diff options
4 files changed, 110 insertions, 49 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java index 260a327c78..b08f0a63c1 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java @@ -723,7 +723,10 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte } catch (RuntimeException ex) { - // Fall-through + if (TRACER.isEnabled()) + { + TRACER.trace(ex); + } } } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java index c1c9da40ca..d4249b9a68 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java @@ -67,6 +67,9 @@ public interface InternalRepository extends IRepository, PackageLoader, BranchLo public void setBranchManager(InternalCDOBranchManager branchManager); + /** + * Same as calling {@link #getPackageRegistry(boolean) getPackageRegistry(true)}. + */ public InternalCDOPackageRegistry getPackageRegistry(); public InternalCDOPackageRegistry getPackageRegistry(boolean considerCommitContext); diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOResourceNodeStore.java b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOResourceNodeStore.java index e3cfb60e35..260b3a1ac9 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOResourceNodeStore.java +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOResourceNodeStore.java @@ -10,10 +10,14 @@ */ package org.eclipse.emf.cdo.workspace.internal.efs; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.eresource.CDOResourceFolder; import org.eclipse.emf.cdo.eresource.CDOResourceNode; import org.eclipse.emf.cdo.view.CDOView; +import org.eclipse.emf.cdo.workspace.internal.efs.bundle.OM; +import org.eclipse.net4j.util.WrappedException; import org.eclipse.net4j.util.io.IOUtil; import org.eclipse.core.filesystem.EFS; @@ -23,9 +27,12 @@ import org.eclipse.core.filesystem.provider.FileInfo; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; /** * @author Eike Stepper @@ -38,6 +45,8 @@ public final class CDOResourceNodeStore extends AbstractFileStore private String name; + private AtomicReference<CDOID> resourceNodeID = new AtomicReference<CDOID>(); + public CDOResourceNodeStore(CDOWorkspaceStore workspaceStore, IFileStore parent, String name) { this.workspaceStore = workspaceStore; @@ -75,29 +84,24 @@ public final class CDOResourceNodeStore extends AbstractFileStore @Override public String[] childNames(int options, IProgressMonitor monitor) throws CoreException { - List<String> childNames = new ArrayList<String>(); - CDOView view = null; - - try + return new ResourceNodeRunnable<String[]>() { - view = workspaceStore.getWorkspace().openView(); - CDOResourceNode node = view.getResourceNode(getPath()); - if (node instanceof CDOResourceFolder) + @Override + protected String[] run(CDOResourceNode node) { - CDOResourceFolder folder = (CDOResourceFolder)node; - - for (CDOResourceNode child : folder.getNodes()) + List<String> childNames = new ArrayList<String>(); + if (node instanceof CDOResourceFolder) { - childNames.add(child.getName()); + CDOResourceFolder folder = (CDOResourceFolder)node; + + for (CDOResourceNode child : folder.getNodes()) + { + childNames.add(child.getName()); + } } + return childNames.toArray(new String[childNames.size()]); } - } - finally - { - IOUtil.close(view); - } - - return childNames.toArray(new String[childNames.size()]); + }.run(); } @Override @@ -109,32 +113,76 @@ public final class CDOResourceNodeStore extends AbstractFileStore @Override public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException { - CDOView view = null; - - try + return new ResourceNodeRunnable<IFileInfo>() { - view = workspaceStore.getWorkspace().openView(); - CDOResourceNode node = view.getResourceNode(getPath()); - - FileInfo info = new FileInfo(getName()); - info.setExists(true); - info.setLength(EFS.NONE); - info.setLastModified(EFS.NONE); - info.setDirectory(node instanceof CDOResourceFolder); - info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, false); - info.setAttribute(EFS.ATTRIBUTE_HIDDEN, false); - return info; - } - finally - { - IOUtil.close(view); - } + @Override + protected IFileInfo run(CDOResourceNode node) + { + FileInfo info = new FileInfo(getName()); + info.setExists(true); + info.setLength(EFS.NONE); + info.setLastModified(EFS.NONE); + info.setDirectory(node instanceof CDOResourceFolder); + info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, false); + info.setAttribute(EFS.ATTRIBUTE_HIDDEN, false); + return info; + } + }.run(); } @Override public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException { - // TODO: implement CDOWorkspaceNodeStore.openInputStream(options, monitor) - throw new UnsupportedOperationException(); + return new ResourceNodeRunnable<InputStream>() + { + @Override + protected InputStream run(CDOResourceNode node) + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + CDOResource resource = (CDOResource)node; + // resource.cdoPrefetch(CDORevision.DEPTH_INFINITE); + + try + { + resource.save(baos, null); + } + catch (Exception ex) + { + OM.LOG.error(ex); + throw WrappedException.wrap(ex); + } + + return new ByteArrayInputStream(baos.toByteArray()); + } + }.run(); + } + + /** + * @author Eike Stepper + */ + private abstract class ResourceNodeRunnable<RESULT> + { + public ResourceNodeRunnable() + { + } + + public RESULT run() + { + CDOView view = null; + + try + { + view = workspaceStore.getWorkspace().openView(); + CDOResourceNode node = view.getResourceNode(getPath()); + resourceNodeID.compareAndSet(null, node.cdoID()); + return run(node); + } + finally + { + IOUtil.close(view); + } + } + + protected abstract RESULT run(CDOResourceNode node); } } diff --git a/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java b/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java index aa23846df0..5af9d1a1c7 100644 --- a/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java +++ b/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java @@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.common.commit.CDOChangeSet; import org.eclipse.emf.cdo.common.commit.CDOChangeSetData; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionCache; import org.eclipse.emf.cdo.common.revision.CDORevisionHandler; @@ -165,16 +166,9 @@ public class CDOWorkspaceImpl implements InternalCDOWorkspace localRepository.setRootResourceID(session.getRepositoryInfo().getRootResourceID()); InternalCDOPackageUnit[] packageUnits = session.getPackageRegistry().getPackageUnits(false); + registerPackageUnits(packageUnits); context[0] = accessor.rawStore(packageUnits, context[0], monitor); - InternalCDOPackageRegistry repositoryPackageRegistry = localRepository.getPackageRegistry(false); - InternalCDOPackageRegistry sessionPackageRegistry = getLocalSession().getPackageRegistry(); - for (InternalCDOPackageUnit packageUnit : packageUnits) - { - repositoryPackageRegistry.putPackageUnit(packageUnit); - sessionPackageRegistry.putPackageUnit(packageUnit); - } - CDORevisionHandler handler = new CDORevisionHandler() { public boolean handleRevision(CDORevision revision) @@ -209,6 +203,16 @@ public class CDOWorkspaceImpl implements InternalCDOWorkspace } } + private void registerPackageUnits(InternalCDOPackageUnit[] packageUnits) + { + InternalCDOPackageRegistry repositoryPackageRegistry = localRepository.getPackageRegistry(false); + for (InternalCDOPackageUnit packageUnit : packageUnits) + { + packageUnit.setState(CDOPackageUnit.State.LOADED); + repositoryPackageRegistry.putPackageUnit(packageUnit); + } + } + protected void open() { } @@ -501,7 +505,10 @@ public class CDOWorkspaceImpl implements InternalCDOWorkspace configuration.setConnector(connector); configuration.setRepositoryName(repositoryName); configuration.setRevisionManager(CDORevisionUtil.createRevisionManager(CDORevisionCache.NOOP)); // Use repo's cache - return (InternalCDOSession)configuration.openSession(); + + InternalCDOSession session = (InternalCDOSession)configuration.openSession(); + session.setPackageRegistry(localRepository.getPackageRegistry(false)); // Use repo's registry + return session; } protected InternalCDOView[] getViews() |