1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.frontend.servlets;
20
21 import java.util.Collection;
22 import java.util.Map;
23
24 import org.jdom2.Element;
25 import org.mycore.common.content.MCRJDOMContent;
26 import org.mycore.datamodel.common.MCRLinkTableManager;
27 import org.mycore.datamodel.metadata.MCRMetadataManager;
28 import org.mycore.datamodel.metadata.MCRObject;
29 import org.mycore.datamodel.metadata.MCRObjectID;
30 import org.mycore.frontend.MCRFrontendUtil;
31
32
33
34
35
36
37
38
39 public class MCRDerivateLinkServlet extends MCRServlet {
40
41 private static final long serialVersionUID = 1L;
42
43 protected static String derivateLinkErrorPage = "error_derivatelink.xml";
44
45 @Override
46 protected void doGetPost(MCRServletJob job) throws Exception {
47 @SuppressWarnings("unchecked")
48 Map<String, String[]> pMap = job.getRequest().getParameterMap();
49 String webpage = pMap.get("subselect.webpage")[0];
50 String mcrId = getSubParameterValueOfBrowserAddressParameter(webpage, "mcrid");
51 String parentId = getSubParameterValueOfBrowserAddressParameter(webpage, "parentID");
52
53
54 Element rootElement = new Element("derivateLinks-parentList");
55
56 MCRObjectID objId = MCRObjectID.getInstance(mcrId);
57 if (MCRMetadataManager.exists(objId)) {
58
59
60 addParentsToElement(rootElement, objId);
61 } else if (parentId != null && MCRMetadataManager.exists(MCRObjectID.getInstance(parentId))) {
62
63
64 Element firstParent = getMyCoReObjectElement(MCRObjectID.getInstance(parentId));
65 if (firstParent != null) {
66 rootElement.addContent(firstParent);
67 }
68 addParentsToElement(rootElement, MCRObjectID.getInstance(parentId));
69 }
70
71
72 if (rootElement.getContentSize() == 0) {
73 job.getResponse().sendRedirect(
74 job.getResponse().encodeRedirectURL(MCRFrontendUtil.getBaseURL() + derivateLinkErrorPage));
75 return;
76 }
77
78
79 rootElement.setAttribute("session", pMap.get("subselect.session")[0]);
80 rootElement.setAttribute("varpath", pMap.get("subselect.varpath")[0]);
81 rootElement.setAttribute("webpage", webpage);
82
83
84 getLayoutService().doLayout(job.getRequest(), job.getResponse(), new MCRJDOMContent(rootElement));
85 }
86
87
88
89
90
91
92
93
94 private void addParentsToElement(Element toElement, MCRObjectID objId) {
95 MCRObjectID pId = objId;
96 while ((pId = getParentId(pId)) != null) {
97 Element parentElement = getMyCoReObjectElement(pId);
98 if (parentElement != null) {
99 toElement.addContent(parentElement);
100 }
101 }
102 }
103
104
105
106
107
108
109
110 private MCRObjectID getParentId(MCRObjectID objectId) {
111 MCRObject obj = MCRMetadataManager.retrieveMCRObject(objectId);
112 return obj.getStructure().getParentID();
113 }
114
115
116
117
118
119
120
121
122 private Element getMyCoReObjectElement(MCRObjectID objectId) {
123 Collection<String> derivates = MCRLinkTableManager.instance().getDestinationOf(objectId, "derivate");
124 if (derivates.size() <= 0) {
125 return null;
126 }
127 Element objElement = new Element("mycoreobject");
128 objElement.setAttribute("id", objectId.toString());
129 for (String derivate : derivates) {
130 Element derElement = new Element("derivate");
131 derElement.setAttribute("id", derivate);
132 objElement.addContent(derElement);
133 }
134 return objElement;
135 }
136
137
138
139
140
141
142
143
144
145 private String getSubParameterValueOfBrowserAddressParameter(String browserAddressParameter, String subParameter) {
146 String value = null;
147 int index = browserAddressParameter.indexOf(subParameter);
148 if (index != -1) {
149 int startIndex = index + subParameter.length() + 1;
150 int endIndex = browserAddressParameter.indexOf("&", index + 1);
151 if (endIndex == -1) {
152 endIndex = browserAddressParameter.length();
153 }
154 value = browserAddressParameter.substring(startIndex, endIndex);
155 }
156 return value;
157 }
158 }