1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.googlesitemap.app.subapp.sitemapdetail.contentconnector;
35
36 import info.magnolia.module.googlesitemap.app.subapp.sitemapdetail.util.SiteMapEntryContainer;
37 import info.magnolia.module.googlesitemap.bean.SiteMapEntry;
38 import info.magnolia.module.googlesitemap.service.SiteMapService;
39 import info.magnolia.ui.api.app.SubAppContext;
40 import info.magnolia.ui.contentapp.detail.DetailLocation;
41 import info.magnolia.ui.vaadin.integration.contentconnector.ContentConnector;
42
43 import javax.inject.Inject;
44
45 import org.apache.commons.lang3.StringUtils;
46
47 import com.vaadin.data.Item;
48 import com.vaadin.data.util.BeanItem;
49
50
51
52
53 public class SitemapContentConnector implements ContentConnector {
54
55 public static final String SEPARATOR = "@";
56
57 private final DetailLocation siteMapLocation;
58
59 private SiteMapService siteMapService;
60
61 private SiteMapEntryContainer container;
62
63 private SitemapContentConnectorDefinition definition;
64
65 @Inject
66 public SitemapContentConnector(SitemapContentConnectorDefinition definition, SiteMapService siteMapService, SubAppContext subAppContext) {
67 this.definition = definition;
68 this.siteMapLocation = DetailLocation.wrap(subAppContext.getLocation());
69 this.siteMapService = siteMapService;
70 this.container = new SiteMapEntryContainer(getSitemapPath(), this.definition.isVirtualUris(), this.siteMapService);
71 }
72
73 @Override
74 public String getItemUrlFragment(Object itemId) {
75 if (itemId instanceof SiteMapEntry) {
76 SiteMapEntry entry = (SiteMapEntry)itemId;
77 return getSitemapPath() + SEPARATOR + entry.getPath();
78 }
79 return getSitemapPath();
80 }
81
82 @Override
83 public SiteMapEntry getItemIdByUrlFragment(String urlFragment) {
84 if (urlFragment.startsWith(siteMapLocation.getNodePath())) {
85 return findEntry(parsePageName(urlFragment));
86 }
87 return null;
88 }
89
90 @Override
91 public Object getDefaultItemId() {
92 return new Object();
93 }
94
95 @Override
96 public Item getItem(Object itemId) {
97 if (itemId instanceof SiteMapEntry) {
98 return new BeanItem<SiteMapEntry>((SiteMapEntry) itemId);
99 }
100 return null;
101 }
102
103 @Override
104 public SiteMapEntry getItemId(Item item) {
105 if (item instanceof BeanItem) {
106 Object bean = ((BeanItem)item).getBean();
107 if (bean instanceof SiteMapEntry) {
108 return (SiteMapEntry)bean;
109 }
110 }
111 return null;
112 }
113
114 @Override
115 public boolean canHandleItem(Object itemId) {
116 return itemId instanceof SiteMapEntry;
117 }
118
119 private SiteMapEntry findEntry(String pagePath) {
120 if (!StringUtils.isBlank(pagePath)) {
121 SiteMapEntry id = container.firstItemId();
122 while (id != null) {
123 if (id.getPath().equals(pagePath)) {
124 return id;
125 }
126 id = container.nextItemId(id);
127 }
128 }
129 return null;
130 }
131
132 public String getSitemapPath() {
133 return StringUtils.substringBefore(siteMapLocation.getNodePath(), SEPARATOR);
134 }
135
136 public SiteMapEntryContainer getContainer() {
137 return container;
138 }
139
140 private String parsePageName(String urlFragment) {
141 return StringUtils.substringAfterLast(urlFragment, SEPARATOR);
142 }
143 }