X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=blobdiff_plain;f=org.argeo.suite.core%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fcore%2FCustomMaintenanceService.java;fp=org.argeo.suite.core%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fcore%2FCustomMaintenanceService.java;h=5d76eb126ae5ec4c83cf21d7de33316e385d9c88;hp=0000000000000000000000000000000000000000;hb=3440f51df3e4c015972c7b6a0efb3ce16188b89b;hpb=752a7b2614895002a3d184be166ef4162caf0d05 diff --git a/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java b/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java new file mode 100644 index 0000000..5d76eb1 --- /dev/null +++ b/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java @@ -0,0 +1,74 @@ +package org.argeo.suite.core; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import javax.jcr.ImportUUIDBehavior; +import javax.jcr.ItemExistsException; +import javax.jcr.Node; +import javax.jcr.RepositoryException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.entity.EntityType; +import org.argeo.jcr.JcrUtils; +import org.argeo.maintenance.AbstractMaintenanceService; + +/** Base for custom initialisations. */ +public abstract class CustomMaintenanceService extends AbstractMaintenanceService { + private final static Log log = LogFactory.getLog(AbstractMaintenanceService.class); + + protected List getTypologies() { + return new ArrayList<>(); + } + + protected String getTypologiesLoadBase() { + return "/sys/terms"; + } + + protected void loadTypologies(Node customBaseNode) throws RepositoryException, IOException { + List typologies = getTypologies(); + if (!typologies.isEmpty()) { + Node termsBase = JcrUtils.getOrAdd(customBaseNode, EntityType.terms.name(), EntityType.typologies.get()); + for (String terms : typologies) { + loadTerms(termsBase, terms); + } + // TODO do not save here, so that upper layers can decide when to save + termsBase.getSession().save(); + } + } + + protected void loadTerms(Node termsBase, String name) throws IOException, RepositoryException { + try { +// if (termsBase.hasNode(name)) +// return; + + String termsLoadPath = getTypologiesLoadBase() + '/' + name + ".xml"; + URL termsUrl = getClass().getClassLoader().getResource(termsLoadPath); + if (termsUrl == null) + throw new IllegalArgumentException("Terms '" + name + "' not found."); + try (InputStream in = termsUrl.openStream()) { + termsBase.getSession().importXML(termsBase.getPath(), in, + ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + } catch (ItemExistsException e) { + log.warn("Terms " + name + " exists with another UUID, removing it..."); + termsBase.getNode(name).remove(); + try (InputStream in = termsUrl.openStream()) { + termsBase.getSession().importXML(termsBase.getPath(), in, + ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + } + } + if (log.isDebugEnabled()) + log.debug("Terms '" + name + "' loaded."); + // TODO do not save here, so that upper layers can decide when to save + termsBase.getSession().save(); + } catch (RepositoryException | IOException e) { + log.error("Cannot load terms '" + name + "': " + e.getMessage()); + throw e; + } + } + +}