]> git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.jcr/src/org/argeo/app/jcr/CustomMaintenanceService.java
Adapt to changes in Argeo Build and Argeo Commons
[gpl/argeo-suite.git] / org.argeo.app.jcr / src / org / argeo / app / jcr / CustomMaintenanceService.java
1 package org.argeo.app.jcr;
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 if (termsBase.hasNode(name))
60 termsBase.getNode(name).remove();
61 try (InputStream in = termsUrl.openStream()) {
62 termsBase.getSession().importXML(termsBase.getPath(), in,
63 ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
64 }
65 }
66 if (log.isDebugEnabled())
67 log.debug("Terms '" + name + "' loaded.");
68 // TODO do not save here, so that upper layers can decide when to save
69 termsBase.getSession().save();
70 } catch (RepositoryException | IOException e) {
71 log.error("Cannot load terms '" + name + "': " + e.getMessage());
72 throw e;
73 }
74 }
75
76 }