You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by dc...@apache.org on 2010/04/22 18:28:00 UTC

svn commit: r936938 [18/29] - in /incubator/chemistry/opencmis/trunk/chemistry-opencmis-server: chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/ chemistry-opencmis-server-bindings/src/main/java/org/apache/chem...

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/DocumentVersionImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/DocumentVersionImpl.java?rev=936938&r1=936937&r2=936938&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/DocumentVersionImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/DocumentVersionImpl.java Thu Apr 22 16:27:57 2010
@@ -41,212 +41,212 @@ import org.apache.chemistry.opencmis.inm
  */
 public class DocumentVersionImpl extends StoredObjectImpl implements DocumentVersion {
 
-	private ContentStreamDataImpl fContent;
-	private VersionedDocument fContainer; // the document this version belongs
-											// to
-	private String fComment; // checkin comment
-	boolean fIsMajor;
-	boolean fIsPwc; // true if this is the PWC
-
-	public DocumentVersionImpl(String repositoryId, VersionedDocument container, ContentStream content,
-			VersioningState verState, ObjectStoreImpl objStore) {
-		super(objStore);
-		setRepositoryId(repositoryId);
-		fContainer = container;
-		setContent(content, false);
-		fIsMajor = verState == VersioningState.MAJOR;
-		fIsPwc = verState == VersioningState.CHECKEDOUT;
-		fProperties = new HashMap<String, PropertyData<?>>(); // ensure that we
-																// have a map
-	}
-
-	public void setContent(ContentStream content, boolean mustPersist) {
-		if (null == content) {
-			fContent = null;
-		} else {
-			fContent = new ContentStreamDataImpl();
-			fContent.setFileName(content.getFileName());
-			fContent.setMimeType(content.getMimeType());
-			try {
-				fContent.setContent(content.getStream());
-			} catch (IOException e) {
-				e.printStackTrace();
-				throw new RuntimeException("Failed to get content from InputStream", e);
-			}
-		}
-	}
-
-	public void setCheckinComment(String comment) {
-		fComment = comment;
-	}
-
-	public String getCheckinComment() {
-		return fComment;
-	}
-
-	public String getVersionLabel() {
-		int majorNo = 0;
-		int minorNo = 0;
-		List<DocumentVersion> allVersions = fContainer.getAllVersions();
-		for (DocumentVersion ver : allVersions) {
-			if (ver.isMajor()) {
-				++majorNo;
-				minorNo = 0;
-			} else
-				++minorNo;
-		}
-		String label = "V " + majorNo + "." + minorNo;
-		return label;
-	}
-
-	public boolean isMajor() {
-		return fIsMajor && !isPwc();
-	}
-
-	public boolean isPwc() {
-		return fIsPwc;
-	}
-
-	public void commit(boolean isMajor) {
-		fIsPwc = false; // unset working copy flag
-		fIsMajor = isMajor;
-	}
-
-	public ContentStream getContent(long offset, long length) {
-		if (offset <= 0 && length < 0)
-			return fContent;
-		else
-			return fContent.getCloneWithLimits(offset, length);
-	}
-
-	public VersionedDocument getParentDocument() {
-		return fContainer;
-	}
-
-	private boolean isLatestVersion() {
-		List<DocumentVersion> allVers = fContainer.getAllVersions();
-		boolean isLatestVersion;
-		if (isPwc())
-			isLatestVersion = allVers.size() > 1 && allVers.get(allVers.size() - 2).equals(this);
-		else
-			isLatestVersion = allVers.get(allVers.size() - 1).equals(this);
-		return isLatestVersion;
-	}
-
-	private boolean isLatestMajorVersion() {
-		if (!fIsMajor)
-			return false;
-
-		List<DocumentVersion> allVersions = fContainer.getAllVersions();
-		DocumentVersion latestMajor = null;
-
-		for (DocumentVersion ver : allVersions)
-			if (ver.isMajor() && !ver.isPwc())
-				latestMajor = ver;
-
-		boolean isLatestMajorVersion = latestMajor == this;
-		return isLatestMajorVersion;
-	}
-
-	// public void persist() {
-	// if (null==fId)
-	// fId = UUID.randomUUID().toString();
-	// }
-
-	public void fillProperties(Map<String, PropertyData<?>> properties, BindingsObjectFactory objFactory,
-			List<String> requestedIds) {
-
-		DocumentVersion pwc = fContainer.getPwc();
-
-		// First get the properties of the container (like custom type
-		// properties, etc)
-		fContainer.fillProperties(properties, objFactory, requestedIds);
-
-		// overwrite the version specific properties (like modification date,
-		// user, etc.)
-		// and set some properties specific to the version
-		super.fillProperties(properties, objFactory, requestedIds);
-
-		// fill the version related properties
-		if (FilterParser.isContainedInFilter(PropertyIds.IS_LATEST_VERSION, requestedIds)) {
-			properties.put(PropertyIds.IS_LATEST_VERSION, objFactory.createPropertyBooleanData(
-					PropertyIds.IS_LATEST_VERSION, isLatestVersion()));
-		}
-		if (FilterParser.isContainedInFilter(PropertyIds.IS_MAJOR_VERSION, requestedIds)) {
-			properties.put(PropertyIds.IS_MAJOR_VERSION, objFactory.createPropertyBooleanData(
-					PropertyIds.IS_MAJOR_VERSION, fIsMajor));
-		}
-		if (FilterParser.isContainedInFilter(PropertyIds.IS_LATEST_MAJOR_VERSION, requestedIds)) {
-			properties.put(PropertyIds.IS_LATEST_MAJOR_VERSION, objFactory.createPropertyBooleanData(
-					PropertyIds.IS_LATEST_MAJOR_VERSION, isLatestMajorVersion()));
-		}
-		if (FilterParser.isContainedInFilter(PropertyIds.VERSION_SERIES_ID, requestedIds)) {
-			properties.put(PropertyIds.VERSION_SERIES_ID, objFactory.createPropertyIdData(
-					PropertyIds.VERSION_SERIES_ID, fContainer.getId()));
-		}
-		if (FilterParser.isContainedInFilter(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT, requestedIds)) {
-			properties.put(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT, objFactory.createPropertyBooleanData(
-					PropertyIds.IS_VERSION_SERIES_CHECKED_OUT, fContainer.isCheckedOut()));
-		}
-		if (FilterParser.isContainedInFilter(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY, requestedIds)) {
-			properties.put(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY, objFactory.createPropertyStringData(
-					PropertyIds.VERSION_SERIES_CHECKED_OUT_BY, fContainer.getCheckedOutBy()));
-		}
-		if (FilterParser.isContainedInFilter(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID, requestedIds)) {
-			properties.put(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID, objFactory.createPropertyIdData(
-					PropertyIds.VERSION_SERIES_CHECKED_OUT_ID, pwc == null ? null : pwc.getId()));
-		}
-		if (FilterParser.isContainedInFilter(PropertyIds.CHECKIN_COMMENT, requestedIds)) {
-			properties.put(PropertyIds.CHECKIN_COMMENT, objFactory.createPropertyStringData(
-					PropertyIds.CHECKIN_COMMENT, fComment));
-		}
-		if (FilterParser.isContainedInFilter(PropertyIds.VERSION_LABEL, requestedIds)) {
-			properties.put(PropertyIds.VERSION_LABEL, objFactory.createPropertyStringData(PropertyIds.VERSION_LABEL,
-					getVersionLabel()));
-		}
-
-		// Set the content related properties
-		if (null != fContent) {
-			if (FilterParser.isContainedInFilter(PropertyIds.CONTENT_STREAM_FILE_NAME, requestedIds)) {
-				properties.put(PropertyIds.CONTENT_STREAM_FILE_NAME, objFactory.createPropertyStringData(
-						PropertyIds.CONTENT_STREAM_FILE_NAME, fContent.getFileName()));
-			}
-
-			// omit: PropertyIds.CMIS_CONTENT_STREAM_ID
-
-			if (FilterParser.isContainedInFilter(PropertyIds.CONTENT_STREAM_LENGTH, requestedIds)) {
-				properties.put(PropertyIds.CONTENT_STREAM_LENGTH, objFactory.createPropertyIntegerData(
-						PropertyIds.CONTENT_STREAM_LENGTH, fContent.getBigLength()));
-			}
-			if (FilterParser.isContainedInFilter(PropertyIds.CONTENT_STREAM_MIME_TYPE, requestedIds)) {
-				properties.put(PropertyIds.CONTENT_STREAM_MIME_TYPE, objFactory.createPropertyStringData(
-						PropertyIds.CONTENT_STREAM_MIME_TYPE, fContent.getMimeType()));
-			}
-		}
-	}
-
-	public List<Folder> getParents() {
-		return fContainer.getParents();
-	}
-
-	public String getPathSegment() {
-		return fContainer.getPathSegment();
-	}
-
-	public void move(Folder oldParent, Folder newParent) {
-		fContainer.move(oldParent, newParent);
-	}
-
-	public void addParent(Folder parent) {
-		fContainer.addParent(parent);
-	}
-
-	public void removeParent(Folder parent) {
-		fContainer.removeParent(parent);
-	}
-
-	public boolean hasContent() {
-		return null != fContent;
-	}
+    private ContentStreamDataImpl fContent;
+    private VersionedDocument fContainer; // the document this version belongs
+    // to
+    private String fComment; // checkin comment
+    boolean fIsMajor;
+    boolean fIsPwc; // true if this is the PWC
+
+    public DocumentVersionImpl(String repositoryId, VersionedDocument container, ContentStream content,
+            VersioningState verState, ObjectStoreImpl objStore) {
+        super(objStore);
+        setRepositoryId(repositoryId);
+        fContainer = container;
+        setContent(content, false);
+        fIsMajor = verState == VersioningState.MAJOR;
+        fIsPwc = verState == VersioningState.CHECKEDOUT;
+        fProperties = new HashMap<String, PropertyData<?>>(); // ensure that we
+        // have a map
+    }
+
+    public void setContent(ContentStream content, boolean mustPersist) {
+        if (null == content) {
+            fContent = null;
+        } else {
+            fContent = new ContentStreamDataImpl();
+            fContent.setFileName(content.getFileName());
+            fContent.setMimeType(content.getMimeType());
+            try {
+                fContent.setContent(content.getStream());
+            } catch (IOException e) {
+                e.printStackTrace();
+                throw new RuntimeException("Failed to get content from InputStream", e);
+            }
+        }
+    }
+
+    public void setCheckinComment(String comment) {
+        fComment = comment;
+    }
+
+    public String getCheckinComment() {
+        return fComment;
+    }
+
+    public String getVersionLabel() {
+        int majorNo = 0;
+        int minorNo = 0;
+        List<DocumentVersion> allVersions = fContainer.getAllVersions();
+        for (DocumentVersion ver : allVersions) {
+            if (ver.isMajor()) {
+                ++majorNo;
+                minorNo = 0;
+            } else
+                ++minorNo;
+        }
+        String label = "V " + majorNo + "." + minorNo;
+        return label;
+    }
+
+    public boolean isMajor() {
+        return fIsMajor && !isPwc();
+    }
+
+    public boolean isPwc() {
+        return fIsPwc;
+    }
+
+    public void commit(boolean isMajor) {
+        fIsPwc = false; // unset working copy flag
+        fIsMajor = isMajor;
+    }
+
+    public ContentStream getContent(long offset, long length) {
+        if (offset <= 0 && length < 0)
+            return fContent;
+        else
+            return fContent.getCloneWithLimits(offset, length);
+    }
+
+    public VersionedDocument getParentDocument() {
+        return fContainer;
+    }
+
+    private boolean isLatestVersion() {
+        List<DocumentVersion> allVers = fContainer.getAllVersions();
+        boolean isLatestVersion;
+        if (isPwc())
+            isLatestVersion = allVers.size() > 1 && allVers.get(allVers.size() - 2).equals(this);
+        else
+            isLatestVersion = allVers.get(allVers.size() - 1).equals(this);
+        return isLatestVersion;
+    }
+
+    private boolean isLatestMajorVersion() {
+        if (!fIsMajor)
+            return false;
+
+        List<DocumentVersion> allVersions = fContainer.getAllVersions();
+        DocumentVersion latestMajor = null;
+
+        for (DocumentVersion ver : allVersions)
+            if (ver.isMajor() && !ver.isPwc())
+                latestMajor = ver;
+
+        boolean isLatestMajorVersion = latestMajor == this;
+        return isLatestMajorVersion;
+    }
+
+    // public void persist() {
+    // if (null==fId)
+    // fId = UUID.randomUUID().toString();
+    // }
+
+    public void fillProperties(Map<String, PropertyData<?>> properties, BindingsObjectFactory objFactory,
+            List<String> requestedIds) {
+
+        DocumentVersion pwc = fContainer.getPwc();
+
+        // First get the properties of the container (like custom type
+        // properties, etc)
+        fContainer.fillProperties(properties, objFactory, requestedIds);
+
+        // overwrite the version specific properties (like modification date,
+        // user, etc.)
+        // and set some properties specific to the version
+        super.fillProperties(properties, objFactory, requestedIds);
+
+        // fill the version related properties
+        if (FilterParser.isContainedInFilter(PropertyIds.IS_LATEST_VERSION, requestedIds)) {
+            properties.put(PropertyIds.IS_LATEST_VERSION, objFactory.createPropertyBooleanData(
+                    PropertyIds.IS_LATEST_VERSION, isLatestVersion()));
+        }
+        if (FilterParser.isContainedInFilter(PropertyIds.IS_MAJOR_VERSION, requestedIds)) {
+            properties.put(PropertyIds.IS_MAJOR_VERSION, objFactory.createPropertyBooleanData(
+                    PropertyIds.IS_MAJOR_VERSION, fIsMajor));
+        }
+        if (FilterParser.isContainedInFilter(PropertyIds.IS_LATEST_MAJOR_VERSION, requestedIds)) {
+            properties.put(PropertyIds.IS_LATEST_MAJOR_VERSION, objFactory.createPropertyBooleanData(
+                    PropertyIds.IS_LATEST_MAJOR_VERSION, isLatestMajorVersion()));
+        }
+        if (FilterParser.isContainedInFilter(PropertyIds.VERSION_SERIES_ID, requestedIds)) {
+            properties.put(PropertyIds.VERSION_SERIES_ID, objFactory.createPropertyIdData(
+                    PropertyIds.VERSION_SERIES_ID, fContainer.getId()));
+        }
+        if (FilterParser.isContainedInFilter(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT, requestedIds)) {
+            properties.put(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT, objFactory.createPropertyBooleanData(
+                    PropertyIds.IS_VERSION_SERIES_CHECKED_OUT, fContainer.isCheckedOut()));
+        }
+        if (FilterParser.isContainedInFilter(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY, requestedIds)) {
+            properties.put(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY, objFactory.createPropertyStringData(
+                    PropertyIds.VERSION_SERIES_CHECKED_OUT_BY, fContainer.getCheckedOutBy()));
+        }
+        if (FilterParser.isContainedInFilter(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID, requestedIds)) {
+            properties.put(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID, objFactory.createPropertyIdData(
+                    PropertyIds.VERSION_SERIES_CHECKED_OUT_ID, pwc == null ? null : pwc.getId()));
+        }
+        if (FilterParser.isContainedInFilter(PropertyIds.CHECKIN_COMMENT, requestedIds)) {
+            properties.put(PropertyIds.CHECKIN_COMMENT, objFactory.createPropertyStringData(
+                    PropertyIds.CHECKIN_COMMENT, fComment));
+        }
+        if (FilterParser.isContainedInFilter(PropertyIds.VERSION_LABEL, requestedIds)) {
+            properties.put(PropertyIds.VERSION_LABEL, objFactory.createPropertyStringData(PropertyIds.VERSION_LABEL,
+                    getVersionLabel()));
+        }
+
+        // Set the content related properties
+        if (null != fContent) {
+            if (FilterParser.isContainedInFilter(PropertyIds.CONTENT_STREAM_FILE_NAME, requestedIds)) {
+                properties.put(PropertyIds.CONTENT_STREAM_FILE_NAME, objFactory.createPropertyStringData(
+                        PropertyIds.CONTENT_STREAM_FILE_NAME, fContent.getFileName()));
+            }
+
+            // omit: PropertyIds.CMIS_CONTENT_STREAM_ID
+
+            if (FilterParser.isContainedInFilter(PropertyIds.CONTENT_STREAM_LENGTH, requestedIds)) {
+                properties.put(PropertyIds.CONTENT_STREAM_LENGTH, objFactory.createPropertyIntegerData(
+                        PropertyIds.CONTENT_STREAM_LENGTH, fContent.getBigLength()));
+            }
+            if (FilterParser.isContainedInFilter(PropertyIds.CONTENT_STREAM_MIME_TYPE, requestedIds)) {
+                properties.put(PropertyIds.CONTENT_STREAM_MIME_TYPE, objFactory.createPropertyStringData(
+                        PropertyIds.CONTENT_STREAM_MIME_TYPE, fContent.getMimeType()));
+            }
+        }
+    }
+
+    public List<Folder> getParents() {
+        return fContainer.getParents();
+    }
+
+    public String getPathSegment() {
+        return fContainer.getPathSegment();
+    }
+
+    public void move(Folder oldParent, Folder newParent) {
+        fContainer.move(oldParent, newParent);
+    }
+
+    public void addParent(Folder parent) {
+        fContainer.addParent(parent);
+    }
+
+    public void removeParent(Folder parent) {
+        fContainer.removeParent(parent);
+    }
+
+    public boolean hasContent() {
+        return null != fContent;
+    }
 
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/FolderImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/FolderImpl.java?rev=936938&r1=936937&r2=936938&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/FolderImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/FolderImpl.java Thu Apr 22 16:27:57 2010
@@ -24,206 +24,206 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 public class FolderImpl extends AbstractSingleFilingImpl implements Folder {
-	private static final Log LOG = LogFactory.getLog(AbstractSingleFilingImpl.class.getName());
+    private static final Log LOG = LogFactory.getLog(AbstractSingleFilingImpl.class.getName());
 
-	FolderImpl(ObjectStoreImpl objStore) {
-		super(objStore);
-	}
-
-	public FolderImpl(ObjectStoreImpl objStore, String name, Folder parent) {
-		super(objStore);
-		init(name, parent);
-	}
-
-	public void addChildFolder(Folder folder) {
-		boolean hasChild;
-		String name = folder.getName();
-		hasChild = hasChild(name);
-		if (hasChild)
-			throw new RuntimeException("Cannot create folder " + name + ". Name already exists in parent folder");
-		folder.setParent(this);
-		folder.persist();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.opencmis.client.provider.spi.inmemory.IFolder#addChildDocument(org
-	 * .opencmis.client.provider .spi.inmemory.storedobj.impl.DocumentImpl)
-	 */
-	public void addChildDocument(Document doc) {
-		addChildObject(doc);
-	}
-
-	public void addChildDocument(VersionedDocument doc) {
-		addChildObject(doc);
-	}
-
-	private void addChildObject(StoredObject so) {
-		String name = so.getName();
-		if (!NameValidator.isValidId(name))
-			throw new CmisInvalidArgumentException(NameValidator.ERROR_ILLEGAL_NAME);
-
-		boolean hasChild;
-		hasChild = hasChild(name);
-		if (hasChild)
-			throw new RuntimeException("Cannot create document " + name + ". Name already exists in parent folder");
-
-		if (so instanceof SingleFiling)
-			((SingleFiling) so).setParent(this);
-		else if (so instanceof MultiFiling)
-			((MultiFiling) so).addParent(this);
-		else
-			throw new RuntimeException("Cannot create document, object is not fileable.");
-
-		so.persist();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.opencmis.client.provider.spi.inmemory.IFolder#getChildren()
-	 */
-	public List<StoredObject> getChildren(int maxItems, int skipCount) {
-		List<StoredObject> result = new ArrayList<StoredObject>();
-		for (String id : fObjStore.getIds()) {
-			StoredObject obj = fObjStore.getObject(id);
-			Filing pathObj = (Filing) obj;
-			if (pathObj.getParents().contains(this)) {
-				if (pathObj instanceof VersionedDocument) {
-					DocumentVersion ver = ((VersionedDocument) pathObj).getLatestVersion(false);
-					result.add(ver);
-				} else if (pathObj instanceof DocumentVersion) {
-					// ignore
-				} else {
-					result.add(obj);
-				}
-			}
-		}
-		sortFolderList(result);
-
-		if (maxItems < 0)
-			maxItems = result.size();
-		if (skipCount < 0)
-			skipCount = 0;
-		int from = Math.min(skipCount, result.size());
-		int to = Math.min(maxItems + from, result.size());
-		result = result.subList(from, to);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.opencmis.client.provider.spi.inmemory.IFolder#getFolderChildren()
-	 */
-	public List<Folder> getFolderChildren(int maxItems, int skipCount) {
-		List<Folder> result = new ArrayList<Folder>();
-		for (String id : fObjStore.getIds()) {
-			StoredObject obj = fObjStore.getObject(id);
-			if (obj instanceof SingleFiling) {
-				SingleFiling pathObj = (SingleFiling) obj;
-				if (pathObj.getParent() == this && pathObj instanceof Folder)
-					result.add((Folder) obj);
-			}
-		}
-		sortFolderList(result);
-		int from = Math.min(skipCount, result.size());
-		int to = Math.min(maxItems + from, result.size());
-		result = result.subList(from, to);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.opencmis.client.provider.spi.inmemory.IFolder#hasChild(java.lang.
-	 * String)
-	 */
-	public boolean hasChild(String name) {
-		for (String id : fObjStore.getIds()) {
-			StoredObject obj = fObjStore.getObject(id);
-			if (obj instanceof Filing) {
-				Filing pathObj = (Filing) obj;
-				if (pathObj.getParents().contains(this) && obj.getName().equals(name))
-					return true;
-			}
-		}
-		return false;
-	}
-
-	public void fillProperties(Map<String, PropertyData<?>> properties, BindingsObjectFactory objFactory,
-			List<String> requestedIds) {
-
-		super.fillProperties(properties, objFactory, requestedIds);
-
-		// add folder specific properties
-
-		if (FilterParser.isContainedInFilter(PropertyIds.PARENT_ID, requestedIds)) {
-			String parentId = getParent() == null ? null : getParent().getId();
-			if (parentId != null)
-				properties.put(PropertyIds.PARENT_ID, objFactory.createPropertyStringData(PropertyIds.PARENT_ID,
-						parentId));
-		}
-
-		if (FilterParser.isContainedInFilter(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS, requestedIds)) {
-			String allowedChildObjects = "*"; // TODO: not yet supported
-			properties.put(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS, objFactory.createPropertyStringData(
-					PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS, allowedChildObjects));
-		}
-
-		if (FilterParser.isContainedInFilter(PropertyIds.PATH, requestedIds)) {
-			String path = getPath();
-			properties.put(PropertyIds.PATH, objFactory.createPropertyStringData(PropertyIds.PATH, path));
-		}
-	}
-
-	// Helper functions
-	private void init(String name, Folder parent) {
-		if (!NameValidator.isValidId(name))
-			throw new CmisInvalidArgumentException(NameValidator.ERROR_ILLEGAL_NAME);
-		setName(name);
-		setParent(parent);
-	}
-
-	private void sortFolderList(List<? extends StoredObject> list) {
-
-		// TODO evaluate orderBy, for now sort by path segment
-		class FolderComparator implements Comparator<StoredObject> {
-
-			public int compare(StoredObject f1, StoredObject f2) {
-				String segment1 = f1.getName();
-				String segment2 = f2.getName();
-
-				return segment1.compareTo(segment2);
-			}
-		}
-
-		Collections.sort(list, new FolderComparator());
-	}
-
-	public void moveChildDocument(StoredObject so, Folder oldParent, Folder newParent) {
-		if (newParent.hasChild(so.getName()))
-			throw new IllegalArgumentException("Cannot move object, this name already exists in target.");
-		if (!(so instanceof Filing))
-			throw new IllegalArgumentException("Cannot move object, object does not have a path.");
-
-		if (so instanceof SingleFiling) {
-			SingleFiling pathObj = (SingleFiling) so;
-			pathObj.setParent(newParent);
-		} else if (so instanceof MultiFiling) {
-			MultiFiling pathObj = (MultiFiling) so;
-			pathObj.addParent(newParent);
-			pathObj.removeParent(oldParent);
-		}
-	}
-
-	public List<String> getAllowedChildObjectTypeIds() {
-		// TODO implement this.
-		return null;
-	}
+    FolderImpl(ObjectStoreImpl objStore) {
+        super(objStore);
+    }
+
+    public FolderImpl(ObjectStoreImpl objStore, String name, Folder parent) {
+        super(objStore);
+        init(name, parent);
+    }
+
+    public void addChildFolder(Folder folder) {
+        boolean hasChild;
+        String name = folder.getName();
+        hasChild = hasChild(name);
+        if (hasChild)
+            throw new RuntimeException("Cannot create folder " + name + ". Name already exists in parent folder");
+        folder.setParent(this);
+        folder.persist();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.opencmis.client.provider.spi.inmemory.IFolder#addChildDocument(org
+     * .opencmis.client.provider .spi.inmemory.storedobj.impl.DocumentImpl)
+     */
+    public void addChildDocument(Document doc) {
+        addChildObject(doc);
+    }
+
+    public void addChildDocument(VersionedDocument doc) {
+        addChildObject(doc);
+    }
+
+    private void addChildObject(StoredObject so) {
+        String name = so.getName();
+        if (!NameValidator.isValidId(name))
+            throw new CmisInvalidArgumentException(NameValidator.ERROR_ILLEGAL_NAME);
+
+        boolean hasChild;
+        hasChild = hasChild(name);
+        if (hasChild)
+            throw new RuntimeException("Cannot create document " + name + ". Name already exists in parent folder");
+
+        if (so instanceof SingleFiling)
+            ((SingleFiling) so).setParent(this);
+        else if (so instanceof MultiFiling)
+            ((MultiFiling) so).addParent(this);
+        else
+            throw new RuntimeException("Cannot create document, object is not fileable.");
+
+        so.persist();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.opencmis.client.provider.spi.inmemory.IFolder#getChildren()
+     */
+    public List<StoredObject> getChildren(int maxItems, int skipCount) {
+        List<StoredObject> result = new ArrayList<StoredObject>();
+        for (String id : fObjStore.getIds()) {
+            StoredObject obj = fObjStore.getObject(id);
+            Filing pathObj = (Filing) obj;
+            if (pathObj.getParents().contains(this)) {
+                if (pathObj instanceof VersionedDocument) {
+                    DocumentVersion ver = ((VersionedDocument) pathObj).getLatestVersion(false);
+                    result.add(ver);
+                } else if (pathObj instanceof DocumentVersion) {
+                    // ignore
+                } else {
+                    result.add(obj);
+                }
+            }
+        }
+        sortFolderList(result);
+
+        if (maxItems < 0)
+            maxItems = result.size();
+        if (skipCount < 0)
+            skipCount = 0;
+        int from = Math.min(skipCount, result.size());
+        int to = Math.min(maxItems + from, result.size());
+        result = result.subList(from, to);
+        return result;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.opencmis.client.provider.spi.inmemory.IFolder#getFolderChildren()
+     */
+    public List<Folder> getFolderChildren(int maxItems, int skipCount) {
+        List<Folder> result = new ArrayList<Folder>();
+        for (String id : fObjStore.getIds()) {
+            StoredObject obj = fObjStore.getObject(id);
+            if (obj instanceof SingleFiling) {
+                SingleFiling pathObj = (SingleFiling) obj;
+                if (pathObj.getParent() == this && pathObj instanceof Folder)
+                    result.add((Folder) obj);
+            }
+        }
+        sortFolderList(result);
+        int from = Math.min(skipCount, result.size());
+        int to = Math.min(maxItems + from, result.size());
+        result = result.subList(from, to);
+        return result;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.opencmis.client.provider.spi.inmemory.IFolder#hasChild(java.lang.
+     * String)
+     */
+    public boolean hasChild(String name) {
+        for (String id : fObjStore.getIds()) {
+            StoredObject obj = fObjStore.getObject(id);
+            if (obj instanceof Filing) {
+                Filing pathObj = (Filing) obj;
+                if (pathObj.getParents().contains(this) && obj.getName().equals(name))
+                    return true;
+            }
+        }
+        return false;
+    }
+
+    public void fillProperties(Map<String, PropertyData<?>> properties, BindingsObjectFactory objFactory,
+            List<String> requestedIds) {
+
+        super.fillProperties(properties, objFactory, requestedIds);
+
+        // add folder specific properties
+
+        if (FilterParser.isContainedInFilter(PropertyIds.PARENT_ID, requestedIds)) {
+            String parentId = getParent() == null ? null : getParent().getId();
+            if (parentId != null)
+                properties.put(PropertyIds.PARENT_ID, objFactory.createPropertyStringData(PropertyIds.PARENT_ID,
+                        parentId));
+        }
+
+        if (FilterParser.isContainedInFilter(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS, requestedIds)) {
+            String allowedChildObjects = "*"; // TODO: not yet supported
+            properties.put(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS, objFactory.createPropertyStringData(
+                    PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS, allowedChildObjects));
+        }
+
+        if (FilterParser.isContainedInFilter(PropertyIds.PATH, requestedIds)) {
+            String path = getPath();
+            properties.put(PropertyIds.PATH, objFactory.createPropertyStringData(PropertyIds.PATH, path));
+        }
+    }
+
+    // Helper functions
+    private void init(String name, Folder parent) {
+        if (!NameValidator.isValidId(name))
+            throw new CmisInvalidArgumentException(NameValidator.ERROR_ILLEGAL_NAME);
+        setName(name);
+        setParent(parent);
+    }
+
+    private void sortFolderList(List<? extends StoredObject> list) {
+
+        // TODO evaluate orderBy, for now sort by path segment
+        class FolderComparator implements Comparator<StoredObject> {
+
+            public int compare(StoredObject f1, StoredObject f2) {
+                String segment1 = f1.getName();
+                String segment2 = f2.getName();
+
+                return segment1.compareTo(segment2);
+            }
+        }
+
+        Collections.sort(list, new FolderComparator());
+    }
+
+    public void moveChildDocument(StoredObject so, Folder oldParent, Folder newParent) {
+        if (newParent.hasChild(so.getName()))
+            throw new IllegalArgumentException("Cannot move object, this name already exists in target.");
+        if (!(so instanceof Filing))
+            throw new IllegalArgumentException("Cannot move object, object does not have a path.");
+
+        if (so instanceof SingleFiling) {
+            SingleFiling pathObj = (SingleFiling) so;
+            pathObj.setParent(newParent);
+        } else if (so instanceof MultiFiling) {
+            MultiFiling pathObj = (MultiFiling) so;
+            pathObj.addParent(newParent);
+            pathObj.removeParent(oldParent);
+        }
+    }
+
+    public List<String> getAllowedChildObjectTypeIds() {
+        // TODO implement this.
+        return null;
+    }
 
 }
\ No newline at end of file

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java?rev=936938&r1=936937&r2=936938&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java Thu Apr 22 16:27:57 2010
@@ -47,242 +47,242 @@ import org.apache.chemistry.opencmis.inm
 
 public class ObjectStoreImpl implements ObjectStore {
 
-	/**
-	 * Simple id generator that uses just an integer
-	 */
-	private static int NEXT_UNUSED_ID = 100;
-
-	/**
-	 * Maps the absolute folder path to the corresponding folder object
-	 */
-	private Map<String, StoredObject> fStoredObjectMap = new HashMap<String, StoredObject>();
-	final String fRepositoryId;
-	FolderImpl fRootFolder = null;
-
-	public ObjectStoreImpl(String repositoryId) {
-		fRepositoryId = repositoryId;
-		createRootFolder();
-	}
-
-	private static synchronized Integer getNextId() {
-		return NEXT_UNUSED_ID++;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.opencmis.client.provider.spi.inmemory.storedobj.impl.ObjectStore#
-	 * getRootFolder()
-	 */
-	public Folder getRootFolder() {
-		return fRootFolder;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.opencmis.client.provider.spi.inmemory.storedobj.impl.ObjectStore#
-	 * getFolderByPath(java.lang .String)
-	 */
-	public StoredObject getObjectByPath(String path) {
-
-		for (StoredObject so : fStoredObjectMap.values()) {
-			if (so instanceof SingleFiling) {
-				String soPath = ((SingleFiling) so).getPath();
-				if (soPath.equals(path))
-					return so;
-			} else if (so instanceof MultiFiling) {
-				MultiFiling mfo = (MultiFiling) so;
-				List<Folder> parents = mfo.getParents();
-				for (Folder parent : parents) {
-					String parentPath = parent.getPath();
-					String mfPath = parentPath.equals(Folder.PATH_SEPARATOR) ? parentPath + mfo.getPathSegment()
-							: parentPath + Folder.PATH_SEPARATOR + mfo.getPathSegment();
-					if (mfPath.equals(path))
-						return so;
-				}
-			} else
-				return null;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.opencmis.client.provider.spi.inmemory.storedobj.impl.ObjectStore#
-	 * getObjectById(java.lang .String)
-	 */
-	public StoredObject getObjectById(String objectId) {
-		// we use path as id so we just can look it up in the map
-		StoredObject so = fStoredObjectMap.get(objectId);
-		return so;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.opencmis.client.provider.spi.inmemory.storedobj.impl.ObjectStore#
-	 * deleteObject(java.lang .String)
-	 */
-	public void deleteObject(String objectId) {
-		String path = objectId; // currently the same
-		StoredObject obj = fStoredObjectMap.get(path);
-
-		if (null == obj)
-			throw new RuntimeException("Cannot delete object with id  " + objectId + ". Object does not exist.");
-
-		if (obj instanceof FolderImpl) {
-			deleteFolder(objectId);
-		} else if (obj instanceof DocumentVersion) {
-			DocumentVersion vers = (DocumentVersion) obj;
-			VersionedDocument parentDoc = vers.getParentDocument();
-			fStoredObjectMap.remove(path);
-			boolean otherVersionsExist = vers.getParentDocument().deleteVersion(vers);
-			if (!otherVersionsExist)
-				fStoredObjectMap.remove(parentDoc.getId());
-		} else {
-			fStoredObjectMap.remove(path);
-		}
-	}
-
-	public void removeVersion(DocumentVersion vers) {
-		StoredObject found = fStoredObjectMap.remove(vers.getId());
-
-		if (null == found)
-			throw new RuntimeException("Cannot delete object with id  " + vers.getId() + ". Object does not exist.");
-	}
-
-	// public void changePath(StoredObject obj, String oldPath, String newPath)
-	// {
-	// fStoredObjectMap.remove(oldPath);
-	// fStoredObjectMap.put(newPath, obj);
-	// }
-
-	// /////////////////////////////////////////
-	// methods used by folders and documents, but not for public use
-
-	// void storeObject(String id, StoredObject sop) {
-	// fStoredObjectMap.put(id, sop);
-	// }
-
-	public String storeObject(StoredObject so) {
-		String id = so.getId();
-		// check if update or create
-		if (null == id)
-			id = getNextId().toString();
-		fStoredObjectMap.put(id, so);
-		return id;
-	}
-
-	StoredObject getObject(String id) {
-		return fStoredObjectMap.get(id);
-	}
-
-	void removeObject(String id) {
-		fStoredObjectMap.remove(id);
-	}
-
-	Set<String> getIds() {
-		Set<String> entries = fStoredObjectMap.keySet();
-		return entries;
-	}
-
-	// void renameAllIdsWithPrefix(String oldPath, String newPath) {
-	// Iterator<Entry<String, StoredObject>> it =
-	// fStoredObjectMap.entrySet().iterator();
-	// Map<String, StoredObject> newMap = new HashMap<String, StoredObject>();
-	// while (it.hasNext()) {
-	// Map.Entry<String, StoredObject> entry = (Map.Entry<String, StoredObject>)
-	// it
-	// .next();
-	//
-	// if (entry.getKey().startsWith(oldPath)) {
-	// if (entry.getValue() instanceof Path) {
-	// newPath = ((Path)entry.getValue()).getPath();
-	// it.remove(); // the only safe way to modify while iteration
-	// newMap.put(newPath, entry.getValue()); // we can't add to the current
-	// collection while
-	// // iterating
-	// }
-	// }
-	// }
-	// fStoredObjectMap.putAll(newMap); // add all at once when iteration is
-	// complete
-	// }
-
-	// /////////////////////////////////////////
-	// private helper methods
-
-	private void createRootFolder() {
-		FolderImpl rootFolder = new FolderImpl(this);
-		rootFolder.setName("RootFolder");
-		rootFolder.setParent(null);
-		rootFolder.setTypeId(BaseTypeId.CMIS_FOLDER.value());
-		rootFolder.setCreatedBy("Admin");
-		rootFolder.setModifiedBy("Admin");
-		rootFolder.setModifiedAtNow();
-		rootFolder.setRepositoryId(fRepositoryId);
-		rootFolder.persist();
-		fRootFolder = rootFolder;
-	}
-
-	public Document createDocument(String name) {
-		Document doc = new DocumentImpl(this);
-		doc.setRepositoryId(fRepositoryId);
-		doc.setName(name);
-		return doc;
-	}
-
-	public VersionedDocument createVersionedDocument(String name) {
-		VersionedDocument doc = new VersionedDocumentImpl(this);
-		doc.setRepositoryId(fRepositoryId);
-		doc.setName(name);
-		return doc;
-	}
-
-	public Folder createFolder(String name) {
-		Folder folder = new FolderImpl(this, name, null);
-		;
-		folder.setRepositoryId(fRepositoryId);
-		return folder;
-	}
-
-	public List<VersionedDocument> getCheckedOutDocuments(String orderBy) {
-		List<VersionedDocument> res = new ArrayList<VersionedDocument>();
-
-		for (StoredObject so : fStoredObjectMap.values()) {
-			if (so instanceof VersionedDocument) {
-				VersionedDocument verDoc = (VersionedDocument) so;
-				if (verDoc.isCheckedOut()) {
-					res.add(verDoc);
-				}
-			}
-		}
-
-		return res;
-	}
-
-	private void deleteFolder(String folderId) {
-		StoredObject folder = fStoredObjectMap.get(folderId);
-		if (folder == null)
-			throw new RuntimeException("Unknown object with id:  " + folderId);
-
-		if (!(folder instanceof FolderImpl)) {
-			throw new RuntimeException("Cannot delete folder with id:  " + folderId
-					+ ". Object exists but is not a folder.");
-		}
-
-		// check if children exist
-		List<StoredObject> children = ((Folder) folder).getChildren(-1, -1);
-		if (children != null && !children.isEmpty())
-			throw new CmisConstraintException("Cannot delete folder with id:  " + folderId + ". Folder is not empty.");
+    /**
+     * Simple id generator that uses just an integer
+     */
+    private static int NEXT_UNUSED_ID = 100;
+
+    /**
+     * Maps the absolute folder path to the corresponding folder object
+     */
+    private Map<String, StoredObject> fStoredObjectMap = new HashMap<String, StoredObject>();
+    final String fRepositoryId;
+    FolderImpl fRootFolder = null;
+
+    public ObjectStoreImpl(String repositoryId) {
+        fRepositoryId = repositoryId;
+        createRootFolder();
+    }
+
+    private static synchronized Integer getNextId() {
+        return NEXT_UNUSED_ID++;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.opencmis.client.provider.spi.inmemory.storedobj.impl.ObjectStore#
+     * getRootFolder()
+     */
+    public Folder getRootFolder() {
+        return fRootFolder;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.opencmis.client.provider.spi.inmemory.storedobj.impl.ObjectStore#
+     * getFolderByPath(java.lang .String)
+     */
+    public StoredObject getObjectByPath(String path) {
+
+        for (StoredObject so : fStoredObjectMap.values()) {
+            if (so instanceof SingleFiling) {
+                String soPath = ((SingleFiling) so).getPath();
+                if (soPath.equals(path))
+                    return so;
+            } else if (so instanceof MultiFiling) {
+                MultiFiling mfo = (MultiFiling) so;
+                List<Folder> parents = mfo.getParents();
+                for (Folder parent : parents) {
+                    String parentPath = parent.getPath();
+                    String mfPath = parentPath.equals(Folder.PATH_SEPARATOR) ? parentPath + mfo.getPathSegment()
+                            : parentPath + Folder.PATH_SEPARATOR + mfo.getPathSegment();
+                    if (mfPath.equals(path))
+                        return so;
+                }
+            } else
+                return null;
+        }
+        return null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.opencmis.client.provider.spi.inmemory.storedobj.impl.ObjectStore#
+     * getObjectById(java.lang .String)
+     */
+    public StoredObject getObjectById(String objectId) {
+        // we use path as id so we just can look it up in the map
+        StoredObject so = fStoredObjectMap.get(objectId);
+        return so;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.opencmis.client.provider.spi.inmemory.storedobj.impl.ObjectStore#
+     * deleteObject(java.lang .String)
+     */
+    public void deleteObject(String objectId) {
+        String path = objectId; // currently the same
+        StoredObject obj = fStoredObjectMap.get(path);
+
+        if (null == obj)
+            throw new RuntimeException("Cannot delete object with id  " + objectId + ". Object does not exist.");
+
+        if (obj instanceof FolderImpl) {
+            deleteFolder(objectId);
+        } else if (obj instanceof DocumentVersion) {
+            DocumentVersion vers = (DocumentVersion) obj;
+            VersionedDocument parentDoc = vers.getParentDocument();
+            fStoredObjectMap.remove(path);
+            boolean otherVersionsExist = vers.getParentDocument().deleteVersion(vers);
+            if (!otherVersionsExist)
+                fStoredObjectMap.remove(parentDoc.getId());
+        } else {
+            fStoredObjectMap.remove(path);
+        }
+    }
+
+    public void removeVersion(DocumentVersion vers) {
+        StoredObject found = fStoredObjectMap.remove(vers.getId());
+
+        if (null == found)
+            throw new RuntimeException("Cannot delete object with id  " + vers.getId() + ". Object does not exist.");
+    }
+
+    // public void changePath(StoredObject obj, String oldPath, String newPath)
+    // {
+    // fStoredObjectMap.remove(oldPath);
+    // fStoredObjectMap.put(newPath, obj);
+    // }
+
+    // /////////////////////////////////////////
+    // methods used by folders and documents, but not for public use
+
+    // void storeObject(String id, StoredObject sop) {
+    // fStoredObjectMap.put(id, sop);
+    // }
+
+    public String storeObject(StoredObject so) {
+        String id = so.getId();
+        // check if update or create
+        if (null == id)
+            id = getNextId().toString();
+        fStoredObjectMap.put(id, so);
+        return id;
+    }
+
+    StoredObject getObject(String id) {
+        return fStoredObjectMap.get(id);
+    }
+
+    void removeObject(String id) {
+        fStoredObjectMap.remove(id);
+    }
+
+    Set<String> getIds() {
+        Set<String> entries = fStoredObjectMap.keySet();
+        return entries;
+    }
+
+    // void renameAllIdsWithPrefix(String oldPath, String newPath) {
+    // Iterator<Entry<String, StoredObject>> it =
+    // fStoredObjectMap.entrySet().iterator();
+    // Map<String, StoredObject> newMap = new HashMap<String, StoredObject>();
+    // while (it.hasNext()) {
+    // Map.Entry<String, StoredObject> entry = (Map.Entry<String, StoredObject>)
+    // it
+    // .next();
+    //
+    // if (entry.getKey().startsWith(oldPath)) {
+    // if (entry.getValue() instanceof Path) {
+    // newPath = ((Path)entry.getValue()).getPath();
+    // it.remove(); // the only safe way to modify while iteration
+    // newMap.put(newPath, entry.getValue()); // we can't add to the current
+    // collection while
+    // // iterating
+    // }
+    // }
+    // }
+    // fStoredObjectMap.putAll(newMap); // add all at once when iteration is
+    // complete
+    // }
+
+    // /////////////////////////////////////////
+    // private helper methods
+
+    private void createRootFolder() {
+        FolderImpl rootFolder = new FolderImpl(this);
+        rootFolder.setName("RootFolder");
+        rootFolder.setParent(null);
+        rootFolder.setTypeId(BaseTypeId.CMIS_FOLDER.value());
+        rootFolder.setCreatedBy("Admin");
+        rootFolder.setModifiedBy("Admin");
+        rootFolder.setModifiedAtNow();
+        rootFolder.setRepositoryId(fRepositoryId);
+        rootFolder.persist();
+        fRootFolder = rootFolder;
+    }
+
+    public Document createDocument(String name) {
+        Document doc = new DocumentImpl(this);
+        doc.setRepositoryId(fRepositoryId);
+        doc.setName(name);
+        return doc;
+    }
+
+    public VersionedDocument createVersionedDocument(String name) {
+        VersionedDocument doc = new VersionedDocumentImpl(this);
+        doc.setRepositoryId(fRepositoryId);
+        doc.setName(name);
+        return doc;
+    }
+
+    public Folder createFolder(String name) {
+        Folder folder = new FolderImpl(this, name, null);
+        ;
+        folder.setRepositoryId(fRepositoryId);
+        return folder;
+    }
+
+    public List<VersionedDocument> getCheckedOutDocuments(String orderBy) {
+        List<VersionedDocument> res = new ArrayList<VersionedDocument>();
+
+        for (StoredObject so : fStoredObjectMap.values()) {
+            if (so instanceof VersionedDocument) {
+                VersionedDocument verDoc = (VersionedDocument) so;
+                if (verDoc.isCheckedOut()) {
+                    res.add(verDoc);
+                }
+            }
+        }
+
+        return res;
+    }
+
+    private void deleteFolder(String folderId) {
+        StoredObject folder = fStoredObjectMap.get(folderId);
+        if (folder == null)
+            throw new RuntimeException("Unknown object with id:  " + folderId);
+
+        if (!(folder instanceof FolderImpl)) {
+            throw new RuntimeException("Cannot delete folder with id:  " + folderId
+                    + ". Object exists but is not a folder.");
+        }
+
+        // check if children exist
+        List<StoredObject> children = ((Folder) folder).getChildren(-1, -1);
+        if (children != null && !children.isEmpty())
+            throw new CmisConstraintException("Cannot delete folder with id:  " + folderId + ". Folder is not empty.");
 
-		fStoredObjectMap.remove(folderId);
-	}
+        fStoredObjectMap.remove(folderId);
+    }
 
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerFactory.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerFactory.java?rev=936938&r1=936937&r2=936938&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerFactory.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerFactory.java Thu Apr 22 16:27:57 2010
@@ -29,38 +29,38 @@ import org.apache.commons.logging.LogFac
  */
 
 public class StoreManagerFactory {
-	private static Log log = LogFactory.getLog(StoreManagerFactory.class);
+    private static Log log = LogFactory.getLog(StoreManagerFactory.class);
 
-	public static StoreManager createInstance(String className) {
+    public static StoreManager createInstance(String className) {
 
-		Class<?> clazz = null;
-		try {
-			clazz = Class.forName(className);
-		} catch (ClassNotFoundException e) {
-			String msg = "Failed to create StoredObjectCreator, class " + className + " does not exist.";
-			log.error(msg, e);
-			e.printStackTrace();
-			throw new RuntimeException(msg, e);
-		}
-
-		Object obj = null;
-		try {
-			obj = clazz.newInstance();
-		} catch (InstantiationException e) {
-			log.error("Failed to create StoredObjectCreator from class " + className, e);
-			e.printStackTrace();
-		} catch (IllegalAccessException e) {
-			log.error("Failed to create StoredObjectCreator from class " + className, e);
-			e.printStackTrace();
-		}
-
-		if (obj instanceof StoreManager)
-			return (StoreManager) obj;
-		else {
-			log.error("Failed to create StoredObjectCreator, class " + className
-					+ " does not implement interface StoredObjectCreator");
-			return null;
-		}
-	}
+        Class<?> clazz = null;
+        try {
+            clazz = Class.forName(className);
+        } catch (ClassNotFoundException e) {
+            String msg = "Failed to create StoredObjectCreator, class " + className + " does not exist.";
+            log.error(msg, e);
+            e.printStackTrace();
+            throw new RuntimeException(msg, e);
+        }
+
+        Object obj = null;
+        try {
+            obj = clazz.newInstance();
+        } catch (InstantiationException e) {
+            log.error("Failed to create StoredObjectCreator from class " + className, e);
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            log.error("Failed to create StoredObjectCreator from class " + className, e);
+            e.printStackTrace();
+        }
+
+        if (obj instanceof StoreManager)
+            return (StoreManager) obj;
+        else {
+            log.error("Failed to create StoredObjectCreator, class " + className
+                    + " does not implement interface StoredObjectCreator");
+            return null;
+        }
+    }
 
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java?rev=936938&r1=936937&r2=936938&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java Thu Apr 22 16:27:57 2010
@@ -55,298 +55,298 @@ import org.apache.chemistry.opencmis.inm
  */
 public class StoreManagerImpl implements StoreManager {
 
-	protected BindingsObjectFactory fObjectFactory;
-	protected RepositoryInfo fRepositoryInfo;
+    protected BindingsObjectFactory fObjectFactory;
+    protected RepositoryInfo fRepositoryInfo;
 
-	/**
-	 * map from repository id to a type manager
-	 */
-	private Map<String, TypeManager> fMapRepositoryToTypeManager = new HashMap<String, TypeManager>();
-
-	/**
-	 * map from repository id to a object store
-	 */
-	private Map<String, ObjectStore> fMapRepositoryToObjectStore = new HashMap<String, ObjectStore>();
-
-	public ObjectStoreImpl getStore(String repositoryId) {
-		return (ObjectStoreImpl) fMapRepositoryToObjectStore.get(repositoryId);
-	}
-
-	public StoreManagerImpl() {
-		fObjectFactory = new BindingsObjectFactoryImpl();
-	}
-
-	public List<String> getAllRepositoryIds() {
-		Set<String> repIds = fMapRepositoryToObjectStore.keySet();
-		List<String> result = new ArrayList<String>();
-		result.addAll(repIds);
-		return result;
-	}
-
-	public void initRepository(String repositoryId) {
-		fMapRepositoryToObjectStore.put(repositoryId, new ObjectStoreImpl(repositoryId));
-		fMapRepositoryToTypeManager.put(repositoryId, new TypeManager());
-	}
-
-	public void createAndInitRepository(String repositoryId, String typeCreatorClassName) {
-		if (fMapRepositoryToObjectStore.containsKey(repositoryId)
-				|| fMapRepositoryToTypeManager.containsKey(repositoryId))
-			throw new RuntimeException("Cannot add repository, repository " + repositoryId + " already exists.");
-
-		fMapRepositoryToObjectStore.put(repositoryId, new ObjectStoreImpl(repositoryId));
-		fMapRepositoryToTypeManager.put(repositoryId, new TypeManager());
-
-		// initialize the type system:
-		initTypeSystem(repositoryId, typeCreatorClassName);
-	}
-
-	public ObjectStore getObjectStore(String repositoryId) {
-		return fMapRepositoryToObjectStore.get(repositoryId);
-	}
-
-	public BindingsObjectFactory getObjectFactory() {
-		return fObjectFactory;
-	}
-
-	public TypeDefinitionContainer getTypeById(String repositoryId, String typeId) {
-		TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
-		if (null == typeManager)
-			throw new RuntimeException("Unknown repository " + repositoryId);
-
-		return typeManager.getTypeById(typeId);
-	}
-
-	public TypeDefinitionContainer getTypeById(String repositoryId, String typeId, boolean includePropertyDefinitions,
-			int depth) {
-		TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
-		if (null == typeManager)
-			throw new RuntimeException("Unknown repository " + repositoryId);
-
-		TypeDefinitionContainer tc = typeManager.getTypeById(typeId);
-		List<TypeDefinitionContainer> result = null;
-
-		if (tc != null) {
-			if (depth == -1) {
-				result = tc.getChildren();
-				if (!includePropertyDefinitions)
-					cloneTypeList(depth - 1, false, result);
-			} else if (depth == 0 || depth < -1)
-				throw new CmisInvalidArgumentException("illegal depth value: " + depth);
-			else {
-				result = tc.getChildren();
-				cloneTypeList(depth - 1, includePropertyDefinitions, result);
-			}
-		}
-		return tc;
-	}
-
-	public Collection<TypeDefinitionContainer> getTypeDefinitionList(String repositoryId,
-			boolean includePropertyDefinitions) {
-		Collection<TypeDefinitionContainer> result;
-		TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
-		if (null == typeManager)
-			throw new RuntimeException("Unknown repository " + repositoryId);
-		Collection<TypeDefinitionContainer> typeColl = typeManager.getTypeDefinitionList();
-		if (includePropertyDefinitions) {
-			result = typeColl;
-		} else {
-			result = new ArrayList<TypeDefinitionContainer>(typeColl);
-			// copy list and omit properties
-			for (TypeDefinitionContainer c : result) {
-				AbstractTypeDefinition td = ((AbstractTypeDefinition) c.getTypeDefinition()).clone();
-				TypeDefinitionContainerImpl tdc = new TypeDefinitionContainerImpl(td);
-				tdc.setChildren(c.getChildren());
-				td.setPropertyDefinitions(null);
-			}
-		}
-		return result;
-	}
-
-	public Map<String, TypeDefinitionContainer> getTypeDefinitionMap(String repositoryId) {
-		return null;
-	}
-
-	public List<TypeDefinitionContainer> getRootTypes(String repositoryId) {
-		TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
-		if (null == typeManager)
-			throw new RuntimeException("Unknown repository " + repositoryId);
-		List<TypeDefinitionContainer> rootTypes = typeManager.getRootTypes();
-
-		return rootTypes;
-	}
-
-	public RepositoryInfo getRepositoryInfo(String repositoryId) {
-		ObjectStore sm = fMapRepositoryToObjectStore.get(repositoryId);
-		if (null == sm)
-			return null;
-
-		RepositoryInfo repoInfo = createDefaultRepositoryInfo(repositoryId);
-
-		return repoInfo;
-	}
-
-	public void clearTypeSystem(String repositoryId) {
-		TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
-		if (null == typeManager)
-			throw new RuntimeException("Unknown repository " + repositoryId);
-
-		typeManager.clearTypeSystem();
-	}
-
-	public void initRepositoryInfo(String repositoryId, String repoInfoCreatorClassName) {
-		RepositoryInfoCreator repoCreator = null;
-
-		if (repoInfoCreatorClassName != null) {
-			Object obj = null;
-			try {
-				obj = Class.forName(repoInfoCreatorClassName).newInstance();
-			} catch (InstantiationException e) {
-				throw new RuntimeException(
-						"Illegal class to create type system, must implement RepositoryInfoCreator interface.", e);
-			} catch (IllegalAccessException e) {
-				throw new RuntimeException(
-						"Illegal class to create type system, must implement RepositoryInfoCreator interface.", e);
-			} catch (ClassNotFoundException e) {
-				throw new RuntimeException(
-						"Illegal class to create type system, must implement RepositoryInfoCreator interface.", e);
-			}
-
-			if (obj instanceof RepositoryInfoCreator) {
-				repoCreator = (RepositoryInfoCreator) obj;
-				fRepositoryInfo = repoCreator.createRepositoryInfo();
-			} else
-				throw new RuntimeException(
-						"Illegal class to create repository info, must implement RepositoryInfoCreator interface.");
-		} else {
-			// create a default repository info
-			createDefaultRepositoryInfo(repositoryId);
-		}
-	}
-
-	public List<TypeDefinition> initTypeSystem(String typeCreatorClassName) {
-
-		List<TypeDefinition> typesList = null;
-
-		if (typeCreatorClassName != null) {
-			Object obj = null;
-			TypeCreator typeCreator = null;
-
-			try {
-				obj = Class.forName(typeCreatorClassName).newInstance();
-			} catch (InstantiationException e) {
-				throw new RuntimeException(
-						"Illegal class to create type system, must implement TypeCreator interface.", e);
-			} catch (IllegalAccessException e) {
-				throw new RuntimeException(
-						"Illegal class to create type system, must implement TypeCreator interface.", e);
-			} catch (ClassNotFoundException e) {
-				throw new RuntimeException(
-						"Illegal class to create type system, must implement TypeCreator interface.", e);
-			}
-
-			if (obj instanceof TypeCreator)
-				typeCreator = (TypeCreator) obj;
-			else
-				throw new RuntimeException("Illegal class to create type system, must implement TypeCreator interface.");
-
-			// retrieve the list of available types from the configured class.
-			// test
-			typesList = typeCreator.createTypesList();
-		}
-
-		return typesList;
-	}
-
-	private void initTypeSystem(String repositoryId, String typeCreatorClassName) {
-
-		List<TypeDefinition> typeDefs = null;
-		TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
-		if (null == typeManager)
-			throw new RuntimeException("Unknown repository " + repositoryId);
-
-		if (null != typeCreatorClassName)
-			typeDefs = initTypeSystem(typeCreatorClassName);
-
-		typeManager.initTypeSystem(typeDefs);
-	}
-
-	private RepositoryInfo createDefaultRepositoryInfo(String repositoryId) {
-		ObjectStore objStore = getObjectStore(repositoryId);
-		String rootFolderId = objStore.getRootFolder().getId();
-		// repository info
-		RepositoryInfoImpl repoInfo;
-		repoInfo = new RepositoryInfoImpl();
-		repoInfo.setRepositoryId(repositoryId == null ? "inMem" : repositoryId);
-		repoInfo.setRepositoryName("InMemory Repository");
-		repoInfo.setRepositoryDescription("InMemory Test Repository");
-		repoInfo.setCmisVersionSupported("1.0");
-		repoInfo.setRepositoryCapabilities(null);
-		repoInfo.setRootFolder(rootFolderId);
-		repoInfo.setPrincipalAnonymous("anonymous");
-		repoInfo.setPrincipalAnyone("anyone");
-		repoInfo.setThinClientUri(null);
-		repoInfo.setChangesIncomplete(Boolean.TRUE);
-		repoInfo.setChangesOnType(null);
-		repoInfo.setLatestChangeLogToken(null);
-		repoInfo.setVendorName("OpenCMIS");
-		repoInfo.setProductName("OpenCMIS InMemory-Server");
-		repoInfo.setProductVersion("0.1");
-
-		// set capabilities
-		RepositoryCapabilitiesImpl caps = new RepositoryCapabilitiesImpl();
-		caps.setAllVersionsSearchable(false);
-		caps.setCapabilityAcl(CapabilityAcl.NONE);
-		caps.setCapabilityChanges(CapabilityChanges.PROPERTIES); // just for
-																	// testing
-		caps.setCapabilityContentStreamUpdates(CapabilityContentStreamUpdates.PWCONLY);
-		caps.setCapabilityJoin(CapabilityJoin.NONE);
-		caps.setCapabilityQuery(CapabilityQuery.METADATAONLY); // just for
-																// testing
-		caps.setCapabilityRendition(CapabilityRenditions.NONE);
-		caps.setIsPwcSearchable(false);
-		caps.setIsPwcUpdatable(true);
-		caps.setSupportsGetDescendants(true);
-		caps.setSupportsGetFolderTree(true);
-		caps.setSupportsMultifiling(true);
-		caps.setSupportsUnfiling(true);
-		caps.setSupportsVersionSpecificFiling(false);
-		repoInfo.setRepositoryCapabilities(caps);
-
-		// AclCapabilitiesDataImpl aclCaps = new AclCapabilitiesDataImpl();
-		// aclCaps.setACLPropagation(AclPropagation.REPOSITORYDETERMINED);
-		// aclCaps.setPermissionDefinitionData(null);
-		// aclCaps.setPermissionMappingData(null);
-		// repoInfo.setACLCapabilities(aclCaps);
-		repoInfo.setAclCapabilities(null);
-		fRepositoryInfo = repoInfo;
-		return repoInfo;
-	}
-
-	/**
-	 * traverse tree and replace each need node with a clone. remove properties
-	 * on clone if requested, cut children of clone if depth is exceeded.
-	 * 
-	 * @param depth
-	 * @param types
-	 */
-	private void cloneTypeList(int depth, boolean includePropertyDefinitions, List<TypeDefinitionContainer> types) {
-
-		ListIterator<TypeDefinitionContainer> it = types.listIterator();
-		while (it.hasNext()) {
-			TypeDefinitionContainer tdc = it.next();
-			AbstractTypeDefinition td = ((AbstractTypeDefinition) tdc.getTypeDefinition()).clone();
-			if (!includePropertyDefinitions)
-				td.setPropertyDefinitions(null);
-			TypeDefinitionContainerImpl tdcClone = new TypeDefinitionContainerImpl(td);
-			if (depth > 0) {
-				ArrayList<TypeDefinitionContainer> children = new ArrayList<TypeDefinitionContainer>(tdc.getChildren()
-						.size());
-				children.addAll(tdc.getChildren());
-				tdcClone.setChildren(children);
-				cloneTypeList(depth - 1, includePropertyDefinitions, children);
-			}
-			it.set(tdcClone);
-		}
-	}
+    /**
+     * map from repository id to a type manager
+     */
+    private Map<String, TypeManager> fMapRepositoryToTypeManager = new HashMap<String, TypeManager>();
+
+    /**
+     * map from repository id to a object store
+     */
+    private Map<String, ObjectStore> fMapRepositoryToObjectStore = new HashMap<String, ObjectStore>();
+
+    public ObjectStoreImpl getStore(String repositoryId) {
+        return (ObjectStoreImpl) fMapRepositoryToObjectStore.get(repositoryId);
+    }
+
+    public StoreManagerImpl() {
+        fObjectFactory = new BindingsObjectFactoryImpl();
+    }
+
+    public List<String> getAllRepositoryIds() {
+        Set<String> repIds = fMapRepositoryToObjectStore.keySet();
+        List<String> result = new ArrayList<String>();
+        result.addAll(repIds);
+        return result;
+    }
+
+    public void initRepository(String repositoryId) {
+        fMapRepositoryToObjectStore.put(repositoryId, new ObjectStoreImpl(repositoryId));
+        fMapRepositoryToTypeManager.put(repositoryId, new TypeManager());
+    }
+
+    public void createAndInitRepository(String repositoryId, String typeCreatorClassName) {
+        if (fMapRepositoryToObjectStore.containsKey(repositoryId)
+                || fMapRepositoryToTypeManager.containsKey(repositoryId))
+            throw new RuntimeException("Cannot add repository, repository " + repositoryId + " already exists.");
+
+        fMapRepositoryToObjectStore.put(repositoryId, new ObjectStoreImpl(repositoryId));
+        fMapRepositoryToTypeManager.put(repositoryId, new TypeManager());
+
+        // initialize the type system:
+        initTypeSystem(repositoryId, typeCreatorClassName);
+    }
+
+    public ObjectStore getObjectStore(String repositoryId) {
+        return fMapRepositoryToObjectStore.get(repositoryId);
+    }
+
+    public BindingsObjectFactory getObjectFactory() {
+        return fObjectFactory;
+    }
+
+    public TypeDefinitionContainer getTypeById(String repositoryId, String typeId) {
+        TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
+        if (null == typeManager)
+            throw new RuntimeException("Unknown repository " + repositoryId);
+
+        return typeManager.getTypeById(typeId);
+    }
+
+    public TypeDefinitionContainer getTypeById(String repositoryId, String typeId, boolean includePropertyDefinitions,
+            int depth) {
+        TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
+        if (null == typeManager)
+            throw new RuntimeException("Unknown repository " + repositoryId);
+
+        TypeDefinitionContainer tc = typeManager.getTypeById(typeId);
+        List<TypeDefinitionContainer> result = null;
+
+        if (tc != null) {
+            if (depth == -1) {
+                result = tc.getChildren();
+                if (!includePropertyDefinitions)
+                    cloneTypeList(depth - 1, false, result);
+            } else if (depth == 0 || depth < -1)
+                throw new CmisInvalidArgumentException("illegal depth value: " + depth);
+            else {
+                result = tc.getChildren();
+                cloneTypeList(depth - 1, includePropertyDefinitions, result);
+            }
+        }
+        return tc;
+    }
+
+    public Collection<TypeDefinitionContainer> getTypeDefinitionList(String repositoryId,
+            boolean includePropertyDefinitions) {
+        Collection<TypeDefinitionContainer> result;
+        TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
+        if (null == typeManager)
+            throw new RuntimeException("Unknown repository " + repositoryId);
+        Collection<TypeDefinitionContainer> typeColl = typeManager.getTypeDefinitionList();
+        if (includePropertyDefinitions) {
+            result = typeColl;
+        } else {
+            result = new ArrayList<TypeDefinitionContainer>(typeColl);
+            // copy list and omit properties
+            for (TypeDefinitionContainer c : result) {
+                AbstractTypeDefinition td = ((AbstractTypeDefinition) c.getTypeDefinition()).clone();
+                TypeDefinitionContainerImpl tdc = new TypeDefinitionContainerImpl(td);
+                tdc.setChildren(c.getChildren());
+                td.setPropertyDefinitions(null);
+            }
+        }
+        return result;
+    }
+
+    public Map<String, TypeDefinitionContainer> getTypeDefinitionMap(String repositoryId) {
+        return null;
+    }
+
+    public List<TypeDefinitionContainer> getRootTypes(String repositoryId) {
+        TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
+        if (null == typeManager)
+            throw new RuntimeException("Unknown repository " + repositoryId);
+        List<TypeDefinitionContainer> rootTypes = typeManager.getRootTypes();
+
+        return rootTypes;
+    }
+
+    public RepositoryInfo getRepositoryInfo(String repositoryId) {
+        ObjectStore sm = fMapRepositoryToObjectStore.get(repositoryId);
+        if (null == sm)
+            return null;
+
+        RepositoryInfo repoInfo = createDefaultRepositoryInfo(repositoryId);
+
+        return repoInfo;
+    }
+
+    public void clearTypeSystem(String repositoryId) {
+        TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
+        if (null == typeManager)
+            throw new RuntimeException("Unknown repository " + repositoryId);
+
+        typeManager.clearTypeSystem();
+    }
+
+    public void initRepositoryInfo(String repositoryId, String repoInfoCreatorClassName) {
+        RepositoryInfoCreator repoCreator = null;
+
+        if (repoInfoCreatorClassName != null) {
+            Object obj = null;
+            try {
+                obj = Class.forName(repoInfoCreatorClassName).newInstance();
+            } catch (InstantiationException e) {
+                throw new RuntimeException(
+                        "Illegal class to create type system, must implement RepositoryInfoCreator interface.", e);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(
+                        "Illegal class to create type system, must implement RepositoryInfoCreator interface.", e);
+            } catch (ClassNotFoundException e) {
+                throw new RuntimeException(
+                        "Illegal class to create type system, must implement RepositoryInfoCreator interface.", e);
+            }
+
+            if (obj instanceof RepositoryInfoCreator) {
+                repoCreator = (RepositoryInfoCreator) obj;
+                fRepositoryInfo = repoCreator.createRepositoryInfo();
+            } else
+                throw new RuntimeException(
+                        "Illegal class to create repository info, must implement RepositoryInfoCreator interface.");
+        } else {
+            // create a default repository info
+            createDefaultRepositoryInfo(repositoryId);
+        }
+    }
+
+    public List<TypeDefinition> initTypeSystem(String typeCreatorClassName) {
+
+        List<TypeDefinition> typesList = null;
+
+        if (typeCreatorClassName != null) {
+            Object obj = null;
+            TypeCreator typeCreator = null;
+
+            try {
+                obj = Class.forName(typeCreatorClassName).newInstance();
+            } catch (InstantiationException e) {
+                throw new RuntimeException(
+                        "Illegal class to create type system, must implement TypeCreator interface.", e);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(
+                        "Illegal class to create type system, must implement TypeCreator interface.", e);
+            } catch (ClassNotFoundException e) {
+                throw new RuntimeException(
+                        "Illegal class to create type system, must implement TypeCreator interface.", e);
+            }
+
+            if (obj instanceof TypeCreator)
+                typeCreator = (TypeCreator) obj;
+            else
+                throw new RuntimeException("Illegal class to create type system, must implement TypeCreator interface.");
+
+            // retrieve the list of available types from the configured class.
+            // test
+            typesList = typeCreator.createTypesList();
+        }
+
+        return typesList;
+    }
+
+    private void initTypeSystem(String repositoryId, String typeCreatorClassName) {
+
+        List<TypeDefinition> typeDefs = null;
+        TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
+        if (null == typeManager)
+            throw new RuntimeException("Unknown repository " + repositoryId);
+
+        if (null != typeCreatorClassName)
+            typeDefs = initTypeSystem(typeCreatorClassName);
+
+        typeManager.initTypeSystem(typeDefs);
+    }
+
+    private RepositoryInfo createDefaultRepositoryInfo(String repositoryId) {
+        ObjectStore objStore = getObjectStore(repositoryId);
+        String rootFolderId = objStore.getRootFolder().getId();
+        // repository info
+        RepositoryInfoImpl repoInfo;
+        repoInfo = new RepositoryInfoImpl();
+        repoInfo.setRepositoryId(repositoryId == null ? "inMem" : repositoryId);
+        repoInfo.setRepositoryName("InMemory Repository");
+        repoInfo.setRepositoryDescription("InMemory Test Repository");
+        repoInfo.setCmisVersionSupported("1.0");
+        repoInfo.setRepositoryCapabilities(null);
+        repoInfo.setRootFolder(rootFolderId);
+        repoInfo.setPrincipalAnonymous("anonymous");
+        repoInfo.setPrincipalAnyone("anyone");
+        repoInfo.setThinClientUri(null);
+        repoInfo.setChangesIncomplete(Boolean.TRUE);
+        repoInfo.setChangesOnType(null);
+        repoInfo.setLatestChangeLogToken(null);
+        repoInfo.setVendorName("OpenCMIS");
+        repoInfo.setProductName("OpenCMIS InMemory-Server");
+        repoInfo.setProductVersion("0.1");
+
+        // set capabilities
+        RepositoryCapabilitiesImpl caps = new RepositoryCapabilitiesImpl();
+        caps.setAllVersionsSearchable(false);
+        caps.setCapabilityAcl(CapabilityAcl.NONE);
+        caps.setCapabilityChanges(CapabilityChanges.PROPERTIES); // just for
+        // testing
+        caps.setCapabilityContentStreamUpdates(CapabilityContentStreamUpdates.PWCONLY);
+        caps.setCapabilityJoin(CapabilityJoin.NONE);
+        caps.setCapabilityQuery(CapabilityQuery.METADATAONLY); // just for
+        // testing
+        caps.setCapabilityRendition(CapabilityRenditions.NONE);
+        caps.setIsPwcSearchable(false);
+        caps.setIsPwcUpdatable(true);
+        caps.setSupportsGetDescendants(true);
+        caps.setSupportsGetFolderTree(true);
+        caps.setSupportsMultifiling(true);
+        caps.setSupportsUnfiling(true);
+        caps.setSupportsVersionSpecificFiling(false);
+        repoInfo.setRepositoryCapabilities(caps);
+
+        // AclCapabilitiesDataImpl aclCaps = new AclCapabilitiesDataImpl();
+        // aclCaps.setACLPropagation(AclPropagation.REPOSITORYDETERMINED);
+        // aclCaps.setPermissionDefinitionData(null);
+        // aclCaps.setPermissionMappingData(null);
+        // repoInfo.setACLCapabilities(aclCaps);
+        repoInfo.setAclCapabilities(null);
+        fRepositoryInfo = repoInfo;
+        return repoInfo;
+    }
+
+    /**
+     * traverse tree and replace each need node with a clone. remove properties
+     * on clone if requested, cut children of clone if depth is exceeded.
+     * 
+     * @param depth
+     * @param types
+     */
+    private void cloneTypeList(int depth, boolean includePropertyDefinitions, List<TypeDefinitionContainer> types) {
+
+        ListIterator<TypeDefinitionContainer> it = types.listIterator();
+        while (it.hasNext()) {
+            TypeDefinitionContainer tdc = it.next();
+            AbstractTypeDefinition td = ((AbstractTypeDefinition) tdc.getTypeDefinition()).clone();
+            if (!includePropertyDefinitions)
+                td.setPropertyDefinitions(null);
+            TypeDefinitionContainerImpl tdcClone = new TypeDefinitionContainerImpl(td);
+            if (depth > 0) {
+                ArrayList<TypeDefinitionContainer> children = new ArrayList<TypeDefinitionContainer>(tdc.getChildren()
+                        .size());
+                children.addAll(tdc.getChildren());
+                tdcClone.setChildren(children);
+                cloneTypeList(depth - 1, includePropertyDefinitions, children);
+            }
+            it.set(tdcClone);
+        }
+    }
 
 }