diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.db4o/src/org')
14 files changed, 1841 insertions, 1841 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/db4o/package-info.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/db4o/package-info.java index aab0770669..e58ec7e9d0 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/db4o/package-info.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/db4o/package-info.java @@ -1,15 +1,15 @@ -/*
- * 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
- */
-
-/**
- * Server concepts for dealing with DB4O stores and accessors.
- */
-package org.eclipse.emf.cdo.server.db4o;
+/* + * 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 + */ + +/** + * Server concepts for dealing with DB4O stores and accessors. + */ +package org.eclipse.emf.cdo.server.db4o; diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OBlob.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OBlob.java index 7c4cd70140..e585fb6902 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OBlob.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OBlob.java @@ -1,22 +1,22 @@ -/*
- * 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-/**
- * @author Victor Roldan Betancort
- */
-public class DB4OBlob extends DB4OWrappedValue<byte[]>
-{
- public DB4OBlob(String id, byte[] value)
- {
- super(id, value);
- }
-}
+/* + * 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: + * Victor Roldan Betancort - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.db4o; + +/** + * @author Victor Roldan Betancort + */ +public class DB4OBlob extends DB4OWrappedValue<byte[]> +{ + public DB4OBlob(String id, byte[] value) + { + super(id, value); + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OClob.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OClob.java index b7bba213dd..46fda2c035 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OClob.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OClob.java @@ -1,23 +1,23 @@ -/*
- * 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-/**
- * @author Victor Roldan Betancort
- */
-public class DB4OClob extends DB4OWrappedValue<char[]>
-{
- public DB4OClob(String id, char[] value)
- {
- super(id, value);
- }
-
-}
+/* + * 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: + * Victor Roldan Betancort - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.db4o; + +/** + * @author Victor Roldan Betancort + */ +public class DB4OClob extends DB4OWrappedValue<char[]> +{ + public DB4OClob(String id, char[] value) + { + super(id, value); + } + +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OCommitInfo.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OCommitInfo.java index 356e5379a4..323ac79e67 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OCommitInfo.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OCommitInfo.java @@ -1,61 +1,61 @@ -/*
- * 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
-import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler;
-import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranch;
-import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager;
-import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager;
-
-/**
- * @author Victor Roldan Betancort
- */
-public class DB4OCommitInfo
-{
- private int branchID;
-
- private long timeStamp;
-
- private long previousTimeStamp;
-
- private String userID;
-
- private String comment;
-
- public DB4OCommitInfo(int branchID, long timeStamp, long previousTimeStamp, String userID, String comment)
- {
- this.branchID = branchID;
- this.timeStamp = timeStamp;
- this.previousTimeStamp = previousTimeStamp;
- this.userID = userID;
- this.comment = comment;
- }
-
- public int getBranchID()
- {
- return branchID;
- }
-
- public long getTimeStamp()
- {
- return timeStamp;
- }
-
- public void handle(InternalCDOBranchManager branchManager, InternalCDOCommitInfoManager manager,
- CDOCommitInfoHandler handler)
- {
- InternalCDOBranch branch = branchManager.getBranch(branchID);
- CDOCommitInfo commitInfo = manager.createCommitInfo(branch, timeStamp, previousTimeStamp, userID, comment, null);
- handler.handleCommitInfo(commitInfo);
- }
-}
+/* + * 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: + * Victor Roldan Betancort - initial API and implementation + */ + +package org.eclipse.emf.cdo.server.internal.db4o; + +import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; +import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler; +import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranch; +import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager; +import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager; + +/** + * @author Victor Roldan Betancort + */ +public class DB4OCommitInfo +{ + private int branchID; + + private long timeStamp; + + private long previousTimeStamp; + + private String userID; + + private String comment; + + public DB4OCommitInfo(int branchID, long timeStamp, long previousTimeStamp, String userID, String comment) + { + this.branchID = branchID; + this.timeStamp = timeStamp; + this.previousTimeStamp = previousTimeStamp; + this.userID = userID; + this.comment = comment; + } + + public int getBranchID() + { + return branchID; + } + + public long getTimeStamp() + { + return timeStamp; + } + + public void handle(InternalCDOBranchManager branchManager, InternalCDOCommitInfoManager manager, + CDOCommitInfoHandler handler) + { + InternalCDOBranch branch = branchManager.getBranch(branchID); + CDOCommitInfo commitInfo = manager.createCommitInfo(branch, timeStamp, previousTimeStamp, userID, comment, null); + handler.handleCommitInfo(commitInfo); + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ODurableLockingManager.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ODurableLockingManager.java index dfb6804265..c09c9c02c3 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ODurableLockingManager.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ODurableLockingManager.java @@ -1,199 +1,199 @@ -/*
- * 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:
- * Caspar De Groot - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.lock.CDOLockUtil;
-import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockArea;
-import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockArea.Handler;
-import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockAreaNotFoundException;
-import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockGrade;
-import org.eclipse.emf.cdo.spi.server.InternalLockManager;
-
-import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType;
-import org.eclipse.net4j.util.lifecycle.Lifecycle;
-
-import com.db4o.ObjectContainer;
-import com.db4o.ObjectSet;
-import com.db4o.query.Query;
-
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * @author Caspar De Groot
- */
-public class DB4ODurableLockingManager extends Lifecycle
-{
- public DB4ODurableLockingManager()
- {
- }
-
- public LockArea createLockArea(DB4OStoreAccessor accessor, String userID, CDOBranchPoint branchPoint,
- boolean readOnly, Map<CDOID, LockGrade> locks)
- {
- String durableLockingID = getNextDurableLockingID(accessor);
- LockArea lockArea = CDOLockUtil.createLockArea(durableLockingID, userID, branchPoint, readOnly, locks);
- storeLockArea(accessor, lockArea);
- return lockArea;
- }
-
- private void storeLockArea(DB4OStoreAccessor accessor, LockArea area)
- {
- ObjectContainer objectContainer = accessor.getObjectContainer();
- DB4OLockArea primitiveLockArea = DB4OLockArea.getPrimitiveLockArea(area);
- objectContainer.store(primitiveLockArea);
- objectContainer.commit();
- }
-
- public LockArea getLockArea(DB4OStoreAccessor accessor, String durableLockingID) throws LockAreaNotFoundException
- {
- DB4OLockArea primitive = getPrimitiveLockArea(accessor, durableLockingID);
- return DB4OLockArea.getLockArea(accessor.getStore(), primitive);
- }
-
- private DB4OLockArea getPrimitiveLockArea(DB4OStoreAccessor accessor, String durableLockingID)
- throws LockAreaNotFoundException
- {
- ObjectContainer container = accessor.getObjectContainer();
- Query query = container.query();
- query.constrain(DB4OLockArea.class);
- query.descend("id").constrain(durableLockingID);
-
- ObjectSet<?> lockAreas = query.execute();
- if (lockAreas.isEmpty())
- {
- throw new LockAreaNotFoundException(durableLockingID);
- }
-
- if (lockAreas.size() > 1)
- {
- throw new AssertionError("Lockarea stored more than once in object database");
- }
-
- return (DB4OLockArea)lockAreas.get(0);
- }
-
- public void getLockAreas(DB4OStoreAccessor accessor, String userIDPrefix, Handler handler)
- {
- ObjectContainer container = accessor.getObjectContainer();
- Query query = container.query();
- query.constrain(DB4OLockArea.class);
-
- if (userIDPrefix.length() > 0)
- {
- query.descend("userID").constrain(userIDPrefix).startsWith(true);
- }
-
- ObjectSet<?> primitives = query.execute();
- for (Object primitive : primitives)
- {
- LockArea area = DB4OLockArea.getLockArea(accessor.getStore(), (DB4OLockArea)primitive);
- if (!handler.handleLockArea(area))
- {
- break;
- }
- }
- }
-
- public void deleteLockArea(DB4OStoreAccessor accessor, String durableLockingID)
- {
- DB4OLockArea primitive = getPrimitiveLockArea(accessor, durableLockingID);
- ObjectContainer container = accessor.getObjectContainer();
- container.delete(primitive);
- container.commit();
- }
-
- public void lock(DB4OStoreAccessor accessor, String durableLockingID, LockType type,
- Collection<? extends Object> objectsToLock)
- {
- // TODO (CD) Refactor? Next chunk of code copied verbatim from MEMStore.lock
- LockArea area = getLockArea(accessor, durableLockingID);
- Map<CDOID, LockGrade> locks = area.getLocks();
-
- InternalLockManager lockManager = accessor.getStore().getRepository().getLockingManager();
- for (Object objectToLock : objectsToLock)
- {
- CDOID id = lockManager.getLockKeyID(objectToLock);
- LockGrade grade = locks.get(id);
- if (grade != null)
- {
- grade = grade.getUpdated(type, true);
- }
- else
- {
- grade = LockGrade.get(type);
- }
-
- locks.put(id, grade);
- }
-
- storeLockArea(accessor, area);
- }
-
- public void unlock(DB4OStoreAccessor accessor, String durableLockingID, LockType type,
- Collection<? extends Object> objectsToUnlock)
- {
- // TODO (CD) Refactor? Next chunk of code copied verbatim from MEMStore.lock
- LockArea area = getLockArea(accessor, durableLockingID);
- Map<CDOID, LockGrade> locks = area.getLocks();
-
- InternalLockManager lockManager = accessor.getStore().getRepository().getLockingManager();
- for (Object objectToUnlock : objectsToUnlock)
- {
- CDOID id = lockManager.getLockKeyID(objectToUnlock);
- LockGrade grade = locks.get(id);
- if (grade != null)
- {
- grade = grade.getUpdated(type, false);
- if (grade == LockGrade.NONE)
- {
- locks.remove(id);
- }
- else
- {
- locks.put(id, grade);
- }
- }
- }
-
- storeLockArea(accessor, area);
- }
-
- public void unlock(DB4OStoreAccessor accessor, String durableLockingID)
- {
- LockArea area = getLockArea(accessor, durableLockingID);
- Map<CDOID, LockGrade> locks = area.getLocks();
- locks.clear();
-
- storeLockArea(accessor, area);
- }
-
- // TODO: Refactor -- this was copied verbatim from DurableLockingManager
- private String getNextDurableLockingID(DB4OStoreAccessor accessor)
- {
- for (;;)
- {
- String durableLockingID = CDOLockUtil.createDurableLockingID();
-
- try
- {
- getLockArea(accessor, durableLockingID); // Check uniqueness
- // Not unique; try once more...
- }
- catch (LockAreaNotFoundException ex)
- {
- return durableLockingID;
- }
- }
- }
-}
+/* + * 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: + * Caspar De Groot - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.db4o; + +import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.lock.CDOLockUtil; +import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockArea; +import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockArea.Handler; +import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockAreaNotFoundException; +import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockGrade; +import org.eclipse.emf.cdo.spi.server.InternalLockManager; + +import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; +import org.eclipse.net4j.util.lifecycle.Lifecycle; + +import com.db4o.ObjectContainer; +import com.db4o.ObjectSet; +import com.db4o.query.Query; + +import java.util.Collection; +import java.util.Map; + +/** + * @author Caspar De Groot + */ +public class DB4ODurableLockingManager extends Lifecycle +{ + public DB4ODurableLockingManager() + { + } + + public LockArea createLockArea(DB4OStoreAccessor accessor, String userID, CDOBranchPoint branchPoint, + boolean readOnly, Map<CDOID, LockGrade> locks) + { + String durableLockingID = getNextDurableLockingID(accessor); + LockArea lockArea = CDOLockUtil.createLockArea(durableLockingID, userID, branchPoint, readOnly, locks); + storeLockArea(accessor, lockArea); + return lockArea; + } + + private void storeLockArea(DB4OStoreAccessor accessor, LockArea area) + { + ObjectContainer objectContainer = accessor.getObjectContainer(); + DB4OLockArea primitiveLockArea = DB4OLockArea.getPrimitiveLockArea(area); + objectContainer.store(primitiveLockArea); + objectContainer.commit(); + } + + public LockArea getLockArea(DB4OStoreAccessor accessor, String durableLockingID) throws LockAreaNotFoundException + { + DB4OLockArea primitive = getPrimitiveLockArea(accessor, durableLockingID); + return DB4OLockArea.getLockArea(accessor.getStore(), primitive); + } + + private DB4OLockArea getPrimitiveLockArea(DB4OStoreAccessor accessor, String durableLockingID) + throws LockAreaNotFoundException + { + ObjectContainer container = accessor.getObjectContainer(); + Query query = container.query(); + query.constrain(DB4OLockArea.class); + query.descend("id").constrain(durableLockingID); + + ObjectSet<?> lockAreas = query.execute(); + if (lockAreas.isEmpty()) + { + throw new LockAreaNotFoundException(durableLockingID); + } + + if (lockAreas.size() > 1) + { + throw new AssertionError("Lockarea stored more than once in object database"); + } + + return (DB4OLockArea)lockAreas.get(0); + } + + public void getLockAreas(DB4OStoreAccessor accessor, String userIDPrefix, Handler handler) + { + ObjectContainer container = accessor.getObjectContainer(); + Query query = container.query(); + query.constrain(DB4OLockArea.class); + + if (userIDPrefix.length() > 0) + { + query.descend("userID").constrain(userIDPrefix).startsWith(true); + } + + ObjectSet<?> primitives = query.execute(); + for (Object primitive : primitives) + { + LockArea area = DB4OLockArea.getLockArea(accessor.getStore(), (DB4OLockArea)primitive); + if (!handler.handleLockArea(area)) + { + break; + } + } + } + + public void deleteLockArea(DB4OStoreAccessor accessor, String durableLockingID) + { + DB4OLockArea primitive = getPrimitiveLockArea(accessor, durableLockingID); + ObjectContainer container = accessor.getObjectContainer(); + container.delete(primitive); + container.commit(); + } + + public void lock(DB4OStoreAccessor accessor, String durableLockingID, LockType type, + Collection<? extends Object> objectsToLock) + { + // TODO (CD) Refactor? Next chunk of code copied verbatim from MEMStore.lock + LockArea area = getLockArea(accessor, durableLockingID); + Map<CDOID, LockGrade> locks = area.getLocks(); + + InternalLockManager lockManager = accessor.getStore().getRepository().getLockingManager(); + for (Object objectToLock : objectsToLock) + { + CDOID id = lockManager.getLockKeyID(objectToLock); + LockGrade grade = locks.get(id); + if (grade != null) + { + grade = grade.getUpdated(type, true); + } + else + { + grade = LockGrade.get(type); + } + + locks.put(id, grade); + } + + storeLockArea(accessor, area); + } + + public void unlock(DB4OStoreAccessor accessor, String durableLockingID, LockType type, + Collection<? extends Object> objectsToUnlock) + { + // TODO (CD) Refactor? Next chunk of code copied verbatim from MEMStore.lock + LockArea area = getLockArea(accessor, durableLockingID); + Map<CDOID, LockGrade> locks = area.getLocks(); + + InternalLockManager lockManager = accessor.getStore().getRepository().getLockingManager(); + for (Object objectToUnlock : objectsToUnlock) + { + CDOID id = lockManager.getLockKeyID(objectToUnlock); + LockGrade grade = locks.get(id); + if (grade != null) + { + grade = grade.getUpdated(type, false); + if (grade == LockGrade.NONE) + { + locks.remove(id); + } + else + { + locks.put(id, grade); + } + } + } + + storeLockArea(accessor, area); + } + + public void unlock(DB4OStoreAccessor accessor, String durableLockingID) + { + LockArea area = getLockArea(accessor, durableLockingID); + Map<CDOID, LockGrade> locks = area.getLocks(); + locks.clear(); + + storeLockArea(accessor, area); + } + + // TODO: Refactor -- this was copied verbatim from DurableLockingManager + private String getNextDurableLockingID(DB4OStoreAccessor accessor) + { + for (;;) + { + String durableLockingID = CDOLockUtil.createDurableLockingID(); + + try + { + getLockArea(accessor, durableLockingID); // Check uniqueness + // Not unique; try once more... + } + catch (LockAreaNotFoundException ex) + { + return durableLockingID; + } + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OIdentifiableObject.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OIdentifiableObject.java index 95f088de43..3fca1d9b4c 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OIdentifiableObject.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OIdentifiableObject.java @@ -1,31 +1,31 @@ -/*
- * 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-import org.eclipse.emf.cdo.server.db4o.IDB4OIdentifiableObject;
-
-/**
- * @author Victor Roldan Betancort
- */
-public class DB4OIdentifiableObject implements IDB4OIdentifiableObject
-{
- private String id;
-
- public String getId()
- {
- return id;
- }
-
- protected void setId(String id)
- {
- this.id = id;
- }
-}
+/* + * 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: + * Victor Roldan Betancort - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.db4o; + +import org.eclipse.emf.cdo.server.db4o.IDB4OIdentifiableObject; + +/** + * @author Victor Roldan Betancort + */ +public class DB4OIdentifiableObject implements IDB4OIdentifiableObject +{ + private String id; + + public String getId() + { + return id; + } + + protected void setId(String id) + { + this.id = id; + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OLockArea.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OLockArea.java index 61059643c2..8dbbe3e0c5 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OLockArea.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OLockArea.java @@ -1,120 +1,120 @@ -/*
- * 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:
- * Caspar De Groot - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-import org.eclipse.emf.cdo.common.branch.CDOBranch;
-import org.eclipse.emf.cdo.common.branch.CDOBranchManager;
-import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.id.CDOIDUtil;
-import org.eclipse.emf.cdo.common.lock.CDOLockUtil;
-import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockArea;
-import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockGrade;
-import org.eclipse.emf.cdo.server.db4o.IDB4OStore;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Caspar De Groot
- */
-public class DB4OLockArea
-{
- private static Map<LockArea, DB4OLockArea> map = new HashMap<LockArea, DB4OLockArea>();
-
- private String id;
-
- private String userID;
-
- private long timestamp;
-
- private int branchID;
-
- private boolean readOnly;
-
- private List<DB4OLockEntry> lockEntries = new LinkedList<DB4OLockEntry>();
-
- public static DB4OLockArea getPrimitiveLockArea(LockArea lockArea)
- {
- DB4OLockArea primitive = map.get(lockArea);
- if (primitive == null)
- {
- primitive = new DB4OLockArea();
- }
-
- primitive.id = lockArea.getDurableLockingID();
- primitive.userID = lockArea.getUserID();
- primitive.timestamp = lockArea.getTimeStamp();
- primitive.branchID = lockArea.getBranch().getID();
- primitive.readOnly = lockArea.isReadOnly();
-
- List<DB4OLockEntry> newList = DB4OLockEntry.getPrimitiveLockEntries(primitive, lockArea.getLocks());
- primitive.lockEntries = newList;
-
- return primitive;
- }
-
- public static LockArea getLockArea(IDB4OStore store, DB4OLockArea primitive)
- {
- // Reconstruct the branchpoint
- //
- CDOBranchManager branchManager = store.getRepository().getBranchManager();
- CDOBranch branch = branchManager.getBranch(primitive.branchID);
- CDOBranchPoint branchpoint = branch.getPoint(primitive.timestamp);
-
- // Reconstruct the lockMap
- //
- Map<CDOID, LockGrade> lockMap = new HashMap<CDOID, LockGrade>();
- for (DB4OLockEntry entry : primitive.getLockEntries())
- {
- CDOID cdoid = CDOIDUtil.createLong(entry.getCdoID());
- LockGrade lockGrade = LockGrade.get(entry.getLockGrade());
- lockMap.put(cdoid, lockGrade);
- }
-
- LockArea lockArea = CDOLockUtil.createLockArea(primitive.id, primitive.userID, branchpoint, primitive.readOnly,
- lockMap);
- map.put(lockArea, primitive);
- return lockArea;
- }
-
- public void setId(String id)
- {
- this.id = id;
- }
-
- public String getId()
- {
- return id;
- }
-
- public String getUserID()
- {
- return userID;
- }
-
- public long getTimestamp()
- {
- return timestamp;
- }
-
- public int getBranchID()
- {
- return branchID;
- }
-
- public List<DB4OLockEntry> getLockEntries()
- {
- return lockEntries;
- }
-}
+/* + * 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: + * Caspar De Groot - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.db4o; + +import org.eclipse.emf.cdo.common.branch.CDOBranch; +import org.eclipse.emf.cdo.common.branch.CDOBranchManager; +import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.common.lock.CDOLockUtil; +import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockArea; +import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockGrade; +import org.eclipse.emf.cdo.server.db4o.IDB4OStore; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * @author Caspar De Groot + */ +public class DB4OLockArea +{ + private static Map<LockArea, DB4OLockArea> map = new HashMap<LockArea, DB4OLockArea>(); + + private String id; + + private String userID; + + private long timestamp; + + private int branchID; + + private boolean readOnly; + + private List<DB4OLockEntry> lockEntries = new LinkedList<DB4OLockEntry>(); + + public static DB4OLockArea getPrimitiveLockArea(LockArea lockArea) + { + DB4OLockArea primitive = map.get(lockArea); + if (primitive == null) + { + primitive = new DB4OLockArea(); + } + + primitive.id = lockArea.getDurableLockingID(); + primitive.userID = lockArea.getUserID(); + primitive.timestamp = lockArea.getTimeStamp(); + primitive.branchID = lockArea.getBranch().getID(); + primitive.readOnly = lockArea.isReadOnly(); + + List<DB4OLockEntry> newList = DB4OLockEntry.getPrimitiveLockEntries(primitive, lockArea.getLocks()); + primitive.lockEntries = newList; + + return primitive; + } + + public static LockArea getLockArea(IDB4OStore store, DB4OLockArea primitive) + { + // Reconstruct the branchpoint + // + CDOBranchManager branchManager = store.getRepository().getBranchManager(); + CDOBranch branch = branchManager.getBranch(primitive.branchID); + CDOBranchPoint branchpoint = branch.getPoint(primitive.timestamp); + + // Reconstruct the lockMap + // + Map<CDOID, LockGrade> lockMap = new HashMap<CDOID, LockGrade>(); + for (DB4OLockEntry entry : primitive.getLockEntries()) + { + CDOID cdoid = CDOIDUtil.createLong(entry.getCdoID()); + LockGrade lockGrade = LockGrade.get(entry.getLockGrade()); + lockMap.put(cdoid, lockGrade); + } + + LockArea lockArea = CDOLockUtil.createLockArea(primitive.id, primitive.userID, branchpoint, primitive.readOnly, + lockMap); + map.put(lockArea, primitive); + return lockArea; + } + + public void setId(String id) + { + this.id = id; + } + + public String getId() + { + return id; + } + + public String getUserID() + { + return userID; + } + + public long getTimestamp() + { + return timestamp; + } + + public int getBranchID() + { + return branchID; + } + + public List<DB4OLockEntry> getLockEntries() + { + return lockEntries; + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OLockEntry.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OLockEntry.java index 07b8e6b8c6..f9c991ef3b 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OLockEntry.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OLockEntry.java @@ -1,93 +1,93 @@ -/*
- * 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:
- * Caspar De Groot - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.id.CDOIDUtil;
-import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockGrade;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * @author Caspar De Groot
- */
-public class DB4OLockEntry
-{
- private long cdoID;
-
- private int lockGrade;
-
- public DB4OLockEntry(long longCdoID, int intLockGrade)
- {
- cdoID = longCdoID;
- lockGrade = intLockGrade;
- }
-
- public static List<DB4OLockEntry> getPrimitiveLockEntries(DB4OLockArea primitive, Map<CDOID, LockGrade> locks)
- {
- List<DB4OLockEntry> newList = new LinkedList<DB4OLockEntry>();
-
- for (Entry<CDOID, LockGrade> entry : locks.entrySet())
- {
- CDOID cdoid = entry.getKey();
- long longCdoID = CDOIDUtil.getLong(cdoid);
-
- LockGrade lockGrade = entry.getValue();
- int intLockGrade = lockGrade.getValue();
-
- DB4OLockEntry lockEntry = getEntry(primitive.getLockEntries(), longCdoID);
- if (lockEntry == null)
- {
- lockEntry = new DB4OLockEntry(longCdoID, intLockGrade);
- }
- else
- {
- lockEntry.setLockGrade(intLockGrade);
- }
-
- newList.add(lockEntry);
- }
-
- return newList;
- }
-
- private void setLockGrade(int lockGrade)
- {
- this.lockGrade = lockGrade;
- }
-
- // TODO (CD) Avoid linear search
- private static DB4OLockEntry getEntry(List<DB4OLockEntry> entries, long targetID)
- {
- for (DB4OLockEntry entry : entries)
- {
- if (entry.cdoID == targetID)
- {
- return entry;
- }
- }
-
- return null;
- }
-
- public long getCdoID()
- {
- return cdoID;
- }
-
- public int getLockGrade()
- {
- return lockGrade;
- }
-}
+/* + * 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: + * Caspar De Groot - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.db4o; + +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockGrade; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * @author Caspar De Groot + */ +public class DB4OLockEntry +{ + private long cdoID; + + private int lockGrade; + + public DB4OLockEntry(long longCdoID, int intLockGrade) + { + cdoID = longCdoID; + lockGrade = intLockGrade; + } + + public static List<DB4OLockEntry> getPrimitiveLockEntries(DB4OLockArea primitive, Map<CDOID, LockGrade> locks) + { + List<DB4OLockEntry> newList = new LinkedList<DB4OLockEntry>(); + + for (Entry<CDOID, LockGrade> entry : locks.entrySet()) + { + CDOID cdoid = entry.getKey(); + long longCdoID = CDOIDUtil.getLong(cdoid); + + LockGrade lockGrade = entry.getValue(); + int intLockGrade = lockGrade.getValue(); + + DB4OLockEntry lockEntry = getEntry(primitive.getLockEntries(), longCdoID); + if (lockEntry == null) + { + lockEntry = new DB4OLockEntry(longCdoID, intLockGrade); + } + else + { + lockEntry.setLockGrade(intLockGrade); + } + + newList.add(lockEntry); + } + + return newList; + } + + private void setLockGrade(int lockGrade) + { + this.lockGrade = lockGrade; + } + + // TODO (CD) Avoid linear search + private static DB4OLockEntry getEntry(List<DB4OLockEntry> entries, long targetID) + { + for (DB4OLockEntry entry : entries) + { + if (entry.cdoID == targetID) + { + return entry; + } + } + + return null; + } + + public long getCdoID() + { + return cdoID; + } + + public int getLockGrade() + { + return lockGrade; + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OPackageUnit.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OPackageUnit.java index 186d1b91fb..13ad6137eb 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OPackageUnit.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OPackageUnit.java @@ -1,179 +1,179 @@ -/*
- * 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-import org.eclipse.emf.cdo.common.model.CDOModelUtil;
-import org.eclipse.emf.cdo.common.model.CDOPackageRegistry;
-import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
-import org.eclipse.emf.cdo.common.model.EMFUtil;
-import org.eclipse.emf.cdo.server.IStore;
-import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo;
-import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
-
-import org.eclipse.net4j.util.collection.Pair;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Victor Roldan Betancort
- */
-public class DB4OPackageUnit
-{
- private String id;
-
- private Integer ordinalType;
-
- private Long timeStamp;
-
- private List<Byte> ePackageBytes;
-
- private List<Pair<String, String>> packageInfos;
-
- public DB4OPackageUnit(String id, Integer ordinalType, Long timeStamp, List<Byte> ePackageBytes,
- List<Pair<String, String>> packageInfos)
- {
- setId(id);
- setOrdinalType(ordinalType);
- setTimeStamp(timeStamp);
- setEPackageBytes(ePackageBytes);
- setPackageInfos(packageInfos);
- }
-
- public void setId(String id)
- {
- this.id = id;
- }
-
- public String getId()
- {
- return id;
- }
-
- public void setOrdinalType(Integer ordinalType)
- {
- this.ordinalType = ordinalType;
- }
-
- public Integer getOrdinalType()
- {
- return ordinalType;
- }
-
- public void setTimeStamp(Long timeStamp)
- {
- this.timeStamp = timeStamp;
- }
-
- public Long getTimeStamp()
- {
- return timeStamp;
- }
-
- public void setEPackageBytes(List<Byte> ePackageBytes)
- {
- this.ePackageBytes = ePackageBytes;
- }
-
- public List<Byte> getEPackageBytes()
- {
- return ePackageBytes;
- }
-
- public static DB4OPackageUnit getPrimitivePackageUnit(IStore store, InternalCDOPackageUnit packageUnit)
- {
- return new DB4OPackageUnit(new String(packageUnit.getID()), new Integer(packageUnit.getOriginalType().ordinal()),
- new Long(packageUnit.getTimeStamp()), getEPackageBytes(store, packageUnit),
- getPackageInfosAsPair(packageUnit.getPackageInfos()));
- }
-
- public static InternalCDOPackageUnit getPackageUnit(DB4OPackageUnit packageUnit)
- {
- InternalCDOPackageUnit cdoPackageUnit = (InternalCDOPackageUnit)CDOModelUtil.createPackageUnit();
- CDOPackageUnit.Type type = CDOPackageUnit.Type.values()[packageUnit.getOrdinalType()];
- cdoPackageUnit.setOriginalType(type);
- cdoPackageUnit.setTimeStamp(packageUnit.getTimeStamp());
- cdoPackageUnit.setPackageInfos(getPackageInfos(packageUnit));
- return cdoPackageUnit;
- }
-
- private static InternalCDOPackageInfo[] getPackageInfos(DB4OPackageUnit packageUnit)
- {
- List<InternalCDOPackageInfo> list = new ArrayList<InternalCDOPackageInfo>();
- for (Pair<String, String> infoPair : packageUnit.getPackageInfos())
- {
- InternalCDOPackageInfo packageInfo = (InternalCDOPackageInfo)CDOModelUtil.createPackageInfo();
- packageInfo.setParentURI(infoPair.getElement1());
- packageInfo.setPackageURI(infoPair.getElement2());
- list.add(packageInfo);
- }
- return list.toArray(new InternalCDOPackageInfo[list.size()]);
- }
-
- private static List<Byte> getEPackageBytes(IStore store, InternalCDOPackageUnit packageUnit)
- {
- EPackage ePackage = packageUnit.getTopLevelPackageInfo().getEPackage();
- CDOPackageRegistry packageRegistry = store.getRepository().getPackageRegistry();
- byte[] bytes = EMFUtil.getEPackageBytes(ePackage, true, packageRegistry);
- List<Byte> bytesObject = new ArrayList<Byte>();
- for (byte bt : bytes)
- {
- bytesObject.add(new Byte(bt));
- }
-
- return bytesObject;
- }
-
- private static EPackage getEPackageFromBytes(List<Byte> ePackageBytesList)
- {
- ResourceSet rSet = new ResourceSetImpl();
- byte[] packageBytes = new byte[ePackageBytesList.size()];
- for (int i = 0; i < packageBytes.length; i++)
- {
- packageBytes[i] = ePackageBytesList.get(i);
- }
-
- EPackage ePackage = EMFUtil.createEPackage("", packageBytes, true, rSet, false);
- return ePackage;
- }
-
- public EPackage getEPackage()
- {
- return getEPackageFromBytes(getEPackageBytes());
- }
-
- private static List<Pair<String, String>> getPackageInfosAsPair(InternalCDOPackageInfo[] packageInfos)
- {
- List<Pair<String, String>> infos = new ArrayList<Pair<String, String>>();
- for (InternalCDOPackageInfo info : packageInfos)
- {
- Pair<String, String> pair = new Pair<String, String>();
- pair.setElement1(info.getParentURI());
- pair.setElement2(info.getPackageURI());
- infos.add(pair);
- }
- return infos;
- }
-
- public void setPackageInfos(List<Pair<String, String>> packageInfos)
- {
- this.packageInfos = packageInfos;
- }
-
- public List<Pair<String, String>> getPackageInfos()
- {
- return packageInfos;
- }
-}
+/* + * 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: + * Victor Roldan Betancort - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.db4o; + +import org.eclipse.emf.cdo.common.model.CDOModelUtil; +import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; +import org.eclipse.emf.cdo.common.model.CDOPackageUnit; +import org.eclipse.emf.cdo.common.model.EMFUtil; +import org.eclipse.emf.cdo.server.IStore; +import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo; +import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit; + +import org.eclipse.net4j.util.collection.Pair; + +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Victor Roldan Betancort + */ +public class DB4OPackageUnit +{ + private String id; + + private Integer ordinalType; + + private Long timeStamp; + + private List<Byte> ePackageBytes; + + private List<Pair<String, String>> packageInfos; + + public DB4OPackageUnit(String id, Integer ordinalType, Long timeStamp, List<Byte> ePackageBytes, + List<Pair<String, String>> packageInfos) + { + setId(id); + setOrdinalType(ordinalType); + setTimeStamp(timeStamp); + setEPackageBytes(ePackageBytes); + setPackageInfos(packageInfos); + } + + public void setId(String id) + { + this.id = id; + } + + public String getId() + { + return id; + } + + public void setOrdinalType(Integer ordinalType) + { + this.ordinalType = ordinalType; + } + + public Integer getOrdinalType() + { + return ordinalType; + } + + public void setTimeStamp(Long timeStamp) + { + this.timeStamp = timeStamp; + } + + public Long getTimeStamp() + { + return timeStamp; + } + + public void setEPackageBytes(List<Byte> ePackageBytes) + { + this.ePackageBytes = ePackageBytes; + } + + public List<Byte> getEPackageBytes() + { + return ePackageBytes; + } + + public static DB4OPackageUnit getPrimitivePackageUnit(IStore store, InternalCDOPackageUnit packageUnit) + { + return new DB4OPackageUnit(new String(packageUnit.getID()), new Integer(packageUnit.getOriginalType().ordinal()), + new Long(packageUnit.getTimeStamp()), getEPackageBytes(store, packageUnit), + getPackageInfosAsPair(packageUnit.getPackageInfos())); + } + + public static InternalCDOPackageUnit getPackageUnit(DB4OPackageUnit packageUnit) + { + InternalCDOPackageUnit cdoPackageUnit = (InternalCDOPackageUnit)CDOModelUtil.createPackageUnit(); + CDOPackageUnit.Type type = CDOPackageUnit.Type.values()[packageUnit.getOrdinalType()]; + cdoPackageUnit.setOriginalType(type); + cdoPackageUnit.setTimeStamp(packageUnit.getTimeStamp()); + cdoPackageUnit.setPackageInfos(getPackageInfos(packageUnit)); + return cdoPackageUnit; + } + + private static InternalCDOPackageInfo[] getPackageInfos(DB4OPackageUnit packageUnit) + { + List<InternalCDOPackageInfo> list = new ArrayList<InternalCDOPackageInfo>(); + for (Pair<String, String> infoPair : packageUnit.getPackageInfos()) + { + InternalCDOPackageInfo packageInfo = (InternalCDOPackageInfo)CDOModelUtil.createPackageInfo(); + packageInfo.setParentURI(infoPair.getElement1()); + packageInfo.setPackageURI(infoPair.getElement2()); + list.add(packageInfo); + } + return list.toArray(new InternalCDOPackageInfo[list.size()]); + } + + private static List<Byte> getEPackageBytes(IStore store, InternalCDOPackageUnit packageUnit) + { + EPackage ePackage = packageUnit.getTopLevelPackageInfo().getEPackage(); + CDOPackageRegistry packageRegistry = store.getRepository().getPackageRegistry(); + byte[] bytes = EMFUtil.getEPackageBytes(ePackage, true, packageRegistry); + List<Byte> bytesObject = new ArrayList<Byte>(); + for (byte bt : bytes) + { + bytesObject.add(new Byte(bt)); + } + + return bytesObject; + } + + private static EPackage getEPackageFromBytes(List<Byte> ePackageBytesList) + { + ResourceSet rSet = new ResourceSetImpl(); + byte[] packageBytes = new byte[ePackageBytesList.size()]; + for (int i = 0; i < packageBytes.length; i++) + { + packageBytes[i] = ePackageBytesList.get(i); + } + + EPackage ePackage = EMFUtil.createEPackage("", packageBytes, true, rSet, false); + return ePackage; + } + + public EPackage getEPackage() + { + return getEPackageFromBytes(getEPackageBytes()); + } + + private static List<Pair<String, String>> getPackageInfosAsPair(InternalCDOPackageInfo[] packageInfos) + { + List<Pair<String, String>> infos = new ArrayList<Pair<String, String>>(); + for (InternalCDOPackageInfo info : packageInfos) + { + Pair<String, String> pair = new Pair<String, String>(); + pair.setElement1(info.getParentURI()); + pair.setElement2(info.getPackageURI()); + infos.add(pair); + } + return infos; + } + + public void setPackageInfos(List<Pair<String, String>> packageInfos) + { + this.packageInfos = packageInfos; + } + + public List<Pair<String, String>> getPackageInfos() + { + return packageInfos; + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ORevision.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ORevision.java index 9f48f371f9..c0ea016193 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ORevision.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ORevision.java @@ -1,463 +1,463 @@ -/*
- * 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-import org.eclipse.emf.cdo.common.branch.CDOBranch;
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.id.CDOIDExternal;
-import org.eclipse.emf.cdo.common.id.CDOIDUtil;
-import org.eclipse.emf.cdo.common.model.CDOClassInfo;
-import org.eclipse.emf.cdo.common.revision.CDOList;
-import org.eclipse.emf.cdo.common.revision.CDOListFactory;
-import org.eclipse.emf.cdo.common.revision.CDORevision;
-import org.eclipse.emf.cdo.common.revision.CDORevisionData;
-import org.eclipse.emf.cdo.common.revision.CDORevisionFactory;
-import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
-import org.eclipse.emf.cdo.server.IRepository;
-import org.eclipse.emf.cdo.server.IStore;
-import org.eclipse.emf.cdo.spi.common.revision.CDOFeatureMapEntry;
-import org.eclipse.emf.cdo.spi.common.revision.InternalCDOList;
-import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
-import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Victor Roldan Betancort
- */
-public class DB4ORevision
-{
- public final static String ATTRIBUTE_CLASS_NAME = "className";
-
- public final static String ATTRIBUTE_PACKAGE_NS_URI = "packageNsURI";
-
- private String packageNsURI;
-
- private String className;
-
- private long id;
-
- private int version;
-
- private long timeStamp;
-
- private long resourceID;
-
- /**
- * Can be an external ID!
- */
- private Object containerID;
-
- private int containingFeatureID;
-
- private List<Object> values;
-
- // TODO enum RevisionType { NORMAL, ROOT_RESOURCE, RESOURCE, RESOURCE_FOLDER }??
- private boolean isResource;
-
- private boolean isResourceFolder;
-
- public DB4ORevision(String packageURI, String className, long id, int version, long resourceID, Object containerID,
- int containingFeatureID, List<Object> values, long timestamp, boolean isResource, boolean isResourceFolder)
- {
- setPackageURI(packageURI);
- setClassName(className);
- setID(id);
- setVersion(version);
- setResourceID(resourceID);
- setContainerID(containerID);
- setContainingFeatureID(containingFeatureID);
- setValues(values);
- setTimeStamp(timestamp);
- setResource(isResource);
- setResourceFolder(isResourceFolder);
- }
-
- public void setPackageURI(String packageURI)
- {
- packageNsURI = packageURI;
- }
-
- public String getPackageURI()
- {
- return packageNsURI;
- }
-
- public void setClassName(String className)
- {
- this.className = className;
- }
-
- public String getClassName()
- {
- return className;
- }
-
- public void setID(long id)
- {
- this.id = id;
- }
-
- public long getID()
- {
- return id;
- }
-
- public int getBranchID()
- {
- return CDOBranch.MAIN_BRANCH_ID;
- }
-
- public void setVersion(int version)
- {
- this.version = version;
- }
-
- public int getVersion()
- {
- return version;
- }
-
- public long getRevised()
- {
- return CDORevision.UNSPECIFIED_DATE;
- }
-
- public void setResourceID(long resourceID)
- {
- this.resourceID = resourceID;
- }
-
- public long getResourceID()
- {
- return resourceID;
- }
-
- public void setContainerID(Object containerID)
- {
- this.containerID = containerID;
- }
-
- public Object getContainerID()
- {
- return containerID;
- }
-
- public void setContainingFeatureID(int containingFeatureID)
- {
- this.containingFeatureID = containingFeatureID;
- }
-
- public int getContainingFeatureID()
- {
- return containingFeatureID;
- }
-
- public void setValues(List<Object> values)
- {
- this.values = values;
- }
-
- public List<Object> getValues()
- {
- return values;
- }
-
- public void setTimeStamp(long timeStamp)
- {
- this.timeStamp = timeStamp;
- }
-
- public long getTimeStamp()
- {
- return timeStamp;
- }
-
- public void setResource(boolean isResource)
- {
- this.isResource = isResource;
- }
-
- public boolean isResource()
- {
- return isResource;
- }
-
- public void setResourceFolder(boolean isResourceFolder)
- {
- this.isResourceFolder = isResourceFolder;
- }
-
- public boolean isResourceFolder()
- {
- return isResourceFolder;
- }
-
- public boolean isResourceNode()
- {
- return isResource || isResourceFolder;
- }
-
- public static DB4ORevision getDB4ORevision(InternalCDORevision revision)
- {
- CDOClassInfo classInfo = revision.getClassInfo();
- EClass eClass = classInfo.getEClass();
- String packageURI = eClass.getEPackage().getNsURI();
- String className = eClass.getName();
-
- CDOID revisionID = revision.getID();
- if (revisionID.isTemporary())
- {
- throw new IllegalArgumentException("TEMPORARY CDOID: " + revisionID);
- }
-
- boolean isResource = revision.isResource();
- boolean isResourceFolder = revision.isResourceFolder();
-
- long id = CDOIDUtil.getLong(revisionID);
- int version = revision.getVersion();
- long timeStamp = revision.getTimeStamp();
- long resourceID = CDOIDUtil.getLong(revision.getResourceID());
- Object containerID = getDB4OID((CDOID)revision.getContainerID());
- int containingFeatureID = revision.getContainingFeatureID();
-
- EStructuralFeature[] features = classInfo.getAllPersistentFeatures();
- List<Object> values = new ArrayList<Object>(features.length);
- if (features.length > 0)
- {
- for (int i = 0; i < features.length; i++)
- {
- EStructuralFeature feature = features[i];
- Object obj = revision.getValue(feature);
-
- // We will process CDOList for EReferences to get rid of CDOIDs (we want to get only primitive types,
- // otherwise the database will persist unwanted objects coming from Object-level relationships
-
- // Multi-valued EAttributes (also kept in CDOList) will be saved as is
- if (obj instanceof InternalCDOList && feature instanceof EReference)
- {
- InternalCDOList cdoList = (InternalCDOList)obj;
- List<Object> list = new ArrayList<Object>();
- for (Object listElement : cdoList)
- {
- if (!(listElement instanceof CDOID))
- {
- throw new IllegalStateException("CDOList should contain only CDOID instances but received "
- + listElement.getClass().getName() + " instead");
- }
-
- list.add(getDB4OID((CDOID)listElement));
- }
-
- values.add(i, list);
- }
- else if (listContainsInstancesOfClass(obj, CDOFeatureMapEntry.class)) // FeatureMap
- {
- values.add(i, DB4OFeatureMapEntry.getPrimitiveFeatureMapEntryList(obj));
- }
- else
- {
- // Prevent the explicit null-ref "NIL" from being serialized!
- if (obj == CDORevisionData.NIL)
- {
- obj = new ExplicitNull();
- }
-
- values.add(i, obj);
- }
- }
- }
-
- return new DB4ORevision(packageURI, className, id, version, resourceID, containerID, containingFeatureID, values,
- timeStamp, isResource, isResourceFolder);
- }
-
- public static InternalCDORevision getCDORevision(IStore store, DB4ORevision primitiveRevision)
- {
- IRepository repository = store.getRepository();
- CDORevisionFactory factory = ((InternalCDORevisionManager)repository.getRevisionManager()).getFactory();
- CDOBranch branch = repository.getBranchManager().getMainBranch();
-
- String nsURI = primitiveRevision.getPackageURI();
- String className = primitiveRevision.getClassName();
- EPackage ePackage = repository.getPackageRegistry().getEPackage(nsURI);
- EClass eClass = (EClass)ePackage.getEClassifier(className);
- InternalCDORevision revision = (InternalCDORevision)factory.createRevision(eClass);
-
- revision.setID(getCDOID(primitiveRevision.getID()));
- revision.setVersion(primitiveRevision.getVersion());
- revision.setBranchPoint(branch.getPoint(primitiveRevision.getTimeStamp()));
- revision.setRevised(primitiveRevision.getRevised());
- revision.setResourceID(getCDOID(primitiveRevision.getResourceID()));
- revision.setContainerID(getCDOID(primitiveRevision.getContainerID()));
- revision.setContainingFeatureID(primitiveRevision.getContainingFeatureID());
- EStructuralFeature[] features = revision.getClassInfo().getAllPersistentFeatures();
-
- int i = 0;
- for (Object value : primitiveRevision.getValues())
- {
- EStructuralFeature feature = features[i++];
- if (feature instanceof EReference && value instanceof List<?>)
- {
- List<?> sourceList = (List<?>)value;
- CDOList list = CDOListFactory.DEFAULT.createList(sourceList.size(), sourceList.size(), CDORevision.UNCHUNKED);
- for (int j = 0; j < sourceList.size(); j++)
- {
- list.set(j, getCDOID(sourceList.get(j)));
- }
-
- value = list;
- }
- else if (listContainsInstancesOfClass(value, DB4OFeatureMapEntry.class))
- {
- value = DB4OFeatureMapEntry.getCDOFeatureMapEntryList(eClass, value);
- }
-
- // Convert 'null' into the explicit null-ref "NIL" if appropriate
- if (value instanceof ExplicitNull)
- {
- value = CDORevisionData.NIL;
- }
-
- revision.setValue(feature, value);
- }
-
- return revision;
- }
-
- public static Object getDB4OID(CDOID id)
- {
- if (id.isExternal())
- {
- return new String(((CDOIDExternal)id).getURI());
- }
-
- return CDOIDUtil.getLong(id);
- }
-
- public static CDOID getCDOID(Object id)
- {
- if (id == null)
- {
- return CDOID.NULL;
- }
-
- if (id instanceof String)
- {
- return CDOIDUtil.createExternal((String)id);
- }
-
- if (id instanceof CDOID)
- {
- return (CDOID)id;
- }
-
- return CDOIDUtil.createLong((Long)id);
- }
-
- public static boolean listContainsInstancesOfClass(Object obj, Class<?> clazz)
- {
- if (obj instanceof List)
- {
- List<?> list = (List<?>)obj;
- for (Object potentialFeatureMap : list)
- {
- if (!clazz.isAssignableFrom(potentialFeatureMap.getClass()))
- {
- return false;
- }
- }
- return true;
- }
- return false;
- }
-
- private static final class DB4OFeatureMapEntry
- {
-
- private int featureID;
-
- private Object valueID;
-
- public DB4OFeatureMapEntry(int featureID, Object valueID)
- {
- setFeatureID(featureID);
- setValueID(valueID);
- }
-
- private void setFeatureID(int featureID)
- {
- this.featureID = featureID;
- }
-
- public int getFeatureID()
- {
- return featureID;
- }
-
- private void setValueID(Object valueID)
- {
- this.valueID = valueID;
- }
-
- public Object getValueID()
- {
- return valueID;
- }
-
- public static List<DB4OFeatureMapEntry> getPrimitiveFeatureMapEntryList(Object obj)
- {
- InternalCDOList cdoList = (InternalCDOList)obj;
- List<DB4OFeatureMapEntry> list = new ArrayList<DB4OFeatureMapEntry>();
- for (Object listElement : cdoList)
- {
- if (listElement instanceof FeatureMap.Entry)
- {
- FeatureMap.Entry entry = (FeatureMap.Entry)listElement;
- EStructuralFeature entryFeature = entry.getEStructuralFeature();
- CDOID entryValue = (CDOID)entry.getValue();
- DB4OFeatureMapEntry db4oEntry = new DB4OFeatureMapEntry(entryFeature.getFeatureID(), getDB4OID(entryValue));
- list.add(db4oEntry);
- }
- }
- return list;
- }
-
- public static CDOList getCDOFeatureMapEntryList(EClass eClass, Object value)
- {
- List<?> sourceList = (List<?>)value;
- CDOList list = CDOListFactory.DEFAULT.createList(sourceList.size(), sourceList.size(), CDORevision.UNCHUNKED);
- for (int j = 0; j < sourceList.size(); j++)
- {
- DB4OFeatureMapEntry mapEntry = (DB4OFeatureMapEntry)sourceList.get(j);
- EStructuralFeature entryFeature = eClass.getEStructuralFeature(mapEntry.getFeatureID());
- CDOID valueID = getCDOID(mapEntry.getValueID());
- list.set(j, CDORevisionUtil.createFeatureMapEntry(entryFeature, valueID));
- }
- return list;
- }
- }
-
- /**
- * @author Caspar De Groot
- */
- private static final class ExplicitNull
- {
- }
-}
+/* + * 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: + * Victor Roldan Betancort - initial API and implementation + */ + +package org.eclipse.emf.cdo.server.internal.db4o; + +import org.eclipse.emf.cdo.common.branch.CDOBranch; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDExternal; +import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.common.model.CDOClassInfo; +import org.eclipse.emf.cdo.common.revision.CDOList; +import org.eclipse.emf.cdo.common.revision.CDOListFactory; +import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionData; +import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; +import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; +import org.eclipse.emf.cdo.server.IRepository; +import org.eclipse.emf.cdo.server.IStore; +import org.eclipse.emf.cdo.spi.common.revision.CDOFeatureMapEntry; +import org.eclipse.emf.cdo.spi.common.revision.InternalCDOList; +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.util.FeatureMap; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Victor Roldan Betancort + */ +public class DB4ORevision +{ + public final static String ATTRIBUTE_CLASS_NAME = "className"; + + public final static String ATTRIBUTE_PACKAGE_NS_URI = "packageNsURI"; + + private String packageNsURI; + + private String className; + + private long id; + + private int version; + + private long timeStamp; + + private long resourceID; + + /** + * Can be an external ID! + */ + private Object containerID; + + private int containingFeatureID; + + private List<Object> values; + + // TODO enum RevisionType { NORMAL, ROOT_RESOURCE, RESOURCE, RESOURCE_FOLDER }?? + private boolean isResource; + + private boolean isResourceFolder; + + public DB4ORevision(String packageURI, String className, long id, int version, long resourceID, Object containerID, + int containingFeatureID, List<Object> values, long timestamp, boolean isResource, boolean isResourceFolder) + { + setPackageURI(packageURI); + setClassName(className); + setID(id); + setVersion(version); + setResourceID(resourceID); + setContainerID(containerID); + setContainingFeatureID(containingFeatureID); + setValues(values); + setTimeStamp(timestamp); + setResource(isResource); + setResourceFolder(isResourceFolder); + } + + public void setPackageURI(String packageURI) + { + packageNsURI = packageURI; + } + + public String getPackageURI() + { + return packageNsURI; + } + + public void setClassName(String className) + { + this.className = className; + } + + public String getClassName() + { + return className; + } + + public void setID(long id) + { + this.id = id; + } + + public long getID() + { + return id; + } + + public int getBranchID() + { + return CDOBranch.MAIN_BRANCH_ID; + } + + public void setVersion(int version) + { + this.version = version; + } + + public int getVersion() + { + return version; + } + + public long getRevised() + { + return CDORevision.UNSPECIFIED_DATE; + } + + public void setResourceID(long resourceID) + { + this.resourceID = resourceID; + } + + public long getResourceID() + { + return resourceID; + } + + public void setContainerID(Object containerID) + { + this.containerID = containerID; + } + + public Object getContainerID() + { + return containerID; + } + + public void setContainingFeatureID(int containingFeatureID) + { + this.containingFeatureID = containingFeatureID; + } + + public int getContainingFeatureID() + { + return containingFeatureID; + } + + public void setValues(List<Object> values) + { + this.values = values; + } + + public List<Object> getValues() + { + return values; + } + + public void setTimeStamp(long timeStamp) + { + this.timeStamp = timeStamp; + } + + public long getTimeStamp() + { + return timeStamp; + } + + public void setResource(boolean isResource) + { + this.isResource = isResource; + } + + public boolean isResource() + { + return isResource; + } + + public void setResourceFolder(boolean isResourceFolder) + { + this.isResourceFolder = isResourceFolder; + } + + public boolean isResourceFolder() + { + return isResourceFolder; + } + + public boolean isResourceNode() + { + return isResource || isResourceFolder; + } + + public static DB4ORevision getDB4ORevision(InternalCDORevision revision) + { + CDOClassInfo classInfo = revision.getClassInfo(); + EClass eClass = classInfo.getEClass(); + String packageURI = eClass.getEPackage().getNsURI(); + String className = eClass.getName(); + + CDOID revisionID = revision.getID(); + if (revisionID.isTemporary()) + { + throw new IllegalArgumentException("TEMPORARY CDOID: " + revisionID); + } + + boolean isResource = revision.isResource(); + boolean isResourceFolder = revision.isResourceFolder(); + + long id = CDOIDUtil.getLong(revisionID); + int version = revision.getVersion(); + long timeStamp = revision.getTimeStamp(); + long resourceID = CDOIDUtil.getLong(revision.getResourceID()); + Object containerID = getDB4OID((CDOID)revision.getContainerID()); + int containingFeatureID = revision.getContainingFeatureID(); + + EStructuralFeature[] features = classInfo.getAllPersistentFeatures(); + List<Object> values = new ArrayList<Object>(features.length); + if (features.length > 0) + { + for (int i = 0; i < features.length; i++) + { + EStructuralFeature feature = features[i]; + Object obj = revision.getValue(feature); + + // We will process CDOList for EReferences to get rid of CDOIDs (we want to get only primitive types, + // otherwise the database will persist unwanted objects coming from Object-level relationships + + // Multi-valued EAttributes (also kept in CDOList) will be saved as is + if (obj instanceof InternalCDOList && feature instanceof EReference) + { + InternalCDOList cdoList = (InternalCDOList)obj; + List<Object> list = new ArrayList<Object>(); + for (Object listElement : cdoList) + { + if (!(listElement instanceof CDOID)) + { + throw new IllegalStateException("CDOList should contain only CDOID instances but received " + + listElement.getClass().getName() + " instead"); + } + + list.add(getDB4OID((CDOID)listElement)); + } + + values.add(i, list); + } + else if (listContainsInstancesOfClass(obj, CDOFeatureMapEntry.class)) // FeatureMap + { + values.add(i, DB4OFeatureMapEntry.getPrimitiveFeatureMapEntryList(obj)); + } + else + { + // Prevent the explicit null-ref "NIL" from being serialized! + if (obj == CDORevisionData.NIL) + { + obj = new ExplicitNull(); + } + + values.add(i, obj); + } + } + } + + return new DB4ORevision(packageURI, className, id, version, resourceID, containerID, containingFeatureID, values, + timeStamp, isResource, isResourceFolder); + } + + public static InternalCDORevision getCDORevision(IStore store, DB4ORevision primitiveRevision) + { + IRepository repository = store.getRepository(); + CDORevisionFactory factory = ((InternalCDORevisionManager)repository.getRevisionManager()).getFactory(); + CDOBranch branch = repository.getBranchManager().getMainBranch(); + + String nsURI = primitiveRevision.getPackageURI(); + String className = primitiveRevision.getClassName(); + EPackage ePackage = repository.getPackageRegistry().getEPackage(nsURI); + EClass eClass = (EClass)ePackage.getEClassifier(className); + InternalCDORevision revision = (InternalCDORevision)factory.createRevision(eClass); + + revision.setID(getCDOID(primitiveRevision.getID())); + revision.setVersion(primitiveRevision.getVersion()); + revision.setBranchPoint(branch.getPoint(primitiveRevision.getTimeStamp())); + revision.setRevised(primitiveRevision.getRevised()); + revision.setResourceID(getCDOID(primitiveRevision.getResourceID())); + revision.setContainerID(getCDOID(primitiveRevision.getContainerID())); + revision.setContainingFeatureID(primitiveRevision.getContainingFeatureID()); + EStructuralFeature[] features = revision.getClassInfo().getAllPersistentFeatures(); + + int i = 0; + for (Object value : primitiveRevision.getValues()) + { + EStructuralFeature feature = features[i++]; + if (feature instanceof EReference && value instanceof List<?>) + { + List<?> sourceList = (List<?>)value; + CDOList list = CDOListFactory.DEFAULT.createList(sourceList.size(), sourceList.size(), CDORevision.UNCHUNKED); + for (int j = 0; j < sourceList.size(); j++) + { + list.set(j, getCDOID(sourceList.get(j))); + } + + value = list; + } + else if (listContainsInstancesOfClass(value, DB4OFeatureMapEntry.class)) + { + value = DB4OFeatureMapEntry.getCDOFeatureMapEntryList(eClass, value); + } + + // Convert 'null' into the explicit null-ref "NIL" if appropriate + if (value instanceof ExplicitNull) + { + value = CDORevisionData.NIL; + } + + revision.setValue(feature, value); + } + + return revision; + } + + public static Object getDB4OID(CDOID id) + { + if (id.isExternal()) + { + return new String(((CDOIDExternal)id).getURI()); + } + + return CDOIDUtil.getLong(id); + } + + public static CDOID getCDOID(Object id) + { + if (id == null) + { + return CDOID.NULL; + } + + if (id instanceof String) + { + return CDOIDUtil.createExternal((String)id); + } + + if (id instanceof CDOID) + { + return (CDOID)id; + } + + return CDOIDUtil.createLong((Long)id); + } + + public static boolean listContainsInstancesOfClass(Object obj, Class<?> clazz) + { + if (obj instanceof List) + { + List<?> list = (List<?>)obj; + for (Object potentialFeatureMap : list) + { + if (!clazz.isAssignableFrom(potentialFeatureMap.getClass())) + { + return false; + } + } + return true; + } + return false; + } + + private static final class DB4OFeatureMapEntry + { + + private int featureID; + + private Object valueID; + + public DB4OFeatureMapEntry(int featureID, Object valueID) + { + setFeatureID(featureID); + setValueID(valueID); + } + + private void setFeatureID(int featureID) + { + this.featureID = featureID; + } + + public int getFeatureID() + { + return featureID; + } + + private void setValueID(Object valueID) + { + this.valueID = valueID; + } + + public Object getValueID() + { + return valueID; + } + + public static List<DB4OFeatureMapEntry> getPrimitiveFeatureMapEntryList(Object obj) + { + InternalCDOList cdoList = (InternalCDOList)obj; + List<DB4OFeatureMapEntry> list = new ArrayList<DB4OFeatureMapEntry>(); + for (Object listElement : cdoList) + { + if (listElement instanceof FeatureMap.Entry) + { + FeatureMap.Entry entry = (FeatureMap.Entry)listElement; + EStructuralFeature entryFeature = entry.getEStructuralFeature(); + CDOID entryValue = (CDOID)entry.getValue(); + DB4OFeatureMapEntry db4oEntry = new DB4OFeatureMapEntry(entryFeature.getFeatureID(), getDB4OID(entryValue)); + list.add(db4oEntry); + } + } + return list; + } + + public static CDOList getCDOFeatureMapEntryList(EClass eClass, Object value) + { + List<?> sourceList = (List<?>)value; + CDOList list = CDOListFactory.DEFAULT.createList(sourceList.size(), sourceList.size(), CDORevision.UNCHUNKED); + for (int j = 0; j < sourceList.size(); j++) + { + DB4OFeatureMapEntry mapEntry = (DB4OFeatureMapEntry)sourceList.get(j); + EStructuralFeature entryFeature = eClass.getEStructuralFeature(mapEntry.getFeatureID()); + CDOID valueID = getCDOID(mapEntry.getValueID()); + list.set(j, CDORevisionUtil.createFeatureMapEntry(entryFeature, valueID)); + } + return list; + } + } + + /** + * @author Caspar De Groot + */ + private static final class ExplicitNull + { + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStore.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStore.java index c370b83e39..183eace6aa 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStore.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStore.java @@ -1,496 +1,496 @@ -/*
- * 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.id.CDOIDUtil;
-import org.eclipse.emf.cdo.server.ISession;
-import org.eclipse.emf.cdo.server.IStore;
-import org.eclipse.emf.cdo.server.IStoreAccessor;
-import org.eclipse.emf.cdo.server.ITransaction;
-import org.eclipse.emf.cdo.server.IView;
-import org.eclipse.emf.cdo.server.db4o.IDB4OIdentifiableObject;
-import org.eclipse.emf.cdo.server.db4o.IDB4OStore;
-import org.eclipse.emf.cdo.spi.server.LongIDStore;
-import org.eclipse.emf.cdo.spi.server.StoreAccessorPool;
-
-import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump;
-import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
-
-import com.db4o.Db4o;
-import com.db4o.ObjectContainer;
-import com.db4o.ObjectServer;
-import com.db4o.ObjectSet;
-import com.db4o.config.Configuration;
-import com.db4o.constraints.UniqueFieldValueConstraint;
-import com.db4o.query.Query;
-import com.db4o.reflect.jdk.JdkReflector;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Victor Roldan Betancort
- */
-public class DB4OStore extends LongIDStore implements IDB4OStore
-{
- private static final String ID_ATTRIBUTE = "id";
-
- private transient String storeLocation;
-
- private transient int port;
-
- private transient ObjectServer server;
-
- private transient Configuration serverConfiguration;
-
- private ServerInfo serverInfo;
-
- private DB4ODurableLockingManager durableLockingManager = new DB4ODurableLockingManager();
-
- @ExcludeFromDump
- private transient final StoreAccessorPool readerPool = new StoreAccessorPool(this, null);
-
- @ExcludeFromDump
- private transient final StoreAccessorPool writerPool = new StoreAccessorPool(this, null);
-
- public DB4OStore(String storeLocation, int port)
- {
- super(IDB4OStore.TYPE, set(ChangeFormat.REVISION), set(RevisionTemporality.NONE, RevisionTemporality.AUDITING),
- set(RevisionParallelism.NONE, RevisionParallelism.BRANCHING));
-
- // setRevisionTemporality(RevisionTemporality.AUDITING);
- // setRevisionParallelism(RevisionParallelism.BRANCHING);
-
- this.storeLocation = storeLocation;
- this.port = port;
- }
-
- public DB4OStore(String storeLocation, int port, Configuration serverConfiguration)
- {
- this(storeLocation, port);
- this.serverConfiguration = serverConfiguration;
- }
-
- public String getStoreLocation()
- {
- return storeLocation;
- }
-
- public int getPort()
- {
- return port;
- }
-
- public long getCreationTime()
- {
- return getServerInfo().getCreationTime();
- }
-
- public void setCreationTime(long creationTime)
- {
- getServerInfo().setCreationTime(creationTime);
- }
-
- public boolean isFirstStart()
- {
- return getServerInfo().isFirstTime();
- }
-
- public DB4ODurableLockingManager getDurableLockingManager()
- {
- return durableLockingManager;
- }
-
- public Map<String, String> getPersistentProperties(Set<String> names)
- {
- if (names == null || names.isEmpty())
- {
- return new HashMap<String, String>(getServerInfo().getProperties());
- }
-
- Map<String, String> result = new HashMap<String, String>();
- for (String key : names)
- {
- String value = getServerInfo().getProperties().get(key);
- if (value != null)
- {
- result.put(key, value);
- }
- }
-
- return result;
- }
-
- public void setPersistentProperties(Map<String, String> properties)
- {
- ServerInfo serverInfo = getServerInfo();
- serverInfo.getProperties().putAll(properties);
- commitServerInfo(null);
- }
-
- public void removePersistentProperties(Set<String> names)
- {
- ServerInfo serverInfo = getServerInfo();
- Map<String, String> properties = serverInfo.getProperties();
- for (String key : names)
- {
- properties.remove(key);
- }
-
- commitServerInfo(null);
- }
-
- // @Override
- // public CDOID getNextCDOID(LongIDStoreAccessor accessor, CDORevision revision)
- // {
- // ObjectContainer objectContainer = ((DB4OStoreAccessor)accessor).getObjectContainer();
- // ExtObjectContainer ext = objectContainer.ext();
- // ext.store(revision);
- //
- // long id = ext.getID(revision);
- // return CDOIDUtil.createLong(id);
- // }
-
- public ObjectContainer openClient()
- {
- return server.openClient();
- }
-
- @Override
- protected void doActivate() throws Exception
- {
- super.doActivate();
- initObjectServer();
- initServerInfo();
- setLastCommitTime(getServerInfo().getLastCommitTime());
- setLastObjectID(fetchLastObjectID());
- LifecycleUtil.activate(durableLockingManager);
- }
-
- private long fetchLastObjectID()
- {
- ObjectContainer container = openClient();
-
- try
- {
- Query query = container.query();
- query.constrain(DB4ORevision.class);
- query.descend("id").orderDescending();
- ObjectSet<?> results = query.execute();
- int size = results.size();
- if (size > 0)
- {
- DB4ORevision rev = (DB4ORevision)results.next();
- return rev.getID();
- }
- return 0;
- }
- finally
- {
- closeClient(container);
- }
- }
-
- protected void initObjectServer()
- {
- Configuration configuration = serverConfiguration;
- if (configuration == null)
- {
- configuration = createServerConfiguration();
- }
- {
- File file = new File(getStoreLocation());
- if (!file.exists())
- {
- try
- {
- file.createNewFile();
- }
- catch (IOException ex)
- {
- throw new RuntimeException(ex);
- }
- }
- }
-
- server = Db4o.openServer(configuration, getStoreLocation(), getPort());
- }
-
- protected void tearDownObjectServer()
- {
- server.close();
- server = null;
- }
-
- private ServerInfo getServerInfo()
- {
- if (serverInfo == null)
- {
- initServerInfo();
- }
-
- return serverInfo;
- }
-
- private void initServerInfo()
- {
- ObjectContainer container = openClient();
-
- try
- {
- serverInfo = getServerInfoFromDatabase(container);
-
- if (serverInfo == null)
- {
- serverInfo = new ServerInfo();
- serverInfo.setFirstTime(true);
- serverInfo.setCreationTime(System.currentTimeMillis());
- commitServerInfo(container);
- }
- else
- {
- if (serverInfo.isFirstTime())
- {
- serverInfo.setFirstTime(false);
- commitServerInfo(container);
- }
- }
- }
- finally
- {
- closeClient(container);
- }
- }
-
- private ServerInfo getServerInfoFromDatabase(ObjectContainer container)
- {
- ObjectSet<ServerInfo> infos = container.query(ServerInfo.class);
- if (infos.size() > 1)
- {
- throw new IllegalStateException("ServeInfo is stored in container more than once");
- }
-
- if (infos.size() == 1)
- {
- return infos.get(0);
- }
-
- return null;
- }
-
- protected void closeClient(ObjectContainer container)
- {
- container.close();
- }
-
- private void commitServerInfo(ObjectContainer container)
- {
- ObjectContainer usedContainer = container != null ? container : openClient();
-
- try
- {
- ServerInfo storedInfo = getServerInfoFromDatabase(usedContainer);
- if (storedInfo != null && storedInfo != serverInfo)
- {
- storedInfo.setCreationTime(serverInfo.getCreationTime());
- storedInfo.setFirstTime(serverInfo.isFirstTime());
- storedInfo.setLastCommitTime(serverInfo.getLastCommitTime());
- storedInfo.setProperties(serverInfo.getProperties());
- serverInfo = storedInfo;
- }
-
- usedContainer.store(serverInfo);
- usedContainer.commit();
- }
- finally
- {
- if (usedContainer != container)
- {
- closeClient(usedContainer);
- }
- }
- }
-
- @Override
- protected void doDeactivate() throws Exception
- {
- ObjectContainer container = openClient();
-
- try
- {
- getServerInfo().setLastCommitTime(getLastCommitTime());
- commitServerInfo(container);
- }
- finally
- {
- closeClient(container);
- }
-
- LifecycleUtil.deactivate(durableLockingManager);
- tearDownObjectServer();
-
- super.doDeactivate();
- }
-
- protected Configuration createServerConfiguration()
- {
- Configuration config = Db4o.newConfiguration();
- config.reflectWith(new JdkReflector(getClass().getClassLoader()));
-
- config.objectClass(DB4ORevision.class).objectField("id").indexed(true);
- config.add(new UniqueFieldValueConstraint(DB4ORevision.class, "id"));
-
- config.objectClass(DB4OPackageUnit.class).objectField("id").indexed(true);
- config.add(new UniqueFieldValueConstraint(DB4OPackageUnit.class, "id"));
-
- config.objectClass(DB4OIdentifiableObject.class).objectField("id").indexed(true);
- config.add(new UniqueFieldValueConstraint(DB4OIdentifiableObject.class, "id"));
-
- config.objectClass(DB4OCommitInfo.class).objectField("timeStamp").indexed(true);
-
- config.objectClass(DB4OLockArea.class).objectField("id").indexed(true);
- config.add(new UniqueFieldValueConstraint(DB4OLockArea.class, "id"));
- config.objectClass(DB4OLockArea.class).cascadeOnUpdate(true);
- config.objectClass(DB4OLockArea.class).cascadeOnDelete(true);
-
- return config;
- }
-
- @Override
- protected IStoreAccessor createReader(ISession session)
- {
- return new DB4OStoreAccessor(this, session);
- }
-
- @Override
- protected IStoreAccessor createWriter(ITransaction transaction)
- {
- return new DB4OStoreAccessor(this, transaction);
- }
-
- @Override
- protected StoreAccessorPool getReaderPool(ISession session, boolean forReleasing)
- {
- return readerPool;
- }
-
- @Override
- protected StoreAccessorPool getWriterPool(IView view, boolean forReleasing)
- {
- return writerPool;
- }
-
- public static DB4ORevision getRevision(ObjectContainer container, CDOID id)
- {
- Query query = container.query();
- query.constrain(DB4ORevision.class);
- query.descend(ID_ATTRIBUTE).constrain(CDOIDUtil.getLong(id));
-
- ObjectSet<?> revisions = query.execute();
- if (revisions.isEmpty())
- {
- return null;
- }
-
- return (DB4ORevision)revisions.get(0);
- }
-
- public static <T> List<T> getElementsOfType(ObjectContainer container, Class<T> clazz)
- {
- ObjectSet<T> elements = container.query(clazz);
- return elements;
- }
-
- public static IDB4OIdentifiableObject getIdentifiableObject(ObjectContainer container, String id)
- {
- Query query = container.query();
- query.constrain(IDB4OIdentifiableObject.class);
- query.descend(ID_ATTRIBUTE).constrain(id);
-
- ObjectSet<?> revisions = query.execute();
- if (revisions.isEmpty())
- {
- return null;
- }
-
- return (IDB4OIdentifiableObject)revisions.get(0);
- }
-
- public static void removeRevision(ObjectContainer container, CDOID id)
- {
- DB4ORevision revision = getRevision(container, id);
- if (revision != null)
- {
- container.delete(revision);
- }
- }
-
- /**
- * Carries {@link IStore}-related information.
- *
- * @author Victor Roldan Betancort
- */
- private static final class ServerInfo
- {
- private boolean isFirstTime;
-
- private long creationTime;
-
- private long lastCommitTime;
-
- private Map<String, String> properties = new HashMap<String, String>();
-
- public boolean isFirstTime()
- {
- return isFirstTime;
- }
-
- public void setFirstTime(boolean isFirstTime)
- {
- this.isFirstTime = isFirstTime;
- }
-
- public void setCreationTime(long creationTime)
- {
- this.creationTime = creationTime;
- }
-
- public long getCreationTime()
- {
- return creationTime;
- }
-
- public void setProperties(Map<String, String> properties)
- {
- this.properties = properties;
- }
-
- public Map<String, String> getProperties()
- {
- return properties;
- }
-
- public long getLastCommitTime()
- {
- return lastCommitTime;
- }
-
- public void setLastCommitTime(long lastCommitTime)
- {
- this.lastCommitTime = lastCommitTime;
- }
- }
-}
+/* + * 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: + * Victor Roldan Betancort - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.db4o; + +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.server.ISession; +import org.eclipse.emf.cdo.server.IStore; +import org.eclipse.emf.cdo.server.IStoreAccessor; +import org.eclipse.emf.cdo.server.ITransaction; +import org.eclipse.emf.cdo.server.IView; +import org.eclipse.emf.cdo.server.db4o.IDB4OIdentifiableObject; +import org.eclipse.emf.cdo.server.db4o.IDB4OStore; +import org.eclipse.emf.cdo.spi.server.LongIDStore; +import org.eclipse.emf.cdo.spi.server.StoreAccessorPool; + +import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump; +import org.eclipse.net4j.util.lifecycle.LifecycleUtil; + +import com.db4o.Db4o; +import com.db4o.ObjectContainer; +import com.db4o.ObjectServer; +import com.db4o.ObjectSet; +import com.db4o.config.Configuration; +import com.db4o.constraints.UniqueFieldValueConstraint; +import com.db4o.query.Query; +import com.db4o.reflect.jdk.JdkReflector; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author Victor Roldan Betancort + */ +public class DB4OStore extends LongIDStore implements IDB4OStore +{ + private static final String ID_ATTRIBUTE = "id"; + + private transient String storeLocation; + + private transient int port; + + private transient ObjectServer server; + + private transient Configuration serverConfiguration; + + private ServerInfo serverInfo; + + private DB4ODurableLockingManager durableLockingManager = new DB4ODurableLockingManager(); + + @ExcludeFromDump + private transient final StoreAccessorPool readerPool = new StoreAccessorPool(this, null); + + @ExcludeFromDump + private transient final StoreAccessorPool writerPool = new StoreAccessorPool(this, null); + + public DB4OStore(String storeLocation, int port) + { + super(IDB4OStore.TYPE, set(ChangeFormat.REVISION), set(RevisionTemporality.NONE, RevisionTemporality.AUDITING), + set(RevisionParallelism.NONE, RevisionParallelism.BRANCHING)); + + // setRevisionTemporality(RevisionTemporality.AUDITING); + // setRevisionParallelism(RevisionParallelism.BRANCHING); + + this.storeLocation = storeLocation; + this.port = port; + } + + public DB4OStore(String storeLocation, int port, Configuration serverConfiguration) + { + this(storeLocation, port); + this.serverConfiguration = serverConfiguration; + } + + public String getStoreLocation() + { + return storeLocation; + } + + public int getPort() + { + return port; + } + + public long getCreationTime() + { + return getServerInfo().getCreationTime(); + } + + public void setCreationTime(long creationTime) + { + getServerInfo().setCreationTime(creationTime); + } + + public boolean isFirstStart() + { + return getServerInfo().isFirstTime(); + } + + public DB4ODurableLockingManager getDurableLockingManager() + { + return durableLockingManager; + } + + public Map<String, String> getPersistentProperties(Set<String> names) + { + if (names == null || names.isEmpty()) + { + return new HashMap<String, String>(getServerInfo().getProperties()); + } + + Map<String, String> result = new HashMap<String, String>(); + for (String key : names) + { + String value = getServerInfo().getProperties().get(key); + if (value != null) + { + result.put(key, value); + } + } + + return result; + } + + public void setPersistentProperties(Map<String, String> properties) + { + ServerInfo serverInfo = getServerInfo(); + serverInfo.getProperties().putAll(properties); + commitServerInfo(null); + } + + public void removePersistentProperties(Set<String> names) + { + ServerInfo serverInfo = getServerInfo(); + Map<String, String> properties = serverInfo.getProperties(); + for (String key : names) + { + properties.remove(key); + } + + commitServerInfo(null); + } + + // @Override + // public CDOID getNextCDOID(LongIDStoreAccessor accessor, CDORevision revision) + // { + // ObjectContainer objectContainer = ((DB4OStoreAccessor)accessor).getObjectContainer(); + // ExtObjectContainer ext = objectContainer.ext(); + // ext.store(revision); + // + // long id = ext.getID(revision); + // return CDOIDUtil.createLong(id); + // } + + public ObjectContainer openClient() + { + return server.openClient(); + } + + @Override + protected void doActivate() throws Exception + { + super.doActivate(); + initObjectServer(); + initServerInfo(); + setLastCommitTime(getServerInfo().getLastCommitTime()); + setLastObjectID(fetchLastObjectID()); + LifecycleUtil.activate(durableLockingManager); + } + + private long fetchLastObjectID() + { + ObjectContainer container = openClient(); + + try + { + Query query = container.query(); + query.constrain(DB4ORevision.class); + query.descend("id").orderDescending(); + ObjectSet<?> results = query.execute(); + int size = results.size(); + if (size > 0) + { + DB4ORevision rev = (DB4ORevision)results.next(); + return rev.getID(); + } + return 0; + } + finally + { + closeClient(container); + } + } + + protected void initObjectServer() + { + Configuration configuration = serverConfiguration; + if (configuration == null) + { + configuration = createServerConfiguration(); + } + { + File file = new File(getStoreLocation()); + if (!file.exists()) + { + try + { + file.createNewFile(); + } + catch (IOException ex) + { + throw new RuntimeException(ex); + } + } + } + + server = Db4o.openServer(configuration, getStoreLocation(), getPort()); + } + + protected void tearDownObjectServer() + { + server.close(); + server = null; + } + + private ServerInfo getServerInfo() + { + if (serverInfo == null) + { + initServerInfo(); + } + + return serverInfo; + } + + private void initServerInfo() + { + ObjectContainer container = openClient(); + + try + { + serverInfo = getServerInfoFromDatabase(container); + + if (serverInfo == null) + { + serverInfo = new ServerInfo(); + serverInfo.setFirstTime(true); + serverInfo.setCreationTime(System.currentTimeMillis()); + commitServerInfo(container); + } + else + { + if (serverInfo.isFirstTime()) + { + serverInfo.setFirstTime(false); + commitServerInfo(container); + } + } + } + finally + { + closeClient(container); + } + } + + private ServerInfo getServerInfoFromDatabase(ObjectContainer container) + { + ObjectSet<ServerInfo> infos = container.query(ServerInfo.class); + if (infos.size() > 1) + { + throw new IllegalStateException("ServeInfo is stored in container more than once"); + } + + if (infos.size() == 1) + { + return infos.get(0); + } + + return null; + } + + protected void closeClient(ObjectContainer container) + { + container.close(); + } + + private void commitServerInfo(ObjectContainer container) + { + ObjectContainer usedContainer = container != null ? container : openClient(); + + try + { + ServerInfo storedInfo = getServerInfoFromDatabase(usedContainer); + if (storedInfo != null && storedInfo != serverInfo) + { + storedInfo.setCreationTime(serverInfo.getCreationTime()); + storedInfo.setFirstTime(serverInfo.isFirstTime()); + storedInfo.setLastCommitTime(serverInfo.getLastCommitTime()); + storedInfo.setProperties(serverInfo.getProperties()); + serverInfo = storedInfo; + } + + usedContainer.store(serverInfo); + usedContainer.commit(); + } + finally + { + if (usedContainer != container) + { + closeClient(usedContainer); + } + } + } + + @Override + protected void doDeactivate() throws Exception + { + ObjectContainer container = openClient(); + + try + { + getServerInfo().setLastCommitTime(getLastCommitTime()); + commitServerInfo(container); + } + finally + { + closeClient(container); + } + + LifecycleUtil.deactivate(durableLockingManager); + tearDownObjectServer(); + + super.doDeactivate(); + } + + protected Configuration createServerConfiguration() + { + Configuration config = Db4o.newConfiguration(); + config.reflectWith(new JdkReflector(getClass().getClassLoader())); + + config.objectClass(DB4ORevision.class).objectField("id").indexed(true); + config.add(new UniqueFieldValueConstraint(DB4ORevision.class, "id")); + + config.objectClass(DB4OPackageUnit.class).objectField("id").indexed(true); + config.add(new UniqueFieldValueConstraint(DB4OPackageUnit.class, "id")); + + config.objectClass(DB4OIdentifiableObject.class).objectField("id").indexed(true); + config.add(new UniqueFieldValueConstraint(DB4OIdentifiableObject.class, "id")); + + config.objectClass(DB4OCommitInfo.class).objectField("timeStamp").indexed(true); + + config.objectClass(DB4OLockArea.class).objectField("id").indexed(true); + config.add(new UniqueFieldValueConstraint(DB4OLockArea.class, "id")); + config.objectClass(DB4OLockArea.class).cascadeOnUpdate(true); + config.objectClass(DB4OLockArea.class).cascadeOnDelete(true); + + return config; + } + + @Override + protected IStoreAccessor createReader(ISession session) + { + return new DB4OStoreAccessor(this, session); + } + + @Override + protected IStoreAccessor createWriter(ITransaction transaction) + { + return new DB4OStoreAccessor(this, transaction); + } + + @Override + protected StoreAccessorPool getReaderPool(ISession session, boolean forReleasing) + { + return readerPool; + } + + @Override + protected StoreAccessorPool getWriterPool(IView view, boolean forReleasing) + { + return writerPool; + } + + public static DB4ORevision getRevision(ObjectContainer container, CDOID id) + { + Query query = container.query(); + query.constrain(DB4ORevision.class); + query.descend(ID_ATTRIBUTE).constrain(CDOIDUtil.getLong(id)); + + ObjectSet<?> revisions = query.execute(); + if (revisions.isEmpty()) + { + return null; + } + + return (DB4ORevision)revisions.get(0); + } + + public static <T> List<T> getElementsOfType(ObjectContainer container, Class<T> clazz) + { + ObjectSet<T> elements = container.query(clazz); + return elements; + } + + public static IDB4OIdentifiableObject getIdentifiableObject(ObjectContainer container, String id) + { + Query query = container.query(); + query.constrain(IDB4OIdentifiableObject.class); + query.descend(ID_ATTRIBUTE).constrain(id); + + ObjectSet<?> revisions = query.execute(); + if (revisions.isEmpty()) + { + return null; + } + + return (IDB4OIdentifiableObject)revisions.get(0); + } + + public static void removeRevision(ObjectContainer container, CDOID id) + { + DB4ORevision revision = getRevision(container, id); + if (revision != null) + { + container.delete(revision); + } + } + + /** + * Carries {@link IStore}-related information. + * + * @author Victor Roldan Betancort + */ + private static final class ServerInfo + { + private boolean isFirstTime; + + private long creationTime; + + private long lastCommitTime; + + private Map<String, String> properties = new HashMap<String, String>(); + + public boolean isFirstTime() + { + return isFirstTime; + } + + public void setFirstTime(boolean isFirstTime) + { + this.isFirstTime = isFirstTime; + } + + public void setCreationTime(long creationTime) + { + this.creationTime = creationTime; + } + + public long getCreationTime() + { + return creationTime; + } + + public void setProperties(Map<String, String> properties) + { + this.properties = properties; + } + + public Map<String, String> getProperties() + { + return properties; + } + + public long getLastCommitTime() + { + return lastCommitTime; + } + + public void setLastCommitTime(long lastCommitTime) + { + this.lastCommitTime = lastCommitTime; + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStoreFactory.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStoreFactory.java index 7181dd7650..6f6f6dd981 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStoreFactory.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStoreFactory.java @@ -1,58 +1,58 @@ -/*
- * 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-import org.eclipse.emf.cdo.server.IStore;
-import org.eclipse.emf.cdo.server.IStoreFactory;
-import org.eclipse.emf.cdo.server.db4o.IDB4OStore;
-import org.eclipse.emf.cdo.server.internal.db4o.bundle.OM;
-import org.eclipse.emf.cdo.spi.server.RepositoryConfigurator;
-
-import org.w3c.dom.Element;
-
-import java.util.Map;
-
-/**
- * @author Victor Roldan Betancort
- */
-public class DB4OStoreFactory implements IStoreFactory
-{
- private static final String PROPERTY_PORT = "port";
-
- private static final String PROPERTY_PATH = "path";
-
- public DB4OStoreFactory()
- {
- }
-
- public String getStoreType()
- {
- return IDB4OStore.TYPE;
- }
-
- public IStore createStore(String repositoryName, Map<String, String> repositoryProperties, Element storeConfig)
- {
- try
- {
- Map<String, String> properties = RepositoryConfigurator.getProperties(storeConfig, 1);
- String dataFilePath = properties.get(PROPERTY_PATH);
- String portString = properties.get(PROPERTY_PORT);
- int port = portString != null ? Integer.parseInt(portString) : 1677;
- return new DB4OStore(dataFilePath, port);
- }
- catch (Exception ex)
- {
- OM.LOG.error(ex);
- }
-
- return null;
- }
-}
+/* + * 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: + * Victor Roldan Betancort - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.db4o; + +import org.eclipse.emf.cdo.server.IStore; +import org.eclipse.emf.cdo.server.IStoreFactory; +import org.eclipse.emf.cdo.server.db4o.IDB4OStore; +import org.eclipse.emf.cdo.server.internal.db4o.bundle.OM; +import org.eclipse.emf.cdo.spi.server.RepositoryConfigurator; + +import org.w3c.dom.Element; + +import java.util.Map; + +/** + * @author Victor Roldan Betancort + */ +public class DB4OStoreFactory implements IStoreFactory +{ + private static final String PROPERTY_PORT = "port"; + + private static final String PROPERTY_PATH = "path"; + + public DB4OStoreFactory() + { + } + + public String getStoreType() + { + return IDB4OStore.TYPE; + } + + public IStore createStore(String repositoryName, Map<String, String> repositoryProperties, Element storeConfig) + { + try + { + Map<String, String> properties = RepositoryConfigurator.getProperties(storeConfig, 1); + String dataFilePath = properties.get(PROPERTY_PATH); + String portString = properties.get(PROPERTY_PORT); + int port = portString != null ? Integer.parseInt(portString) : 1677; + return new DB4OStore(dataFilePath, port); + } + catch (Exception ex) + { + OM.LOG.error(ex); + } + + return null; + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OWrappedValue.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OWrappedValue.java index f847b202fd..32d2c855c7 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OWrappedValue.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OWrappedValue.java @@ -1,36 +1,36 @@ -/*
- * 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-/**
- * @author Victor Roldan Betancort
- */
-public class DB4OWrappedValue<TYPE> extends DB4OIdentifiableObject
-{
- private TYPE value;
-
- public DB4OWrappedValue(String id, TYPE value)
- {
- setId(id);
- setValue(value);
- }
-
- public TYPE getValue()
- {
- return value;
- }
-
- private void setValue(TYPE value)
- {
- this.value = value;
- }
-
-}
+/* + * 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: + * Victor Roldan Betancort - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.db4o; + +/** + * @author Victor Roldan Betancort + */ +public class DB4OWrappedValue<TYPE> extends DB4OIdentifiableObject +{ + private TYPE value; + + public DB4OWrappedValue(String id, TYPE value) + { + setId(id); + setValue(value); + } + + public TYPE getValue() + { + return value; + } + + private void setValue(TYPE value) + { + this.value = value; + } + +} diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/bundle/OM.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/bundle/OM.java index bbce2e254d..edfdca447d 100644 --- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/bundle/OM.java +++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/bundle/OM.java @@ -1,45 +1,45 @@ -/*
- * 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-
-package org.eclipse.emf.cdo.server.internal.db4o.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 Victor Roldan Betancort
- */
-public abstract class OM
-{
- public static final String BUNDLE_ID = "org.eclipse.emf.cdo.server.db4o"; //$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 Victor Roldan Betancort
- */
- 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: + * Victor Roldan Betancort - initial API and implementation + */ + +package org.eclipse.emf.cdo.server.internal.db4o.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 Victor Roldan Betancort + */ +public abstract class OM +{ + public static final String BUNDLE_ID = "org.eclipse.emf.cdo.server.db4o"; //$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 Victor Roldan Betancort + */ + public static final class Activator extends OSGiActivator + { + public Activator() + { + super(BUNDLE); + } + } +} |