]> git.argeo.org Git - gpl/argeo-suite.git/blob - CustomMaintenanceService.java
a4b1fff691520c09ad165b9792e0ed21125888c7
[gpl/argeo-suite.git] / CustomMaintenanceService.java
1 package org.argeo.app.core;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.net.URL;
6 import java.util.ArrayList;
7 import java.util.List;
8
9 import javax.jcr.ImportUUIDBehavior;
10 import javax.jcr.ItemExistsException;
11 import javax.jcr.Node;
12 import javax.jcr.RepositoryException;
13
14 import org.argeo.api.cms.CmsLog;
15 import org.argeo.app.api.EntityType;
16 import org.argeo.jcr.JcrUtils;
17 import org.argeo.maintenance.AbstractMaintenanceService;
18
19 /** Base for custom initialisations. */
20 public abstract class CustomMaintenanceService extends AbstractMaintenanceService {
21 private final static CmsLog log = CmsLog.getLog(AbstractMaintenanceService.class);
22
23 protected List<String> getTypologies() {
24 return new ArrayList<>();
25 }
26
27 protected String getTypologiesLoadBase() {
28 return "";
29 }
30
31 protected void loadTypologies(Node customBaseNode) throws RepositoryException, IOException {
32 List<String> typologies = getTypologies();
33 if (!typologies.isEmpty()) {
34 Node termsBase = JcrUtils.getOrAdd(customBaseNode, EntityType.terms.name(), EntityType.typologies.get());
35 for (String terms : typologies) {
36 loadTerms(termsBase, terms);
37 }
38 // TODO do not save here, so that upper layers can decide when to save
39 termsBase.getSession().save();
40 }
41 }
42
43 protected void loadTerms(Node termsBase, String name) throws IOException, RepositoryException {
44 try {
45 // if (termsBase.hasNode(name))
46 // return;
47 String typologiesLoadBase = getTypologiesLoadBase();
48 if (typologiesLoadBase.contains("/") && !typologiesLoadBase.endsWith("/"))
49 typologiesLoadBase = typologiesLoadBase + "/";
50 String termsLoadPath = typologiesLoadBase + name + ".xml";
51 URL termsUrl = getClass().getResource(termsLoadPath);
52 if (termsUrl == null)
53 throw new IllegalArgumentException("Terms '" + name + "' not found.");
54 try (InputStream in = termsUrl.openStream()) {
55 termsBase.getSession().importXML(termsBase.getPath(), in,
56 ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
57 } catch (ItemExistsException e) {
58 log.warn("Terms " + name + " exists with another UUID, removing it...");
59 termsBase.getNode(name).remove();
60 try (InputStream in = termsUrl.openStream()) {
61 termsBase.getSession().importXML(termsBase.getPath(), in,
62 ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
63 }
64 }
65 if (log.isDebugEnabled())
66 log.debug("Terms '" + name + "' loaded.");
67 // TODO do not save here, so that upper layers can decide when to save
68 termsBase.getSession().save();
69 } catch (RepositoryException | IOException e) {
70 log.error("Cannot load terms '" + name + "': " + e.getMessage());
71 throw e;
72 }
73 }
74
75 }