You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2015/08/21 13:41:00 UTC

svn commit: r1696946 - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare: FileShareCmisService.java FileShareRepository.java FileShareTypeManager.java

Author: fmui
Date: Fri Aug 21 11:41:00 2015
New Revision: 1696946

URL: http://svn.apache.org/r1696946
Log:
FileShare: added basic sorting support

Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareCmisService.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareRepository.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareTypeManager.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareCmisService.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareCmisService.java?rev=1696946&r1=1696945&r2=1696946&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareCmisService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareCmisService.java Fri Aug 21 11:41:00 2015
@@ -137,7 +137,7 @@ public class FileShareCmisService extend
     public ObjectInFolderList getChildren(String repositoryId, String folderId, String filter, String orderBy,
             Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
             Boolean includePathSegment, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
-        return getRepository().getChildren(getCallContext(), folderId, filter, includeAllowableActions,
+        return getRepository().getChildren(getCallContext(), folderId, filter, orderBy, includeAllowableActions,
                 includePathSegment, maxItems, skipCount, this);
     }
 

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareRepository.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareRepository.java?rev=1696946&r1=1696945&r2=1696946&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareRepository.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareRepository.java Fri Aug 21 11:41:00 2015
@@ -31,12 +31,14 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.EnumSet;
 import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
@@ -230,7 +232,7 @@ public class FileShareRepository {
         capabilities.setCapabilityRendition(CapabilityRenditions.NONE);
 
         if (cmisVersion != CmisVersion.CMIS_1_0) {
-            capabilities.setCapabilityOrderBy(CapabilityOrderBy.NONE);
+            capabilities.setCapabilityOrderBy(CapabilityOrderBy.COMMON);
 
             NewTypeSettableAttributesImpl typeSetAttributes = new NewTypeSettableAttributesImpl();
             typeSetAttributes.setCanSetControllableAcl(false);
@@ -416,6 +418,10 @@ public class FileShareRepository {
         if (type.getBaseTypeId() == BaseTypeId.CMIS_DOCUMENT) {
             objectId = createDocument(context, properties, folderId, contentStream, versioningState);
         } else if (type.getBaseTypeId() == BaseTypeId.CMIS_FOLDER) {
+            if (contentStream != null || versioningState != null) {
+                throw new CmisInvalidArgumentException("Cannot create a folder with content or a versioning state!");
+            }
+
             objectId = createFolder(context, properties, folderId);
         } else {
             throw new CmisObjectNotFoundException("Cannot create object of type '" + typeId + "'!");
@@ -1151,7 +1157,7 @@ public class FileShareRepository {
     /**
      * CMIS getChildren.
      */
-    public ObjectInFolderList getChildren(CallContext context, String folderId, String filter,
+    public ObjectInFolderList getChildren(CallContext context, String folderId, String filter, String orderBy,
             Boolean includeAllowableActions, Boolean includePathSegment, BigInteger maxItems, BigInteger skipCount,
             ObjectInfoHandler objectInfos) {
         debug("getChildren");
@@ -1181,6 +1187,92 @@ public class FileShareRepository {
             throw new CmisObjectNotFoundException("Not a folder!");
         }
 
+        // get the children
+        List<File> children = new ArrayList<File>();
+        for (File child : folder.listFiles()) {
+            // skip hidden and shadow files
+            if (child.isHidden() || child.getName().equals(SHADOW_FOLDER) || child.getPath().endsWith(SHADOW_EXT)) {
+                continue;
+            }
+
+            children.add(child);
+        }
+
+        // very basic sorting
+        if (orderBy != null) {
+            boolean desc = false;
+            String queryName = orderBy;
+
+            int commaIdx = orderBy.indexOf(',');
+            if (commaIdx > -1) {
+                queryName = orderBy.substring(0, commaIdx);
+            }
+
+            queryName = queryName.trim();
+            if (queryName.toLowerCase(Locale.ENGLISH).endsWith(" desc")) {
+                desc = true;
+                queryName = queryName.substring(0, queryName.length() - 5).trim();
+            }
+
+            Comparator<File> comparator = null;
+
+            if ("cmis:name".equals(queryName)) {
+                comparator = new Comparator<File>() {
+                    @Override
+                    public int compare(File f1, File f2) {
+                        return f1.getName().toLowerCase(Locale.ENGLISH)
+                                .compareTo(f2.getName().toLowerCase(Locale.ENGLISH));
+                    }
+                };
+            } else if ("cmis:creationDate".equals(queryName) || "cmis:lastModificationDate".equals(queryName)) {
+                comparator = new Comparator<File>() {
+                    @Override
+                    public int compare(File f1, File f2) {
+                        return Long.compare(f1.lastModified(), f2.lastModified());
+                    }
+                };
+            } else if ("cmis:contentStreamLength".equals(queryName)) {
+                comparator = new Comparator<File>() {
+                    @Override
+                    public int compare(File f1, File f2) {
+                        return Long.compare(f1.length(), f2.length());
+                    }
+                };
+            } else if ("cmis:objectId".equals(queryName)) {
+                comparator = new Comparator<File>() {
+                    @Override
+                    public int compare(File f1, File f2) {
+                        try {
+                            return fileToId(f1).compareTo(fileToId(f2));
+                        } catch (IOException e) {
+                            return 0;
+                        }
+                    }
+                };
+            } else if ("cmis:baseTypeId".equals(queryName)) {
+                comparator = new Comparator<File>() {
+                    @Override
+                    public int compare(File f1, File f2) {
+                        if (f1.isDirectory() == f2.isDirectory()) {
+                            return 0;
+                        }
+                        return f1.isDirectory() ? -1 : 1;
+                    }
+                };
+            } else if ("cmis:createdBy".equals(queryName) || "cmis:lastModifiedBy".equals(queryName)) {
+                // do nothing
+            } else {
+                throw new CmisInvalidArgumentException("Cannot sort by " + queryName + ".");
+            }
+
+            if (comparator != null) {
+                Collections.sort(children, comparator);
+                if (desc) {
+                    Collections.reverse(children);
+                }
+            }
+        }
+
         // set object info of the the folder
         if (context.isObjectInfoRequired()) {
             compileObjectData(context, folder, null, false, false, userReadOnly, objectInfos);
@@ -1193,12 +1285,7 @@ public class FileShareRepository {
         int count = 0;
 
         // iterate through children
-        for (File child : folder.listFiles()) {
-            // skip hidden and shadow files
-            if (child.isHidden() || child.getName().equals(SHADOW_FOLDER) || child.getPath().endsWith(SHADOW_EXT)) {
-                continue;
-            }
-
+        for (File child : children) {
             count++;
 
             if (skip > 0) {

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareTypeManager.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareTypeManager.java?rev=1696946&r1=1696945&r2=1696946&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareTypeManager.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareTypeManager.java Fri Aug 21 11:41:00 2015
@@ -31,9 +31,11 @@ import java.util.Map;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.chemistry.opencmis.commons.PropertyIds;
 import org.apache.chemistry.opencmis.commons.definitions.MutableDocumentTypeDefinition;
 import org.apache.chemistry.opencmis.commons.definitions.MutableFolderTypeDefinition;
 import org.apache.chemistry.opencmis.commons.definitions.MutablePropertyDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.MutablePropertyIdDefinition;
 import org.apache.chemistry.opencmis.commons.definitions.MutableTypeDefinition;
 import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
@@ -77,13 +79,19 @@ public class FileShareTypeManager {
         // add base folder type
         MutableFolderTypeDefinition folderType = typeDefinitionFactory
                 .createBaseFolderTypeDefinition(CmisVersion.CMIS_1_1);
-        removeQueryableAndOrderableFlags(folderType);
+        ((MutablePropertyIdDefinition) folderType.getPropertyDefinitions().get(PropertyIds.OBJECT_ID))
+                .setIsOrderable(Boolean.TRUE);
+        ((MutablePropertyIdDefinition) folderType.getPropertyDefinitions().get(PropertyIds.BASE_TYPE_ID))
+                .setIsOrderable(Boolean.TRUE);
         typeDefinitions.put(folderType.getId(), folderType);
 
         // add base document type
         MutableDocumentTypeDefinition documentType = typeDefinitionFactory
                 .createBaseDocumentTypeDefinition(CmisVersion.CMIS_1_1);
-        removeQueryableAndOrderableFlags(documentType);
+        ((MutablePropertyIdDefinition) documentType.getPropertyDefinitions().get(PropertyIds.OBJECT_ID))
+                .setIsOrderable(Boolean.TRUE);
+        ((MutablePropertyIdDefinition) documentType.getPropertyDefinitions().get(PropertyIds.BASE_TYPE_ID))
+                .setIsOrderable(Boolean.TRUE);
         typeDefinitions.put(documentType.getId(), documentType);
     }
 
@@ -124,19 +132,6 @@ public class FileShareTypeManager {
         }
     }
 
-    /**
-     * Removes the queryable and orderable flags from the property definitions
-     * of a type definition because this implementations does neither support
-     * queries nor can order objects.
-     */
-    private void removeQueryableAndOrderableFlags(MutableTypeDefinition type) {
-        for (PropertyDefinition<?> propDef : type.getPropertyDefinitions().values()) {
-            MutablePropertyDefinition<?> mutablePropDef = (MutablePropertyDefinition<?>) propDef;
-            mutablePropDef.setIsQueryable(false);
-            mutablePropDef.setIsOrderable(false);
-        }
-    }
-
     public void loadTypeDefinitionFromFile(String filename) throws IOException, XMLStreamException {
         loadTypeDefinitionFromStream(new BufferedInputStream(new FileInputStream(filename), 64 * 1024));
     }