1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.pi.purl;
20
21 import java.net.MalformedURLException;
22 import java.net.URL;
23 import java.util.Date;
24 import java.util.HashMap;
25 import java.util.Map;
26 import java.util.Optional;
27 import java.util.function.Consumer;
28
29 import org.mycore.backend.jpa.MCREntityManagerProvider;
30 import org.mycore.datamodel.metadata.MCRBase;
31 import org.mycore.datamodel.metadata.MCRObjectID;
32 import org.mycore.pi.MCRPIJobService;
33 import org.mycore.pi.backend.MCRPI;
34 import org.mycore.pi.exceptions.MCRPersistentIdentifierException;
35
36 public class MCRPURLService extends MCRPIJobService<MCRPURL> {
37
38 private static final String TYPE = "purl";
39
40 private static final String CONTEXT_PURL = "PURL";
41
42 private static final String CONTEXT_OBJECT = "ObjectID";
43
44 private static final String PURL_SERVER_CONFIG = "Server";
45
46 private static final String PURL_USER_CONFIG = "Username";
47
48 private static final String PURL_PASSWORD_CONFIG = "Password";
49
50 private static final String PURL_BASE_URL = "RegisterBaseURL";
51
52 private static final String PURL_CONTEXT_CONFIG = "RegisterURLContext";
53
54 private static final String PURL_MAINTAINER_CONFIG = "Maintainer";
55
56 private static final String DEFAULT_CONTEXT_PATH = "receive/$ID";
57
58 public MCRPURLService() {
59 super(TYPE);
60 }
61
62 @Override
63 public void registerJob(Map<String, String> parameters) throws MCRPersistentIdentifierException {
64 MCRPURL purl = getPURLFromJob(parameters);
65 String idString = parameters.get(CONTEXT_OBJECT);
66 validateJobUserRights(MCRObjectID.getInstance(idString));
67
68 doWithPURLManager(
69 manager -> manager
70 .registerNewPURL(purl.getUrl().getPath(), buildTargetURL(idString), "302", getProperties().getOrDefault(
71 PURL_MAINTAINER_CONFIG, "test")));
72 this.updateStartRegistrationDate(MCRObjectID.getInstance(idString), "", new Date());
73 }
74
75 protected String buildTargetURL(String objId) {
76 String baseURL = getProperties().get(PURL_BASE_URL);
77 return baseURL + getProperties().getOrDefault(PURL_CONTEXT_CONFIG, DEFAULT_CONTEXT_PATH)
78 .replaceAll("\\$[iI][dD]", objId);
79
80 }
81
82 @Override
83 protected Optional<String> getJobInformation(Map<String, String> contextParameters) {
84 return Optional.empty();
85 }
86
87 private MCRPURL getPURLFromJob(Map<String, String> parameters)
88 throws MCRPersistentIdentifierException {
89 String purlString = parameters.get(CONTEXT_PURL);
90
91 try {
92 return new MCRPURL(new URL(purlString));
93 } catch (MalformedURLException e) {
94 throw new MCRPersistentIdentifierException("Cannot parse " + purlString);
95 }
96 }
97
98 @Override
99 public void updateJob(Map<String, String> parameters) throws MCRPersistentIdentifierException {
100 String purlString = parameters.get(CONTEXT_PURL);
101 String objId = parameters.get(CONTEXT_OBJECT);
102
103 validateJobUserRights(MCRObjectID.getInstance(objId));
104 MCRPURL purl;
105
106 try {
107 purl = new MCRPURL(
108 new URL(purlString));
109 } catch (MalformedURLException e) {
110 throw new MCRPersistentIdentifierException("Could not parse purl: " + purlString, e);
111 }
112
113 doWithPURLManager((purlManager) -> {
114 if (!purlManager.isPURLTargetURLUnchanged(purl.getUrl().toString(), buildTargetURL(
115 objId))) {
116 purlManager.updateExistingPURL(purl.getUrl().getPath(), buildTargetURL(objId), "302",
117 getProperties().getOrDefault(
118 PURL_MAINTAINER_CONFIG, "test"));
119 }
120 });
121 }
122
123 @Override
124 public void deleteJob(Map<String, String> parameters) {
125
126 }
127
128 @Override
129 public MCRPI insertIdentifierToDatabase(MCRBase obj, String additional,
130 MCRPURL identifier) {
131 Date registrationStarted = null;
132 if (getRegistrationPredicate().test(obj)) {
133 registrationStarted = new Date();
134 startRegisterJob(obj, identifier);
135 }
136
137 MCRPI databaseEntry = new MCRPI(identifier.asString(), getType(), obj.getId().toString(), additional,
138 this.getServiceID(), provideRegisterDate(obj, additional), registrationStarted);
139 MCREntityManagerProvider.getCurrentEntityManager().persist(databaseEntry);
140 return databaseEntry;
141 }
142
143 @Override
144 protected void registerIdentifier(MCRBase obj, String additional, MCRPURL purl)
145 throws MCRPersistentIdentifierException {
146 if (!"".equals(additional)) {
147 throw new MCRPersistentIdentifierException(
148 getClass().getName() + " doesn't support additional information! (" + additional + ")");
149 }
150 }
151
152 @Override
153 protected void delete(MCRPURL identifier, MCRBase obj, String additional)
154 throws MCRPersistentIdentifierException {
155
156 }
157
158 @Override
159 protected void update(MCRPURL purl, MCRBase obj, String additional)
160 throws MCRPersistentIdentifierException {
161 if (isRegistered(obj.getId(), additional)) {
162 startUpdateJob(obj, purl);
163 } else if (!hasRegistrationStarted(obj.getId(), additional)
164 && getRegistrationPredicate().test(obj)) {
165 this.updateStartRegistrationDate(obj.getId(), "", new Date());
166 startRegisterJob(obj, purl);
167 }
168 }
169
170 private void startUpdateJob(MCRBase obj, MCRPURL purl) {
171 HashMap<String, String> contextParameters = new HashMap<>();
172 contextParameters.put(CONTEXT_PURL, purl.asString());
173 contextParameters.put(CONTEXT_OBJECT, obj.getId().toString());
174 this.addUpdateJob(contextParameters);
175 }
176
177 private void startRegisterJob(MCRBase obj, MCRPURL purl) {
178 HashMap<String, String> contextParameters = new HashMap<>();
179 contextParameters.put(CONTEXT_PURL, purl.asString());
180 contextParameters.put(CONTEXT_OBJECT, obj.getId().toString());
181 this.addRegisterJob(contextParameters);
182 }
183
184 protected void doWithPURLManager(Consumer<MCRPURLManager> action) {
185 Map<String, String> props = getProperties();
186 String serverURL = props.get(PURL_SERVER_CONFIG);
187 String username = props.get(PURL_USER_CONFIG);
188 String password = props.get(PURL_PASSWORD_CONFIG);
189
190 MCRPURLManager manager = new MCRPURLManager();
191 manager.login(serverURL, username, password);
192
193 try {
194 action.accept(manager);
195 } finally {
196 manager.logout();
197 }
198 }
199 }