You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2012/08/06 22:12:38 UTC
svn commit: r1369967 - in
/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory:
./ query/ server/ types/
Author: jens
Date: Mon Aug 6 20:12:37 2012
New Revision: 1369967
URL: http://svn.apache.org/viewvc?rev=1369967&view=rev
Log:
InMemory bug fixes: support alias cmis:user; allowable actions: consistent canCancelCheckin and canCheckIn; query: return only properties of xyz type in select * from xyz
Modified:
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeValidator.java
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryAclService.java
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryVersioningServiceImpl.java
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyCreationHelper.java
Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java?rev=1369967&r1=1369966&r2=1369967&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/DataObjectCreator.java Mon Aug 6 20:12:37 2012
@@ -116,10 +116,8 @@ public class DataObjectCreator {
if (canCheckOut) {
set.add(Action.CAN_CHECK_OUT);
}
- if (isCheckedOut) {
- set.add(Action.CAN_CANCEL_CHECK_OUT);
- }
if (canCheckIn) {
+ set.add(Action.CAN_CANCEL_CHECK_OUT);
set.add(Action.CAN_CHECK_IN);
}
set.add(Action.CAN_GET_ALL_VERSIONS);
Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeValidator.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeValidator.java?rev=1369967&r1=1369966&r2=1369967&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeValidator.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/TypeValidator.java Mon Aug 6 20:12:37 2012
@@ -18,14 +18,20 @@
*/
package org.apache.chemistry.opencmis.inmemory;
+import java.util.ArrayList;
import java.util.Collection;
-import java.util.Iterator;
+import java.util.List;
+import org.apache.chemistry.opencmis.commons.data.Ace;
+import org.apache.chemistry.opencmis.commons.data.Acl;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
import org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlEntryImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlListImpl;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlPrincipalDataImpl;
import org.apache.chemistry.opencmis.server.support.TypeManager;
/**
@@ -36,7 +42,9 @@ import org.apache.chemistry.opencmis.ser
*/
public class TypeValidator {
- public static void checkType(TypeManager tm, TypeDefinition td) {
+ private static final Object CMIS_USER = "cmis:user";
+
+ public static void checkType(TypeManager tm, TypeDefinition td) {
if (null == tm.getTypeById(td.getParentTypeId())) {
throw new CmisInvalidArgumentException("Cannot add type, because parent with id " + td.getParentTypeId()
@@ -90,6 +98,39 @@ public class TypeValidator {
}
}
+ public static Acl expandAclMakros(String user, Acl acl) {
+ boolean mustCopy = false;
+
+ if (user == null || acl == null || acl.getAces() == null)
+ return acl;
+
+ for (Ace ace: acl.getAces()) {
+ String principal = ace.getPrincipalId();
+ if (principal != null && principal.equals(CMIS_USER)) {
+ mustCopy = true;
+ }
+ }
+
+ if (mustCopy) {
+ AccessControlListImpl result = new AccessControlListImpl();
+ List<Ace> list = new ArrayList<Ace>(acl.getAces().size());
+ for (Ace ace: acl.getAces()) {
+ String principal = ace.getPrincipalId();
+ if (principal != null && principal.equals(CMIS_USER)) {
+ AccessControlEntryImpl ace2 = new AccessControlEntryImpl();
+ ace2.setPermissions(ace.getPermissions());
+ ace2.setExtensions(ace.getExtensions());
+ ace2.setPrincipal(new AccessControlPrincipalDataImpl(user));
+ list.add(ace2);
+ } else
+ list.add(ace);
+ }
+ result.setAces(list);
+ return result;
+ } else
+ return acl;
+ }
+
private static void checkTypeId(TypeManager tm, String typeId) {
if (null == typeId) {
Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java?rev=1369967&r1=1369966&r2=1369967&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java Mon Aug 6 20:12:37 2012
@@ -144,10 +144,12 @@ public class InMemoryQueryProcessor {
List<ObjectData> objDataList = new ArrayList<ObjectData>();
Map<String, String> props = queryObj.getRequestedPropertiesByAlias();
Map<String, String> funcs = queryObj.getRequestedFuncsByAlias();
+ TypeDefinition fromType = queryObj.getMainFromName();
+
for (StoredObject so : matches) {
TypeDefinition td = tm.getTypeById(so.getTypeId()).getTypeDefinition();
ObjectData od = PropertyCreationHelper.getObjectDataQueryResult(td, so, user, props, funcs,
- includeAllowableActions, includeRelationships, renditionFilter);
+ fromType, includeAllowableActions, includeRelationships, renditionFilter);
objDataList.add(od);
}
Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryAclService.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryAclService.java?rev=1369967&r1=1369966&r2=1369967&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryAclService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryAclService.java Mon Aug 6 20:12:37 2012
@@ -24,6 +24,7 @@ import org.apache.chemistry.opencmis.com
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.TypeValidator;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.DocumentVersion;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoreManager;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoredObject;
@@ -62,7 +63,10 @@ public class InMemoryAclService extends
public Acl applyAcl(CallContext context, String repositoryId, String objectId, Acl addAces, Acl removeAces, AclPropagation aclPropagation,
ExtensionsData extension, ObjectInfoHandler objectInfos) {
- StoredObject so = validator.applyAcl(context, repositoryId, objectId, aclPropagation, extension);
+ addAces = TypeValidator.expandAclMakros(context.getUsername(), addAces);
+ removeAces = TypeValidator.expandAclMakros(context.getUsername(), removeAces);
+
+ StoredObject so = validator.applyAcl(context, repositoryId, objectId, aclPropagation, extension);
Acl acl = fStoreManager.getObjectStore(repositoryId).applyAcl(so, addAces, removeAces, aclPropagation, context.getUsername());
if (context.isObjectInfoRequired()) {
@@ -75,7 +79,9 @@ public class InMemoryAclService extends
public Acl applyAcl(CallContext context, String repositoryId, String objectId, Acl aces, AclPropagation aclPropagation) {
- StoredObject so = validator.applyAcl(context, repositoryId, objectId);
+ aces = TypeValidator.expandAclMakros(context.getUsername(), aces);
+
+ StoredObject so = validator.applyAcl(context, repositoryId, objectId);
return fStoreManager.getObjectStore(repositoryId).applyAcl(so, aces, aclPropagation, context.getUsername());
}
Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java?rev=1369967&r1=1369966&r2=1369967&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java Mon Aug 6 20:12:37 2012
@@ -699,7 +699,10 @@ public class InMemoryObjectServiceImpl e
ContentStream contentStream, VersioningState versioningState, List<String> policies, Acl addACEs,
Acl removeACEs, ExtensionsData extension) {
- validator.createDocument(context, repositoryId, folderId, extension);
+ addACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
+ removeACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), removeACEs);
+
+ validator.createDocument(context, repositoryId, folderId, extension);
// Validation stuff
TypeValidator.validateRequiredSystemProperties(properties);
@@ -802,7 +805,10 @@ public class InMemoryObjectServiceImpl e
private Folder createFolderIntern(CallContext context, String repositoryId, Properties properties, String folderId,
List<String> policies, Acl addACEs, Acl removeACEs, ExtensionsData extension) {
- validator.createFolder(context, repositoryId, folderId, extension);
+ addACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
+ removeACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), removeACEs);
+
+ validator.createFolder(context, repositoryId, folderId, extension);
TypeValidator.validateRequiredSystemProperties(properties);
String user = context.getUsername();
@@ -871,6 +877,8 @@ public class InMemoryObjectServiceImpl e
private StoredObject createPolicyIntern(CallContext context, String repositoryId, Properties properties, String folderId,
List<String> policies, Acl addAces, Acl removeAces, ExtensionsData extension) {
+ addAces = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addAces);
+ removeAces = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), removeAces);
validator.createPolicy(context, repositoryId, folderId, extension);
throw new CmisNotSupportedException("createPolicy is not supported.");
}
@@ -883,7 +891,10 @@ public class InMemoryObjectServiceImpl e
String user = context.getUsername();
- // get required properties
+ addACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addACEs);
+ removeACEs = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), removeACEs);
+
+ // get required properties
PropertyData<?> pd = properties.getProperties().get(PropertyIds.SOURCE_ID);
String sourceId = (String) pd.getFirstValue();
if (null == sourceId || sourceId.length() == 0)
Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryVersioningServiceImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryVersioningServiceImpl.java?rev=1369967&r1=1369966&r2=1369967&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryVersioningServiceImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryVersioningServiceImpl.java Mon Aug 6 20:12:37 2012
@@ -79,7 +79,10 @@ public class InMemoryVersioningServiceIm
Properties properties, ContentStream contentStream, String checkinComment, List<String> policies,
Acl addAces, Acl removeAces, ExtensionsData extension, ObjectInfoHandler objectInfos) {
- StoredObject so = validator.checkIn(context, repositoryId, objectId, addAces, removeAces, extension);
+ addAces = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), addAces);
+ removeAces = org.apache.chemistry.opencmis.inmemory.TypeValidator.expandAclMakros(context.getUsername(), removeAces);
+
+ StoredObject so = validator.checkIn(context, repositoryId, objectId, addAces, removeAces, extension);
String user = context.getUsername();
VersionedDocument verDoc = testHasProperCheckedOutStatus(so, user);
Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyCreationHelper.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyCreationHelper.java?rev=1369967&r1=1369966&r2=1369967&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyCreationHelper.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyCreationHelper.java Mon Aug 6 20:12:37 2012
@@ -243,8 +243,9 @@ public class PropertyCreationHelper {
return props;
}
- public static Properties getPropertiesFromObject(StoredObject so, TypeDefinition td,
- Map<String, String> requestedIds, Map<String, String> requestedFuncs) {
+ public static Properties getPropertiesFromObject(StoredObject so,
+ TypeDefinition td, TypeDefinition fromType,
+ Map<String, String> requestedIds, Map<String, String> requestedFuncs) {
// build properties collection
List<String> idList = new ArrayList<String>(requestedIds.values());
@@ -267,30 +268,34 @@ public class PropertyCreationHelper {
Map<String, PropertyData<?>> mappedProperties = new HashMap<String, PropertyData<?>>();
if (requestedIds.containsValue("*")) {
for (Map.Entry<String, PropertyData<?>> prop : properties.entrySet()) {
- // map property id to property query name
- String queryName = td.getPropertyDefinitions().get(prop.getKey()).getQueryName();
- String localName = td.getPropertyDefinitions().get(prop.getKey()).getLocalName();
- String displayName = td.getPropertyDefinitions().get(prop.getKey()).getDisplayName();
- AbstractPropertyData<?> ad = clonePropertyData(prop.getValue());
-
- ad.setQueryName(queryName);
- ad.setLocalName(localName);
- ad.setDisplayName(displayName);
- mappedProperties.put(queryName, ad);
+ if (fromType.getPropertyDefinitions().containsKey(prop.getKey())) {
+ // map property id to property query name
+ String queryName = td.getPropertyDefinitions().get(prop.getKey()).getQueryName();
+ String localName = td.getPropertyDefinitions().get(prop.getKey()).getLocalName();
+ String displayName = td.getPropertyDefinitions().get(prop.getKey()).getDisplayName();
+ AbstractPropertyData<?> ad = clonePropertyData(prop.getValue());
+
+ ad.setQueryName(queryName);
+ ad.setLocalName(localName);
+ ad.setDisplayName(displayName);
+ mappedProperties.put(queryName, ad);
+ }
}
} else {
// replace all ids with query names or alias:
for (Entry<String, String> propAlias : requestedIds.entrySet()) {
- String queryNameOrAlias = propAlias.getKey();
- PropertyData<?> prop = properties.get(propAlias.getValue());
- String localName = td.getPropertyDefinitions().get(prop.getId()).getLocalName();
- String displayName = td.getPropertyDefinitions().get(prop.getId()).getDisplayName();
- AbstractPropertyData<?> ad = clonePropertyData(prop);
-
- ad.setQueryName(queryNameOrAlias);
- ad.setLocalName(localName);
- ad.setDisplayName(displayName);
- mappedProperties.put(queryNameOrAlias, ad);
+ String queryNameOrAlias = propAlias.getKey();
+ PropertyData<?> prop = properties.get(propAlias.getValue());
+ if (fromType.getPropertyDefinitions().containsKey(prop.getId())) {
+ String localName = td.getPropertyDefinitions().get(prop.getId()).getLocalName();
+ String displayName = td.getPropertyDefinitions().get(prop.getId()).getDisplayName();
+ AbstractPropertyData<?> ad = clonePropertyData(prop);
+
+ ad.setQueryName(queryNameOrAlias);
+ ad.setLocalName(localName);
+ ad.setDisplayName(displayName);
+ mappedProperties.put(queryNameOrAlias, ad);
+ }
}
}
// add functions:
@@ -350,13 +355,13 @@ public class PropertyCreationHelper {
}
public static ObjectData getObjectDataQueryResult(TypeDefinition typeDef, StoredObject so, String user,
- Map<String, String> requestedProperties, Map<String, String> requestedFuncs,
+ Map<String, String> requestedProperties, Map<String, String> requestedFuncs, TypeDefinition fromType,
Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter) {
ObjectDataImpl od = new ObjectDataImpl();
// build properties collection
- Properties props = getPropertiesFromObject(so, typeDef, requestedProperties, requestedFuncs);
+ Properties props = getPropertiesFromObject(so, typeDef, fromType, requestedProperties, requestedFuncs);
// fill output object
if (null != includeAllowableActions && includeAllowableActions) {