X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FJackrabbitLocalRepository.java;h=572ab1fcc2376aec1df201ec3ae8aaf0e999dc37;hb=eb3116df3624b3d32793548b79e137e2dad429cb;hp=dc47e6e1367af92de2347451b0ff2c2adad5526b;hpb=9e5ea515aa9a855645c9d20c478c14770264a5cb;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitLocalRepository.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitLocalRepository.java index dc47e6e13..572ab1fcc 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitLocalRepository.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitLocalRepository.java @@ -1,34 +1,21 @@ package org.argeo.cms.internal.kernel; -import java.util.GregorianCalendar; import java.util.Map; import java.util.TreeMap; -import javax.jcr.ItemNotFoundException; -import javax.jcr.Node; -import javax.jcr.PathNotFoundException; -import javax.jcr.Property; -import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.Value; -import javax.jcr.nodetype.NodeType; -import javax.jcr.observation.Event; -import javax.jcr.observation.EventIterator; -import javax.jcr.observation.EventListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.jackrabbit.api.JackrabbitValue; import org.apache.jackrabbit.core.RepositoryImpl; import org.argeo.jcr.JcrUtils; class JackrabbitLocalRepository extends LocalRepository { private final static Log log = LogFactory.getLog(JackrabbitLocalRepository.class); - private final static String MIX_ETAG = "mix:etag"; - private final static String JCR_ETAG = "jcr:etag"; + final String SECURITY_WORKSPACE = "security"; - private Map workspaceMonitors = new TreeMap<>(); + private Map workspaceMonitors = new TreeMap<>(); public JackrabbitLocalRepository(RepositoryImpl repository, String cn) { super(repository, cn); @@ -55,14 +42,16 @@ class JackrabbitLocalRepository extends LocalRepository { } private void addMonitor(String realWorkspaceName) { + if (realWorkspaceName.equals(SECURITY_WORKSPACE)) + return; if (!workspaceMonitors.containsKey(realWorkspaceName)) { try { - WorkspaceMonitor workspaceMonitor = new WorkspaceMonitor(getJackrabbitrepository(realWorkspaceName), - getCn(), realWorkspaceName); + CmsWorkspaceIndexer workspaceMonitor = new CmsWorkspaceIndexer( + getJackrabbitrepository(realWorkspaceName), getCn(), realWorkspaceName); workspaceMonitors.put(realWorkspaceName, workspaceMonitor); - workspaceMonitor.start(); + workspaceMonitor.init(); if (log.isDebugEnabled()) - log.debug("Registered " + workspaceMonitor.getName()); + log.debug("Registered " + workspaceMonitor); } catch (RepositoryException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -70,132 +59,10 @@ class JackrabbitLocalRepository extends LocalRepository { } } - static String toEtag(Value v) { - JackrabbitValue value = (JackrabbitValue) v; - return '\"' + value.getContentIdentity() + '\"'; - - } - - /** recursive */ - static void setLastModified(Node node, Event event) throws RepositoryException { - GregorianCalendar calendar = new GregorianCalendar(); - calendar.setTimeInMillis(event.getDate()); - if (node.isNodeType(NodeType.NT_FOLDER)) { - node.addMixin(NodeType.MIX_LAST_MODIFIED); + public void destroy() { + for (String workspaceName : workspaceMonitors.keySet()) { + workspaceMonitors.get(workspaceName).destroy(); } - if (node.isNodeType(NodeType.MIX_LAST_MODIFIED)) { - node.setProperty(Property.JCR_LAST_MODIFIED, calendar); - node.setProperty(Property.JCR_LAST_MODIFIED_BY, event.getUserID()); - } - if (node.getDepth() == 0) - return; - Node parent = node.getParent(); - setLastModified(parent, event); } - static class WorkspaceMonitor extends Thread implements EventListener { - String workspaceName; - RepositoryImpl repositoryImpl; - Session session; - - public WorkspaceMonitor(RepositoryImpl repositoryImpl, String cn, String workspaceName) - throws RepositoryException { - super("Monitor workspace " + workspaceName + " of repository " + cn); - this.workspaceName = workspaceName; - this.repositoryImpl = repositoryImpl; - } - - public void run() { - - session = KernelUtils.openAdminSession(repositoryImpl, workspaceName); - try { - String[] nodeTypes = { NodeType.NT_FILE, NodeType.MIX_LAST_MODIFIED }; - session.getWorkspace().getObservationManager().addEventListener(this, - Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_CHANGED, "/", true, null, nodeTypes, - true); - while (save()) { - - } - - } catch (RepositoryException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } finally { - JcrUtils.logoutQuietly(session); - } - } - - protected synchronized boolean save() { - try { - wait(100); - } catch (InterruptedException e) { - // silent - } - if (!session.isLive()) - return false; - try { - if (session.hasPendingChanges()) - session.save(); - } catch (RepositoryException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return true; - } - - @Override - public synchronized void onEvent(EventIterator events) { - events: while (events.hasNext()) { - Event event = events.nextEvent(); -// if (log.isDebugEnabled()) -// log.debug(event); - try { - if (event.getType() == Event.NODE_ADDED) { - Node node = session.getNode(event.getPath()); - if (node.getParent().isNodeType(NodeType.NT_FILE)) { -// Node contentNode = node.getNode(Node.JCR_CONTENT); - node.addMixin(NodeType.MIX_LAST_MODIFIED); - Property property = node.getProperty(Property.JCR_DATA); - String etag = toEtag(property.getValue()); - node.setProperty(JCR_ETAG, etag); - setLastModified(node, event); -// node.getSession().save(); - if (log.isDebugEnabled()) - log.debug("Node " + node.getPath() + ": " + event); - } - } else if (event.getType() == Event.NODE_REMOVED) { - String parentPath = JcrUtils.parentPath(event.getPath()); - try { - Node parent = session.getNode(parentPath); - setLastModified(parent, event); - - if (log.isDebugEnabled()) - log.debug("Node removed from " + parent.getPath() + ": " + event); - } catch (ItemNotFoundException | PathNotFoundException e) { - continue events; - } - } else if (event.getType() == Event.PROPERTY_CHANGED) { - Property property = session.getProperty(event.getPath()); - if (property.getName().equals("jcr:lastModified")) - continue events; - if (property.getType() == PropertyType.BINARY && property.getName().equals("jcr:data") - && property.getParent().isNodeType(NodeType.NT_UNSTRUCTURED)) { - String etag = toEtag(property.getValue()); - property.getParent().setProperty(JCR_ETAG, etag); - } - setLastModified(property.getParent(), event); -// property.getParent().getSession().save(); - if (log.isDebugEnabled()) - log.debug("Property " + property.getPath() + ": " + event); - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - notifyAll(); - - } - - } }