From 1387dcaf2a9f675ba9c6fd9583142290ef7b264b Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Mon, 6 Jun 2011 19:49:42 +0000 Subject: [PATCH] Merged DEV/SWIFT to HEAD 26012: OpenCMIS server bug fixes: PWC properties update and document version delete 26205: - integrated the CMIS Client API project into the build - made the local CMIS client use the Alfresco OpenCMIS Extension - updated OpenCMIS 26300: expose all non-child associations through OpenCMIS and check relationship source and target instead of the relationship type 26356: OpenCMIS update 26378: added more CMIS client examples 26380: added helper methods for CMIS client 26500: - fixed CMIS date aspect property encoding - fixed CMIS rendition filter handling 26519: OpenCMIS update 26523: fixed CMISConnectionManager 26596: renamed CMIS JavaScript root objects (cmis -> cmisserver, cmisclient -> cmis) 26651: removed the cmis-client-api project and replaced it with a jar in 3rd-party 26652: - corrected CMIS samples 26656: - removed cmis-client-api from build 26658: - removed the last bit of cmis-client-api 26663: - added CMIS samples (browser and upload) 26742: CMIS webscripts samples update 26743: CMIS webscripts samples update 26939: removed duplicate commons-fileupload 26942: updated commons-lang to 2.6 26943: updated OpenCMIS (browser binding is now included in the server framework) 26953: refactored OpenCMIS client integration 26974: Update classpath for Florian - OpenCMIS browser bindings are now rolled into the main jar, no need for their own one 26975: removed outdated CMIS browser binding demo page 27048: port of the Spring Surf CMIS browser plus a few new features (create folder, create document, delete object) 27077: bug fix: CMIS id for associations 27079: OpenCMIS update 27085: added check if CMIS is supported 27086: OpenCMIS client bindings update (force JAX-WS RI) 27138: clean up 27764: CMIS default connection handling 27879: OpenCMIS client: moved server definitions to separate config file 27880: OpenCMIS client: removed test repositories from configuration 27918: changed CMIS server configuration tag name to match Spring Surf configuration 27920: enabled relationships in CMIS browser 27924: Updated Spring Surf and added the Spring Surf CMIS framework [Merge note: Kept most recent HEAD jars where conflicts occured] 27926: Updated Spring Surf source jars [Merge note: Kept most recent HEAD jars where conflicts occured] git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@28219 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../opencmis/AlfrescoCmisService.java | 8 ++- .../org/alfresco/opencmis/CMISConnector.java | 68 ++++++++++++------- .../opencmis/CMISRenditionMapping.java | 9 ++- .../CMISStrictDictionaryService.java | 18 +++-- .../opencmis/mapping/CMISMapping.java | 8 --- .../opencmis/mapping/NodeRefProperty.java | 15 ++-- 6 files changed, 75 insertions(+), 51 deletions(-) diff --git a/source/java/org/alfresco/opencmis/AlfrescoCmisService.java b/source/java/org/alfresco/opencmis/AlfrescoCmisService.java index 0f7af2a772..3d1199d743 100644 --- a/source/java/org/alfresco/opencmis/AlfrescoCmisService.java +++ b/source/java/org/alfresco/opencmis/AlfrescoCmisService.java @@ -1415,7 +1415,8 @@ public class AlfrescoCmisService extends AbstractCmisService { if (connector.getNodeService().getChildAssocs(nodeRef).size() > 0) { - throw new CmisConstraintException("Could not delete folder with at least one Child"); + throw new CmisConstraintException( + "Could not delete folder with at least one child!"); } connector.getNodeService().deleteNode(nodeRef); @@ -1437,6 +1438,11 @@ public class AlfrescoCmisService extends AbstractCmisService return true; } + if (variant == ObjectVariantEnum.VERSION) + { + nodeRef = connector.getNodeRef(connector.getCurrentVersionId(objectId)); + } + // remove not primary parent associations List childAssociations = connector.getNodeService().getParentAssocs( nodeRef); diff --git a/source/java/org/alfresco/opencmis/CMISConnector.java b/source/java/org/alfresco/opencmis/CMISConnector.java index be99ef4eac..fdc79dc31b 100644 --- a/source/java/org/alfresco/opencmis/CMISConnector.java +++ b/source/java/org/alfresco/opencmis/CMISConnector.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; +import java.util.Date; import java.util.EnumSet; import java.util.GregorianCalendar; import java.util.HashMap; @@ -33,6 +34,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.TimeZone; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; @@ -1554,6 +1556,13 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen private String convertAspectPropertyValue(Object value) { + if (value instanceof Date) + { + GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT")); + cal.setTime((Date) value); + value = cal; + } + if (value instanceof GregorianCalendar) { DatatypeFactory df; @@ -1759,11 +1768,13 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen for (AssociationRef assocRef : assocs) { TypeDefinitionWrapper assocTypeDef = cmisDictionaryService.findAssocType(assocRef.getTypeQName()); - if (assocTypeDef != null) + if (assocTypeDef == null || getType(assocRef.getSourceRef()) == null + || getType(assocRef.getTargetRef()) == null) { - result.add(createCMISObject(assocRef, null, false, IncludeRelationships.NONE, RENDITION_NONE, false, - false)); + continue; } + + result.add(createCMISObject(assocRef, null, false, IncludeRelationships.NONE, RENDITION_NONE, false, false)); } return result; @@ -1807,31 +1818,34 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen for (AssociationRef assocRef : assocs) { TypeDefinitionWrapper assocTypeDef = cmisDictionaryService.findAssocType(assocRef.getTypeQName()); - if (assocTypeDef != null) + if (assocTypeDef == null || getType(assocRef.getSourceRef()) == null + || getType(assocRef.getTargetRef()) == null) { - if ((typeId != null) && !assocRef.getId().equals(typeId)) - { - continue; - } + continue; + } - counter++; + if ((typeId != null) && !assocRef.getId().equals(typeId)) + { + continue; + } - if (skip > 0) - { - skip--; - continue; - } + counter++; - max--; - if (max > 0) - { - result.getObjects().add( - createCMISObject(assocRef, filter, includeAllowableActions, IncludeRelationships.NONE, - RENDITION_NONE, false, false)); - } else - { - hasMore = true; - } + if (skip > 0) + { + skip--; + continue; + } + + max--; + if (max > 0) + { + result.getObjects().add( + createCMISObject(assocRef, filter, includeAllowableActions, IncludeRelationships.NONE, + RENDITION_NONE, false, false)); + } else + { + hasMore = true; } } } @@ -2458,8 +2472,10 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen throw new CmisInvalidArgumentException("Property " + property.getId() + " is unknown!"); } - if ((propDef.getPropertyDefinition().getUpdatability() == Updatability.READONLY) - || (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY))) + Updatability updatability = propDef.getPropertyDefinition().getUpdatability(); + if ((updatability == Updatability.READONLY) + || (updatability == Updatability.WHENCHECKEDOUT && !nodeService.hasAspect(nodeRef, + ContentModel.ASPECT_WORKING_COPY))) { throw new CmisInvalidArgumentException("Property " + property.getId() + " is read-only!"); } diff --git a/source/java/org/alfresco/opencmis/CMISRenditionMapping.java b/source/java/org/alfresco/opencmis/CMISRenditionMapping.java index 8aa6f2a2a8..c37e3ae119 100644 --- a/source/java/org/alfresco/opencmis/CMISRenditionMapping.java +++ b/source/java/org/alfresco/opencmis/CMISRenditionMapping.java @@ -165,7 +165,7 @@ public class CMISRenditionMapping } ContentReader reader = contentService.getReader(rendNodeRef, contentProperty); - if ((reader == null) || (reader.exists())) + if ((reader == null) || (!reader.exists())) { // no content -> no rendition continue; @@ -188,7 +188,7 @@ public class CMISRenditionMapping { // found a kind, not a MIME type List renditionNames = kindToRenditionNames.get(f); - if (renditionNames.contains(rendName)) + if (renditionNames != null && renditionNames.contains(rendName)) { include = true; break; @@ -239,6 +239,11 @@ public class CMISRenditionMapping } } + if (filterSet == null || filterSet.contains("cmis:thumbnail")) + { + + } + return result; } diff --git a/source/java/org/alfresco/opencmis/dictionary/CMISStrictDictionaryService.java b/source/java/org/alfresco/opencmis/dictionary/CMISStrictDictionaryService.java index 1060db530e..c4a97b1e44 100644 --- a/source/java/org/alfresco/opencmis/dictionary/CMISStrictDictionaryService.java +++ b/source/java/org/alfresco/opencmis/dictionary/CMISStrictDictionaryService.java @@ -20,6 +20,7 @@ package org.alfresco.opencmis.dictionary; import java.util.Collection; +import org.alfresco.cmis.mapping.CMISMapping; import org.alfresco.service.cmr.dictionary.AssociationDefinition; import org.alfresco.service.cmr.dictionary.ClassDefinition; import org.alfresco.service.namespace.QName; @@ -71,10 +72,6 @@ public class CMISStrictDictionaryService extends CMISAbstractDictionaryService { typeId = cmisMapping.getCmisTypeId(BaseTypeId.CMIS_FOLDER, classQName); objectTypeDef = new FolderTypeDefintionWrapper(cmisMapping, serviceRegistry, typeId, classDef); - } else if (cmisMapping.isValidCmisRelationship(classQName)) - { - typeId = cmisMapping.getCmisTypeId(BaseTypeId.CMIS_RELATIONSHIP, classQName); - objectTypeDef = new RelationshipTypeDefintionWrapper(cmisMapping, serviceRegistry, typeId, classDef); } else if (cmisMapping.isValidCmisPolicy(classQName)) { typeId = cmisMapping.getCmisTypeId(BaseTypeId.CMIS_POLICY, classQName); @@ -96,6 +93,14 @@ public class CMISStrictDictionaryService extends CMISAbstractDictionaryService */ private void createAssocDefs(DictionaryRegistry registry, Collection classQNames) { + // register base type + String typeId = cmisMapping.getCmisTypeId(BaseTypeId.CMIS_RELATIONSHIP, CMISMapping.RELATIONSHIP_QNAME); + RelationshipTypeDefintionWrapper objectTypeDef = new RelationshipTypeDefintionWrapper(cmisMapping, + serviceRegistry, typeId, dictionaryService.getClass(CMISMapping.RELATIONSHIP_QNAME)); + + registry.registerTypeDefinition(objectTypeDef); + + // register all other relationships for (QName classQName : classQNames) { if (!cmisMapping.isValidCmisRelationship(classQName)) @@ -103,9 +108,8 @@ public class CMISStrictDictionaryService extends CMISAbstractDictionaryService // create appropriate kind of type definition AssociationDefinition assocDef = dictionaryService.getAssociation(classQName); - String typeId = cmisMapping.getCmisTypeId(BaseTypeId.CMIS_RELATIONSHIP, classQName); - RelationshipTypeDefintionWrapper objectTypeDef = new RelationshipTypeDefintionWrapper(cmisMapping, typeId, - assocDef); + typeId = cmisMapping.getCmisTypeId(BaseTypeId.CMIS_RELATIONSHIP, classQName); + objectTypeDef = new RelationshipTypeDefintionWrapper(cmisMapping, typeId, assocDef); registry.registerTypeDefinition(objectTypeDef); } diff --git a/source/java/org/alfresco/opencmis/mapping/CMISMapping.java b/source/java/org/alfresco/opencmis/mapping/CMISMapping.java index 76a866ad35..91d05b0e1c 100644 --- a/source/java/org/alfresco/opencmis/mapping/CMISMapping.java +++ b/source/java/org/alfresco/opencmis/mapping/CMISMapping.java @@ -642,14 +642,6 @@ public class CMISMapping implements InitializingBean { return false; } - if (!isValidCmisDocumentOrFolder(getCmisType(associationDefinition.getSourceClass().getName()))) - { - return false; - } - if (!isValidCmisDocumentOrFolder(getCmisType(associationDefinition.getTargetClass().getName()))) - { - return false; - } return true; } diff --git a/source/java/org/alfresco/opencmis/mapping/NodeRefProperty.java b/source/java/org/alfresco/opencmis/mapping/NodeRefProperty.java index 6e3f3018a3..9dd8fd6452 100644 --- a/source/java/org/alfresco/opencmis/mapping/NodeRefProperty.java +++ b/source/java/org/alfresco/opencmis/mapping/NodeRefProperty.java @@ -21,6 +21,7 @@ package org.alfresco.opencmis.mapping; import java.io.Serializable; import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.NodeRef; /** @@ -40,15 +41,15 @@ public class NodeRefProperty extends AbstractVersioningProperty super(serviceRegistry, NodeRefPropertyId); } - /* - * (non-Javadoc) - * - * @see - * org.alfresco.cmis.mapping.AbstractProperty#getValue(org.alfresco.service - * .cmr.repository.NodeRef) - */ + @Override public Serializable getValue(NodeRef nodeRef) { return getLiveNodeRef(nodeRef); } + + @Override + public Serializable getValue(AssociationRef assocRef) + { + return "" + assocRef.getId(); + } }