You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fg...@apache.org on 2010/07/29 19:13:30 UTC

svn commit: r980513 [4/15] - in /incubator/chemistry/opencmis/trunk/chemistry-opencmis-server: chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/dummy/ chemistry-opencmis-server-bindings/src/main/java/org/apache...

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryNavigationServiceImpl.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/server/InMemoryNavigationServiceImpl.java?rev=980513&r1=980512&r2=980513&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryNavigationServiceImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryNavigationServiceImpl.java Thu Jul 29 17:13:28 2010
@@ -1,438 +1,438 @@
-/*
- * 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.chemistry.opencmis.inmemory.server;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.chemistry.opencmis.commons.PropertyIds;
-import org.apache.chemistry.opencmis.commons.data.AllowableActions;
-import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
-import org.apache.chemistry.opencmis.commons.data.ObjectData;
-import org.apache.chemistry.opencmis.commons.data.ObjectInFolderContainer;
-import org.apache.chemistry.opencmis.commons.data.ObjectInFolderData;
-import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
-import org.apache.chemistry.opencmis.commons.data.ObjectList;
-import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
-import org.apache.chemistry.opencmis.commons.data.Properties;
-import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
-import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
-import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectDataImpl;
-import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectInFolderContainerImpl;
-import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectInFolderDataImpl;
-import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectInFolderListImpl;
-import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectListImpl;
-import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectParentDataImpl;
-import org.apache.chemistry.opencmis.commons.impl.server.ObjectInfoImpl;
-import org.apache.chemistry.opencmis.commons.server.CallContext;
-import org.apache.chemistry.opencmis.commons.server.ObjectInfoHandler;
-import org.apache.chemistry.opencmis.inmemory.DataObjectCreator;
-import org.apache.chemistry.opencmis.inmemory.FilterParser;
-import org.apache.chemistry.opencmis.inmemory.storedobj.api.DocumentVersion;
-import org.apache.chemistry.opencmis.inmemory.storedobj.api.Filing;
-import org.apache.chemistry.opencmis.inmemory.storedobj.api.Folder;
-import org.apache.chemistry.opencmis.inmemory.storedobj.api.MultiFiling;
-import org.apache.chemistry.opencmis.inmemory.storedobj.api.ObjectStore;
-import org.apache.chemistry.opencmis.inmemory.storedobj.api.SingleFiling;
-import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoreManager;
-import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoredObject;
-import org.apache.chemistry.opencmis.inmemory.storedobj.api.VersionedDocument;
-import org.apache.chemistry.opencmis.inmemory.types.PropertyCreationHelper;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-public class InMemoryNavigationServiceImpl extends InMemoryAbstractServiceImpl {
-
-    private static Log LOG = LogFactory.getLog(InMemoryNavigationServiceImpl.class);
-
-    AtomLinkInfoProvider fAtomLinkProvider;
-
-    public InMemoryNavigationServiceImpl(StoreManager storeManager) {
-        super(storeManager);
-        fAtomLinkProvider = new AtomLinkInfoProvider(fStoreManager);
-    }
-
-    public ObjectList getCheckedOutDocs(CallContext context, String repositoryId, String folderId, String filter,
-            String orderBy, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
-            String renditionFilter, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension,
-            ObjectInfoHandler objectInfos) {
-
-        ObjectListImpl res = new ObjectListImpl();
-        List<ObjectData> odList = new ArrayList<ObjectData>();
-
-        LOG.debug("start getCheckedOutDocs()");
-        if (null != folderId)
-            checkStandardParameters(repositoryId, folderId);
-        else
-            checkRepositoryId(repositoryId);
-
-        String user = context.getUsername();
-        if (null == folderId) {
-            List<VersionedDocument> checkedOuts = fStoreManager.getObjectStore(repositoryId).getCheckedOutDocuments(
-                    orderBy);
-            for (VersionedDocument checkedOut : checkedOuts) {
-                TypeDefinition td = fStoreManager.getTypeById(repositoryId, checkedOut.getTypeId()).getTypeDefinition();
-                ObjectData od = PropertyCreationHelper.getObjectData(td, checkedOut, filter, user,
-                        includeAllowableActions, includeRelationships, renditionFilter, false, false, extension);
-                if (context.isObjectInfoRequired()) {
-                    ObjectInfoImpl objectInfo = new ObjectInfoImpl();
-                    fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, checkedOut, objectInfo);
-                    objectInfos.addObjectInfo(objectInfo);
-                }
-                odList.add(od);
-            }
-        } else {
-            ObjectInFolderList children = getChildrenIntern(repositoryId, folderId, filter, orderBy,
-                    includeAllowableActions, includeRelationships, renditionFilter, false, -1, -1, false, context
-                            .isObjectInfoRequired() ? objectInfos : null, user);
-            for (ObjectInFolderData child : children.getObjects()) {
-                ObjectData obj = child.getObject();
-                StoredObject so = fStoreManager.getObjectStore(repositoryId).getObjectById(obj.getId());
-                LOG.info("Checked out: children:" + obj.getId());
-                if (so instanceof DocumentVersion && ((DocumentVersion) so).getParentDocument().isCheckedOut()) {
-                    odList.add(obj);
-                    if (context.isObjectInfoRequired()) {
-                        ObjectInfoImpl objectInfo = new ObjectInfoImpl();
-                        fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfo);
-                        objectInfos.addObjectInfo(objectInfo);
-                    }
-                }
-            }
-        }
-        res.setObjects(odList);
-        res.setNumItems(BigInteger.valueOf(odList.size()));
-
-        LOG.debug("end getCheckedOutDocs()");
-        return res;
-    }
-
-    public ObjectInFolderList getChildren(CallContext context, String repositoryId, String folderId, String filter,
-            String orderBy, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
-            String renditionFilter, Boolean includePathSegment, BigInteger maxItems, BigInteger skipCount,
-            ExtensionsData extension, ObjectInfoHandler objectInfos) {
-
-        LOG.debug("start getChildren()");
-
-        checkStandardParameters(repositoryId, folderId);
-
-        int maxItemsInt = maxItems == null ? -1 : maxItems.intValue();
-        int skipCountInt = skipCount == null ? -1 : skipCount.intValue();
-        String user = context.getUsername();
-        ObjectInFolderList res = getChildrenIntern(repositoryId, folderId, filter, orderBy, includeAllowableActions,
-                includeRelationships, renditionFilter, includePathSegment, maxItemsInt, skipCountInt, false,
-                context.isObjectInfoRequired() ? objectInfos : null, user);
-        LOG.debug("stop getChildren()");
-        return res;
-    }
-
-    public List<ObjectInFolderContainer> getDescendants(CallContext context, String repositoryId, String folderId,
-            BigInteger depth, String filter, Boolean includeAllowableActions,
-            IncludeRelationships includeRelationships, String renditionFilter, Boolean includePathSegment,
-            ExtensionsData extension, ObjectInfoHandler objectInfos) {
-
-        LOG.debug("start getDescendants()");
-
-        checkStandardParameters(repositoryId, folderId);
-
-        int levels;
-        if (depth == null)
-            levels = 2; // one of the recommended defaults (should it be
-        // -1?)
-        else if (depth.intValue() == 0)
-            throw new CmisInvalidArgumentException("A zero depth is not allowed for getDescendants().");
-        else
-            levels = depth.intValue();
-
-        int level = 0;
-        String user = context.getUsername();
-        List<ObjectInFolderContainer> result = getDescendantsIntern(repositoryId, folderId, filter,
-                includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, level, levels,
-                false, objectInfos, user);
-
-        LOG.debug("stop getDescendants()");
-        return result;
-    }
-
-    public ObjectData getFolderParent(CallContext context, String repositoryId, String folderId, String filter,
-            ExtensionsData extension, ObjectInfoHandler objectInfos) {
-
-        LOG.debug("start getFolderParent()");
-
-        StoredObject so = checkStandardParameters(repositoryId, folderId);
-
-        Folder folder = null;
-        if (so instanceof Folder)
-            folder = (Folder) so;
-        else
-            throw new CmisInvalidArgumentException("Can't get folder parent, id does not refer to a folder: "
-                    + folderId);
-
-        ObjectData res = getFolderParentIntern(repositoryId, folder, filter, context.isObjectInfoRequired() ? objectInfos : null);
-        if (res == null)
-            throw new CmisInvalidArgumentException("Cannot get parent of a root folder");
-
-        // To be able to provide all Atom links in the response we need
-        // additional information:
-        if (context.isObjectInfoRequired()) {
-            ObjectInfoImpl objectInfo = new ObjectInfoImpl();
-            fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfo);
-            objectInfos.addObjectInfo(objectInfo);
-        }
-
-        LOG.debug("stop getFolderParent()");
-        return res;
-    }
-
-    public List<ObjectInFolderContainer> getFolderTree(CallContext context, String repositoryId, String folderId,
-            BigInteger depth, String filter, Boolean includeAllowableActions,
-            IncludeRelationships includeRelationships, String renditionFilter, Boolean includePathSegment,
-            ExtensionsData extension, ObjectInfoHandler objectInfos) {
-
-        LOG.debug("start getFolderTree()");
-
-        checkStandardParameters(repositoryId, folderId);
-
-        if (depth != null && depth.intValue() == 0)
-            throw new CmisInvalidArgumentException("A zero depth is not allowed for getFolderTree().");
-
-        int levels = depth == null ? 2 : depth.intValue();
-        int level = 0;
-        String user = context.getUsername();
-        List<ObjectInFolderContainer> result = getDescendantsIntern(repositoryId, folderId, filter,
-                includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, level, levels,
-                true, objectInfos, user);
-
-        LOG.debug("stop getFolderTree()");
-        return result;
-    }
-
-    public List<ObjectParentData> getObjectParents(CallContext context, String repositoryId, String objectId,
-            String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
-            String renditionFilter, Boolean includeRelativePathSegment, ExtensionsData extension,
-            ObjectInfoHandler objectInfos) {
-
-        LOG.debug("start getObjectParents()");
-
-        StoredObject so = checkStandardParameters(repositoryId, objectId);
-
-        // for now we have only folders that have a parent and the in-memory
-        // provider only has one
-        // parent for each object (no multi-filing)
-        List<ObjectParentData> result = null;
-
-        Filing spo = null;
-        if (so instanceof Filing)
-            spo = (Filing) so;
-        else
-            return Collections.emptyList();
-
-        result = getObjectParentsIntern(repositoryId, spo, filter, context.isObjectInfoRequired() ? objectInfos : null);
-
-        // To be able to provide all Atom links in the response we need
-        // additional information:
-        if (context.isObjectInfoRequired()) {
-            ObjectInfoImpl objectInfo = new ObjectInfoImpl();
-            fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfo);
-            objectInfos.addObjectInfo(objectInfo);
-        }
-
-        LOG.debug("stop getObjectParents()");
-        return result;
-    }
-
-    // private helpers
-
-    private ObjectInFolderList getChildrenIntern(String repositoryId, String folderId, String filter, String orderBy,
-            Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
-            Boolean includePathSegments, int maxItems, int skipCount, boolean folderOnly, ObjectInfoHandler objectInfos,
-            String user) {
-
-        ObjectInFolderListImpl result = new ObjectInFolderListImpl();
-        List<ObjectInFolderData> folderList = new ArrayList<ObjectInFolderData>();
-        ObjectStore fs = fStoreManager.getObjectStore(repositoryId);
-        StoredObject so = fs.getObjectById(folderId);
-        Folder folder = null;
-
-        if (so == null)
-            throw new CmisObjectNotFoundException("Unknown object id: " + folderId);
-
-        if (so instanceof Folder)
-            folder = (Folder) so;
-        else
-            return null; // it is a document and has no children
-
-        List<? extends StoredObject> children = folderOnly ? folder.getFolderChildren(maxItems, skipCount) : folder
-                .getChildren(maxItems, skipCount);
-
-        List<String> requestedIds = FilterParser.getRequestedIdsFromFilter(filter);
-
-        for (StoredObject spo : children) {
-            ObjectInFolderDataImpl oifd = new ObjectInFolderDataImpl();
-            ObjectDataImpl objectData = new ObjectDataImpl();
-            if (includePathSegments != null && includePathSegments)
-                oifd.setPathSegment(spo.getName());
-            if (includeAllowableActions != null && includeAllowableActions) {
-                AllowableActions allowableActions = DataObjectCreator.fillAllowableActions(spo, user);
-                objectData.setAllowableActions(allowableActions);
-            }
-            if (includeRelationships != null && includeRelationships != IncludeRelationships.NONE) {
-                objectData.setRelationships(null /* f.getRelationships() */);
-            }
-            if (renditionFilter != null && renditionFilter.length() > 0) {
-                objectData.setRelationships(null /*
-                                                  * f.getRenditions(renditionFilter
-                                                  * )
-                                                  */);
-            }
-
-            TypeDefinition td = fStoreManager.getTypeById(repositoryId, spo.getTypeId()).getTypeDefinition();
-            Properties props = PropertyCreationHelper.getPropertiesFromObject(spo, td, requestedIds);
-            objectData.setProperties(props);
-
-            oifd.setObject(objectData);
-            folderList.add(oifd);
-            // add additional information for Atom
-            if (objectInfos != null) {
-                ObjectInfoImpl objectInfo = new ObjectInfoImpl();
-                fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, spo, objectInfo);
-                objectInfos.addObjectInfo(objectInfo);
-            }
-
-        }
-        result.setObjects(folderList);
-        if (objectInfos != null) {
-            ObjectInfoImpl objectInfo = new ObjectInfoImpl();
-            fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfo);
-            objectInfos.addObjectInfo(objectInfo);
-        }
-        return result;
-    }
-
-    private List<ObjectInFolderContainer> getDescendantsIntern(String repositoryId, String folderId, String filter,
-            Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
-            Boolean includePathSegments, int level, int maxLevels, boolean folderOnly, ObjectInfoHandler objectInfos,
-            String user) {
-
-        // log.info("getDescendantsIntern: " + folderId + ", in level " + level
-        // + ", max levels " + maxLevels);
-
-        List<ObjectInFolderContainer> childrenOfFolderId = null;
-        if (maxLevels == -1 || level < maxLevels) {
-            String orderBy = PropertyIds.NAME;
-            ObjectInFolderList children = getChildrenIntern(repositoryId, folderId, filter, orderBy,
-                    includeAllowableActions, includeRelationships, renditionFilter, includePathSegments, 1000, 0,
-                    folderOnly, objectInfos, user);
-
-            childrenOfFolderId = new ArrayList<ObjectInFolderContainer>();
-            if (null != children) {
-
-                for (ObjectInFolderData child : children.getObjects()) {
-                    ObjectInFolderContainerImpl oifc = new ObjectInFolderContainerImpl();
-                    String childId = child.getObject().getId();
-                    List<ObjectInFolderContainer> subChildren = getDescendantsIntern(repositoryId, childId, filter,
-                            includeAllowableActions, includeRelationships, renditionFilter, includePathSegments,
-                            level + 1, maxLevels, folderOnly, objectInfos, user);
-
-                    oifc.setObject(child);
-                    if (null != subChildren)
-                        oifc.setChildren(subChildren);
-                    childrenOfFolderId.add(oifc);
-                }
-            }
-        }
-        return childrenOfFolderId;
-    }
-
-    private List<ObjectParentData> getObjectParentsIntern(String repositoryId, Filing sop, String filter,
-            ObjectInfoHandler objectInfos) {
-
-        List<ObjectParentData> result = null;
-        if (sop instanceof SingleFiling) {
-            ObjectData parent = getFolderParentIntern(repositoryId, (SingleFiling) sop, filter, objectInfos);
-            if (null != parent) {
-                ObjectParentDataImpl parentData = new ObjectParentDataImpl();
-                parentData.setObject(parent);
-                String path = ((SingleFiling) sop).getPath();
-                int beginIndex = path.lastIndexOf(Filing.PATH_SEPARATOR) + 1; // Note
-                // :
-                // if
-                // /
-                // not
-                // found
-                // results in 0
-                String relPathSeg = path.substring(beginIndex, path.length());
-                parentData.setRelativePathSegment(relPathSeg);
-                result = Collections.singletonList((ObjectParentData) parentData);
-            } else
-                result = Collections.emptyList();
-        } else if (sop instanceof MultiFiling) {
-            result = new ArrayList<ObjectParentData>();
-            MultiFiling multiParentObj = (MultiFiling) sop;
-            List<Folder> parents = multiParentObj.getParents();
-            if (null != parents)
-                for (Folder parent : parents) {
-                    ObjectParentDataImpl parentData = new ObjectParentDataImpl();
-                    ObjectDataImpl objData = new ObjectDataImpl();
-                    copyFilteredProperties(repositoryId, parent, filter, objData);
-                    parentData.setObject(objData);
-                    parentData.setRelativePathSegment(multiParentObj.getPathSegment());
-                    result.add(parentData);
-                    if (objectInfos != null) {
-                        ObjectInfoImpl objectInfo = new ObjectInfoImpl();
-                        fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, parent, objectInfo);
-                        objectInfos.addObjectInfo(objectInfo);
-                    }
-                }
-        }
-        return result;
-    }
-
-    private ObjectData getFolderParentIntern(String repositoryId, SingleFiling sop, String filter,
-            ObjectInfoHandler objectInfos) {
-
-        ObjectDataImpl parent = new ObjectDataImpl();
-
-        Folder parentFolder = sop.getParent();
-
-        if (null == parentFolder) {
-            return null;
-        }
-
-        copyFilteredProperties(repositoryId, parentFolder, filter, parent);
-        if (objectInfos != null) {
-            ObjectInfoImpl objectInfo = new ObjectInfoImpl();
-            fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, parentFolder, objectInfo);
-            objectInfos.addObjectInfo(objectInfo);
-        }
-
-        return parent;
-    }
-
-    void copyFilteredProperties(String repositoryId, StoredObject so, String filter, ObjectDataImpl objData) {
-        List<String> requestedIds = FilterParser.getRequestedIdsFromFilter(filter);
-        TypeDefinition td = fStoreManager.getTypeById(repositoryId, so.getTypeId()).getTypeDefinition();
-        Properties props = PropertyCreationHelper.getPropertiesFromObject(so, td, requestedIds);
-        objData.setProperties(props);
-    }
-
-}
+/*
+ * 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.chemistry.opencmis.inmemory.server;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.chemistry.opencmis.commons.PropertyIds;
+import org.apache.chemistry.opencmis.commons.data.AllowableActions;
+import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
+import org.apache.chemistry.opencmis.commons.data.ObjectData;
+import org.apache.chemistry.opencmis.commons.data.ObjectInFolderContainer;
+import org.apache.chemistry.opencmis.commons.data.ObjectInFolderData;
+import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
+import org.apache.chemistry.opencmis.commons.data.ObjectList;
+import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
+import org.apache.chemistry.opencmis.commons.data.Properties;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectDataImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectInFolderContainerImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectInFolderDataImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectInFolderListImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectListImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectParentDataImpl;
+import org.apache.chemistry.opencmis.commons.impl.server.ObjectInfoImpl;
+import org.apache.chemistry.opencmis.commons.server.CallContext;
+import org.apache.chemistry.opencmis.commons.server.ObjectInfoHandler;
+import org.apache.chemistry.opencmis.inmemory.DataObjectCreator;
+import org.apache.chemistry.opencmis.inmemory.FilterParser;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.DocumentVersion;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.Filing;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.Folder;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.MultiFiling;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.ObjectStore;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.SingleFiling;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoreManager;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoredObject;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.VersionedDocument;
+import org.apache.chemistry.opencmis.inmemory.types.PropertyCreationHelper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class InMemoryNavigationServiceImpl extends InMemoryAbstractServiceImpl {
+
+    private static Log LOG = LogFactory.getLog(InMemoryNavigationServiceImpl.class);
+
+    AtomLinkInfoProvider fAtomLinkProvider;
+
+    public InMemoryNavigationServiceImpl(StoreManager storeManager) {
+        super(storeManager);
+        fAtomLinkProvider = new AtomLinkInfoProvider(fStoreManager);
+    }
+
+    public ObjectList getCheckedOutDocs(CallContext context, String repositoryId, String folderId, String filter,
+            String orderBy, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
+            String renditionFilter, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension,
+            ObjectInfoHandler objectInfos) {
+
+        ObjectListImpl res = new ObjectListImpl();
+        List<ObjectData> odList = new ArrayList<ObjectData>();
+
+        LOG.debug("start getCheckedOutDocs()");
+        if (null != folderId)
+            checkStandardParameters(repositoryId, folderId);
+        else
+            checkRepositoryId(repositoryId);
+
+        String user = context.getUsername();
+        if (null == folderId) {
+            List<VersionedDocument> checkedOuts = fStoreManager.getObjectStore(repositoryId).getCheckedOutDocuments(
+                    orderBy);
+            for (VersionedDocument checkedOut : checkedOuts) {
+                TypeDefinition td = fStoreManager.getTypeById(repositoryId, checkedOut.getTypeId()).getTypeDefinition();
+                ObjectData od = PropertyCreationHelper.getObjectData(td, checkedOut, filter, user,
+                        includeAllowableActions, includeRelationships, renditionFilter, false, false, extension);
+                if (context.isObjectInfoRequired()) {
+                    ObjectInfoImpl objectInfo = new ObjectInfoImpl();
+                    fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, checkedOut, objectInfo);
+                    objectInfos.addObjectInfo(objectInfo);
+                }
+                odList.add(od);
+            }
+        } else {
+            ObjectInFolderList children = getChildrenIntern(repositoryId, folderId, filter, orderBy,
+                    includeAllowableActions, includeRelationships, renditionFilter, false, -1, -1, false, context
+                            .isObjectInfoRequired() ? objectInfos : null, user);
+            for (ObjectInFolderData child : children.getObjects()) {
+                ObjectData obj = child.getObject();
+                StoredObject so = fStoreManager.getObjectStore(repositoryId).getObjectById(obj.getId());
+                LOG.info("Checked out: children:" + obj.getId());
+                if (so instanceof DocumentVersion && ((DocumentVersion) so).getParentDocument().isCheckedOut()) {
+                    odList.add(obj);
+                    if (context.isObjectInfoRequired()) {
+                        ObjectInfoImpl objectInfo = new ObjectInfoImpl();
+                        fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfo);
+                        objectInfos.addObjectInfo(objectInfo);
+                    }
+                }
+            }
+        }
+        res.setObjects(odList);
+        res.setNumItems(BigInteger.valueOf(odList.size()));
+
+        LOG.debug("end getCheckedOutDocs()");
+        return res;
+    }
+
+    public ObjectInFolderList getChildren(CallContext context, String repositoryId, String folderId, String filter,
+            String orderBy, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
+            String renditionFilter, Boolean includePathSegment, BigInteger maxItems, BigInteger skipCount,
+            ExtensionsData extension, ObjectInfoHandler objectInfos) {
+
+        LOG.debug("start getChildren()");
+
+        checkStandardParameters(repositoryId, folderId);
+
+        int maxItemsInt = maxItems == null ? -1 : maxItems.intValue();
+        int skipCountInt = skipCount == null ? -1 : skipCount.intValue();
+        String user = context.getUsername();
+        ObjectInFolderList res = getChildrenIntern(repositoryId, folderId, filter, orderBy, includeAllowableActions,
+                includeRelationships, renditionFilter, includePathSegment, maxItemsInt, skipCountInt, false,
+                context.isObjectInfoRequired() ? objectInfos : null, user);
+        LOG.debug("stop getChildren()");
+        return res;
+    }
+
+    public List<ObjectInFolderContainer> getDescendants(CallContext context, String repositoryId, String folderId,
+            BigInteger depth, String filter, Boolean includeAllowableActions,
+            IncludeRelationships includeRelationships, String renditionFilter, Boolean includePathSegment,
+            ExtensionsData extension, ObjectInfoHandler objectInfos) {
+
+        LOG.debug("start getDescendants()");
+
+        checkStandardParameters(repositoryId, folderId);
+
+        int levels;
+        if (depth == null)
+            levels = 2; // one of the recommended defaults (should it be
+        // -1?)
+        else if (depth.intValue() == 0)
+            throw new CmisInvalidArgumentException("A zero depth is not allowed for getDescendants().");
+        else
+            levels = depth.intValue();
+
+        int level = 0;
+        String user = context.getUsername();
+        List<ObjectInFolderContainer> result = getDescendantsIntern(repositoryId, folderId, filter,
+                includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, level, levels,
+                false, objectInfos, user);
+
+        LOG.debug("stop getDescendants()");
+        return result;
+    }
+
+    public ObjectData getFolderParent(CallContext context, String repositoryId, String folderId, String filter,
+            ExtensionsData extension, ObjectInfoHandler objectInfos) {
+
+        LOG.debug("start getFolderParent()");
+
+        StoredObject so = checkStandardParameters(repositoryId, folderId);
+
+        Folder folder = null;
+        if (so instanceof Folder)
+            folder = (Folder) so;
+        else
+            throw new CmisInvalidArgumentException("Can't get folder parent, id does not refer to a folder: "
+                    + folderId);
+
+        ObjectData res = getFolderParentIntern(repositoryId, folder, filter, context.isObjectInfoRequired() ? objectInfos : null);
+        if (res == null)
+            throw new CmisInvalidArgumentException("Cannot get parent of a root folder");
+
+        // To be able to provide all Atom links in the response we need
+        // additional information:
+        if (context.isObjectInfoRequired()) {
+            ObjectInfoImpl objectInfo = new ObjectInfoImpl();
+            fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfo);
+            objectInfos.addObjectInfo(objectInfo);
+        }
+
+        LOG.debug("stop getFolderParent()");
+        return res;
+    }
+
+    public List<ObjectInFolderContainer> getFolderTree(CallContext context, String repositoryId, String folderId,
+            BigInteger depth, String filter, Boolean includeAllowableActions,
+            IncludeRelationships includeRelationships, String renditionFilter, Boolean includePathSegment,
+            ExtensionsData extension, ObjectInfoHandler objectInfos) {
+
+        LOG.debug("start getFolderTree()");
+
+        checkStandardParameters(repositoryId, folderId);
+
+        if (depth != null && depth.intValue() == 0)
+            throw new CmisInvalidArgumentException("A zero depth is not allowed for getFolderTree().");
+
+        int levels = depth == null ? 2 : depth.intValue();
+        int level = 0;
+        String user = context.getUsername();
+        List<ObjectInFolderContainer> result = getDescendantsIntern(repositoryId, folderId, filter,
+                includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, level, levels,
+                true, objectInfos, user);
+
+        LOG.debug("stop getFolderTree()");
+        return result;
+    }
+
+    public List<ObjectParentData> getObjectParents(CallContext context, String repositoryId, String objectId,
+            String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
+            String renditionFilter, Boolean includeRelativePathSegment, ExtensionsData extension,
+            ObjectInfoHandler objectInfos) {
+
+        LOG.debug("start getObjectParents()");
+
+        StoredObject so = checkStandardParameters(repositoryId, objectId);
+
+        // for now we have only folders that have a parent and the in-memory
+        // provider only has one
+        // parent for each object (no multi-filing)
+        List<ObjectParentData> result = null;
+
+        Filing spo = null;
+        if (so instanceof Filing)
+            spo = (Filing) so;
+        else
+            return Collections.emptyList();
+
+        result = getObjectParentsIntern(repositoryId, spo, filter, context.isObjectInfoRequired() ? objectInfos : null);
+
+        // To be able to provide all Atom links in the response we need
+        // additional information:
+        if (context.isObjectInfoRequired()) {
+            ObjectInfoImpl objectInfo = new ObjectInfoImpl();
+            fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfo);
+            objectInfos.addObjectInfo(objectInfo);
+        }
+
+        LOG.debug("stop getObjectParents()");
+        return result;
+    }
+
+    // private helpers
+
+    private ObjectInFolderList getChildrenIntern(String repositoryId, String folderId, String filter, String orderBy,
+            Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
+            Boolean includePathSegments, int maxItems, int skipCount, boolean folderOnly, ObjectInfoHandler objectInfos,
+            String user) {
+
+        ObjectInFolderListImpl result = new ObjectInFolderListImpl();
+        List<ObjectInFolderData> folderList = new ArrayList<ObjectInFolderData>();
+        ObjectStore fs = fStoreManager.getObjectStore(repositoryId);
+        StoredObject so = fs.getObjectById(folderId);
+        Folder folder = null;
+
+        if (so == null)
+            throw new CmisObjectNotFoundException("Unknown object id: " + folderId);
+
+        if (so instanceof Folder)
+            folder = (Folder) so;
+        else
+            return null; // it is a document and has no children
+
+        List<? extends StoredObject> children = folderOnly ? folder.getFolderChildren(maxItems, skipCount) : folder
+                .getChildren(maxItems, skipCount);
+
+        List<String> requestedIds = FilterParser.getRequestedIdsFromFilter(filter);
+
+        for (StoredObject spo : children) {
+            ObjectInFolderDataImpl oifd = new ObjectInFolderDataImpl();
+            ObjectDataImpl objectData = new ObjectDataImpl();
+            if (includePathSegments != null && includePathSegments)
+                oifd.setPathSegment(spo.getName());
+            if (includeAllowableActions != null && includeAllowableActions) {
+                AllowableActions allowableActions = DataObjectCreator.fillAllowableActions(spo, user);
+                objectData.setAllowableActions(allowableActions);
+            }
+            if (includeRelationships != null && includeRelationships != IncludeRelationships.NONE) {
+                objectData.setRelationships(null /* f.getRelationships() */);
+            }
+            if (renditionFilter != null && renditionFilter.length() > 0) {
+                objectData.setRelationships(null /*
+                                                  * f.getRenditions(renditionFilter
+                                                  * )
+                                                  */);
+            }
+
+            TypeDefinition td = fStoreManager.getTypeById(repositoryId, spo.getTypeId()).getTypeDefinition();
+            Properties props = PropertyCreationHelper.getPropertiesFromObject(spo, td, requestedIds);
+            objectData.setProperties(props);
+
+            oifd.setObject(objectData);
+            folderList.add(oifd);
+            // add additional information for Atom
+            if (objectInfos != null) {
+                ObjectInfoImpl objectInfo = new ObjectInfoImpl();
+                fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, spo, objectInfo);
+                objectInfos.addObjectInfo(objectInfo);
+            }
+
+        }
+        result.setObjects(folderList);
+        if (objectInfos != null) {
+            ObjectInfoImpl objectInfo = new ObjectInfoImpl();
+            fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfo);
+            objectInfos.addObjectInfo(objectInfo);
+        }
+        return result;
+    }
+
+    private List<ObjectInFolderContainer> getDescendantsIntern(String repositoryId, String folderId, String filter,
+            Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
+            Boolean includePathSegments, int level, int maxLevels, boolean folderOnly, ObjectInfoHandler objectInfos,
+            String user) {
+
+        // log.info("getDescendantsIntern: " + folderId + ", in level " + level
+        // + ", max levels " + maxLevels);
+
+        List<ObjectInFolderContainer> childrenOfFolderId = null;
+        if (maxLevels == -1 || level < maxLevels) {
+            String orderBy = PropertyIds.NAME;
+            ObjectInFolderList children = getChildrenIntern(repositoryId, folderId, filter, orderBy,
+                    includeAllowableActions, includeRelationships, renditionFilter, includePathSegments, 1000, 0,
+                    folderOnly, objectInfos, user);
+
+            childrenOfFolderId = new ArrayList<ObjectInFolderContainer>();
+            if (null != children) {
+
+                for (ObjectInFolderData child : children.getObjects()) {
+                    ObjectInFolderContainerImpl oifc = new ObjectInFolderContainerImpl();
+                    String childId = child.getObject().getId();
+                    List<ObjectInFolderContainer> subChildren = getDescendantsIntern(repositoryId, childId, filter,
+                            includeAllowableActions, includeRelationships, renditionFilter, includePathSegments,
+                            level + 1, maxLevels, folderOnly, objectInfos, user);
+
+                    oifc.setObject(child);
+                    if (null != subChildren)
+                        oifc.setChildren(subChildren);
+                    childrenOfFolderId.add(oifc);
+                }
+            }
+        }
+        return childrenOfFolderId;
+    }
+
+    private List<ObjectParentData> getObjectParentsIntern(String repositoryId, Filing sop, String filter,
+            ObjectInfoHandler objectInfos) {
+
+        List<ObjectParentData> result = null;
+        if (sop instanceof SingleFiling) {
+            ObjectData parent = getFolderParentIntern(repositoryId, (SingleFiling) sop, filter, objectInfos);
+            if (null != parent) {
+                ObjectParentDataImpl parentData = new ObjectParentDataImpl();
+                parentData.setObject(parent);
+                String path = ((SingleFiling) sop).getPath();
+                int beginIndex = path.lastIndexOf(Filing.PATH_SEPARATOR) + 1; // Note
+                // :
+                // if
+                // /
+                // not
+                // found
+                // results in 0
+                String relPathSeg = path.substring(beginIndex, path.length());
+                parentData.setRelativePathSegment(relPathSeg);
+                result = Collections.singletonList((ObjectParentData) parentData);
+            } else
+                result = Collections.emptyList();
+        } else if (sop instanceof MultiFiling) {
+            result = new ArrayList<ObjectParentData>();
+            MultiFiling multiParentObj = (MultiFiling) sop;
+            List<Folder> parents = multiParentObj.getParents();
+            if (null != parents)
+                for (Folder parent : parents) {
+                    ObjectParentDataImpl parentData = new ObjectParentDataImpl();
+                    ObjectDataImpl objData = new ObjectDataImpl();
+                    copyFilteredProperties(repositoryId, parent, filter, objData);
+                    parentData.setObject(objData);
+                    parentData.setRelativePathSegment(multiParentObj.getPathSegment());
+                    result.add(parentData);
+                    if (objectInfos != null) {
+                        ObjectInfoImpl objectInfo = new ObjectInfoImpl();
+                        fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, parent, objectInfo);
+                        objectInfos.addObjectInfo(objectInfo);
+                    }
+                }
+        }
+        return result;
+    }
+
+    private ObjectData getFolderParentIntern(String repositoryId, SingleFiling sop, String filter,
+            ObjectInfoHandler objectInfos) {
+
+        ObjectDataImpl parent = new ObjectDataImpl();
+
+        Folder parentFolder = sop.getParent();
+
+        if (null == parentFolder) {
+            return null;
+        }
+
+        copyFilteredProperties(repositoryId, parentFolder, filter, parent);
+        if (objectInfos != null) {
+            ObjectInfoImpl objectInfo = new ObjectInfoImpl();
+            fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, parentFolder, objectInfo);
+            objectInfos.addObjectInfo(objectInfo);
+        }
+
+        return parent;
+    }
+
+    void copyFilteredProperties(String repositoryId, StoredObject so, String filter, ObjectDataImpl objData) {
+        List<String> requestedIds = FilterParser.getRequestedIdsFromFilter(filter);
+        TypeDefinition td = fStoreManager.getTypeById(repositoryId, so.getTypeId()).getTypeDefinition();
+        Properties props = PropertyCreationHelper.getPropertiesFromObject(so, td, requestedIds);
+        objData.setProperties(props);
+    }
+
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryNavigationServiceImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native