From c5f8afb091979d794f7b023f98bbc6a748d90f48 Mon Sep 17 00:00:00 2001 From: Eike Stepper Date: Sat, 15 Sep 2012 19:06:30 +0200 Subject: [388928] Develop a resource transfer framework https://bugs.eclipse.org/bugs/show_bug.cgi?id=388928 --- .../spi/repository/RepositoryTransferSystem.java | 80 +++++++++++++++++++++- 1 file changed, 77 insertions(+), 3 deletions(-) (limited to 'plugins/org.eclipse.emf.cdo.transfer.repository') diff --git a/plugins/org.eclipse.emf.cdo.transfer.repository/src/org/eclipse/emf/cdo/transfer/spi/repository/RepositoryTransferSystem.java b/plugins/org.eclipse.emf.cdo.transfer.repository/src/org/eclipse/emf/cdo/transfer/spi/repository/RepositoryTransferSystem.java index c00978de68..f389be5597 100644 --- a/plugins/org.eclipse.emf.cdo.transfer.repository/src/org/eclipse/emf/cdo/transfer/spi/repository/RepositoryTransferSystem.java +++ b/plugins/org.eclipse.emf.cdo.transfer.repository/src/org/eclipse/emf/cdo/transfer/spi/repository/RepositoryTransferSystem.java @@ -10,6 +10,7 @@ */ package org.eclipse.emf.cdo.transfer.spi.repository; +import org.eclipse.emf.cdo.CDOObject; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.lob.CDOBlob; import org.eclipse.emf.cdo.common.lob.CDOClob; @@ -25,9 +26,15 @@ import org.eclipse.emf.cdo.transfer.CDOTransferSystem; import org.eclipse.emf.cdo.transfer.CDOTransferType; import org.eclipse.emf.cdo.util.CDOURIUtil; import org.eclipse.emf.cdo.view.CDOView; +import org.eclipse.emf.cdo.view.CDOViewInvalidationEvent; +import org.eclipse.net4j.util.event.IEvent; +import org.eclipse.net4j.util.event.IListener; import org.eclipse.net4j.util.io.IORuntimeException; import org.eclipse.net4j.util.io.IOUtil; +import org.eclipse.net4j.util.lifecycle.ILifecycle; +import org.eclipse.net4j.util.lifecycle.LifecycleEventAdapter; +import org.eclipse.net4j.util.ref.ReferenceValueMap; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; @@ -43,6 +50,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; +import java.util.Map; +import java.util.Set; +import java.util.WeakHashMap; /** * @author Eike Stepper @@ -52,9 +62,15 @@ public class RepositoryTransferSystem extends CDOTransferSystem { public static final String TYPE = "repository"; - private CDOView view; + private static final Map INSTANCES = new WeakHashMap(); - public RepositoryTransferSystem(CDOView view) + private static final IListener VIEW_LISTENER = new ViewListener(); + + private final CDOView view; + + private final Map resourceNodeCache = new ReferenceValueMap.Soft(); + + private RepositoryTransferSystem(CDOView view) { super(view.isReadOnly()); this.view = view; @@ -78,7 +94,7 @@ public class RepositoryTransferSystem extends CDOTransferSystem CDOBranch branch = view.getBranch(); CDOSession session = view.getSession(); CDOTransaction transaction = session.openTransaction(branch); - return new RepositoryTransferSystem(transaction); + return getInstance(transaction); } return this; @@ -125,6 +141,7 @@ public class RepositoryTransferSystem extends CDOTransferSystem @Override public CDOTransferElement getElement(IPath path) { + System.out.println("Get element for: " + path); if (path.isEmpty()) { return new RootElement(this, view.getRootResource()); @@ -200,6 +217,63 @@ public class RepositoryTransferSystem extends CDOTransferSystem return "Repository " + view.getSession().getRepositoryInfo().getName(); } + protected void handleViewInvalidation(CDOViewInvalidationEvent event) + { + Set dirtyObjects = event.getDirtyObjects(); + } + + public static RepositoryTransferSystem getInstance(CDOView view) + { + synchronized (INSTANCES) + { + RepositoryTransferSystem instance = INSTANCES.get(view); + if (instance == null) + { + instance = new RepositoryTransferSystem(view); + view.addListener(VIEW_LISTENER); + INSTANCES.put(view, instance); + } + + return instance; + } + } + + /** + * @author Eike Stepper + */ + private static class ViewListener extends LifecycleEventAdapter + { + @Override + protected void onDeactivated(ILifecycle view) + { + synchronized (INSTANCES) + { + INSTANCES.remove(view); + } + } + + @Override + protected void notifyOtherEvent(IEvent event) + { + if (event instanceof CDOViewInvalidationEvent) + { + CDOViewInvalidationEvent e = (CDOViewInvalidationEvent)event; + CDOView view = e.getSource(); + + RepositoryTransferSystem instance; + synchronized (INSTANCES) + { + instance = INSTANCES.get(view); + } + + if (instance != null) + { + instance.handleViewInvalidation(e); + } + } + } + } + /** * @author Eike Stepper */ -- cgit v1.2.3