X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.repo%2Fsrc%2Forg%2Fargeo%2Fslc%2Frepo%2Fcore%2FWorkspaceIndexer.java;fp=org.argeo.slc.repo%2Fsrc%2Forg%2Fargeo%2Fslc%2Frepo%2Fcore%2FWorkspaceIndexer.java;h=958165d19e5865d73cae59969468bb116edba34e;hb=825d60c5348dbe3f5be25b0bccf7bdebfe694219;hp=0000000000000000000000000000000000000000;hpb=5e991fff5cba01858dcc5747a27e637325bc5c8e;p=gpl%2Fargeo-jcr.git diff --git a/org.argeo.slc.repo/src/org/argeo/slc/repo/core/WorkspaceIndexer.java b/org.argeo.slc.repo/src/org/argeo/slc/repo/core/WorkspaceIndexer.java new file mode 100644 index 0000000..958165d --- /dev/null +++ b/org.argeo.slc.repo/src/org/argeo/slc/repo/core/WorkspaceIndexer.java @@ -0,0 +1,81 @@ +package org.argeo.slc.repo.core; + +import java.util.List; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.observation.Event; +import javax.jcr.observation.EventIterator; +import javax.jcr.observation.EventListener; + +import org.argeo.api.cms.CmsLog; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.SlcException; +import org.argeo.slc.repo.NodeIndexer; + +/** Maintains the metadata of a workspace, using listeners */ +public class WorkspaceIndexer { + private final static CmsLog log = CmsLog.getLog(WorkspaceIndexer.class); + + private final Session adminSession; + private IndexingListener artifactListener; + /** order may be important */ + private final List nodeIndexers; + + public WorkspaceIndexer(Session adminSession, List nodeIndexers) { + this.adminSession = adminSession; + this.nodeIndexers = nodeIndexers; + try { + artifactListener = new IndexingListener(); + adminSession + .getWorkspace() + .getObservationManager() + .addEventListener(artifactListener, Event.NODE_ADDED, "/", + true, null, null, true); + } catch (RepositoryException e) { + throw new SlcException("Cannot initialize repository backend", e); + } + } + + public void close() { + try { + adminSession.getWorkspace().getObservationManager() + .removeEventListener(artifactListener); + } catch (RepositoryException e) { + log.error("Cannot close workspace indexer " + + adminSession.getWorkspace().getName(), e); + } + } + + class IndexingListener implements EventListener { + + public void onEvent(EventIterator events) { + while (events.hasNext()) { + Event event = events.nextEvent(); + try { + String newNodePath = event.getPath(); + Node newNode = null; + for (NodeIndexer nodeIndexer : nodeIndexers) { + try { + if (nodeIndexer.support(newNodePath)) { + if (newNode == null) + newNode = adminSession.getNode(newNodePath); + nodeIndexer.index(newNode); + } + } catch (RuntimeException e) { + e.printStackTrace(); + throw e; + } + } + if (newNode != null) + adminSession.save(); + } catch (RepositoryException e) { + throw new SlcException("Cannot process event " + event, e); + } finally { + JcrUtils.discardQuietly(adminSession); + } + } + } + } +}