View Javadoc
1   /*
2    * This file is part of ***  M y C o R e  ***
3    * See http://www.mycore.de/ for details.
4    *
5    * MyCoRe is free software: you can redistribute it and/or modify
6    * it under the terms of the GNU General Public License as published by
7    * the Free Software Foundation, either version 3 of the License, or
8    * (at your option) any later version.
9    *
10   * MyCoRe is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU General Public License for more details.
14   *
15   * You should have received a copy of the GNU General Public License
16   * along with MyCoRe.  If not, see <http://www.gnu.org/licenses/>.
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         // deleting ist not supported
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         // not supported
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 }