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/02/16 17:04:07 UTC
svn commit: r910572 [30/36] - in /incubator/chemistry/trunk/opencmis: ./
_dev/ opencmis-client/ opencmis-client/opencmis-client-api/
opencmis-client/opencmis-client-api/src/
opencmis-client/opencmis-client-api/src/main/
opencmis-client/opencmis-client-...
Added: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/DocumentVersionImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/DocumentVersionImpl.java?rev=910572&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/DocumentVersionImpl.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/DocumentVersionImpl.java Tue Feb 16 16:03:38 2010
@@ -0,0 +1,188 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.opencmis.inmemory.storedobj.impl;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.opencmis.commons.PropertyIds;
+import org.apache.opencmis.commons.enums.VersioningState;
+import org.apache.opencmis.commons.provider.ContentStreamData;
+import org.apache.opencmis.commons.provider.PropertyData;
+import org.apache.opencmis.commons.provider.ProviderObjectFactory;
+import org.apache.opencmis.inmemory.FilterParser;
+import org.apache.opencmis.inmemory.storedobj.api.DocumentVersion;
+import org.apache.opencmis.inmemory.storedobj.api.VersionedDocument;
+
+/**
+ * A class representing a single version of a document
+ *
+ * @author Jens
+ *
+ */
+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, ContentStreamData content,
+ VersioningState verState) {
+ 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(ContentStreamData 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 String getCheckinComment() {
+ return fComment;
+ }
+
+ public String getVersionLabel() {
+ int majorNo = 0;
+ int minorNo = 0;
+ List<DocumentVersion> allVersions = fContainer.getAllVersions(null);
+ 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 ContentStreamData getContent() {
+ return fContent;
+ }
+
+ public VersionedDocument getParentDocument() {
+ return fContainer;
+ }
+
+ private boolean isLatestVersion() {
+ List<DocumentVersion> allVers = fContainer.getAllVersions(null);
+ 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(null);
+ 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(List<PropertyData<?>> properties, ProviderObjectFactory 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.CMIS_IS_LATEST_VERSION, requestedIds)) {
+ properties.add(objFactory.createPropertyBooleanData(PropertyIds.CMIS_IS_LATEST_VERSION, isLatestVersion()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_IS_MAJOR_VERSION, requestedIds)) {
+ properties.add(objFactory.createPropertyBooleanData(PropertyIds.CMIS_IS_MAJOR_VERSION, fIsMajor));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_IS_LATEST_MAJOR_VERSION, requestedIds)) {
+ properties.add(objFactory.createPropertyBooleanData(PropertyIds.CMIS_IS_LATEST_MAJOR_VERSION, isLatestMajorVersion()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_VERSION_SERIES_ID, requestedIds)) {
+ properties.add(objFactory.createPropertyIdData(PropertyIds.CMIS_VERSION_SERIES_ID, fContainer.getId()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_IS_VERSION_SERIES_CHECKED_OUT, requestedIds)) {
+ properties.add(objFactory.createPropertyBooleanData(PropertyIds.CMIS_IS_VERSION_SERIES_CHECKED_OUT, fContainer.isCheckedOut()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_BY, requestedIds)) {
+ properties.add(objFactory.createPropertyStringData(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_BY, fContainer.getCheckedOutBy()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_ID, requestedIds)) {
+ properties.add(objFactory.createPropertyIdData(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_ID, pwc == null ? null : pwc.getId()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_CHECKIN_COMMENT, requestedIds)) {
+ properties.add(objFactory.createPropertyStringData(PropertyIds.CMIS_CHECKIN_COMMENT, fComment));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_VERSION_LABEL, requestedIds)) {
+ properties.add(objFactory.createPropertyStringData(PropertyIds.CMIS_VERSION_LABEL, getVersionLabel()));
+ }
+ }
+
+}
Propchange: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/DocumentVersionImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/FolderImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/FolderImpl.java?rev=910572&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/FolderImpl.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/FolderImpl.java Tue Feb 16 16:03:38 2010
@@ -0,0 +1,226 @@
+package org.apache.opencmis.inmemory.storedobj.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.opencmis.commons.PropertyIds;
+import org.apache.opencmis.commons.provider.PropertyData;
+import org.apache.opencmis.commons.provider.ProviderObjectFactory;
+import org.apache.opencmis.inmemory.FilterParser;
+import org.apache.opencmis.inmemory.NameValidator;
+import org.apache.opencmis.inmemory.storedobj.api.Document;
+import org.apache.opencmis.inmemory.storedobj.api.Folder;
+import org.apache.opencmis.inmemory.storedobj.api.Path;
+import org.apache.opencmis.inmemory.storedobj.api.StoredObject;
+import org.apache.opencmis.inmemory.storedobj.api.VersionedDocument;
+
+public class FolderImpl extends AbstractPathImpl implements Folder {
+ private static final Log LOG = LogFactory.getLog(AbstractPathImpl.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);
+ fObjStore.storeObject(folder.getPath(), folder);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.opencmis.client.provider.spi.inmemory.IFolder#addChildDocument(org.apache.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 IllegalArgumentException(NameValidator.ERROR_ILLEGAL_NAME);
+
+ boolean hasChild;
+ hasChild = hasChild(name);
+ if (hasChild)
+ throw new RuntimeException("Cannot create document " + name
+ + ". Name already exists in parent folder");
+
+ String documentPath = getPath();
+ if (documentPath.equals(PATH_SEPARATOR))
+ documentPath += name;
+ else
+ documentPath += PATH_SEPARATOR + name;
+ ((Path)so).setParent(this);
+ fObjStore.storeObject(documentPath, so);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IFolder#getChildren()
+ */
+ public List<StoredObject> getChildren(int maxItems, int skipCount) {
+ List<StoredObject> result = new ArrayList<StoredObject>();
+ String path = getPath();
+ for (String id : fObjStore.getIds()) {
+ StoredObject obj = fObjStore.getObject(id);
+ if (obj instanceof Path) {
+ Path pathObj = (Path) obj;
+ if (pathObj.getParent() != null && path.equals(pathObj.getParent().getPath()))
+ 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.apache.opencmis.client.provider.spi.inmemory.IFolder#getFolderChildren()
+ */
+ public List<Folder> getFolderChildren(int maxItems, int skipCount) {
+ List<Folder> result = new ArrayList<Folder>();
+ String path = getPath();
+ for (String id : fObjStore.getIds()) {
+ StoredObject obj = fObjStore.getObject(id);
+ if (obj instanceof Path) {
+ Path pathObj = (Path) obj;
+ if (pathObj.getParent() != null && path.equals(pathObj.getParent().getPath())
+ && 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.apache.opencmis.client.provider.spi.inmemory.IFolder#hasChild(java.lang.String)
+ */
+ public boolean hasChild(String name) {
+ String path = getPath();
+ if (path.equals(PATH_SEPARATOR))
+ path = path + name;
+ else
+ path = path + PATH_SEPARATOR + name;
+ for (String objPath : fObjStore.getIds()) {
+ if (path.equals(objPath))
+ return true;
+ }
+ return false;
+ }
+
+ public void fillProperties(List<PropertyData<?>> properties, ProviderObjectFactory objFactory,
+ List<String> requestedIds) {
+
+ super.fillProperties(properties, objFactory, requestedIds);
+
+ // add folder specific properties
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_OBJECT_ID, requestedIds)) {
+ properties.add(objFactory.createPropertyIdData(PropertyIds.CMIS_OBJECT_ID, getPath()));
+ // for folders we use the path as id in this provider
+ }
+
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_PARENT_ID, requestedIds)) {
+ String parentId = getParent() == null ? null : getParent().getId();
+ if ( parentId != null )
+ properties.add(objFactory.createPropertyStringData(PropertyIds.CMIS_PARENT_ID, parentId));
+ }
+
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_ALLOWED_CHILD_OBJECT_TYPE_IDS,
+ requestedIds)) {
+ String allowedChildObjects = "*"; // TODO: not yet supported
+ properties.add(objFactory.createPropertyStringData(
+ PropertyIds.CMIS_ALLOWED_CHILD_OBJECT_TYPE_IDS, allowedChildObjects));
+ }
+
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_PATH, requestedIds)) {
+ String path = getPath();
+ properties.add(objFactory.createPropertyStringData(PropertyIds.CMIS_PATH, path));
+ }
+ }
+
+ // Helper functions
+ private void init(String name, Folder parent) {
+ if (!NameValidator.isValidId(name))
+ throw new IllegalArgumentException(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 persist() {
+ // The in-memory implementation doesn't have to do anything here, but sets the id
+// fId = getPath();
+ }
+
+ public void moveChildDocument(Document doc, Folder newParent) {
+ if (newParent.hasChild(doc.getName()))
+ throw new IllegalArgumentException(
+ "Cannot move folder, this name already exists in target.");
+
+ String oldPath = doc.getPath(); // old path of document to move
+ doc.setParent(newParent);
+ String newPath = doc.getPath(); // new path of document to move
+ fObjStore.removeObject(oldPath);
+ fObjStore.storeObject(newPath, doc);
+ }
+
+ public List<String> getAllowedChildObjectTypeIds() {
+ // TODO implement this.
+ return null;
+ }
+
+}
\ No newline at end of file
Propchange: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/FolderImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java?rev=910572&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java Tue Feb 16 16:03:38 2010
@@ -0,0 +1,234 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.opencmis.inmemory.storedobj.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.apache.opencmis.commons.enums.BaseObjectTypeIds;
+import org.apache.opencmis.commons.exceptions.CmisConstraintException;
+import org.apache.opencmis.inmemory.storedobj.api.Document;
+import org.apache.opencmis.inmemory.storedobj.api.Folder;
+import org.apache.opencmis.inmemory.storedobj.api.ObjectStore;
+import org.apache.opencmis.inmemory.storedobj.api.Path;
+import org.apache.opencmis.inmemory.storedobj.api.StoredObject;
+import org.apache.opencmis.inmemory.storedobj.api.VersionedDocument;
+
+/**
+ * InMemory folder implementation
+ *
+ * @author Jens
+ *
+ */
+
+public class ObjectStoreImpl implements ObjectStore {
+
+ /**
+ * 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();
+ }
+
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.opencmis.client.provider.spi.inmemory.storedobj.impl.ObjectStore#getRootFolder()
+ */
+ public Folder getRootFolder() {
+ return fRootFolder;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.opencmis.client.provider.spi.inmemory.storedobj.impl.ObjectStore#getFolderByPath(java.lang
+ * .String)
+ */
+ public StoredObject getObjectByPath(String path) {
+ StoredObject obj = fStoredObjectMap.get(path);
+ return obj;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.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.apache.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 {
+ fStoredObjectMap.remove(path);
+ }
+ }
+
+ 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);
+ }
+
+ 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(BaseObjectTypeIds.CMIS_FOLDER.value());
+ rootFolder.setCreatedBy("Admin");
+ rootFolder.setModifiedBy("Admin");
+ rootFolder.setModifiedAtNow();
+ rootFolder.setRepositoryId(fRepositoryId);
+
+ fStoredObjectMap.put(Path.PATH_SEPARATOR, rootFolder);
+ 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) {
+ String path = folderId; // we use path as id
+ StoredObject obj = fStoredObjectMap.get(path);
+ if (obj != null) {
+ if (!(obj instanceof FolderImpl))
+ throw new RuntimeException("Cannot delete folder with path: " + path
+ + ". Object exists but is not a folder.");
+ }
+
+ // check if children exist
+ fStoredObjectMap.remove(path);
+ for (String objPath : fStoredObjectMap.keySet()) {
+ if (objPath.startsWith(path)) {
+ fStoredObjectMap.put(path, obj); // restore object
+ throw new CmisConstraintException("Cannot delete folder with path: " + path
+ + ". Folder is not empty.");
+ }
+ }
+ }
+
+}
Propchange: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/ObjectStoreImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/SessionConfigReader.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/SessionConfigReader.java?rev=910572&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/SessionConfigReader.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/SessionConfigReader.java Tue Feb 16 16:03:38 2010
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.opencmis.inmemory.storedobj.impl;
+
+import org.apache.opencmis.client.provider.spi.Session;
+import org.apache.opencmis.inmemory.ConfigMap;
+
+public class SessionConfigReader implements ConfigMap {
+
+ private Session fSession;
+
+ public SessionConfigReader(Session session) {
+ fSession = session;
+ }
+
+ public String get(String paramName) {
+ return (String) fSession.get(paramName);
+ }
+
+}
Propchange: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/SessionConfigReader.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoreManagerFactory.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoreManagerFactory.java?rev=910572&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoreManagerFactory.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoreManagerFactory.java Tue Feb 16 16:03:38 2010
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.opencmis.inmemory.storedobj.impl;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.opencmis.inmemory.storedobj.api.StoreManager;
+
+/**
+ * create objects that are stored in a persistent store
+ *
+ * @author Jens
+ */
+
+public class StoreManagerFactory {
+ private static Log log = LogFactory.getLog(StoreManagerFactory.class);
+
+ 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;
+ }
+ }
+
+}
Propchange: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoreManagerFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java?rev=910572&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java Tue Feb 16 16:03:38 2010
@@ -0,0 +1,313 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.opencmis.inmemory.storedobj.impl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.opencmis.commons.api.TypeDefinition;
+import org.apache.opencmis.commons.api.TypeDefinitionContainer;
+import org.apache.opencmis.commons.enums.CapabilityChanges;
+import org.apache.opencmis.commons.enums.CapabilityContentStreamUpdates;
+import org.apache.opencmis.commons.enums.CapabilityJoin;
+import org.apache.opencmis.commons.enums.CapabilityQuery;
+import org.apache.opencmis.commons.enums.CapabilityRendition;
+import org.apache.opencmis.commons.impl.dataobjects.ProviderObjectFactoryImpl;
+import org.apache.opencmis.commons.impl.dataobjects.RepositoryCapabilitiesDataImpl;
+import org.apache.opencmis.commons.impl.dataobjects.RepositoryInfoDataImpl;
+import org.apache.opencmis.commons.provider.ProviderObjectFactory;
+import org.apache.opencmis.commons.provider.RepositoryInfoData;
+import org.apache.opencmis.inmemory.ConfigMap;
+import org.apache.opencmis.inmemory.RepositoryInfo;
+import org.apache.opencmis.inmemory.RepositoryInfoCreator;
+import org.apache.opencmis.inmemory.TypeCreator;
+import org.apache.opencmis.inmemory.TypeManager;
+import org.apache.opencmis.inmemory.storedobj.api.ObjectStore;
+import org.apache.opencmis.inmemory.storedobj.api.StoreManager;
+
+
+/**
+ * factory to create objects that are stored in the InMemory store
+ *
+ * @author Jens
+ */
+public class StoreManagerImpl implements StoreManager {
+
+ protected ProviderObjectFactory fObjectFactory;
+ protected ConfigMap fConfigMap;
+ protected RepositoryInfoData 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 ProviderObjectFactoryImpl();
+ }
+
+ public void setConfigReader(ConfigMap configMap) {
+ fConfigMap = configMap;
+ }
+
+ 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, boolean isCreated) {
+ TypeManager typeManager;
+ if (isCreated)
+ typeManager = fMapRepositoryToTypeManager.get(repositoryId);
+ else {
+ typeManager = new TypeManager();
+ fMapRepositoryToObjectStore.put(repositoryId, new ObjectStoreImpl(repositoryId));
+ fMapRepositoryToTypeManager.put(repositoryId, typeManager);
+ }
+
+ }
+
+ public ObjectStore getObjectStore(String repositoryId) {
+ return fMapRepositoryToObjectStore.get(repositoryId);
+ }
+
+ public ProviderObjectFactory getObjectFactory() {
+ return fObjectFactory;
+ }
+
+ public String getParameter(String parameter) {
+ return fConfigMap.get(parameter);
+ }
+
+ 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 Collection<TypeDefinitionContainer> getTypeDefinitionList(String repositoryId) {
+ TypeManager typeManager = fMapRepositoryToTypeManager.get(repositoryId);
+ if (null == typeManager)
+ throw new RuntimeException("Unknown repository " + repositoryId);
+ return typeManager.getTypeDefinitionList();
+ }
+
+ 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 RepositoryInfoData getRepositoryInfo(String repositoryId) {
+ ObjectStore sm = fMapRepositoryToObjectStore.get(repositoryId);
+ if (null == sm)
+ return null;
+
+ RepositoryInfoData repoInfo = createDefaultRepositoryInfo(repositoryId);
+
+ return repoInfo;
+ }
+
+ public 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);
+ }
+
+ 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 void createRepository(String repositoryId) {
+ 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());
+ }
+
+ public RepositoryInfo loadRepository(String repositoryId) {
+ return null;
+ }
+
+ private RepositoryInfoData createDefaultRepositoryInfo(String repositoryId) {
+ // repository info
+ RepositoryInfoDataImpl repoInfo;
+ repoInfo = new RepositoryInfoDataImpl();
+ repoInfo.setRepositoryId(repositoryId==null ? "inMem" : repositoryId);
+ repoInfo.setRepositoryName("InMemory Repository");
+ repoInfo.setRepositoryDescription("InMemory Test Repository");
+ repoInfo.setCmisVersionSupported("1.0");
+ repoInfo.setRepositoryCapabilities(null);
+ repoInfo.setRootFolder("/");
+ 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
+ RepositoryCapabilitiesDataImpl caps = new RepositoryCapabilitiesDataImpl();
+ caps.setAllVersionsSearchable(false);
+ caps.setCapabilityAcl(org.apache.opencmis.commons.enums.CapabilityAcl.NONE);
+ caps.setCapabilityChanges(CapabilityChanges.PROPERTIES); // just for testing
+ caps.setCapabilityContentStreamUpdates(CapabilityContentStreamUpdates.ANYTIME);
+ caps.setCapabilityJoin(CapabilityJoin.NONE);
+ caps.setCapabilityQuery(CapabilityQuery.METADATAONLY); // just for testing
+ caps.setCapabilityRendition(CapabilityRendition.NONE);
+ caps.setIsPwcSearchable(false);
+ caps.setIsPwcUpdatable(true);
+ caps.setSupportsGetDescendants(true);
+ caps.setSupportsGetFolderTree(true);
+ caps.setSupportsMultifiling(false);
+ caps.setSupportsUnfiling(false);
+ 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;
+ }
+
+ 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;
+ }
+
+}
Propchange: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java?rev=910572&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java Tue Feb 16 16:03:38 2010
@@ -0,0 +1,413 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.opencmis.inmemory.storedobj.impl;
+
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.Map.Entry;
+
+import org.apache.opencmis.commons.PropertyIds;
+import org.apache.opencmis.commons.provider.PropertyData;
+import org.apache.opencmis.commons.provider.ProviderObjectFactory;
+import org.apache.opencmis.inmemory.FilterParser;
+import org.apache.opencmis.inmemory.storedobj.api.StoredObject;
+
+/**
+ * InMemory Stored Object
+ *
+ * @author Jens
+ *
+ */
+
+/**
+ * StoredObject is the common superclass of all objects hold in the repository Documents, Folders,
+ * Relationships and Policies
+ */
+
+public class StoredObjectImpl implements StoredObject {
+ protected String fId;
+ protected String fName;
+ protected String fTypeId;
+ protected String fCreatedBy;
+ protected String fModifiedBy;
+ protected GregorianCalendar fCreatedAt;
+ protected GregorianCalendar fModifiedAt;
+ protected String fRepositoryId;
+ protected Map<String, PropertyData<?>> fProperties;
+
+ StoredObjectImpl() { // visibility should be package
+ GregorianCalendar now = getNow();
+ now.setTime(new Date());
+ fCreatedAt = now;
+ fModifiedAt = now;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#getId()
+ */
+ public String getId() {
+ return fId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#getName()
+ */
+ public String getName() {
+ return fName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#setName(java.lang.String)
+ */
+ public void setName(String name) {
+ fName = name;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#getTypeId()
+ */
+ public String getTypeId() {
+ return fTypeId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#setTypeId(java.lang.String)
+ */
+ public void setTypeId(String type) {
+ fTypeId = type;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#getCreatedBy()
+ */
+ public String getCreatedBy() {
+ return fCreatedBy;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#setCreatedBy(java.lang.String)
+ */
+ public void setCreatedBy(String createdBy) {
+ this.fCreatedBy = createdBy;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#getModifiedBy()
+ */
+ public String getModifiedBy() {
+ return fModifiedBy;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#setModifiedBy(java.lang.String)
+ */
+ public void setModifiedBy(String modifiedBy) {
+ this.fModifiedBy = modifiedBy;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#getCreatedAt()
+ */
+ public GregorianCalendar getCreatedAt() {
+ return fCreatedAt;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#setCreatedAt(java.util.GregorianCalendar)
+ */
+ public void setCreatedAt(GregorianCalendar createdAt) {
+ this.fCreatedAt = createdAt;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#getModifiedAt()
+ */
+ public GregorianCalendar getModifiedAt() {
+ return fModifiedAt;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#setModifiedAtNow()
+ */
+ public void setModifiedAtNow() {
+ this.fModifiedAt = getNow();
+ }
+
+ public void setRepositoryId(String repositoryId) {
+ fRepositoryId = repositoryId;
+ }
+
+ public String getRepositoryId() {
+ return fRepositoryId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#setProperties(java.util.Map)
+ */
+ public void setProperties(Map<String, PropertyData<?>> props) {
+ fProperties = props;
+ }
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#getProperties()
+ */
+ public Map<String, PropertyData<?>> getProperties() {
+ return fProperties;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.storedobj.api.StoredObject#getChangeToken()
+ */
+ public String getChangeToken() {
+ GregorianCalendar lastModified = getModifiedAt();
+ String token = Long.valueOf(lastModified.getTimeInMillis()).toString();
+ return token;
+ }
+
+ public void rename(String newName) {
+ setName(newName);
+ persist();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#createSystemBasePropertiesWhenCreated(java.util.Map, java.lang.String)
+ */
+ public void createSystemBasePropertiesWhenCreated(
+ Map<String, PropertyData<?>> properties,
+ String user) {
+ addSystemBaseProperties(properties, user, true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#updateSystemBasePropertiesWhenModified(java.util.Map, java.lang.String)
+ */
+ public void updateSystemBasePropertiesWhenModified(
+ Map<String, PropertyData<?>> properties,
+ String user) {
+ addSystemBaseProperties(properties, user, false);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#fillProperties(java.util.List, org.apache.opencmis.client.provider.ProviderObjectFactory, java.util.List)
+ */
+ public void fillProperties(List<PropertyData<?>> properties,
+ ProviderObjectFactory objFactory, List<String> requestedIds) {
+
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_NAME, requestedIds)) {
+ properties.add(objFactory.createPropertyStringData(PropertyIds.CMIS_NAME, getName()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_OBJECT_ID, requestedIds)) {
+ properties.add(objFactory.createPropertyIdData(PropertyIds.CMIS_OBJECT_ID, getId()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_OBJECT_TYPE_ID, requestedIds)) {
+ properties.add(objFactory.createPropertyIdData(PropertyIds.CMIS_OBJECT_TYPE_ID, getTypeId()));
+ }
+ // set the base type id outside becaus it requires the type definition
+// if (FilterParser.isContainedInFilter(PropertyIds.CMIS_BASE_TYPE_ID, requestedIds)) {
+// properties.add(objFactory.createPropertyIdData(PropertyIds.CMIS_BASE_TYPE_ID, getBaseTypeId()));
+// }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_CREATED_BY, requestedIds)) {
+ properties.add(objFactory.createPropertyStringData(PropertyIds.CMIS_CREATED_BY, getCreatedBy()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_CREATION_DATE, requestedIds)) {
+ properties.add(objFactory.createPropertyDateTimeData(PropertyIds.CMIS_CREATION_DATE, getCreatedAt()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_LAST_MODIFIED_BY, requestedIds)) {
+ properties.add(objFactory.createPropertyStringData(PropertyIds.CMIS_LAST_MODIFIED_BY, getModifiedBy()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_LAST_MODIFICATION_DATE, requestedIds)) {
+ properties.add(objFactory.createPropertyDateTimeData(PropertyIds.CMIS_LAST_MODIFICATION_DATE, getModifiedAt()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_CHANGE_TOKEN, requestedIds)) {
+ String token = getChangeToken();
+ properties.add(objFactory.createPropertyStringData(PropertyIds.CMIS_CHANGE_TOKEN, token));
+ }
+
+ // add custom properties of type definition to the collection
+ if (null != fProperties) {
+ for (Entry<String, PropertyData<?>> prop: fProperties.entrySet()) {
+ properties.add(prop.getValue());
+ }
+ }
+ }
+
+
+ /////////////////////////////////////////////
+ // private helper methods
+
+ /* (non-Javadoc)
+ * @see org.apache.opencmis.client.provider.spi.inmemory.IStoredObject#setCustomProperties(java.util.Map)
+ */
+ public void setCustomProperties(Map<String, PropertyData<?>> properties) {
+ properties = new HashMap<String, PropertyData<?>>(properties); // get a writable collection
+ removeAllSystemProperties(properties);
+ setProperties(properties);
+ }
+
+ private GregorianCalendar getNow() {
+ GregorianCalendar now = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
+ return now;
+ }
+
+ /**
+ * Add CMIS_CREATED_BY, CMIS_CREATION_DATE, CMIS_LAST_MODIFIED_BY, CMIS_LAST_MODIFICATION_DATE,
+ * CMIS_CHANGE_TOKEN system properties to the list of properties with current values
+ */
+ private void addSystemBaseProperties(Map<String, PropertyData<?>> properties, String user, boolean isCreated) {
+ if (user == null)
+ user = "unknown";
+
+ // Note that initial creation and modification date is set in constructor.
+ setModifiedBy(user);
+ if (isCreated) {
+ setCreatedBy(user);
+ setName((String) properties.get(PropertyIds.CMIS_NAME).getFirstValue());
+ setTypeId((String) properties.get(PropertyIds.CMIS_OBJECT_TYPE_ID).getFirstValue());
+ } else {
+ setModifiedAtNow();
+ }
+ }
+
+ /**
+ * Add CMIS_CREATED_BY, CMIS_CREATION_DATE, CMIS_LAST_MODIFIED_BY, CMIS_LAST_MODIFICATION_DATE,
+ * CMIS_CHANGE_TOKEN system properties to the list of properties with current values
+ */
+ protected void setSystemBasePropertiesWhenCreatedDirect(String name, String typeId, String user) {
+ // Note that initial creation and modification date is set in constructor.
+ setModifiedBy(user);
+ setCreatedBy(user);
+ setName(name);
+ setTypeId(typeId);
+ }
+
+/*
+ CMIS_NAME
+ CMIS_OBJECT_ID
+ CMIS_OBJECT_TYPE_ID
+ CMIS_BASE_TYPE_ID
+ CMIS_CREATED_BY
+ CMIS_CREATION_DATE
+ CMIS_LAST_MODIFIED_BY
+ CMIS_LAST_MODIFICATION_DATE
+ CMIS_CHANGE_TOKEN
+
+ // ---- document ----
+ CMIS_IS_IMMUTABLE
+ CMIS_IS_LATEST_VERSION
+ CMIS_IS_MAJOR_VERSION
+ CMIS_IS_LATEST_MAJOR_VERSION
+ CMIS_VERSION_LABEL
+ CMIS_VERSION_SERIES_ID
+ CMIS_IS_VERSION_SERIES_CHECKED_OUT
+ CMIS_VERSION_SERIES_CHECKED_OUT_BY
+ CMIS_VERSION_SERIES_CHECKED_OUT_ID
+ CMIS_CHECKIN_COMMENT
+ CMIS_CONTENT_STREAM_LENGTH
+ CMIS_CONTENT_STREAM_MIME_TYPE
+ CMIS_CONTENT_STREAM_FILE_NAME
+ CMIS_CONTENT_STREAM_ID
+
+ // ---- folder ----
+ CMIS_PARENT_ID
+ CMIS_ALLOWED_CHILD_OBJECT_TYPE_IDS
+ CMIS_PATH
+
+ // ---- relationship ----
+ CMIS_SOURCE_ID
+ CMIS_TARGET_ID
+
+ // ---- policy ----
+ CMIS_POLICY_TEXT
+ */
+ private void removeAllSystemProperties(Map<String, PropertyData<?>> properties) {
+ // ---- base ----
+ if (properties.containsKey(PropertyIds.CMIS_NAME))
+ properties.remove(PropertyIds.CMIS_NAME);
+ if (properties.containsKey(PropertyIds.CMIS_OBJECT_ID))
+ properties.remove(PropertyIds.CMIS_OBJECT_ID);
+ if (properties.containsKey(PropertyIds.CMIS_OBJECT_TYPE_ID))
+ properties.remove(PropertyIds.CMIS_OBJECT_TYPE_ID);
+ if (properties.containsKey(PropertyIds.CMIS_BASE_TYPE_ID))
+ properties.remove(PropertyIds.CMIS_BASE_TYPE_ID);
+ if (properties.containsKey(PropertyIds.CMIS_CREATED_BY))
+ properties.remove(PropertyIds.CMIS_CREATED_BY);
+ if (properties.containsKey(PropertyIds.CMIS_CREATION_DATE))
+ properties.remove(PropertyIds.CMIS_CREATION_DATE);
+ if (properties.containsKey(PropertyIds.CMIS_LAST_MODIFIED_BY))
+ properties.remove(PropertyIds.CMIS_LAST_MODIFIED_BY);
+ if (properties.containsKey(PropertyIds.CMIS_LAST_MODIFICATION_DATE))
+ properties.remove(PropertyIds.CMIS_LAST_MODIFICATION_DATE);
+ if (properties.containsKey(PropertyIds.CMIS_CHANGE_TOKEN))
+ properties.remove(PropertyIds.CMIS_CHANGE_TOKEN);
+ // ---- document ----
+ if (properties.containsKey(PropertyIds.CMIS_IS_IMMUTABLE))
+ properties.remove(PropertyIds.CMIS_IS_IMMUTABLE);
+ if (properties.containsKey(PropertyIds.CMIS_IS_LATEST_VERSION))
+ properties.remove(PropertyIds.CMIS_IS_LATEST_VERSION);
+ if (properties.containsKey(PropertyIds.CMIS_IS_MAJOR_VERSION))
+ properties.remove(PropertyIds.CMIS_IS_MAJOR_VERSION);
+ if (properties.containsKey(PropertyIds.CMIS_IS_LATEST_MAJOR_VERSION))
+ properties.remove(PropertyIds.CMIS_IS_LATEST_MAJOR_VERSION);
+ if (properties.containsKey(PropertyIds.CMIS_VERSION_LABEL))
+ properties.remove(PropertyIds.CMIS_VERSION_LABEL);
+ if (properties.containsKey(PropertyIds.CMIS_VERSION_SERIES_ID))
+ properties.remove(PropertyIds.CMIS_VERSION_SERIES_ID);
+ if (properties.containsKey(PropertyIds.CMIS_IS_VERSION_SERIES_CHECKED_OUT))
+ properties.remove(PropertyIds.CMIS_IS_VERSION_SERIES_CHECKED_OUT);
+ if (properties.containsKey(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_BY))
+ properties.remove(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_BY);
+ if (properties.containsKey(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_ID))
+ properties.remove(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_ID);
+ if (properties.containsKey(PropertyIds.CMIS_CHECKIN_COMMENT))
+ properties.remove(PropertyIds.CMIS_CHECKIN_COMMENT);
+ if (properties.containsKey(PropertyIds.CMIS_CONTENT_STREAM_LENGTH))
+ properties.remove(PropertyIds.CMIS_CONTENT_STREAM_LENGTH);
+ if (properties.containsKey(PropertyIds.CMIS_CONTENT_STREAM_MIME_TYPE))
+ properties.remove(PropertyIds.CMIS_CONTENT_STREAM_MIME_TYPE);
+ if (properties.containsKey(PropertyIds.CMIS_CONTENT_STREAM_FILE_NAME))
+ properties.remove(PropertyIds.CMIS_CONTENT_STREAM_FILE_NAME);
+ if (properties.containsKey(PropertyIds.CMIS_CONTENT_STREAM_ID))
+ properties.remove(PropertyIds.CMIS_CONTENT_STREAM_ID);
+ // ---- folder ----
+ if (properties.containsKey(PropertyIds.CMIS_PARENT_ID))
+ properties.remove(PropertyIds.CMIS_PARENT_ID);
+ if (properties.containsKey(PropertyIds.CMIS_ALLOWED_CHILD_OBJECT_TYPE_IDS))
+ properties.remove(PropertyIds.CMIS_ALLOWED_CHILD_OBJECT_TYPE_IDS);
+ if (properties.containsKey(PropertyIds.CMIS_PATH))
+ properties.remove(PropertyIds.CMIS_PATH);
+ // ---- relationship ----
+ if (properties.containsKey(PropertyIds.CMIS_SOURCE_ID))
+ properties.remove(PropertyIds.CMIS_SOURCE_ID);
+ if (properties.containsKey(PropertyIds.CMIS_TARGET_ID))
+ properties.remove(PropertyIds.CMIS_TARGET_ID);
+ // ---- policy ----
+ if (properties.containsKey(PropertyIds.CMIS_POLICY_TEXT))
+ properties.remove(PropertyIds.CMIS_POLICY_TEXT);
+ }
+
+public void persist() {
+ // in-memory implementation does not need to to anything to persist,
+ // but after this call the id should be set.
+}
+
+
+}
Propchange: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/VersionedDocumentImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/VersionedDocumentImpl.java?rev=910572&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/VersionedDocumentImpl.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/VersionedDocumentImpl.java Tue Feb 16 16:03:38 2010
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.opencmis.inmemory.storedobj.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.opencmis.commons.PropertyIds;
+import org.apache.opencmis.commons.enums.VersioningState;
+import org.apache.opencmis.commons.exceptions.CmisConstraintException;
+import org.apache.opencmis.commons.provider.ContentStreamData;
+import org.apache.opencmis.commons.provider.PropertyData;
+import org.apache.opencmis.commons.provider.ProviderObjectFactory;
+import org.apache.opencmis.inmemory.FilterParser;
+import org.apache.opencmis.inmemory.storedobj.api.DocumentVersion;
+import org.apache.opencmis.inmemory.storedobj.api.VersionedDocument;
+
+public class VersionedDocumentImpl extends AbstractPathImpl implements VersionedDocument {
+
+ private boolean fIsCheckedOut;
+ private String fCheckedOutUser;
+ private List<DocumentVersion> fVersions;
+
+
+ public VersionedDocumentImpl(ObjectStoreImpl objStore) {
+ super(objStore);
+ fVersions = new ArrayList<DocumentVersion>();
+ fIsCheckedOut = false;
+ }
+
+ public DocumentVersion addVersion(ContentStreamData content,
+ VersioningState verState, String user) {
+
+ if (isCheckedOut())
+ throw new CmisConstraintException("Cannot add a version to document, document is checked out.");
+
+ DocumentVersionImpl ver = new DocumentVersionImpl(fRepositoryId, this, content, verState);
+ ver.setSystemBasePropertiesWhenCreatedDirect(getName(), getTypeId(), user); // copy name and type id from version series.
+ ver.persist();
+ fObjStore.storeObject(ver.getId(), ver);
+ fVersions.add(ver);
+ if (verState == VersioningState.CHECKEDOUT) {
+ fCheckedOutUser = user;
+ fIsCheckedOut = true;
+ }
+
+ return ver;
+ }
+
+ public void cancelCheckOut(String user) {
+ DocumentVersion pwc = getPwc();
+ fVersions.remove(pwc);
+ fObjStore.deleteObject(pwc.getId());
+ }
+
+ public void checkIn(boolean isMajor, String checkinComment, String user) {
+ if (fIsCheckedOut) {
+ if (fCheckedOutUser.equals(user)) {
+ fIsCheckedOut = false;
+ fCheckedOutUser = null;
+ } else {
+ throw new CmisConstraintException("Error: Can't checkin. Document " + getId()
+ + " user " + user + " has not checked out the document");
+ }
+ }
+ else
+ throw new CmisConstraintException("Error: Can't cancel checkout, Document " + getId() + " is not checked out.");
+
+ DocumentVersion pwc = getPwc();
+ pwc.commit(isMajor);
+ }
+
+ public DocumentVersion checkOut(ContentStreamData content, String user) {
+ if (fIsCheckedOut) {
+ throw new CmisConstraintException("Error: Can't checkout, Document " + getId() + " is already checked out.");
+ }
+
+ // create PWC
+ DocumentVersion pwc = addVersion(content, VersioningState.CHECKEDOUT, user); // will set check-out flag
+ return pwc;
+ }
+
+ public List<DocumentVersion> getAllVersions(String filter) {
+ //TODO: implement filter
+ return fVersions;
+ }
+
+ public DocumentVersion getLatestVersion(boolean major) {
+
+ DocumentVersion latest = null;
+ if (major) {
+ for (DocumentVersion ver : fVersions) {
+ if (ver.isMajor())
+ latest = ver;
+ }
+ } else {
+ latest = fVersions.get(fVersions.size() - 1);
+ }
+ return latest;
+ }
+
+ public boolean isCheckedOut() {
+ return fIsCheckedOut;
+ }
+
+ public String getCheckedOutBy() {
+ return fCheckedOutUser;
+ }
+
+ public DocumentVersion getPwc() {
+ for ( DocumentVersion ver : fVersions) {
+ if (ver.isPwc())
+ return ver;
+ }
+ return null;
+ }
+
+ public void fillProperties(List<PropertyData<?>> properties, ProviderObjectFactory objFactory,
+ List<String> requestedIds) {
+
+ DocumentVersion pwc = getPwc();
+
+ super.fillProperties(properties, objFactory, requestedIds);
+
+ // overwrite the version related properties
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_VERSION_SERIES_ID, requestedIds)) {
+ properties.add(objFactory.createPropertyIdData(PropertyIds.CMIS_VERSION_SERIES_ID, getId()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_IS_VERSION_SERIES_CHECKED_OUT, requestedIds)) {
+ properties.add(objFactory.createPropertyBooleanData(PropertyIds.CMIS_IS_VERSION_SERIES_CHECKED_OUT, isCheckedOut()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_BY, requestedIds)) {
+ properties.add(objFactory.createPropertyStringData(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_BY, getCheckedOutBy()));
+ }
+ if (FilterParser.isContainedInFilter(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_ID, requestedIds)) {
+ properties.add(objFactory.createPropertyIdData(PropertyIds.CMIS_VERSION_SERIES_CHECKED_OUT_ID, pwc == null ? null : pwc.getId()));
+ }
+
+ }
+
+}
Propchange: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/storedobj/impl/VersionedDocumentImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/types/DefaultTypeSystemCreator.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/types/DefaultTypeSystemCreator.java?rev=910572&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/types/DefaultTypeSystemCreator.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/types/DefaultTypeSystemCreator.java Tue Feb 16 16:03:38 2010
@@ -0,0 +1,284 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.opencmis.inmemory.types;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.opencmis.commons.api.Choice;
+import org.apache.opencmis.commons.api.DocumentTypeDefinition;
+import org.apache.opencmis.commons.api.PropertyDefinition;
+import org.apache.opencmis.commons.api.TypeDefinition;
+import org.apache.opencmis.commons.impl.dataobjects.ChoiceImpl;
+import org.apache.opencmis.commons.impl.dataobjects.PropertyDateTimeDefinitionImpl;
+import org.apache.opencmis.commons.impl.dataobjects.PropertyDecimalDefinitionImpl;
+import org.apache.opencmis.commons.impl.dataobjects.PropertyHtmlDefinitionImpl;
+import org.apache.opencmis.commons.impl.dataobjects.PropertyIdDefinitionImpl;
+import org.apache.opencmis.commons.impl.dataobjects.PropertyIntegerDefinitionImpl;
+import org.apache.opencmis.commons.impl.dataobjects.PropertyStringDefinitionImpl;
+import org.apache.opencmis.commons.impl.dataobjects.PropertyUriDefinitionImpl;
+import org.apache.opencmis.inmemory.TypeCreator;
+
+public class DefaultTypeSystemCreator implements TypeCreator {
+ static public List<TypeDefinition> singletonTypes = buildTypesList();
+ public static final String COMPLEX_TYPE = "ComplexType";
+ public static final String TOPLEVEL_TYPE = "DocumentTopLevel";
+ public static final String VERSIONED_TYPE = "VersionableType";
+ public static final String LEVEL1_TYPE = "DocumentLevel1";;
+ public static final String LEVEL2_TYPE = "DocumentLevel2";
+
+ /**
+ * in the public interface of this class we return the singleton containing the required types for
+ * testing
+ */
+ public List<TypeDefinition> createTypesList() {
+ return singletonTypes;
+ }
+
+ public static List<TypeDefinition> getTypesList() {
+ return singletonTypes;
+ }
+
+ static public TypeDefinition getTypeById(String typeId) {
+ for (TypeDefinition typeDef : singletonTypes)
+ if (typeDef.getId().equals(typeId))
+ return typeDef;
+ return null;
+ }
+
+ /**
+ * create root types and a collection of sample types
+ *
+ * @return typesMap map filled with created types
+ */
+ private static List<TypeDefinition> buildTypesList() {
+ // always add CMIS default types
+ List<TypeDefinition> typesList = new LinkedList<TypeDefinition>();
+
+ InMemoryDocumentTypeDefinition cmisType1 = new InMemoryDocumentTypeDefinition("MyDocType1",
+ "My Type 1 Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
+ typesList.add(cmisType1);
+
+ InMemoryDocumentTypeDefinition cmisType2 = new InMemoryDocumentTypeDefinition("MyDocType2",
+ "My Type 2 Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
+ typesList.add(cmisType2);
+
+ InMemoryDocumentTypeDefinition cmisType11 = new InMemoryDocumentTypeDefinition("MyDocType1.1",
+ "My Type 3 Level 2", cmisType1);
+ typesList.add(cmisType11);
+
+ InMemoryDocumentTypeDefinition cmisType111 = new InMemoryDocumentTypeDefinition("MyDocType1.1.1",
+ "My Type 4 Level 3", cmisType11);
+ typesList.add(cmisType111);
+
+ InMemoryDocumentTypeDefinition cmisType112 = new InMemoryDocumentTypeDefinition("MyDocType1.1.2",
+ "My Type 5 Level 3", cmisType11);
+ typesList.add(cmisType112);
+
+ InMemoryDocumentTypeDefinition cmisType12 = new InMemoryDocumentTypeDefinition("MyDocType1.2",
+ "My Type 6 Level 2", cmisType1);
+ typesList.add(cmisType12);
+
+ InMemoryDocumentTypeDefinition cmisType21 = new InMemoryDocumentTypeDefinition("MyDocType2.1",
+ "My Type 7 Level 2", cmisType2);
+ typesList.add(cmisType21);
+
+ InMemoryDocumentTypeDefinition cmisType22 = new InMemoryDocumentTypeDefinition("MyDocType2.2",
+ "My Type 8 Level 2", cmisType2);
+ typesList.add(cmisType22);
+ InMemoryDocumentTypeDefinition cmisType23 = new InMemoryDocumentTypeDefinition("MyDocType2.3",
+ "My Type 9 Level 2", cmisType2);
+ typesList.add(cmisType23);
+ DocumentTypeDefinition cmisType24 = new InMemoryDocumentTypeDefinition("MyDocType2.4",
+ "My Type 10 Level 2", cmisType2);
+ typesList.add(cmisType24);
+ InMemoryDocumentTypeDefinition cmisType25 = new InMemoryDocumentTypeDefinition("MyDocType2.5",
+ "My Type 11 Level 2", cmisType2);
+ typesList.add(cmisType25);
+
+ InMemoryDocumentTypeDefinition cmisType26 = new InMemoryDocumentTypeDefinition("MyDocType2.6",
+ "My Type 12 Level 2", cmisType2);
+ typesList.add(cmisType26);
+ InMemoryDocumentTypeDefinition cmisType27 = new InMemoryDocumentTypeDefinition("MyDocType2.7",
+ "My Type 13 Level 2", cmisType2);
+ typesList.add(cmisType27);
+ InMemoryDocumentTypeDefinition cmisType28 = new InMemoryDocumentTypeDefinition("MyDocType2.8",
+ "My Type 14 Level 2", cmisType2);
+ typesList.add(cmisType28);
+ InMemoryDocumentTypeDefinition cmisType29 = new InMemoryDocumentTypeDefinition("MyDocType2.9",
+ "My Type 15 Level 2", cmisType2);
+ typesList.add(cmisType29);
+
+ // create a complex type with properties
+ InMemoryDocumentTypeDefinition cmisComplexType = new InMemoryDocumentTypeDefinition(COMPLEX_TYPE,
+ "Complex type with properties, Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
+
+ // create a boolean property definition
+
+ Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+
+ PropertyDefinition<Boolean> prop = PropertyCreationHelper.createBooleanDefinition(
+ "BooleanProp", "Sample Boolean Property");
+ propertyDefinitions.put(prop.getId(), prop);
+
+ prop = PropertyCreationHelper.createBooleanMultiDefinition("BooleanPropMV",
+ "Sample Boolean multi-value Property");
+ propertyDefinitions.put(prop.getId(), prop);
+
+ PropertyDateTimeDefinitionImpl prop2 = PropertyCreationHelper.createDateTimeDefinition(
+ "DateTimeProp", "Sample DateTime Property");
+ propertyDefinitions.put(prop2.getId(), prop2);
+
+ prop2 = PropertyCreationHelper.createDateTimeMultiDefinition("DateTimePropMV",
+ "Sample DateTime multi-value Property");
+ propertyDefinitions.put(prop2.getId(), prop2);
+
+ PropertyDecimalDefinitionImpl prop3 = PropertyCreationHelper.createDecimalDefinition(
+ "DecimalProp", "Sample Decimal Property");
+ propertyDefinitions.put(prop3.getId(), prop3);
+
+ prop3 = PropertyCreationHelper.createDecimalDefinition("DecimalPropMV",
+ "Sample Decimal multi-value Property");
+ propertyDefinitions.put(prop3.getId(), prop3);
+
+ PropertyHtmlDefinitionImpl prop4 = PropertyCreationHelper.createHtmlDefinition("HtmlProp",
+ "Sample Html Property");
+ propertyDefinitions.put(prop4.getId(), prop4);
+
+ prop4 = PropertyCreationHelper.createHtmlDefinition("HtmlPropMV",
+ "Sample Html multi-value Property");
+ propertyDefinitions.put(prop4.getId(), prop4);
+
+ PropertyIdDefinitionImpl prop5 = PropertyCreationHelper.createIdDefinition("IdProp",
+ "Sample Id Property");
+ propertyDefinitions.put(prop5.getId(), prop5);
+
+ prop5 = PropertyCreationHelper.createIdDefinition("IdPropMV",
+ "Sample Id Html multi-value Property");
+ propertyDefinitions.put(prop5.getId(), prop5);
+
+ PropertyIntegerDefinitionImpl prop6 = PropertyCreationHelper.createIntegerDefinition(
+ "IntProp", "Sample Int Property");
+ propertyDefinitions.put(prop6.getId(), prop6);
+
+ prop6 = PropertyCreationHelper.createIntegerDefinition("IntPropMV",
+ "Sample Int multi-value Property");
+ propertyDefinitions.put(prop6.getId(), prop6);
+
+ PropertyStringDefinitionImpl prop7 = PropertyCreationHelper.createStringDefinition(
+ "StringProp", "Sample String Property");
+ propertyDefinitions.put(prop7.getId(), prop7);
+
+ PropertyUriDefinitionImpl prop8 = PropertyCreationHelper.createUriDefinition("UriProp",
+ "Sample Uri Property");
+ propertyDefinitions.put(prop8.getId(), prop8);
+
+ prop8 = PropertyCreationHelper.createUriDefinition("UriPropMV",
+ "Sample Uri multi-value Property");
+ propertyDefinitions.put(prop8.getId(), prop8);
+
+ PropertyStringDefinitionImpl prop9 = PropertyCreationHelper.createStringDefinition(
+ "PickListProp", "Sample Pick List Property");
+ List<Choice<String>> choiceList = new ArrayList<Choice<String>>();
+ ChoiceImpl<String> elem = new ChoiceImpl<String>();
+ elem.setValue(Collections.singletonList("red"));
+ choiceList.add(elem);
+ elem = new ChoiceImpl<String>();
+ elem.setValue(Collections.singletonList("green"));
+ choiceList.add(elem);
+ elem = new ChoiceImpl<String>();
+ elem.setValue(Collections.singletonList("blue"));
+ choiceList.add(elem);
+ elem = new ChoiceImpl<String>();
+ elem.setValue(Collections.singletonList("black"));
+ choiceList.add(elem);
+ prop9.setChoices(choiceList);
+ prop9.setDefaultValue(Collections.singletonList("blue"));
+
+ /*
+ * try short form: * / PropertyCreationHelper.addElemToPicklist(prop9, "red");
+ * PropertyCreationHelper.addElemToPicklist(prop9, "green");
+ * PropertyCreationHelper.addElemToPicklist(prop9, "blue");
+ * PropertyCreationHelper.addElemToPicklist(prop9, "black");
+ * PropertyCreationHelper.setDefaultValue(prop9, "blue"); /*
+ */
+
+ cmisComplexType.setPropertyDefinitions(propertyDefinitions);
+
+ // add type to types collection
+ typesList.add(cmisComplexType);
+
+ // create a type hierarchy with inherited properties
+ InMemoryDocumentTypeDefinition cmisDocTypeTopLevel = new InMemoryDocumentTypeDefinition(TOPLEVEL_TYPE,
+ "Document type with properties, Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
+
+ InMemoryDocumentTypeDefinition cmisDocTypeLevel1 = new InMemoryDocumentTypeDefinition(LEVEL1_TYPE,
+ "Document type with inherited properties, Level 2", cmisDocTypeTopLevel);
+
+ InMemoryDocumentTypeDefinition cmisDocTypeLevel2 = new InMemoryDocumentTypeDefinition(LEVEL2_TYPE,
+ "Document type with inherited properties, Level 3", cmisDocTypeLevel1);
+
+ propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+ PropertyStringDefinitionImpl propTop = PropertyCreationHelper.createStringDefinition(
+ "StringPropTopLevel", "Sample String Property");
+ propertyDefinitions.put(propTop.getId(), propTop);
+ cmisDocTypeTopLevel.setPropertyDefinitions(propertyDefinitions);
+
+ propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+ PropertyStringDefinitionImpl propLevel1 = PropertyCreationHelper.createStringDefinition(
+ "StringPropLevel1", "String Property Level 1");
+ propertyDefinitions.put(propLevel1.getId(), propLevel1);
+ cmisDocTypeLevel1.setPropertyDefinitions(propertyDefinitions);
+
+ propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+ PropertyStringDefinitionImpl propLevel2 = PropertyCreationHelper.createStringDefinition(
+ "StringPropLevel2", "String Property Level 2");
+ propertyDefinitions.put(propLevel2.getId(), propLevel2);
+ cmisDocTypeLevel2.setPropertyDefinitions(propertyDefinitions);
+
+ // add type to types collection
+ typesList.add(cmisDocTypeTopLevel);
+ typesList.add(cmisDocTypeLevel1);
+ typesList.add(cmisDocTypeLevel2);
+
+ // Create a type that is versionable
+ InMemoryDocumentTypeDefinition cmisVersionedType = new InMemoryDocumentTypeDefinition(VERSIONED_TYPE,
+ "VersionedType", InMemoryDocumentTypeDefinition.getRootDocumentType());
+
+ // create a single String property definition
+
+ propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+
+ PropertyStringDefinitionImpl prop1 = PropertyCreationHelper.createStringDefinition("VersionedStringProp", "Sample String Property");
+ propertyDefinitions.put(prop1.getId(), prop1);
+
+ cmisVersionedType.addCustomPropertyDefinitions(propertyDefinitions);
+ cmisVersionedType.setIsVersionable(true); // make it a versionable type;
+
+ // add type to types collection
+ typesList.add(cmisVersionedType);
+
+ return typesList;
+ }
+
+}
Propchange: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/types/DefaultTypeSystemCreator.java
------------------------------------------------------------------------------
svn:eol-style = native