diff options
8 files changed, 333 insertions, 127 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java index fec39e6b33..c0f34f41fc 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java @@ -479,7 +479,7 @@ public class DBStoreAccessor implements IDBStoreAccessor { IRepository repository = store.getRepository(); IPackageManager packageManager = repository.getPackageManager(); - CDOClassRef type = repository.getObjectType(this, id); + CDOClassRef type = repository.getTypeManager().getObjectType(this, id); return (CDOClassImpl)type.resolve(packageManager); } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ObjectTypeMap.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ObjectTypeMap.java deleted file mode 100644 index 34f5424b5e..0000000000 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ObjectTypeMap.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.eclipse.emf.cdo.internal.server; - -import org.eclipse.net4j.util.io.ExtendedIOUtil; -import org.eclipse.net4j.util.io.SortedFileMap; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.File; -import java.io.IOException; - -/** - * @author Eike Stepper - */ -public final class ObjectTypeMap extends SortedFileMap<Integer, String> -{ - public ObjectTypeMap(File file) - { - super(file, "rw"); - } - - @Override - public int getKeySize() - { - return 4; - } - - @Override - protected Integer readKey(DataInput in) throws IOException - { - return in.readInt(); - } - - @Override - protected void writeKey(DataOutput out, Integer key) throws IOException - { - out.writeInt(key); - } - - @Override - public int getValueSize() - { - return 20; - } - - @Override - protected String readValue(DataInput in) throws IOException - { - return ExtendedIOUtil.readString(in); - } - - @Override - protected void writeValue(DataOutput out, String value) throws IOException - { - byte[] bytes = value.getBytes(); - if (bytes.length + 4 > getValueSize()) - { - throw new IllegalArgumentException("Value size of " + getValueSize() + " exceeded: " + value); - } - - ExtendedIOUtil.writeByteArray(out, bytes); - } -} diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java index e03d0c166f..dd904ca56c 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java @@ -12,26 +12,17 @@ package org.eclipse.emf.cdo.internal.server; import org.eclipse.emf.cdo.internal.protocol.CDOIDImpl; import org.eclipse.emf.cdo.internal.protocol.CDOIDRangeImpl; -import org.eclipse.emf.cdo.internal.protocol.model.CDOClassRefImpl; -import org.eclipse.emf.cdo.internal.server.bundle.OM; import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.CDOIDRange; -import org.eclipse.emf.cdo.protocol.model.CDOClassRef; import org.eclipse.emf.cdo.server.IRepository; import org.eclipse.emf.cdo.server.IStore; -import org.eclipse.emf.cdo.server.IStoreReader; import org.eclipse.net4j.internal.util.container.Container; -import org.eclipse.net4j.util.ImplementationError; import org.eclipse.net4j.util.StringUtil; -import org.eclipse.net4j.util.io.IOUtil; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; -import java.io.File; import java.text.MessageFormat; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; /** * @author Eike Stepper @@ -48,6 +39,8 @@ public class Repository extends Container implements IRepository private String uuid; + private TypeManager typeManager = new TypeManager(this); + private PackageManager packageManager = new PackageManager(this); private SessionManager sessionManager = new SessionManager(this); @@ -62,12 +55,6 @@ public class Repository extends Container implements IRepository private long nextMetaIDValue = INITIAL_META_ID_VALUE; - private ConcurrentMap<CDOID, CDOClassRef> objectTypes = new ConcurrentHashMap(); - - private ObjectTypeMap objectTypeMap; - - private ObjectTypeMap metaObjectTypeMap; - public Repository(String name, IStore store) { if (StringUtil.isEmpty(name)) @@ -84,7 +71,7 @@ public class Repository extends Container implements IRepository this.store = store; uuid = UUID.randomUUID().toString(); - elements = new Object[] { packageManager, sessionManager, resourceManager, revisionManager, store }; + elements = new Object[] { packageManager, sessionManager, resourceManager, revisionManager, typeManager, store }; } public String getName() @@ -102,6 +89,11 @@ public class Repository extends Container implements IRepository return uuid; } + public TypeManager getTypeManager() + { + return typeManager; + } + public PackageManager getPackageManager() { return packageManager; @@ -149,54 +141,19 @@ public class Repository extends Container implements IRepository return id; } - public CDOClassRef getObjectType(IStoreReader storeReader, CDOID id) - { - CDOClassRef type = objectTypes.get(id); - if (type == null) - { - type = storeReader.readObjectType(id); - if (type == null) - { - throw new ImplementationError("type == null"); - } - - objectTypes.put(id, type); - } - - return type; - } - - public void registerObjectType(CDOID id, CDOClassRefImpl type) - { - objectTypes.putIfAbsent(id, type); - } - @Override public String toString() { return MessageFormat.format("Repository[{0}, {1}]", name, uuid); } - protected void initTypeMaps() - { - if (!store.hasEfficientTypeLookup()) - { - File stateFolder = new File(OM.BUNDLE.getStateLocation()); - File repositoryFolder = new File(stateFolder, uuid); - IOUtil.mkdirs(repositoryFolder); - - objectTypeMap = new ObjectTypeMap(new File(repositoryFolder, "object.types")); - metaObjectTypeMap = new ObjectTypeMap(new File(repositoryFolder, "metaobject.types")); - } - } - @Override protected void doActivate() throws Exception { super.doActivate(); LifecycleUtil.activate(store); - initTypeMaps(); - + typeManager.setPersistent(!store.hasEfficientTypeLookup()); + typeManager.activate(); packageManager.activate(); sessionManager.activate(); resourceManager.activate(); @@ -210,9 +167,7 @@ public class Repository extends Container implements IRepository resourceManager.deactivate(); sessionManager.deactivate(); packageManager.deactivate(); - - IOUtil.close(metaObjectTypeMap); - IOUtil.close(objectTypeMap); + typeManager.deactivate(); LifecycleUtil.deactivate(store); super.doDeactivate(); } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/RevisionManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/RevisionManager.java index e5f1013ffa..7a7139609b 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/RevisionManager.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/RevisionManager.java @@ -51,7 +51,7 @@ public class RevisionManager extends CDORevisionResolverImpl implements IRevisio { IStoreReader storeReader = StoreUtil.getReader(); CDORevisionImpl revision = (CDORevisionImpl)storeReader.readRevision(id); - repository.registerObjectType(revision.getID(), revision.getCDOClass().createClassRef()); + repository.getTypeManager().registerObjectType(revision.getID(), revision.getCDOClass().createClassRef()); return revision; } @@ -60,7 +60,7 @@ public class RevisionManager extends CDORevisionResolverImpl implements IRevisio { IStoreReader storeReader = StoreUtil.getReader(); CDORevisionImpl revision = (CDORevisionImpl)storeReader.readRevision(id, timeStamp); - repository.registerObjectType(revision.getID(), revision.getCDOClass().createClassRef()); + repository.getTypeManager().registerObjectType(revision.getID(), revision.getCDOClass().createClassRef()); return revision; } @@ -83,7 +83,7 @@ public class RevisionManager extends CDORevisionResolverImpl implements IRevisio public void phase2(IStoreWriter storeWriter) { - repository.registerObjectType(revision.getID(), revision.getCDOClass().createClassRef()); + repository.getTypeManager().registerObjectType(revision.getID(), revision.getCDOClass().createClassRef()); addRevision(revision); if (revision.isResource()) { diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java index eeebbcb624..5694f7fb1a 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java @@ -176,7 +176,7 @@ public class Session extends Container<IView> implements ISession, CDOIDProvider knownObjects.add(id); Repository repository = sessionManager.getRepository(); - CDOClassRef type = repository.getObjectType(StoreUtil.getReader(), id); + CDOClassRef type = repository.getTypeManager().getObjectType(StoreUtil.getReader(), id); return CDOIDImpl.create(id.getValue(), type); } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TypeManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TypeManager.java new file mode 100644 index 0000000000..5b20c8293d --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TypeManager.java @@ -0,0 +1,287 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * 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.internal.server; + +import org.eclipse.emf.cdo.internal.protocol.CDOIDImpl; +import org.eclipse.emf.cdo.internal.protocol.model.CDOClassRefImpl; +import org.eclipse.emf.cdo.internal.server.bundle.OM; +import org.eclipse.emf.cdo.protocol.CDOID; +import org.eclipse.emf.cdo.protocol.model.CDOClassRef; +import org.eclipse.emf.cdo.server.IStoreReader; +import org.eclipse.emf.cdo.server.ITypeManager; + +import org.eclipse.net4j.internal.util.lifecycle.Lifecycle; +import org.eclipse.net4j.util.ImplementationError; +import org.eclipse.net4j.util.io.CachedFileMap; +import org.eclipse.net4j.util.io.ExtendedDataInput; +import org.eclipse.net4j.util.io.ExtendedDataOutput; +import org.eclipse.net4j.util.io.ExtendedIOUtil; +import org.eclipse.net4j.util.io.IOUtil; +import org.eclipse.net4j.util.io.SortedFileMap; + +import java.io.File; +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * @author Eike Stepper + */ +public class TypeManager extends Lifecycle implements ITypeManager +{ + private Repository repository; + + private boolean persistent; + + private ConcurrentMap<CDOID, CDOClassRef> objectTypes = new ConcurrentHashMap(); + + private PackageURIMap packageURIMap; + + private ObjectTypeMap objectTypeMap; + + private ObjectTypeMap metaObjectTypeMap; + + public TypeManager(Repository repository) + { + this.repository = repository; + } + + public Repository getRepository() + { + return repository; + } + + public boolean isPersistent() + { + return persistent; + } + + public void setPersistent(boolean persistent) + { + this.persistent = persistent; + } + + public CDOClassRef getObjectType(IStoreReader storeReader, CDOID id) + { + CDOClassRef type = objectTypes.get(id); + if (type == null) + { + type = loadTypeFromMap(id); + if (type == null && storeReader != null) + { + type = storeReader.readObjectType(id); + } + + if (type == null) + { + throw new ImplementationError("type == null"); + } + + objectTypes.put(id, type); + } + + return type; + } + + public void registerObjectType(CDOID id, CDOClassRefImpl type) + { + objectTypes.putIfAbsent(id, type); + } + + private CDOClassRef loadTypeFromMap(CDOID id) + { + TypeEntry entry = null; + if (id.isMeta()) + { + if (objectTypeMap != null) + { + entry = objectTypeMap.get(id); + } + } + else + { + if (metaObjectTypeMap != null) + { + entry = metaObjectTypeMap.get(id); + } + } + + if (entry == null) + { + return null; + } + + String packageURI = packageURIMap.get(entry.getPackageID()); + return new CDOClassRefImpl(packageURI, entry.getClassifierID()); + } + + @Override + protected void doActivate() throws Exception + { + super.doActivate(); + if (persistent) + { + File stateFolder = new File(OM.BUNDLE.getStateLocation()); + File repositoryFolder = new File(stateFolder, repository.getUUID()); + IOUtil.mkdirs(repositoryFolder); + + packageURIMap = new PackageURIMap(new File(repositoryFolder, "package.uris")); + objectTypeMap = new ObjectTypeMap(new File(repositoryFolder, "object.types")); + metaObjectTypeMap = new ObjectTypeMap(new File(repositoryFolder, "metaobject.types")); + } + } + + @Override + protected void doDeactivate() throws Exception + { + super.doDeactivate(); + } + + /** + * @author Eike Stepper + */ + private static final class TypeEntry + { + public static final int SIZE = 8; + + private int classifierID; + + private int packageID; + + public TypeEntry(int classifierID, int packageID) + { + this.classifierID = classifierID; + this.packageID = packageID; + } + + public TypeEntry(ExtendedDataInput in) throws IOException + { + classifierID = in.readInt(); + packageID = in.readInt(); + } + + public void write(ExtendedDataOutput out) throws IOException + { + out.writeInt(classifierID); + out.writeInt(packageID); + } + + public int getClassifierID() + { + return classifierID; + } + + public int getPackageID() + { + return packageID; + } + } + + /** + * @author Eike Stepper + */ + private static final class PackageURIMap extends CachedFileMap<Integer, String> + { + public PackageURIMap(File file) + { + super(file, "rw"); + } + + @Override + public int getKeySize() + { + return 4; + } + + @Override + protected Integer readKey(ExtendedDataInput in) throws IOException + { + return in.readInt(); + } + + @Override + protected void writeKey(ExtendedDataOutput out, Integer key) throws IOException + { + out.writeInt(key); + } + + @Override + public int getValueSize() + { + return 260; + } + + @Override + protected String readValue(ExtendedDataInput in) throws IOException + { + return in.readString(); + } + + @Override + protected void writeValue(ExtendedDataOutput out, String value) throws IOException + { + byte[] bytes = value.getBytes(); + if (bytes.length + 4 > getValueSize()) + { + throw new IllegalArgumentException("Value size of " + getValueSize() + " exceeded: " + value); + } + + ExtendedIOUtil.writeByteArray(out, bytes); + } + } + + /** + * @author Eike Stepper + */ + private static final class ObjectTypeMap extends SortedFileMap<CDOID, TypeEntry> + { + public ObjectTypeMap(File file) + { + super(file, "rw"); + } + + @Override + public int getKeySize() + { + return 8; + } + + @Override + protected CDOID readKey(ExtendedDataInput in) throws IOException + { + return CDOIDImpl.read(in); + } + + @Override + protected void writeKey(ExtendedDataOutput out, CDOID key) throws IOException + { + CDOIDImpl.write(out, key); + } + + @Override + public int getValueSize() + { + return TypeEntry.SIZE; + } + + @Override + protected TypeEntry readValue(ExtendedDataInput in) throws IOException + { + return new TypeEntry(in); + } + + @Override + protected void writeValue(ExtendedDataOutput out, TypeEntry value) throws IOException + { + value.write(out); + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IRepository.java index de9d3f13c8..22b6b0608f 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IRepository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IRepository.java @@ -10,8 +10,7 @@ **************************************************************************/ package org.eclipse.emf.cdo.server; -import org.eclipse.emf.cdo.protocol.CDOID; -import org.eclipse.emf.cdo.protocol.model.CDOClassRef; +import org.eclipse.emf.cdo.internal.server.TypeManager; import org.eclipse.net4j.util.container.IContainer; @@ -26,6 +25,8 @@ public interface IRepository extends IContainer public String getUUID(); + public TypeManager getTypeManager(); + public IPackageManager getPackageManager(); public ISessionManager getSessionManager(); @@ -33,6 +34,4 @@ public interface IRepository extends IContainer public IResourceManager getResourceManager(); public IRevisionManager getRevisionManager(); - - public CDOClassRef getObjectType(IStoreReader storeReader, CDOID id); } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/ITypeManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/ITypeManager.java new file mode 100644 index 0000000000..ef6cc1ca99 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/ITypeManager.java @@ -0,0 +1,27 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * 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.server; + +import org.eclipse.emf.cdo.internal.protocol.model.CDOClassRefImpl; +import org.eclipse.emf.cdo.protocol.CDOID; +import org.eclipse.emf.cdo.protocol.model.CDOClassRef; + +/** + * @author Eike Stepper + */ +public interface ITypeManager extends IRepositoryElement +{ + public boolean isPersistent(); + + public CDOClassRef getObjectType(IStoreReader storeReader, CDOID id); + + public void registerObjectType(CDOID id, CDOClassRefImpl type); +} |