diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOResourceNodeStore.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOResourceNodeStore.java | 126 |
1 files changed, 87 insertions, 39 deletions
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); } } |