diff options
author | Eike Stepper | 2012-07-19 08:22:04 +0000 |
---|---|---|
committer | Eike Stepper | 2012-07-19 08:22:04 +0000 |
commit | 1460904fd3c193ffaf809913b2983a400fce9d94 (patch) | |
tree | 72f3a17b75fedba3ae1060df1d32c9c7889be954 /plugins/org.eclipse.emf.cdo.workspace.efs | |
parent | 5f360965ae87478e0681899bf310a210cafc2c44 (diff) | |
download | cdo-1460904fd3c193ffaf809913b2983a400fce9d94.tar.gz cdo-1460904fd3c193ffaf809913b2983a400fce9d94.tar.xz cdo-1460904fd3c193ffaf809913b2983a400fce9d94.zip |
Fix line endings in master (dos2unix)
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.workspace.efs')
11 files changed, 1536 insertions, 1536 deletions
diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/.settings/org.eclipse.core.resources.prefs b/plugins/org.eclipse.emf.cdo.workspace.efs/.settings/org.eclipse.core.resources.prefs index 457a31aac4..e06f471e7c 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/.settings/org.eclipse.core.resources.prefs +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/.settings/org.eclipse.core.resources.prefs @@ -1,3 +1,3 @@ -#Mon Jul 04 13:01:47 CEST 2011
-eclipse.preferences.version=1
-encoding//model/org.eclipse.emf.cdo.defs.ecorediag=UTF-8
+#Mon Jul 04 13:01:47 CEST 2011 +eclipse.preferences.version=1 +encoding//model/org.eclipse.emf.cdo.defs.ecorediag=UTF-8 diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/copyright.txt b/plugins/org.eclipse.emf.cdo.workspace.efs/copyright.txt index 8f6328980e..0a0f67e6d7 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/copyright.txt +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/copyright.txt @@ -1,8 +1,8 @@ -Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Eclipse Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/epl-v10.html
-
-Contributors:
+Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/epl-v10.html + +Contributors: Eike Stepper - initial API and implementation
\ No newline at end of file diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/plugin.properties b/plugins/org.eclipse.emf.cdo.workspace.efs/plugin.properties index cc43fd9137..aeb8c7a3dd 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/plugin.properties +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/plugin.properties @@ -1,11 +1,11 @@ -# Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# Eike Stepper - initial API and implementation
-
-pluginName = CDO Model Repository Client Workspace EFS
-providerName = Eclipse Modeling Project
+# Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Eike Stepper - initial API and implementation + +pluginName = CDO Model Repository Client Workspace EFS +providerName = Eclipse Modeling Project diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/plugin.xml b/plugins/org.eclipse.emf.cdo.workspace.efs/plugin.xml index 7a6fdeba25..8f4a8f895f 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/plugin.xml +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/plugin.xml @@ -1,24 +1,24 @@ -<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<!--
- Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- All rights reserved. This program and the accompanying materials
- are made available under the terms of the Eclipse Public License v1.0
- which accompanies this distribution, and is available at
- http://www.eclipse.org/legal/epl-v10.html
-
- Contributors:
- Eike Stepper - initial API and implementation
--->
-
-<plugin>
-
- <extension
- id="org.eclipse.core.filesystem.cdo.workspace"
- point="org.eclipse.core.filesystem.filesystems">
- <filesystem scheme="cdo.workspace">
- <run class="org.eclipse.emf.cdo.workspace.internal.efs.CDOWorkspaceFileSystem"/>
- </filesystem>
- </extension>
-
-</plugin>
+<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.4"?> +<!-- + Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + + Contributors: + Eike Stepper - initial API and implementation +--> + +<plugin> + + <extension + id="org.eclipse.core.filesystem.cdo.workspace" + point="org.eclipse.core.filesystem.filesystems"> + <filesystem scheme="cdo.workspace"> + <run class="org.eclipse.emf.cdo.workspace.internal.efs.CDOWorkspaceFileSystem"/> + </filesystem> + </extension> + +</plugin> diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/AbstractFileStore.java b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/AbstractFileStore.java index 43315abc4a..6b6e176a06 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/AbstractFileStore.java +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/AbstractFileStore.java @@ -1,104 +1,104 @@ -/*
- * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Eike Stepper - initial API and implementation
- */
-package org.eclipse.emf.cdo.workspace.internal.efs;
-
-import org.eclipse.net4j.util.WrappedException;
-
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.provider.FileStore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-/**
- * @author Eike Stepper
- */
-public abstract class AbstractFileStore extends FileStore
-{
- public AbstractFileStore()
- {
- }
-
- @Override
- public CDOWorkspaceFileSystem getFileSystem()
- {
- return CDOWorkspaceFileSystem.getInstance();
- }
-
- @Override
- public URI toURI()
- {
- try
- {
- return new URI(getParent().toURI().toString() + "/" + getName());
- }
- catch (URISyntaxException ex)
- {
- throw WrappedException.wrap(ex);
- }
- }
-
- /**
- * @author Eike Stepper
- */
- public static final class Invalid extends AbstractFileStore
- {
- private IFileStore parent;
-
- private String name;
-
- public Invalid(IFileStore parent, String name)
- {
- this.parent = parent;
- this.name = name;
- }
-
- @Override
- public IFileStore getParent()
- {
- return parent;
- }
-
- @Override
- public String getName()
- {
- return name;
- }
-
- @Override
- public String[] childNames(int options, IProgressMonitor monitor) throws CoreException
- {
- return CDOWorkspaceFileSystem.NO_CHILD_NAMES;
- }
-
- @Override
- public IFileStore getChild(String name)
- {
- return new Invalid(this, name);
- }
-
- @Override
- public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException
- {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException
- {
- throw new UnsupportedOperationException();
- }
- }
-}
+/* + * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.workspace.internal.efs; + +import org.eclipse.net4j.util.WrappedException; + +import org.eclipse.core.filesystem.IFileInfo; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.filesystem.provider.FileStore; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; + +/** + * @author Eike Stepper + */ +public abstract class AbstractFileStore extends FileStore +{ + public AbstractFileStore() + { + } + + @Override + public CDOWorkspaceFileSystem getFileSystem() + { + return CDOWorkspaceFileSystem.getInstance(); + } + + @Override + public URI toURI() + { + try + { + return new URI(getParent().toURI().toString() + "/" + getName()); + } + catch (URISyntaxException ex) + { + throw WrappedException.wrap(ex); + } + } + + /** + * @author Eike Stepper + */ + public static final class Invalid extends AbstractFileStore + { + private IFileStore parent; + + private String name; + + public Invalid(IFileStore parent, String name) + { + this.parent = parent; + this.name = name; + } + + @Override + public IFileStore getParent() + { + return parent; + } + + @Override + public String getName() + { + return name; + } + + @Override + public String[] childNames(int options, IProgressMonitor monitor) throws CoreException + { + return CDOWorkspaceFileSystem.NO_CHILD_NAMES; + } + + @Override + public IFileStore getChild(String name) + { + return new Invalid(this, name); + } + + @Override + public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException + { + throw new UnsupportedOperationException(); + } + + @Override + public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException + { + throw new UnsupportedOperationException(); + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/AbstractResourceNodeStore.java b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/AbstractResourceNodeStore.java index 0fc4348eb2..5f9503365f 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/AbstractResourceNodeStore.java +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/AbstractResourceNodeStore.java @@ -1,196 +1,196 @@ -/*
- * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Eike Stepper - initial API and implementation
- */
-package org.eclipse.emf.cdo.workspace.internal.efs;
-
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.eresource.CDOResourceNode;
-import org.eclipse.emf.cdo.transaction.CDOTransaction;
-import org.eclipse.emf.cdo.util.CommitException;
-import org.eclipse.emf.cdo.view.CDOView;
-import org.eclipse.emf.cdo.workspace.CDOWorkspace;
-
-import org.eclipse.net4j.util.WrappedException;
-import org.eclipse.net4j.util.io.IOUtil;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.provider.FileInfo;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Eike Stepper
- */
-public abstract class AbstractResourceNodeStore extends AbstractFileStore
-{
- private CDOID resourceNodeID;
-
- public AbstractResourceNodeStore()
- {
- }
-
- @Override
- public String[] childNames(int options, IProgressMonitor monitor) throws CoreException
- {
- return new ResourceNodeRunnable<String[]>()
- {
- @Override
- protected String[] run(CDOResourceNode node)
- {
- List<String> childNames = new ArrayList<String>();
- collectChildNames(node, childNames);
- return childNames.toArray(new String[childNames.size()]);
- }
- }.run();
- }
-
- @Override
- public IFileStore getChild(String name)
- {
- return new CDOResourceNodeStore(getWorkspaceStore(), this, name);
- }
-
- @Override
- public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException
- {
- return new ResourceNodeRunnable<IFileInfo>()
- {
- @Override
- protected IFileInfo run(CDOResourceNode node)
- {
- long lastModified = EFS.NONE;
- boolean exists = node != null;
- boolean directory = exists && isDirectory(node);
- if (!directory)
- {
- lastModified = getWorkspaceStore().getLastModified(getPath());
- }
-
- FileInfo info = new FileInfo(getName());
- info.setLastModified(lastModified);
- info.setExists(exists);
- info.setDirectory(directory);
- info.setLength(EFS.NONE);
- info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, false);
- info.setAttribute(EFS.ATTRIBUTE_HIDDEN, false);
- return info;
- }
- }.run();
- }
-
- public abstract CDOWorkspaceStore getWorkspaceStore();
-
- @Override
- public abstract AbstractResourceNodeStore getParent();
-
- public abstract String getPath();
-
- protected CDOView getView()
- {
- return getWorkspaceStore().getView();
- }
-
- protected abstract CDOResourceNode getResourceNode(CDOView view);
-
- protected abstract boolean isDirectory(CDOResourceNode node);
-
- protected abstract void collectChildNames(CDOResourceNode node, List<String> childNames);
-
- /**
- * @author Eike Stepper
- */
- protected abstract class ResourceNodeRunnable<RESULT>
- {
- public ResourceNodeRunnable()
- {
- }
-
- public RESULT run()
- {
- return run(false);
- }
-
- public RESULT run(boolean transactional)
- {
- CDOView view = null;
-
- try
- {
- view = openView(transactional);
- RESULT result = run(view);
- if (transactional)
- {
- CDOTransaction transaction = (CDOTransaction)view;
- transaction.commit();
- }
-
- return result;
- }
- catch (CommitException ex)
- {
- throw WrappedException.wrap(ex);
- }
- finally
- {
- if (transactional)
- {
- IOUtil.close(view);
- }
- }
- }
-
- protected RESULT run(CDOView view)
- {
- CDOResourceNode node = getResourceNode(view);
- RESULT result = run(node);
- return result;
- }
-
- protected RESULT run(CDOResourceNode node)
- {
- return null;
- }
-
- private CDOView openView(boolean transactional)
- {
- CDOWorkspace workspace = getWorkspaceStore().getWorkspace();
- return transactional ? workspace.openTransaction() : getView();
- }
-
- private CDOResourceNode getResourceNode(CDOView view)
- {
- CDOResourceNode node = null;
-
- try
- {
- if (resourceNodeID == null)
- {
- node = AbstractResourceNodeStore.this.getResourceNode(view);
- resourceNodeID = node.cdoID();
- }
- else
- {
- node = (CDOResourceNode)view.getObject(resourceNodeID);
- }
- }
- catch (Exception ex)
- {
- //$FALL-THROUGH$
- }
-
- return node;
- }
- }
-}
+/* + * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.workspace.internal.efs; + +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.eresource.CDOResourceNode; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.util.CommitException; +import org.eclipse.emf.cdo.view.CDOView; +import org.eclipse.emf.cdo.workspace.CDOWorkspace; + +import org.eclipse.net4j.util.WrappedException; +import org.eclipse.net4j.util.io.IOUtil; + +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileInfo; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.filesystem.provider.FileInfo; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Eike Stepper + */ +public abstract class AbstractResourceNodeStore extends AbstractFileStore +{ + private CDOID resourceNodeID; + + public AbstractResourceNodeStore() + { + } + + @Override + public String[] childNames(int options, IProgressMonitor monitor) throws CoreException + { + return new ResourceNodeRunnable<String[]>() + { + @Override + protected String[] run(CDOResourceNode node) + { + List<String> childNames = new ArrayList<String>(); + collectChildNames(node, childNames); + return childNames.toArray(new String[childNames.size()]); + } + }.run(); + } + + @Override + public IFileStore getChild(String name) + { + return new CDOResourceNodeStore(getWorkspaceStore(), this, name); + } + + @Override + public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException + { + return new ResourceNodeRunnable<IFileInfo>() + { + @Override + protected IFileInfo run(CDOResourceNode node) + { + long lastModified = EFS.NONE; + boolean exists = node != null; + boolean directory = exists && isDirectory(node); + if (!directory) + { + lastModified = getWorkspaceStore().getLastModified(getPath()); + } + + FileInfo info = new FileInfo(getName()); + info.setLastModified(lastModified); + info.setExists(exists); + info.setDirectory(directory); + info.setLength(EFS.NONE); + info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, false); + info.setAttribute(EFS.ATTRIBUTE_HIDDEN, false); + return info; + } + }.run(); + } + + public abstract CDOWorkspaceStore getWorkspaceStore(); + + @Override + public abstract AbstractResourceNodeStore getParent(); + + public abstract String getPath(); + + protected CDOView getView() + { + return getWorkspaceStore().getView(); + } + + protected abstract CDOResourceNode getResourceNode(CDOView view); + + protected abstract boolean isDirectory(CDOResourceNode node); + + protected abstract void collectChildNames(CDOResourceNode node, List<String> childNames); + + /** + * @author Eike Stepper + */ + protected abstract class ResourceNodeRunnable<RESULT> + { + public ResourceNodeRunnable() + { + } + + public RESULT run() + { + return run(false); + } + + public RESULT run(boolean transactional) + { + CDOView view = null; + + try + { + view = openView(transactional); + RESULT result = run(view); + if (transactional) + { + CDOTransaction transaction = (CDOTransaction)view; + transaction.commit(); + } + + return result; + } + catch (CommitException ex) + { + throw WrappedException.wrap(ex); + } + finally + { + if (transactional) + { + IOUtil.close(view); + } + } + } + + protected RESULT run(CDOView view) + { + CDOResourceNode node = getResourceNode(view); + RESULT result = run(node); + return result; + } + + protected RESULT run(CDOResourceNode node) + { + return null; + } + + private CDOView openView(boolean transactional) + { + CDOWorkspace workspace = getWorkspaceStore().getWorkspace(); + return transactional ? workspace.openTransaction() : getView(); + } + + private CDOResourceNode getResourceNode(CDOView view) + { + CDOResourceNode node = null; + + try + { + if (resourceNodeID == null) + { + node = AbstractResourceNodeStore.this.getResourceNode(view); + resourceNodeID = node.cdoID(); + } + else + { + node = (CDOResourceNode)view.getObject(resourceNodeID); + } + } + catch (Exception ex) + { + //$FALL-THROUGH$ + } + + return node; + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOProjectDescriptionStore.java b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOProjectDescriptionStore.java index 44531dc5a8..bd35a9e577 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOProjectDescriptionStore.java +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOProjectDescriptionStore.java @@ -1,144 +1,144 @@ -/*
- * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Eike Stepper - initial API and implementation
- */
-package org.eclipse.emf.cdo.workspace.internal.efs;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import java.io.File;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * @author Eike Stepper
- */
-public final class CDOProjectDescriptionStore extends AbstractFileStore
-{
- public static final String DESCRIPTION_FILE_NAME = ".project";
-
- private CDOWorkspaceStore workspaceStore;
-
- public CDOProjectDescriptionStore(CDOWorkspaceStore workspaceStore)
- {
- this.workspaceStore = workspaceStore;
- }
-
- public CDOWorkspaceStore getWorkspaceStore()
- {
- return workspaceStore;
- }
-
- @Override
- public IFileStore getParent()
- {
- return workspaceStore;
- }
-
- @Override
- public String getName()
- {
- return DESCRIPTION_FILE_NAME;
- }
-
- @Override
- public String[] childNames(int options, IProgressMonitor monitor) throws CoreException
- {
- return CDOWorkspaceFileSystem.NO_CHILD_NAMES;
- }
-
- @Override
- public IFileStore getChild(String name)
- {
- return new AbstractFileStore.Invalid(this, name);
- }
-
- @Override
- public void copy(IFileStore destination, int options, IProgressMonitor monitor) throws CoreException
- {
- getLocalFile().copy(destination, options, monitor);
- }
-
- @Override
- public void delete(int options, IProgressMonitor monitor) throws CoreException
- {
- getLocalFile().delete(options, monitor);
- }
-
- @Override
- public IFileInfo fetchInfo()
- {
- return getLocalFile().fetchInfo();
- }
-
- @Override
- public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException
- {
- return getLocalFile().fetchInfo(options, monitor);
- }
-
- @Override
- public IFileStore getFileStore(IPath path)
- {
- return getLocalFile().getFileStore(path);
- }
-
- @Override
- public boolean isParentOf(IFileStore other)
- {
- return getLocalFile().isParentOf(other);
- }
-
- @Override
- public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException
- {
- return getLocalFile().mkdir(options, monitor);
- }
-
- @Override
- public void move(IFileStore destination, int options, IProgressMonitor monitor) throws CoreException
- {
- getLocalFile().move(destination, options, monitor);
- }
-
- @Override
- public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException
- {
- return getLocalFile().openInputStream(options, monitor);
- }
-
- @Override
- public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException
- {
- return getLocalFile().openOutputStream(options, monitor);
- }
-
- @Override
- public void putInfo(IFileInfo info, int options, IProgressMonitor monitor) throws CoreException
- {
- getLocalFile().putInfo(info, options, monitor);
- }
-
- @Override
- public File toLocalFile(int options, IProgressMonitor monitor) throws CoreException
- {
- return getLocalFile().toLocalFile(options, monitor);
- }
-
- private IFileStore getLocalFile()
- {
- File file = new File(workspaceStore.getLocation(), DESCRIPTION_FILE_NAME);
- return EFS.getLocalFileSystem().fromLocalFile(file);
- }
-}
+/* + * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.workspace.internal.efs; + +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileInfo; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * @author Eike Stepper + */ +public final class CDOProjectDescriptionStore extends AbstractFileStore +{ + public static final String DESCRIPTION_FILE_NAME = ".project"; + + private CDOWorkspaceStore workspaceStore; + + public CDOProjectDescriptionStore(CDOWorkspaceStore workspaceStore) + { + this.workspaceStore = workspaceStore; + } + + public CDOWorkspaceStore getWorkspaceStore() + { + return workspaceStore; + } + + @Override + public IFileStore getParent() + { + return workspaceStore; + } + + @Override + public String getName() + { + return DESCRIPTION_FILE_NAME; + } + + @Override + public String[] childNames(int options, IProgressMonitor monitor) throws CoreException + { + return CDOWorkspaceFileSystem.NO_CHILD_NAMES; + } + + @Override + public IFileStore getChild(String name) + { + return new AbstractFileStore.Invalid(this, name); + } + + @Override + public void copy(IFileStore destination, int options, IProgressMonitor monitor) throws CoreException + { + getLocalFile().copy(destination, options, monitor); + } + + @Override + public void delete(int options, IProgressMonitor monitor) throws CoreException + { + getLocalFile().delete(options, monitor); + } + + @Override + public IFileInfo fetchInfo() + { + return getLocalFile().fetchInfo(); + } + + @Override + public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException + { + return getLocalFile().fetchInfo(options, monitor); + } + + @Override + public IFileStore getFileStore(IPath path) + { + return getLocalFile().getFileStore(path); + } + + @Override + public boolean isParentOf(IFileStore other) + { + return getLocalFile().isParentOf(other); + } + + @Override + public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException + { + return getLocalFile().mkdir(options, monitor); + } + + @Override + public void move(IFileStore destination, int options, IProgressMonitor monitor) throws CoreException + { + getLocalFile().move(destination, options, monitor); + } + + @Override + public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException + { + return getLocalFile().openInputStream(options, monitor); + } + + @Override + public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException + { + return getLocalFile().openOutputStream(options, monitor); + } + + @Override + public void putInfo(IFileInfo info, int options, IProgressMonitor monitor) throws CoreException + { + getLocalFile().putInfo(info, options, monitor); + } + + @Override + public File toLocalFile(int options, IProgressMonitor monitor) throws CoreException + { + return getLocalFile().toLocalFile(options, monitor); + } + + private IFileStore getLocalFile() + { + File file = new File(workspaceStore.getLocation(), DESCRIPTION_FILE_NAME); + return EFS.getLocalFileSystem().fromLocalFile(file); + } +} 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 b815635cf7..1b475b72a3 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 @@ -1,192 +1,192 @@ -/*
- * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Eike Stepper - initial API and implementation
- */
-package org.eclipse.emf.cdo.workspace.internal.efs;
-
-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.transaction.CDOTransaction;
-import org.eclipse.emf.cdo.view.CDOView;
-import org.eclipse.emf.cdo.workspace.internal.efs.CDOWorkspaceStore.SaveContext;
-import org.eclipse.emf.cdo.workspace.internal.efs.bundle.OM;
-
-import org.eclipse.net4j.util.WrappedException;
-
-import org.eclipse.emf.ecore.xmi.XMIResource;
-import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
-
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.List;
-
-/**
- * @author Eike Stepper
- */
-public final class CDOResourceNodeStore extends AbstractResourceNodeStore
-{
- private CDOWorkspaceStore workspaceStore;
-
- private AbstractResourceNodeStore parent;
-
- private String name;
-
- public CDOResourceNodeStore(CDOWorkspaceStore workspaceStore, AbstractResourceNodeStore parent, String name)
- {
- this.workspaceStore = workspaceStore;
- this.parent = parent;
- this.name = name;
- }
-
- @Override
- public AbstractResourceNodeStore getParent()
- {
- return parent;
- }
-
- @Override
- public String getName()
- {
- return name;
- }
-
- @Override
- public String getPath()
- {
- return parent.getPath() + "/" + name;
- }
-
- @Override
- public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException
- {
- return new ResourceNodeRunnable<InputStream>()
- {
- @Override
- protected InputStream run(CDOResourceNode node)
- {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- CDOResource resource = (CDOResource)node;
-
- try
- {
- resource.save(baos, null);
- }
- catch (Exception ex)
- {
- OM.LOG.error(ex);
- throw WrappedException.wrap(ex);
- }
-
- return new ByteArrayInputStream(baos.toByteArray());
- }
- }.run();
- }
-
- @Override
- public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException
- {
- return new ByteArrayOutputStream()
- {
- @Override
- public void close() throws IOException
- {
- byte[] bytes = toByteArray();
- InputStream in = new ByteArrayInputStream(bytes);
-
- XMIResource xmiResource = new XMIResourceImpl();
- xmiResource.load(in, null);
-
- String path = getPath();
- getWorkspaceStore().setLastModified(path, System.currentTimeMillis());
-
- SaveContext saveContext = getWorkspaceStore().getSaveContext();
- saveContext.save(xmiResource, path);
- }
- };
- }
-
- @Override
- public void delete(int options, IProgressMonitor monitor) throws CoreException
- {
- // Options can only contain EFS.NONE
- new ResourceNodeRunnable<Boolean>()
- {
- @Override
- protected Boolean run(CDOResourceNode node)
- {
- try
- {
- node.delete(null);
- return true;
- }
- catch (IOException ex)
- {
- throw WrappedException.wrap(ex);
- }
- }
- }.run(true);
- }
-
- @Override
- public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException
- {
- // TODO Respect the SHALLOW option
- new ResourceNodeRunnable<CDOResourceFolder>()
- {
- @Override
- protected CDOResourceFolder run(CDOView view)
- {
- String path = getPath();
- return ((CDOTransaction)view).getOrCreateResourceFolder(path);
- }
- }.run(true);
-
- return this;
- }
-
- @Override
- public CDOWorkspaceStore getWorkspaceStore()
- {
- return workspaceStore;
- }
-
- @Override
- protected CDOResourceNode getResourceNode(CDOView view)
- {
- return view.getResourceNode(getPath());
- }
-
- @Override
- protected boolean isDirectory(CDOResourceNode node)
- {
- return node instanceof CDOResourceFolder;
- }
-
- @Override
- protected void collectChildNames(CDOResourceNode node, List<String> childNames)
- {
- if (node instanceof CDOResourceFolder)
- {
- CDOResourceFolder folder = (CDOResourceFolder)node;
-
- for (CDOResourceNode child : folder.getNodes())
- {
- childNames.add(child.getName());
- }
- }
- }
-}
+/* + * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.workspace.internal.efs; + +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.transaction.CDOTransaction; +import org.eclipse.emf.cdo.view.CDOView; +import org.eclipse.emf.cdo.workspace.internal.efs.CDOWorkspaceStore.SaveContext; +import org.eclipse.emf.cdo.workspace.internal.efs.bundle.OM; + +import org.eclipse.net4j.util.WrappedException; + +import org.eclipse.emf.ecore.xmi.XMIResource; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl; + +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; + +/** + * @author Eike Stepper + */ +public final class CDOResourceNodeStore extends AbstractResourceNodeStore +{ + private CDOWorkspaceStore workspaceStore; + + private AbstractResourceNodeStore parent; + + private String name; + + public CDOResourceNodeStore(CDOWorkspaceStore workspaceStore, AbstractResourceNodeStore parent, String name) + { + this.workspaceStore = workspaceStore; + this.parent = parent; + this.name = name; + } + + @Override + public AbstractResourceNodeStore getParent() + { + return parent; + } + + @Override + public String getName() + { + return name; + } + + @Override + public String getPath() + { + return parent.getPath() + "/" + name; + } + + @Override + public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException + { + return new ResourceNodeRunnable<InputStream>() + { + @Override + protected InputStream run(CDOResourceNode node) + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + CDOResource resource = (CDOResource)node; + + try + { + resource.save(baos, null); + } + catch (Exception ex) + { + OM.LOG.error(ex); + throw WrappedException.wrap(ex); + } + + return new ByteArrayInputStream(baos.toByteArray()); + } + }.run(); + } + + @Override + public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException + { + return new ByteArrayOutputStream() + { + @Override + public void close() throws IOException + { + byte[] bytes = toByteArray(); + InputStream in = new ByteArrayInputStream(bytes); + + XMIResource xmiResource = new XMIResourceImpl(); + xmiResource.load(in, null); + + String path = getPath(); + getWorkspaceStore().setLastModified(path, System.currentTimeMillis()); + + SaveContext saveContext = getWorkspaceStore().getSaveContext(); + saveContext.save(xmiResource, path); + } + }; + } + + @Override + public void delete(int options, IProgressMonitor monitor) throws CoreException + { + // Options can only contain EFS.NONE + new ResourceNodeRunnable<Boolean>() + { + @Override + protected Boolean run(CDOResourceNode node) + { + try + { + node.delete(null); + return true; + } + catch (IOException ex) + { + throw WrappedException.wrap(ex); + } + } + }.run(true); + } + + @Override + public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException + { + // TODO Respect the SHALLOW option + new ResourceNodeRunnable<CDOResourceFolder>() + { + @Override + protected CDOResourceFolder run(CDOView view) + { + String path = getPath(); + return ((CDOTransaction)view).getOrCreateResourceFolder(path); + } + }.run(true); + + return this; + } + + @Override + public CDOWorkspaceStore getWorkspaceStore() + { + return workspaceStore; + } + + @Override + protected CDOResourceNode getResourceNode(CDOView view) + { + return view.getResourceNode(getPath()); + } + + @Override + protected boolean isDirectory(CDOResourceNode node) + { + return node instanceof CDOResourceFolder; + } + + @Override + protected void collectChildNames(CDOResourceNode node, List<String> childNames) + { + if (node instanceof CDOResourceFolder) + { + CDOResourceFolder folder = (CDOResourceFolder)node; + + for (CDOResourceNode child : folder.getNodes()) + { + childNames.add(child.getName()); + } + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOWorkspaceFileSystem.java b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOWorkspaceFileSystem.java index 3e98e2fc28..55ce6b27ab 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOWorkspaceFileSystem.java +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOWorkspaceFileSystem.java @@ -1,192 +1,192 @@ -/*
- * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Eike Stepper - initial API and implementation
- */
-package org.eclipse.emf.cdo.workspace.internal.efs;
-
-import org.eclipse.emf.cdo.workspace.CDOWorkspace;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.provider.FileSystem;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IPath;
-
-import java.io.File;
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-/**
- * @author Eike Stepper
- */
-public class CDOWorkspaceFileSystem extends FileSystem implements IResourceChangeListener
-{
- public static final String SCHEME = "cdo.workspace";
-
- public static final String[] NO_CHILD_NAMES = {};
-
- private static CDOWorkspaceFileSystem instance;
-
- /**
- * Maps {@link IProject} name to {@link IFileStore}.
- */
- private Map<String, CDOWorkspaceStore> workspaceStores = new HashMap<String, CDOWorkspaceStore>();
-
- /**
- * <code>true</code> if this {@link CDOWorkspaceFileSystem} is registered as an {@link IResourceChangeListener} with
- * the {@link IWorkspace}, <code>false</code> otherwise.
- */
- private boolean workspaceListenerRegistered;
-
- /**
- * Called once by the {@link IExtensionRegistry}.
- */
- public CDOWorkspaceFileSystem()
- {
- instance = this;
- }
-
- public static CDOWorkspaceFileSystem getInstance()
- {
- return instance;
- }
-
- @Override
- public int attributes()
- {
- return EFS.ATTRIBUTE_OTHER_READ | EFS.ATTRIBUTE_OTHER_WRITE;
- }
-
- @Override
- public boolean isCaseSensitive()
- {
- return true;
- }
-
- @Override
- public IFileStore getStore(URI uri)
- {
- String path = uri.getSchemeSpecificPart();
- StringTokenizer tokenizer = new StringTokenizer(path, "/");
- String name = tokenizer.nextToken();
-
- IFileStore store = getWorkspaceStore(name);
-
- while (tokenizer.hasMoreTokens())
- {
- name = tokenizer.nextToken();
- store = store.getChild(name);
- }
-
- return store;
- }
-
- public void resourceChanged(IResourceChangeEvent event)
- {
- IResourceDelta delta = event.getDelta();
- if (delta != null)
- {
- IResourceDelta[] deltas = delta.getAffectedChildren();
- projectsChanged(deltas);
- }
- }
-
- private void projectsChanged(IResourceDelta[] deltas)
- {
- for (IResourceDelta delta : deltas)
- {
- int kind = delta.getKind();
- boolean removed = kind == IResourceDelta.REMOVED;
- if (!removed)
- {
- int flags = delta.getFlags();
- if ((flags & IResourceDelta.OPEN) != 0)
- {
- IProject project = (IProject)delta.getResource();
- removed = !project.isOpen();
- }
- }
-
- if (removed)
- {
- String name = delta.getFullPath().segment(0);
-
- CDOWorkspaceStore store;
- synchronized (workspaceStores)
- {
- store = workspaceStores.remove(name);
-
- if (workspaceStores.isEmpty())
- {
- ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
- workspaceListenerRegistered = false;
- }
- }
-
- if (store != null)
- {
- store.dispose();
- }
- }
- }
- }
-
- public CDOWorkspaceStore addWorkspaceStore(String name, CDOWorkspace workspace)
- {
- synchronized (workspaceStores)
- {
- CDOWorkspaceStore store = createWorkspaceStore(name);
- store.setWorkspace(workspace);
- addWorkspaceStore(store);
- return store;
- }
- }
-
- private void addWorkspaceStore(IFileStore store)
- {
- workspaceStores.put(store.getName(), (CDOWorkspaceStore)store);
-
- if (!workspaceListenerRegistered)
- {
- ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
- workspaceListenerRegistered = true;
- }
- }
-
- private IFileStore getWorkspaceStore(String name)
- {
- synchronized (workspaceStores)
- {
- IFileStore store = workspaceStores.get(name);
- if (store == null)
- {
- store = createWorkspaceStore(name);
- addWorkspaceStore(store);
- }
-
- return store;
- }
- }
-
- private CDOWorkspaceStore createWorkspaceStore(String name)
- {
- IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
- IPath location = root.getLocation().append(name);
- return new CDOWorkspaceStore(name, new File(location.toOSString()));
- }
-}
+/* + * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.workspace.internal.efs; + +import org.eclipse.emf.cdo.workspace.CDOWorkspace; + +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.filesystem.provider.FileSystem; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.IPath; + +import java.io.File; +import java.net.URI; +import java.util.HashMap; +import java.util.Map; +import java.util.StringTokenizer; + +/** + * @author Eike Stepper + */ +public class CDOWorkspaceFileSystem extends FileSystem implements IResourceChangeListener +{ + public static final String SCHEME = "cdo.workspace"; + + public static final String[] NO_CHILD_NAMES = {}; + + private static CDOWorkspaceFileSystem instance; + + /** + * Maps {@link IProject} name to {@link IFileStore}. + */ + private Map<String, CDOWorkspaceStore> workspaceStores = new HashMap<String, CDOWorkspaceStore>(); + + /** + * <code>true</code> if this {@link CDOWorkspaceFileSystem} is registered as an {@link IResourceChangeListener} with + * the {@link IWorkspace}, <code>false</code> otherwise. + */ + private boolean workspaceListenerRegistered; + + /** + * Called once by the {@link IExtensionRegistry}. + */ + public CDOWorkspaceFileSystem() + { + instance = this; + } + + public static CDOWorkspaceFileSystem getInstance() + { + return instance; + } + + @Override + public int attributes() + { + return EFS.ATTRIBUTE_OTHER_READ | EFS.ATTRIBUTE_OTHER_WRITE; + } + + @Override + public boolean isCaseSensitive() + { + return true; + } + + @Override + public IFileStore getStore(URI uri) + { + String path = uri.getSchemeSpecificPart(); + StringTokenizer tokenizer = new StringTokenizer(path, "/"); + String name = tokenizer.nextToken(); + + IFileStore store = getWorkspaceStore(name); + + while (tokenizer.hasMoreTokens()) + { + name = tokenizer.nextToken(); + store = store.getChild(name); + } + + return store; + } + + public void resourceChanged(IResourceChangeEvent event) + { + IResourceDelta delta = event.getDelta(); + if (delta != null) + { + IResourceDelta[] deltas = delta.getAffectedChildren(); + projectsChanged(deltas); + } + } + + private void projectsChanged(IResourceDelta[] deltas) + { + for (IResourceDelta delta : deltas) + { + int kind = delta.getKind(); + boolean removed = kind == IResourceDelta.REMOVED; + if (!removed) + { + int flags = delta.getFlags(); + if ((flags & IResourceDelta.OPEN) != 0) + { + IProject project = (IProject)delta.getResource(); + removed = !project.isOpen(); + } + } + + if (removed) + { + String name = delta.getFullPath().segment(0); + + CDOWorkspaceStore store; + synchronized (workspaceStores) + { + store = workspaceStores.remove(name); + + if (workspaceStores.isEmpty()) + { + ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); + workspaceListenerRegistered = false; + } + } + + if (store != null) + { + store.dispose(); + } + } + } + } + + public CDOWorkspaceStore addWorkspaceStore(String name, CDOWorkspace workspace) + { + synchronized (workspaceStores) + { + CDOWorkspaceStore store = createWorkspaceStore(name); + store.setWorkspace(workspace); + addWorkspaceStore(store); + return store; + } + } + + private void addWorkspaceStore(IFileStore store) + { + workspaceStores.put(store.getName(), (CDOWorkspaceStore)store); + + if (!workspaceListenerRegistered) + { + ResourcesPlugin.getWorkspace().addResourceChangeListener(this); + workspaceListenerRegistered = true; + } + } + + private IFileStore getWorkspaceStore(String name) + { + synchronized (workspaceStores) + { + IFileStore store = workspaceStores.get(name); + if (store == null) + { + store = createWorkspaceStore(name); + addWorkspaceStore(store); + } + + return store; + } + } + + private CDOWorkspaceStore createWorkspaceStore(String name) + { + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + IPath location = root.getLocation().append(name); + return new CDOWorkspaceStore(name, new File(location.toOSString())); + } +} diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOWorkspaceStore.java b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOWorkspaceStore.java index ba4a22df73..b0625750e6 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOWorkspaceStore.java +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/CDOWorkspaceStore.java @@ -1,619 +1,619 @@ -/*
- * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Eike Stepper - initial API and implementation
- */
-package org.eclipse.emf.cdo.workspace.internal.efs;
-
-import org.eclipse.emf.cdo.CDOObject;
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.id.CDOIDUtil;
-import org.eclipse.emf.cdo.eresource.CDOResource;
-import org.eclipse.emf.cdo.eresource.CDOResourceNode;
-import org.eclipse.emf.cdo.transaction.CDOTransaction;
-import org.eclipse.emf.cdo.util.CDOUtil;
-import org.eclipse.emf.cdo.util.CommitException;
-import org.eclipse.emf.cdo.view.CDOView;
-import org.eclipse.emf.cdo.workspace.CDOWorkspace;
-import org.eclipse.emf.cdo.workspace.efs.CDOFS;
-
-import org.eclipse.net4j.util.WrappedException;
-import org.eclipse.net4j.util.io.IOUtil;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.xmi.XMIResource;
-import org.eclipse.emf.spi.cdo.InternalCDOObject;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import java.io.File;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * @author Eike Stepper
- */
-public final class CDOWorkspaceStore extends AbstractResourceNodeStore
-{
- private static final AbstractResourceNodeStore NO_PARENT = null;
-
- private String name;
-
- private File location;
-
- private CDOWorkspace workspace;
-
- private Map<String, Long> lastModifiedTimes = new HashMap<String, Long>();
-
- private CDOView view;
-
- private SaveContext saveContext;
-
- public CDOWorkspaceStore(String name, File location)
- {
- this.name = name;
- this.location = location;
- }
-
- public File getLocation()
- {
- return location;
- }
-
- public synchronized CDOWorkspace getWorkspace()
- {
- if (workspace == null)
- {
- workspace = openWorkspace();
- }
-
- return workspace;
- }
-
- public synchronized void setWorkspace(CDOWorkspace workspace)
- {
- this.workspace = workspace;
- }
-
- private CDOWorkspace openWorkspace()
- {
- try
- {
- return CDOFS.open(name, location);
- }
- catch (Exception ex)
- {
- throw WrappedException.wrap(ex);
- }
- }
-
- @Override
- public AbstractResourceNodeStore getParent()
- {
- return NO_PARENT;
- }
-
- @Override
- public String getName()
- {
- return name;
- }
-
- @Override
- public URI toURI()
- {
- try
- {
- return new URI(CDOWorkspaceFileSystem.SCHEME + "://" + name);
- }
- catch (URISyntaxException ex)
- {
- throw WrappedException.wrap(ex);
- }
- }
-
- @Override
- public IFileStore getChild(String name)
- {
- if (CDOProjectDescriptionStore.DESCRIPTION_FILE_NAME.equals(name))
- {
- return new CDOProjectDescriptionStore(this);
- }
-
- return super.getChild(name);
- }
-
- @Override
- public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException
- {
- return this;
- }
-
- @Override
- public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException
- {
- throw new UnsupportedOperationException();
- }
-
- public void dispose()
- {
- if (view != null)
- {
- IOUtil.close(view);
- view = null;
- }
- }
-
- @Override
- public CDOWorkspaceStore getWorkspaceStore()
- {
- return this;
- }
-
- public long getLastModified(String path)
- {
- Long time = lastModifiedTimes.get(path);
- return time == null ? EFS.NONE : time;
- }
-
- public void setLastModified(String path, long time)
- {
- lastModifiedTimes.put(path, time);
- // TODO Save lastModifiedTimes
- }
-
- public SaveContext getSaveContext()
- {
- if (saveContext == null)
- {
- saveContext = new SaveContext();
- }
-
- return saveContext;
- }
-
- @Override
- public String getPath()
- {
- return "";
- }
-
- @Override
- protected synchronized CDOView getView()
- {
- if (view == null)
- {
- view = workspace.openView();
- }
-
- return view;
- }
-
- @Override
- protected CDOResourceNode getResourceNode(CDOView view)
- {
- return view.getRootResource();
- }
-
- @Override
- protected boolean isDirectory(CDOResourceNode node)
- {
- return true;
- }
-
- @Override
- protected void collectChildNames(CDOResourceNode node, List<String> childNames)
- {
- childNames.add(CDOProjectDescriptionStore.DESCRIPTION_FILE_NAME);
-
- CDOResource rootResource = (CDOResource)node;
- for (EObject content : rootResource.getContents())
- {
- if (content instanceof CDOResourceNode)
- {
- CDOResourceNode child = (CDOResourceNode)content;
- childNames.add(child.getName());
- }
- }
- }
-
- /**
- * @author Eike Stepper
- */
- public final class SaveContext
- {
- private CDOTransaction transaction = workspace.openTransaction();
-
- private Map<String, InternalCDOObject> newObjects = new HashMap<String, InternalCDOObject>();
-
- private Map<String, List<ForwardReference>> forwardReferences = new HashMap<String, List<ForwardReference>>();
-
- private XMIResource xmiResource;
-
- public SaveContext()
- {
- }
-
- public void save(XMIResource xmiResource, String cdoPath)
- {
- this.xmiResource = xmiResource;
-
- try
- {
- CDOResource cdoResource = transaction.getOrCreateResource(cdoPath);
- saveContents(xmiResource.getContents(), cdoResource.getContents());
- }
- finally
- {
- this.xmiResource = null;
- done();
- }
- }
-
- private void saveContents(EList<EObject> xmiContents, EList<EObject> cdoContents)
- {
- int size = xmiContents.size();
- for (int i = 0; i < size; i++)
- {
- EObject xmiObject = xmiContents.get(i);
- CDOObject cdoObject = getCDOObjectByXMIID(xmiObject);
- if (cdoObject == null)
- {
- cdoObject = createNewCDOObject(xmiObject);
- cdoContents.add(i, cdoObject);
- }
- else
- {
- int index = cdoContents.indexOf(cdoObject);
- if (index != -1)
- {
- if (index != i)
- {
- cdoContents.move(i, index);
- }
- }
- else
- {
- cdoContents.add(i, cdoObject);
- }
- }
-
- saveObject((InternalEObject)xmiObject, (InternalCDOObject)cdoObject);
- }
-
- shortenList(cdoContents, size);
- }
-
- private void saveObject(InternalEObject xmiObject, InternalCDOObject cdoObject)
- {
- // CDOClassInfo classInfo = cdoObject.cdoRevision().getClassInfo();
- for (EStructuralFeature feature : xmiObject.eClass().getEAllStructuralFeatures())
- {
- Object xmiValue = xmiObject.eGet(feature);
- if (feature instanceof EReference)
- {
- EReference reference = (EReference)feature;
- if (reference.isContainment())
- {
- if (reference.isMany())
- {
- // Many-valued containment reference
- @SuppressWarnings("unchecked")
- EList<EObject> xmiContents = (EList<EObject>)xmiValue;
-
- @SuppressWarnings("unchecked")
- EList<EObject> cdoContents = (EList<EObject>)cdoObject.eGet(reference);
-
- saveContents(xmiContents, cdoContents);
- }
- else
- {
- // Single-valued containment reference
- if (xmiValue != null)
- {
- InternalCDOObject cdoValue = getCDOObjectByXMIID((EObject)xmiValue);
- if (cdoValue == null)
- {
- cdoValue = createNewCDOObject((EObject)xmiValue);
- }
-
- cdoObject.eSet(reference, cdoValue);
- saveObject((InternalEObject)xmiValue, cdoValue);
- }
- else
- {
- cdoObject.eSet(reference, null);
- }
- }
- }
- else
- {
- if (reference.isMany())
- {
- // Many-valued cross reference
- @SuppressWarnings("unchecked")
- EList<EObject> xmiElements = (EList<EObject>)xmiValue;
-
- @SuppressWarnings("unchecked")
- EList<EObject> cdoElements = (EList<EObject>)cdoObject.eGet(reference);
-
- int size = xmiElements.size();
- for (int i = 0; i < size; i++)
- {
- InternalEObject xmiElement = (InternalEObject)xmiElements.get(i);
- InternalCDOObject cdoElement;
-
- org.eclipse.emf.common.util.URI eProxyURI = xmiElement.eProxyURI();
- if (eProxyURI != null)
- {
- String href = eProxyURI.fragment();
- cdoElement = getCDOObjectByHREF(href);
- if (cdoElement == null)
- {
- registerForwardReference(cdoObject, reference, i, href);
-
- InternalCDOObject dummy = createNewCDOObject(xmiElement);
- cdoElements.add(i, dummy);
- continue;
- }
- }
- else
- {
- cdoElement = getCDOObjectByXMIID(xmiElement);
- }
-
- int index = cdoElements.indexOf(cdoElement);
- if (index != -1)
- {
- cdoElements.move(i, index);
- }
- else
- {
- cdoElements.add(i, cdoElement);
- }
- }
-
- shortenList(cdoElements, size);
- }
- else
- {
- // Single-valued cross reference
- CDOObject cdoValue = null;
- if (xmiValue != null)
- {
- org.eclipse.emf.common.util.URI eProxyURI = ((InternalEObject)xmiValue).eProxyURI();
- if (eProxyURI != null)
- {
- String href = eProxyURI.fragment();
- cdoValue = getCDOObjectByHREF(href);
- if (cdoValue == null)
- {
- registerForwardReference(cdoObject, reference, -1, href);
- }
- }
- else
- {
- cdoValue = getCDOObjectByXMIID((EObject)xmiValue);
- }
- }
-
- cdoObject.eSet(reference, cdoValue);
- }
- }
- }
- else
- {
- EAttribute attribute = (EAttribute)feature;
- if (attribute.isMany())
- {
- // Many-valued attribute
- @SuppressWarnings("unchecked")
- EList<Object> xmiElements = (EList<Object>)xmiValue;
-
- @SuppressWarnings("unchecked")
- EList<Object> cdoElements = (EList<Object>)cdoObject.eGet(attribute);
- cdoElements.clear();
-
- int size = xmiElements.size();
- for (int i = 0; i < size; i++)
- {
- Object xmiElement = xmiElements.get(i);
- cdoElements.add(xmiElement);
- }
- }
- else
- {
- // Single-valued attribute
- cdoObject.eSet(attribute, xmiValue);
- }
- }
- }
- }
-
- private InternalCDOObject getCDOObjectByXMIID(EObject xmiObject)
- {
- String xmiID = xmiResource.getID(xmiObject);
- if (xmiID != null)
- {
- try
- {
- CDOID id = CDOIDUtil.read(xmiID);
- if (!CDOIDUtil.isNull(id))
- {
- return (InternalCDOObject)transaction.getObject(id);
- }
- }
- catch (Exception ex)
- {
- ex.printStackTrace();
- //$FALL-THROUGH$
- }
- }
-
- return null;
- }
-
- private InternalCDOObject createNewCDOObject(EObject xmiObject)
- {
- // Create new object
- EObject newInstance = EcoreUtil.create(xmiObject.eClass());
- InternalCDOObject cdoObject = (InternalCDOObject)CDOUtil.getCDOObject(newInstance);
-
- // Remember new object
- String fragment = xmiResource.getURIFragment(xmiObject);
- newObjects.put(fragment, cdoObject);
-
- return cdoObject;
- }
-
- private void shortenList(EList<EObject> list, int size)
- {
- int remove = list.size() - size;
- while (remove-- != 0)
- {
- list.remove(list.size() - 1);
- }
- }
-
- private InternalCDOObject getCDOObjectByHREF(String href)
- {
- InternalCDOObject cdoObject = null;
-
- try
- {
- CDOID id = CDOIDUtil.read(href);
- cdoObject = (InternalCDOObject)transaction.getObject(id);
- }
- catch (Exception ex)
- {
- //$FALL-THROUGH$
- }
-
- if (cdoObject == null)
- {
- cdoObject = newObjects.get(href);
- }
-
- return cdoObject;
- }
-
- private void done()
- {
- if (resolveForwardReferences())
- {
- commit();
- }
- }
-
- private void registerForwardReference(InternalCDOObject cdoObject, EReference reference, int index, String href)
- {
- List<ForwardReference> list = forwardReferences.get(href);
- if (list == null)
- {
- list = new ArrayList<ForwardReference>();
- forwardReferences.put(href, list);
- }
-
- list.add(new ForwardReference(cdoObject, reference, index));
- }
-
- private boolean resolveForwardReferences()
- {
- Set<Entry<String, List<ForwardReference>>> entrySet = forwardReferences.entrySet();
- for (Iterator<Entry<String, List<ForwardReference>>> it = entrySet.iterator(); it.hasNext();)
- {
- Entry<String, List<ForwardReference>> entry = it.next();
- String href = entry.getKey();
-
- InternalCDOObject target = getCDOObjectByHREF(href);
- if (target != null)
- {
- List<ForwardReference> list = entry.getValue();
- for (ForwardReference forwardReference : list)
- {
- forwardReference.resolve(target);
- }
-
- it.remove();
- }
- }
-
- return forwardReferences.isEmpty();
- }
-
- private void commit()
- {
- try
- {
- transaction.commit();
- }
- catch (CommitException ex)
- {
- throw WrappedException.wrap(ex);
- }
- finally
- {
- IOUtil.closeSilent(transaction);
- transaction = null;
- forwardReferences = null;
- newObjects = null;
- saveContext = null;
- }
- }
-
- /**
- * @author Eike Stepper
- */
- private final class ForwardReference
- {
- private InternalCDOObject source;
-
- private EReference reference;
-
- private int index;
-
- public ForwardReference(InternalCDOObject source, EReference reference, int index)
- {
- this.source = source;
- this.reference = reference;
- this.index = index;
- }
-
- public void resolve(InternalCDOObject target)
- {
- if (reference.isMany())
- {
- @SuppressWarnings("unchecked")
- EList<EObject> list = (EList<EObject>)source.eGet(reference);
- list.set(index, target);
- }
- else
- {
- source.eSet(reference, target);
- }
- }
- }
- }
-}
+/* + * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.workspace.internal.efs; + +import org.eclipse.emf.cdo.CDOObject; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.eresource.CDOResourceNode; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.util.CDOUtil; +import org.eclipse.emf.cdo.util.CommitException; +import org.eclipse.emf.cdo.view.CDOView; +import org.eclipse.emf.cdo.workspace.CDOWorkspace; +import org.eclipse.emf.cdo.workspace.efs.CDOFS; + +import org.eclipse.net4j.util.WrappedException; +import org.eclipse.net4j.util.io.IOUtil; + +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.InternalEObject; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.emf.ecore.xmi.XMIResource; +import org.eclipse.emf.spi.cdo.InternalCDOObject; + +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +import java.io.File; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +/** + * @author Eike Stepper + */ +public final class CDOWorkspaceStore extends AbstractResourceNodeStore +{ + private static final AbstractResourceNodeStore NO_PARENT = null; + + private String name; + + private File location; + + private CDOWorkspace workspace; + + private Map<String, Long> lastModifiedTimes = new HashMap<String, Long>(); + + private CDOView view; + + private SaveContext saveContext; + + public CDOWorkspaceStore(String name, File location) + { + this.name = name; + this.location = location; + } + + public File getLocation() + { + return location; + } + + public synchronized CDOWorkspace getWorkspace() + { + if (workspace == null) + { + workspace = openWorkspace(); + } + + return workspace; + } + + public synchronized void setWorkspace(CDOWorkspace workspace) + { + this.workspace = workspace; + } + + private CDOWorkspace openWorkspace() + { + try + { + return CDOFS.open(name, location); + } + catch (Exception ex) + { + throw WrappedException.wrap(ex); + } + } + + @Override + public AbstractResourceNodeStore getParent() + { + return NO_PARENT; + } + + @Override + public String getName() + { + return name; + } + + @Override + public URI toURI() + { + try + { + return new URI(CDOWorkspaceFileSystem.SCHEME + "://" + name); + } + catch (URISyntaxException ex) + { + throw WrappedException.wrap(ex); + } + } + + @Override + public IFileStore getChild(String name) + { + if (CDOProjectDescriptionStore.DESCRIPTION_FILE_NAME.equals(name)) + { + return new CDOProjectDescriptionStore(this); + } + + return super.getChild(name); + } + + @Override + public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException + { + return this; + } + + @Override + public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException + { + throw new UnsupportedOperationException(); + } + + public void dispose() + { + if (view != null) + { + IOUtil.close(view); + view = null; + } + } + + @Override + public CDOWorkspaceStore getWorkspaceStore() + { + return this; + } + + public long getLastModified(String path) + { + Long time = lastModifiedTimes.get(path); + return time == null ? EFS.NONE : time; + } + + public void setLastModified(String path, long time) + { + lastModifiedTimes.put(path, time); + // TODO Save lastModifiedTimes + } + + public SaveContext getSaveContext() + { + if (saveContext == null) + { + saveContext = new SaveContext(); + } + + return saveContext; + } + + @Override + public String getPath() + { + return ""; + } + + @Override + protected synchronized CDOView getView() + { + if (view == null) + { + view = workspace.openView(); + } + + return view; + } + + @Override + protected CDOResourceNode getResourceNode(CDOView view) + { + return view.getRootResource(); + } + + @Override + protected boolean isDirectory(CDOResourceNode node) + { + return true; + } + + @Override + protected void collectChildNames(CDOResourceNode node, List<String> childNames) + { + childNames.add(CDOProjectDescriptionStore.DESCRIPTION_FILE_NAME); + + CDOResource rootResource = (CDOResource)node; + for (EObject content : rootResource.getContents()) + { + if (content instanceof CDOResourceNode) + { + CDOResourceNode child = (CDOResourceNode)content; + childNames.add(child.getName()); + } + } + } + + /** + * @author Eike Stepper + */ + public final class SaveContext + { + private CDOTransaction transaction = workspace.openTransaction(); + + private Map<String, InternalCDOObject> newObjects = new HashMap<String, InternalCDOObject>(); + + private Map<String, List<ForwardReference>> forwardReferences = new HashMap<String, List<ForwardReference>>(); + + private XMIResource xmiResource; + + public SaveContext() + { + } + + public void save(XMIResource xmiResource, String cdoPath) + { + this.xmiResource = xmiResource; + + try + { + CDOResource cdoResource = transaction.getOrCreateResource(cdoPath); + saveContents(xmiResource.getContents(), cdoResource.getContents()); + } + finally + { + this.xmiResource = null; + done(); + } + } + + private void saveContents(EList<EObject> xmiContents, EList<EObject> cdoContents) + { + int size = xmiContents.size(); + for (int i = 0; i < size; i++) + { + EObject xmiObject = xmiContents.get(i); + CDOObject cdoObject = getCDOObjectByXMIID(xmiObject); + if (cdoObject == null) + { + cdoObject = createNewCDOObject(xmiObject); + cdoContents.add(i, cdoObject); + } + else + { + int index = cdoContents.indexOf(cdoObject); + if (index != -1) + { + if (index != i) + { + cdoContents.move(i, index); + } + } + else + { + cdoContents.add(i, cdoObject); + } + } + + saveObject((InternalEObject)xmiObject, (InternalCDOObject)cdoObject); + } + + shortenList(cdoContents, size); + } + + private void saveObject(InternalEObject xmiObject, InternalCDOObject cdoObject) + { + // CDOClassInfo classInfo = cdoObject.cdoRevision().getClassInfo(); + for (EStructuralFeature feature : xmiObject.eClass().getEAllStructuralFeatures()) + { + Object xmiValue = xmiObject.eGet(feature); + if (feature instanceof EReference) + { + EReference reference = (EReference)feature; + if (reference.isContainment()) + { + if (reference.isMany()) + { + // Many-valued containment reference + @SuppressWarnings("unchecked") + EList<EObject> xmiContents = (EList<EObject>)xmiValue; + + @SuppressWarnings("unchecked") + EList<EObject> cdoContents = (EList<EObject>)cdoObject.eGet(reference); + + saveContents(xmiContents, cdoContents); + } + else + { + // Single-valued containment reference + if (xmiValue != null) + { + InternalCDOObject cdoValue = getCDOObjectByXMIID((EObject)xmiValue); + if (cdoValue == null) + { + cdoValue = createNewCDOObject((EObject)xmiValue); + } + + cdoObject.eSet(reference, cdoValue); + saveObject((InternalEObject)xmiValue, cdoValue); + } + else + { + cdoObject.eSet(reference, null); + } + } + } + else + { + if (reference.isMany()) + { + // Many-valued cross reference + @SuppressWarnings("unchecked") + EList<EObject> xmiElements = (EList<EObject>)xmiValue; + + @SuppressWarnings("unchecked") + EList<EObject> cdoElements = (EList<EObject>)cdoObject.eGet(reference); + + int size = xmiElements.size(); + for (int i = 0; i < size; i++) + { + InternalEObject xmiElement = (InternalEObject)xmiElements.get(i); + InternalCDOObject cdoElement; + + org.eclipse.emf.common.util.URI eProxyURI = xmiElement.eProxyURI(); + if (eProxyURI != null) + { + String href = eProxyURI.fragment(); + cdoElement = getCDOObjectByHREF(href); + if (cdoElement == null) + { + registerForwardReference(cdoObject, reference, i, href); + + InternalCDOObject dummy = createNewCDOObject(xmiElement); + cdoElements.add(i, dummy); + continue; + } + } + else + { + cdoElement = getCDOObjectByXMIID(xmiElement); + } + + int index = cdoElements.indexOf(cdoElement); + if (index != -1) + { + cdoElements.move(i, index); + } + else + { + cdoElements.add(i, cdoElement); + } + } + + shortenList(cdoElements, size); + } + else + { + // Single-valued cross reference + CDOObject cdoValue = null; + if (xmiValue != null) + { + org.eclipse.emf.common.util.URI eProxyURI = ((InternalEObject)xmiValue).eProxyURI(); + if (eProxyURI != null) + { + String href = eProxyURI.fragment(); + cdoValue = getCDOObjectByHREF(href); + if (cdoValue == null) + { + registerForwardReference(cdoObject, reference, -1, href); + } + } + else + { + cdoValue = getCDOObjectByXMIID((EObject)xmiValue); + } + } + + cdoObject.eSet(reference, cdoValue); + } + } + } + else + { + EAttribute attribute = (EAttribute)feature; + if (attribute.isMany()) + { + // Many-valued attribute + @SuppressWarnings("unchecked") + EList<Object> xmiElements = (EList<Object>)xmiValue; + + @SuppressWarnings("unchecked") + EList<Object> cdoElements = (EList<Object>)cdoObject.eGet(attribute); + cdoElements.clear(); + + int size = xmiElements.size(); + for (int i = 0; i < size; i++) + { + Object xmiElement = xmiElements.get(i); + cdoElements.add(xmiElement); + } + } + else + { + // Single-valued attribute + cdoObject.eSet(attribute, xmiValue); + } + } + } + } + + private InternalCDOObject getCDOObjectByXMIID(EObject xmiObject) + { + String xmiID = xmiResource.getID(xmiObject); + if (xmiID != null) + { + try + { + CDOID id = CDOIDUtil.read(xmiID); + if (!CDOIDUtil.isNull(id)) + { + return (InternalCDOObject)transaction.getObject(id); + } + } + catch (Exception ex) + { + ex.printStackTrace(); + //$FALL-THROUGH$ + } + } + + return null; + } + + private InternalCDOObject createNewCDOObject(EObject xmiObject) + { + // Create new object + EObject newInstance = EcoreUtil.create(xmiObject.eClass()); + InternalCDOObject cdoObject = (InternalCDOObject)CDOUtil.getCDOObject(newInstance); + + // Remember new object + String fragment = xmiResource.getURIFragment(xmiObject); + newObjects.put(fragment, cdoObject); + + return cdoObject; + } + + private void shortenList(EList<EObject> list, int size) + { + int remove = list.size() - size; + while (remove-- != 0) + { + list.remove(list.size() - 1); + } + } + + private InternalCDOObject getCDOObjectByHREF(String href) + { + InternalCDOObject cdoObject = null; + + try + { + CDOID id = CDOIDUtil.read(href); + cdoObject = (InternalCDOObject)transaction.getObject(id); + } + catch (Exception ex) + { + //$FALL-THROUGH$ + } + + if (cdoObject == null) + { + cdoObject = newObjects.get(href); + } + + return cdoObject; + } + + private void done() + { + if (resolveForwardReferences()) + { + commit(); + } + } + + private void registerForwardReference(InternalCDOObject cdoObject, EReference reference, int index, String href) + { + List<ForwardReference> list = forwardReferences.get(href); + if (list == null) + { + list = new ArrayList<ForwardReference>(); + forwardReferences.put(href, list); + } + + list.add(new ForwardReference(cdoObject, reference, index)); + } + + private boolean resolveForwardReferences() + { + Set<Entry<String, List<ForwardReference>>> entrySet = forwardReferences.entrySet(); + for (Iterator<Entry<String, List<ForwardReference>>> it = entrySet.iterator(); it.hasNext();) + { + Entry<String, List<ForwardReference>> entry = it.next(); + String href = entry.getKey(); + + InternalCDOObject target = getCDOObjectByHREF(href); + if (target != null) + { + List<ForwardReference> list = entry.getValue(); + for (ForwardReference forwardReference : list) + { + forwardReference.resolve(target); + } + + it.remove(); + } + } + + return forwardReferences.isEmpty(); + } + + private void commit() + { + try + { + transaction.commit(); + } + catch (CommitException ex) + { + throw WrappedException.wrap(ex); + } + finally + { + IOUtil.closeSilent(transaction); + transaction = null; + forwardReferences = null; + newObjects = null; + saveContext = null; + } + } + + /** + * @author Eike Stepper + */ + private final class ForwardReference + { + private InternalCDOObject source; + + private EReference reference; + + private int index; + + public ForwardReference(InternalCDOObject source, EReference reference, int index) + { + this.source = source; + this.reference = reference; + this.index = index; + } + + public void resolve(InternalCDOObject target) + { + if (reference.isMany()) + { + @SuppressWarnings("unchecked") + EList<EObject> list = (EList<EObject>)source.eGet(reference); + list.set(index, target); + } + else + { + source.eSet(reference, target); + } + } + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/bundle/OM.java b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/bundle/OM.java index 087eb5b0fa..ef40ccc879 100644 --- a/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/bundle/OM.java +++ b/plugins/org.eclipse.emf.cdo.workspace.efs/src/org/eclipse/emf/cdo/workspace/internal/efs/bundle/OM.java @@ -1,44 +1,44 @@ -/*
- * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Eike Stepper - initial API and implementation
- */
-package org.eclipse.emf.cdo.workspace.internal.efs.bundle;
-
-import org.eclipse.net4j.util.om.OMBundle;
-import org.eclipse.net4j.util.om.OMPlatform;
-import org.eclipse.net4j.util.om.OSGiActivator;
-import org.eclipse.net4j.util.om.log.OMLogger;
-import org.eclipse.net4j.util.om.trace.OMTracer;
-
-/**
- * The <em>Operations & Maintenance</em> class of this bundle.
- *
- * @author Eike Stepper
- */
-public abstract class OM
-{
- public static final String BUNDLE_ID = "org.eclipse.emf.cdo.workspace.efs"; //$NON-NLS-1$
-
- public static final OMBundle BUNDLE = OMPlatform.INSTANCE.bundle(BUNDLE_ID, OM.class);
-
- public static final OMTracer DEBUG = BUNDLE.tracer("debug"); //$NON-NLS-1$
-
- public static final OMLogger LOG = BUNDLE.logger();
-
- /**
- * @author Eike Stepper
- */
- public static final class Activator extends OSGiActivator
- {
- public Activator()
- {
- super(BUNDLE);
- }
- }
-}
+/* + * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.workspace.internal.efs.bundle; + +import org.eclipse.net4j.util.om.OMBundle; +import org.eclipse.net4j.util.om.OMPlatform; +import org.eclipse.net4j.util.om.OSGiActivator; +import org.eclipse.net4j.util.om.log.OMLogger; +import org.eclipse.net4j.util.om.trace.OMTracer; + +/** + * The <em>Operations & Maintenance</em> class of this bundle. + * + * @author Eike Stepper + */ +public abstract class OM +{ + public static final String BUNDLE_ID = "org.eclipse.emf.cdo.workspace.efs"; //$NON-NLS-1$ + + public static final OMBundle BUNDLE = OMPlatform.INSTANCE.bundle(BUNDLE_ID, OM.class); + + public static final OMTracer DEBUG = BUNDLE.tracer("debug"); //$NON-NLS-1$ + + public static final OMLogger LOG = BUNDLE.logger(); + + /** + * @author Eike Stepper + */ + public static final class Activator extends OSGiActivator + { + public Activator() + { + super(BUNDLE); + } + } +} |