package org.argeo.support.odk; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.jcr.ImportUUIDBehavior; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.nodetype.NodeType; 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.jcr.JcrxApi; import org.argeo.util.DigestUtils; /** Utilities around ODK. */ public class OdkUtils { private final static Log log = LogFactory.getLog(OdkUtils.class); public static void loadOdkForm(Node formBase, String name, InputStream in) throws RepositoryException, IOException { if (!formBase.isNodeType(EntityType.formSet.get())) throw new IllegalArgumentException( "Parent path " + formBase + " must be of type " + EntityType.formSet.get()); Node form = JcrUtils.getOrAdd(formBase, name, OrxListType.xform.get(), NodeType.MIX_SIMPLE_VERSIONABLE); String previousCsum = JcrxApi.getChecksum(form, JcrxApi.MD5); Session s = formBase.getSession(); // String res = "/odk/apafSession.odk.xml"; // try (InputStream in = getClass().getClassLoader().getResourceAsStream(res)) { s.importXML(form.getPath(), in, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); // } if (previousCsum == null)// save before checksuming s.save(); String newCsum; try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { s.exportDocumentView(form.getPath() + "/" + OdkNames.H_HTML, out, true, false); newCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray()); } if (previousCsum == null) { JcrxApi.addChecksum(form, newCsum); JcrUtils.updateLastModified(form); s.save(); s.getWorkspace().getVersionManager().checkpoint(form.getPath()); if (log.isDebugEnabled()) log.debug("New form " + form); } else { if (newCsum.equals(previousCsum)) { // discard s.refresh(false); if (log.isDebugEnabled()) log.debug("Unmodified form " + form); return; } else { JcrxApi.addChecksum(form, newCsum); JcrUtils.updateLastModified(form); s.save(); s.getWorkspace().getVersionManager().checkpoint(form.getPath()); if (log.isDebugEnabled()) { log.debug("Updated form " + form); log.debug("Previous csum " + previousCsum); log.debug("New csum " + newCsum); } } } } /** Singleton. */ private OdkUtils() { } }