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));
}