Author: fmui
Date: Mon Apr 19 12:49:41 2010
New Revision: 935546

URL: http://svn.apache.org/viewvc?rev=935546&view=rev
Log:
added convenience code that generates object infos

Added:
    
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/RenditionInfoImpl.java
Removed:
    
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/RenditionInfosImpl.java
Modified:
    
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/api/server/CmisService.java
    
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/AbstractCmisService.java
    
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareService.java
    
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareServiceFactory.java
    
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/CmisServiceWrapper.java
    
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/ObjectInfoHelper.java

Modified: 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/api/server/CmisService.java
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/api/server/CmisService.java?rev=935546&r1=935545&r2=935546&view=diff
==============================================================================
--- 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/api/server/CmisService.java
 (original)
+++ 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/api/server/CmisService.java
 Mon Apr 19 12:49:41 2010
@@ -59,7 +59,7 @@ public interface CmisService extends Rep
         * 
         * Only AtomPub requests will require object infos.
         */
-       ObjectInfo getObjectInfo(String objectId);
+       ObjectInfo getObjectInfo(String repositoryId, String objectId);
 
        /**
         * Signals that this object will not be used anymore and resources can

Modified: 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/AbstractCmisService.java
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/AbstractCmisService.java?rev=935546&r1=935545&r2=935546&view=diff
==============================================================================
--- 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/AbstractCmisService.java
 (original)
+++ 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/AbstractCmisService.java
 Mon Apr 19 12:49:41 2010
@@ -1,6 +1,8 @@
 package org.apache.chemistry.opencmis.commons.impl.server;
 
 import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -18,15 +20,24 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.api.ObjectList;
 import org.apache.chemistry.opencmis.commons.api.ObjectParentData;
 import org.apache.chemistry.opencmis.commons.api.Properties;
+import org.apache.chemistry.opencmis.commons.api.PropertyBoolean;
 import org.apache.chemistry.opencmis.commons.api.PropertyData;
+import org.apache.chemistry.opencmis.commons.api.PropertyDateTime;
+import org.apache.chemistry.opencmis.commons.api.PropertyId;
+import org.apache.chemistry.opencmis.commons.api.PropertyInteger;
+import org.apache.chemistry.opencmis.commons.api.PropertyString;
 import org.apache.chemistry.opencmis.commons.api.RenditionData;
+import org.apache.chemistry.opencmis.commons.api.RepositoryCapabilities;
 import org.apache.chemistry.opencmis.commons.api.RepositoryInfo;
 import org.apache.chemistry.opencmis.commons.api.TypeDefinition;
 import org.apache.chemistry.opencmis.commons.api.TypeDefinitionContainer;
 import org.apache.chemistry.opencmis.commons.api.TypeDefinitionList;
 import org.apache.chemistry.opencmis.commons.api.server.CmisService;
 import org.apache.chemistry.opencmis.commons.api.server.ObjectInfo;
+import org.apache.chemistry.opencmis.commons.api.server.RenditionInfo;
 import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
+import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
+import org.apache.chemistry.opencmis.commons.enums.CapabilityAcl;
 import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
 import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
 import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
@@ -39,6 +50,7 @@ import org.apache.chemistry.opencmis.com
 public abstract class AbstractCmisService implements CmisService {
 
        private Map<String, ObjectInfo> objectInfoMap;
+       private boolean addObjectInfos = true;
 
        // --- repository service ---
 
@@ -828,27 +840,266 @@ public abstract class AbstractCmisServic
 
        // --- server specific ---
 
-       public ObjectInfo getObjectInfo(String objectId) {
+       /**
+        * Returns the object info map.
+        */
+       private Map<String, ObjectInfo> getObjectInfoMap() {
                if (objectInfoMap == null) {
-                       return null;
+                       objectInfoMap = new HashMap<String, ObjectInfo>();
+               }
+
+               return objectInfoMap;
+       }
+
+       /**
+        * {...@inheritdoc}
+        * 
+        * <p>
+        * <b>Implementation Hints:</b>
+        * <ul>
+        * <li>Bindings: AtomPub</li>
+        * <li>If the object info is not found, the object info will be 
assembled.
+        * To do that the repository info, the object, the object parent, the 
object
+        * history and the base type definitions will be fetched. If you want to
+        * change this behavior, override this method.</li>
+        * </ul>
+        */
+       public ObjectInfo getObjectInfo(String repositoryId, String objectId) {
+               objectInfoMap = getObjectInfoMap();
+
+               ObjectInfo info = objectInfoMap.get(objectId);
+               if (info == null) {
+                       // object info has not been found -> create one
+                       ObjectInfoImpl infoImpl = new ObjectInfoImpl();
+
+                       try {
+                               // switch off object info collection to avoid 
side effects
+                               addObjectInfos = false;
+
+                               // get the object
+                               ObjectData object = getObject(repositoryId, 
objectId, null, Boolean.TRUE, IncludeRelationships.BOTH,
+                                               "*", Boolean.TRUE, 
Boolean.FALSE, null);
+
+                               // if the object has no properties, stop here
+                               if (object.getProperties() == null || 
object.getProperties().getProperties() == null) {
+                                       throw new Exception("No properties!");
+                               }
+
+                               // get the repository info
+                               RepositoryInfo repositoryInfo = 
getRepositoryInfo(repositoryId, null);
+
+                               // general properties
+                               infoImpl.setObject(object);
+                               infoImpl.setId(object.getId());
+                               infoImpl.setName(getStringProperty(object, 
PropertyIds.NAME));
+                               infoImpl.setCreatedBy(getStringProperty(object, 
PropertyIds.CREATED_BY));
+                               
infoImpl.setCreationDate(getDateTimeProperty(object, PropertyIds.CREATED_BY));
+                               
infoImpl.setLastModificationDate(getDateTimeProperty(object, 
PropertyIds.LAST_MODIFICATION_DATE));
+                               infoImpl.setTypeId(getIdProperty(object, 
PropertyIds.OBJECT_TYPE_ID));
+                               infoImpl.setBaseType(object.getBaseTypeId());
+
+                               // versioning
+                               
infoImpl.setIsCurrentVersion(object.getBaseTypeId() == 
BaseTypeId.CMIS_DOCUMENT);
+                               infoImpl.setWorkingCopyId(null);
+                               infoImpl.setWorkingCopyOriginalId(null);
+
+                               
infoImpl.setVersionSeriesId(getStringProperty(object, 
PropertyIds.VERSION_SERIES_ID));
+                               if (infoImpl.getVersionSeriesId() != null) {
+                                       Boolean isLatest = 
getBooleanProperty(object, PropertyIds.IS_LATEST_VERSION);
+                                       infoImpl.setIsCurrentVersion(isLatest 
== null ? true : isLatest.booleanValue());
+
+                                       Boolean isCheckedOut = 
getBooleanProperty(object, PropertyIds.IS_VERSION_SERIES_CHECKED_OUT);
+                                       if (isCheckedOut != null && 
isCheckedOut.booleanValue()) {
+                                               
infoImpl.setWorkingCopyId(getIdProperty(object, 
PropertyIds.VERSION_SERIES_CHECKED_OUT_ID));
+
+                                               // get latest version
+                                               List<ObjectData> versions = 
getAllVersions(repositoryId, objectId, infoImpl
+                                                               
.getVersionSeriesId(), PropertyIds.OBJECT_ID, Boolean.FALSE, null);
+                                               if (versions != null && 
versions.size() > 0) {
+                                                       
infoImpl.setWorkingCopyOriginalId(versions.get(0).getId());
+                                               }
+                                       }
+                               }
+
+                               // content
+                               String fileName = getStringProperty(object, 
PropertyIds.CONTENT_STREAM_FILE_NAME);
+                               String mimeType = getStringProperty(object, 
PropertyIds.CONTENT_STREAM_MIME_TYPE);
+                               String streamId = getStringProperty(object, 
PropertyIds.CONTENT_STREAM_ID);
+                               BigInteger length = getIntegerProperty(object, 
PropertyIds.CONTENT_STREAM_LENGTH);
+                               boolean hasContent = fileName != null || 
mimeType != null || streamId != null || length != null;
+                               if (hasContent) {
+                                       infoImpl.setHasContent(hasContent);
+                                       infoImpl.setContentType(mimeType);
+                                       infoImpl.setFileName(fileName);
+                               } else {
+                                       infoImpl.setHasContent(false);
+                                       infoImpl.setContentType(null);
+                                       infoImpl.setFileName(null);
+                               }
+
+                               // parent
+                               List<ObjectParentData> parents = 
getObjectParents(repositoryId, objectId, PropertyIds.OBJECT_ID,
+                                               Boolean.FALSE, 
IncludeRelationships.NONE, "cmis:none", Boolean.FALSE, null);
+                               infoImpl.setHasParent(parents.size() > 0);
+
+                               // policies and relationships
+                               infoImpl.setSupportsRelationships(false);
+                               infoImpl.setSupportsPolicies(false);
+
+                               TypeDefinitionList baseTypesList = 
getTypeChildren(repositoryId, null, Boolean.FALSE, BigInteger
+                                               .valueOf(4), BigInteger.ZERO, 
null);
+                               for (TypeDefinition type : 
baseTypesList.getList()) {
+                                       if 
(BaseTypeId.CMIS_RELATIONSHIP.value().equals(type.getId())) {
+                                               
infoImpl.setSupportsRelationships(true);
+                                       } else if 
(BaseTypeId.CMIS_POLICY.value().equals(type.getId())) {
+                                               
infoImpl.setSupportsPolicies(true);
+                                       }
+                               }
+
+                               // renditions
+                               infoImpl.setRenditionInfos(null);
+
+                               List<RenditionData> renditions = 
object.getRenditions();
+                               if (renditions != null && renditions.size() > 
0) {
+                                       List<RenditionInfo> renditionInfos = 
new ArrayList<RenditionInfo>();
+
+                                       for (RenditionData rendition : 
renditions) {
+                                               RenditionInfoImpl renditionInfo 
= new RenditionInfoImpl();
+                                               
renditionInfo.setId(rendition.getStreamId());
+                                               
renditionInfo.setKind(rendition.getKind());
+                                               
renditionInfo.setContentType(rendition.getMimeType());
+                                               
renditionInfo.setTitle(rendition.getTitle());
+                                               
renditionInfo.setLength(rendition.getBigLength());
+
+                                               
renditionInfos.add(renditionInfo);
+                                       }
+
+                                       
infoImpl.setRenditionInfos(renditionInfos);
+                               }
+
+                               // relationships
+                               infoImpl.setRelationshipSourceIds(null);
+                               infoImpl.setRelationshipTargetIds(null);
+
+                               List<ObjectData> relationships = 
object.getRelationships();
+                               if (relationships != null && 
relationships.size() > 0) {
+                                       List<String> sourceIds = new 
ArrayList<String>();
+                                       List<String> targetIds = new 
ArrayList<String>();
+
+                                       for (ObjectData relationship : 
relationships) {
+                                               String sourceId = 
getIdProperty(relationship, PropertyIds.SOURCE_ID);
+                                               String targetId = 
getIdProperty(relationship, PropertyIds.TARGET_ID);
+
+                                               if 
(object.getId().equals(sourceId)) {
+                                                       
sourceIds.add(relationship.getId());
+                                               }
+                                               if 
(object.getId().equals(targetId)) {
+                                                       
targetIds.add(relationship.getId());
+                                               }
+                                       }
+
+                                       if (sourceIds.size() > 0) {
+                                               
infoImpl.setRelationshipSourceIds(sourceIds);
+                                       }
+                                       if (targetIds.size() > 0) {
+                                               
infoImpl.setRelationshipTargetIds(targetIds);
+                                       }
+                               }
+
+                               // global settings
+                               infoImpl.setHasAcl(false);
+                               infoImpl.setSupportsDescendants(false);
+                               infoImpl.setSupportsFolderTree(false);
+
+                               RepositoryCapabilities capabilities = 
repositoryInfo.getCapabilities();
+                               if (capabilities != null) {
+                                       
infoImpl.setHasAcl(capabilities.getAclCapability() == CapabilityAcl.DISCOVER
+                                                       || 
capabilities.getAclCapability() == CapabilityAcl.MANAGE);
+                                       if (object.getBaseTypeId() == 
BaseTypeId.CMIS_FOLDER) {
+                                               
infoImpl.setSupportsDescendants(Boolean.TRUE.equals(capabilities.isGetDescendantsSupported()));
+                                               
infoImpl.setSupportsFolderTree(Boolean.TRUE.equals(capabilities.isGetFolderTreeSupported()));
+                                       }
+                               }
+
+                               // switch on object info collection
+                               addObjectInfos = true;
+
+                               // add object info
+                               addObjectInfo(infoImpl);
+                               info = infoImpl;
+                       } catch (Exception e) {
+                               info = null;
+                       } finally {
+                               addObjectInfos = true;
+                       }
                }
 
-               return objectInfoMap.get(objectId);
+               return info;
        }
 
        /**
         * Adds an object info.
         */
        public void addObjectInfo(ObjectInfo objectInfo) {
-               if (objectInfoMap == null) {
-                       objectInfoMap = new HashMap<String, ObjectInfo>();
+               if (!addObjectInfos) {
+                       return;
                }
 
                if (objectInfo != null && objectInfo.getId() != null) {
-                       objectInfoMap.put(objectInfo.getId(), objectInfo);
+                       getObjectInfoMap().put(objectInfo.getId(), objectInfo);
                }
        }
 
+       /**
+        * Clears the object info map.
+        */
+       public void clearObjectInfos() {
+               objectInfoMap = null;
+       }
+
        public void close() {
+               clearObjectInfos();
+       }
+
+       // --- helpers ---
+
+       private String getStringProperty(ObjectData object, String name) {
+               PropertyData<?> property = 
object.getProperties().getProperties().get(name);
+               if (property instanceof PropertyString) {
+                       return ((PropertyString) property).getFirstValue();
+               }
+               return null;
+       }
+
+       private String getIdProperty(ObjectData object, String name) {
+               PropertyData<?> property = 
object.getProperties().getProperties().get(name);
+               if (property instanceof PropertyId) {
+                       return ((PropertyId) property).getFirstValue();
+               }
+               return null;
+       }
+
+       private GregorianCalendar getDateTimeProperty(ObjectData object, String 
name) {
+               PropertyData<?> property = 
object.getProperties().getProperties().get(name);
+               if (property instanceof PropertyDateTime) {
+                       return ((PropertyDateTime) property).getFirstValue();
+               }
+               return null;
+       }
+
+       private Boolean getBooleanProperty(ObjectData object, String name) {
+               PropertyData<?> property = 
object.getProperties().getProperties().get(name);
+               if (property instanceof PropertyBoolean) {
+                       return ((PropertyBoolean) property).getFirstValue();
+               }
+               return null;
+       }
+
+       private BigInteger getIntegerProperty(ObjectData object, String name) {
+               PropertyData<?> property = 
object.getProperties().getProperties().get(name);
+               if (property instanceof PropertyInteger) {
+                       return ((PropertyInteger) property).getFirstValue();
+               }
+               return null;
        }
 }

Added: 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/RenditionInfoImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/RenditionInfoImpl.java?rev=935546&view=auto
==============================================================================
--- 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/RenditionInfoImpl.java
 (added)
+++ 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-impl/src/main/java/org/apache/chemistry/opencmis/commons/impl/server/RenditionInfoImpl.java
 Mon Apr 19 12:49:41 2010
@@ -0,0 +1,75 @@
+/*
+ * 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.commons.impl.server;
+
+import java.math.BigInteger;
+
+import org.apache.chemistry.opencmis.commons.api.server.RenditionInfo;
+
+/**
+ * Implementation of the {...@link RenditionInfo} interface.
+ */
+public class RenditionInfoImpl implements RenditionInfo {
+
+       private String id;
+       private String contentType;
+       private String kind;
+       private String title;
+       private BigInteger length;
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getContenType() {
+               return contentType;
+       }
+
+       public void setContentType(String contentType) {
+               this.contentType = contentType;
+       }
+
+       public String getKind() {
+               return kind;
+       }
+
+       public void setKind(String kind) {
+               this.kind = kind;
+       }
+
+       public String getTitle() {
+               return title;
+       }
+
+       public void setTitle(String title) {
+               this.title = title;
+       }
+
+       public BigInteger getLength() {
+               return length;
+       }
+
+       public void setLength(BigInteger length) {
+               this.length = length;
+       }
+}

Modified: 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareService.java
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareService.java?rev=935546&r1=935545&r2=935546&view=diff
==============================================================================
--- 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareService.java
 (original)
+++ 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareService.java
 Mon Apr 19 12:49:41 2010
@@ -34,8 +34,8 @@ import org.apache.chemistry.opencmis.com
  */
 public class FileShareService extends AbstractCmisService {
 
-       private ThreadLocal<CallContext> threadLocalCallContext = new 
ThreadLocal<CallContext>();
        private RepositoryMap repositoryMap;
+       private CallContext context;
 
        /**
         * Constructor.
@@ -44,36 +44,25 @@ public class FileShareService extends Ab
                this.repositoryMap = repositoryMap;
        }
 
-       // --- thread locals ---
+       // --- context ---
 
-       public void setThreadCallContext(CallContext context) {
-               threadLocalCallContext.set(context);
+       public void setCallContext(CallContext context) {
+               this.context = context;
        }
 
-       public CallContext getThreadCallContext() {
-               return threadLocalCallContext.get();
-       }
-
-       public void removeThreadCallContext() {
-               threadLocalCallContext.remove();
+       public CallContext getCallContext() {
+               return context;
        }
 
        public FileShareRepository getRepository() {
-               return 
repositoryMap.getRepository(getThreadCallContext().getRepositoryId());
-       }
-
-       // --- life cycle ---
-
-       @Override
-       public void close() {
-               removeThreadCallContext();
+               return 
repositoryMap.getRepository(getCallContext().getRepositoryId());
        }
 
        // --- repository service ---
 
        @Override
        public RepositoryInfo getRepositoryInfo(String repositoryId, 
ExtensionsData extension) {
-               return 
getRepository().getRepositoryInfo(getThreadCallContext());
+               return getRepository().getRepositoryInfo(getCallContext());
        }
 
        @Override
@@ -81,7 +70,7 @@ public class FileShareService extends Ab
                List<RepositoryInfo> result = new ArrayList<RepositoryInfo>();
 
                for (FileShareRepository fsr : repositoryMap.getRepositories()) 
{
-                       
result.add(fsr.getRepositoryInfo(getThreadCallContext()));
+                       result.add(fsr.getRepositoryInfo(getCallContext()));
                }
 
                return result;
@@ -90,19 +79,19 @@ public class FileShareService extends Ab
        @Override
        public TypeDefinitionList getTypeChildren(String repositoryId, String 
typeId, Boolean includePropertyDefinitions,
                        BigInteger maxItems, BigInteger skipCount, 
ExtensionsData extension) {
-               return getRepository().getTypesChildren(getThreadCallContext(), 
typeId, includePropertyDefinitions, maxItems,
+               return getRepository().getTypesChildren(getCallContext(), 
typeId, includePropertyDefinitions, maxItems,
                                skipCount);
        }
 
        @Override
        public TypeDefinition getTypeDefinition(String repositoryId, String 
typeId, ExtensionsData extension) {
-               return 
getRepository().getTypeDefinition(getThreadCallContext(), typeId);
+               return getRepository().getTypeDefinition(getCallContext(), 
typeId);
        }
 
        @Override
        public List<TypeDefinitionContainer> getTypeDescendants(String 
repositoryId, String typeId, BigInteger depth,
                        Boolean includePropertyDefinitions, ExtensionsData 
extension) {
-               return 
getRepository().getTypesDescendants(getThreadCallContext(), typeId, depth, 
includePropertyDefinitions);
+               return getRepository().getTypesDescendants(getCallContext(), 
typeId, depth, includePropertyDefinitions);
        }
 
        // --- navigation service ---
@@ -111,7 +100,7 @@ public class FileShareService extends Ab
        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(getThreadCallContext(), 
folderId, filter, includeAllowableActions,
+               return getRepository().getChildren(getCallContext(), folderId, 
filter, includeAllowableActions,
                                includePathSegment, maxItems, skipCount, null);
        }
 
@@ -119,20 +108,20 @@ public class FileShareService extends Ab
        public List<ObjectInFolderContainer> getDescendants(String 
repositoryId, String folderId, BigInteger depth,
                        String filter, Boolean includeAllowableActions, 
IncludeRelationships includeRelationships,
                        String renditionFilter, Boolean includePathSegment, 
ExtensionsData extension) {
-               return getRepository().getDescendants(getThreadCallContext(), 
folderId, depth, filter, includeAllowableActions,
+               return getRepository().getDescendants(getCallContext(), 
folderId, depth, filter, includeAllowableActions,
                                includePathSegment, null, false);
        }
 
        @Override
        public ObjectData getFolderParent(String repositoryId, String folderId, 
String filter, ExtensionsData extension) {
-               return getRepository().getFolderParent(getThreadCallContext(), 
folderId, filter, null);
+               return getRepository().getFolderParent(getCallContext(), 
folderId, filter, null);
        }
 
        @Override
        public List<ObjectInFolderContainer> getFolderTree(String repositoryId, 
String folderId, BigInteger depth,
                        String filter, Boolean includeAllowableActions, 
IncludeRelationships includeRelationships,
                        String renditionFilter, Boolean includePathSegment, 
ExtensionsData extension) {
-               return getRepository().getDescendants(getThreadCallContext(), 
folderId, depth, filter, includeAllowableActions,
+               return getRepository().getDescendants(getCallContext(), 
folderId, depth, filter, includeAllowableActions,
                                includePathSegment, null, true);
        }
 
@@ -140,7 +129,7 @@ public class FileShareService extends Ab
        public List<ObjectParentData> getObjectParents(String repositoryId, 
String objectId, String filter,
                        Boolean includeAllowableActions, IncludeRelationships 
includeRelationships, String renditionFilter,
                        Boolean includeRelativePathSegment, ExtensionsData 
extension) {
-               return getRepository().getObjectParents(getThreadCallContext(), 
objectId, filter, includeAllowableActions,
+               return getRepository().getObjectParents(getCallContext(), 
objectId, filter, includeAllowableActions,
                                includeRelativePathSegment, null);
        }
 
@@ -162,7 +151,7 @@ public class FileShareService extends Ab
        @Override
        public String create(String repositoryId, Properties properties, String 
folderId, ContentStream contentStream,
                        VersioningState versioningState, List<String> policies, 
ExtensionsData extension) {
-               ObjectData object = 
getRepository().create(getThreadCallContext(), properties, folderId, 
contentStream,
+               ObjectData object = getRepository().create(getCallContext(), 
properties, folderId, contentStream,
                                versioningState, null);
 
                return object.getId();
@@ -172,72 +161,70 @@ public class FileShareService extends Ab
        public String createDocument(String repositoryId, Properties 
properties, String folderId,
                        ContentStream contentStream, VersioningState 
versioningState, List<String> policies, Acl addAces,
                        Acl removeAces, ExtensionsData extension) {
-               return getRepository().createDocument(getThreadCallContext(), 
properties, folderId, contentStream,
-                               versioningState);
+               return getRepository().createDocument(getCallContext(), 
properties, folderId, contentStream, versioningState);
        }
 
        @Override
        public String createDocumentFromSource(String repositoryId, String 
sourceId, Properties properties,
                        String folderId, VersioningState versioningState, 
List<String> policies, Acl addAces, Acl removeAces,
                        ExtensionsData extension) {
-               return 
getRepository().createDocumentFromSource(getThreadCallContext(), sourceId, 
properties, folderId,
+               return 
getRepository().createDocumentFromSource(getCallContext(), sourceId, 
properties, folderId,
                                versioningState);
        }
 
        @Override
        public String createFolder(String repositoryId, Properties properties, 
String folderId, List<String> policies,
                        Acl addAces, Acl removeAces, ExtensionsData extension) {
-               return getRepository().createFolder(getThreadCallContext(), 
properties, folderId);
+               return getRepository().createFolder(getCallContext(), 
properties, folderId);
        }
 
        @Override
        public void deleteContentStream(String repositoryId, Holder<String> 
objectId, Holder<String> changeToken,
                        ExtensionsData extension) {
-               getRepository().setContentStream(getThreadCallContext(), 
objectId, true, null);
+               getRepository().setContentStream(getCallContext(), objectId, 
true, null);
        }
 
        @Override
        public void deleteObjectOrCancelCheckOut(String repositoryId, String 
objectId, Boolean allVersions,
                        ExtensionsData extension) {
-               getRepository().deleteObject(getThreadCallContext(), objectId);
+               getRepository().deleteObject(getCallContext(), objectId);
        }
 
        @Override
        public FailedToDeleteData deleteTree(String repositoryId, String 
folderId, Boolean allVersions,
                        UnfileObject unfileObjects, Boolean continueOnFailure, 
ExtensionsData extension) {
-               return getRepository().deleteTree(getThreadCallContext(), 
folderId, continueOnFailure);
+               return getRepository().deleteTree(getCallContext(), folderId, 
continueOnFailure);
        }
 
        @Override
        public AllowableActions getAllowableActions(String repositoryId, String 
objectId, ExtensionsData extension) {
-               return 
getRepository().getAllowableActions(getThreadCallContext(), objectId);
+               return getRepository().getAllowableActions(getCallContext(), 
objectId);
        }
 
        @Override
        public ContentStream getContentStream(String repositoryId, String 
objectId, String streamId, BigInteger offset,
                        BigInteger length, ExtensionsData extension) {
-               return getRepository().getContentStream(getThreadCallContext(), 
objectId, offset, length);
+               return getRepository().getContentStream(getCallContext(), 
objectId, offset, length);
        }
 
        @Override
        public ObjectData getObject(String repositoryId, String objectId, 
String filter, Boolean includeAllowableActions,
                        IncludeRelationships includeRelationships, String 
renditionFilter, Boolean includePolicyIds,
                        Boolean includeAcl, ExtensionsData extension) {
-               return getRepository().getObject(getThreadCallContext(), 
objectId, filter, includeAllowableActions, includeAcl,
-                               null);
+               return getRepository().getObject(getCallContext(), objectId, 
filter, includeAllowableActions, includeAcl, null);
        }
 
        @Override
        public ObjectData getObjectByPath(String repositoryId, String path, 
String filter, Boolean includeAllowableActions,
                        IncludeRelationships includeRelationships, String 
renditionFilter, Boolean includePolicyIds,
                        Boolean includeAcl, ExtensionsData extension) {
-               return getRepository().getObjectByPath(getThreadCallContext(), 
path, filter, includeAllowableActions,
-                               includeAcl, null);
+               return getRepository().getObjectByPath(getCallContext(), path, 
filter, includeAllowableActions, includeAcl,
+                               null);
        }
 
        @Override
        public Properties getProperties(String repositoryId, String objectId, 
String filter, ExtensionsData extension) {
-               ObjectData object = 
getRepository().getObject(getThreadCallContext(), objectId, filter, false, 
false, null);
+               ObjectData object = getRepository().getObject(getCallContext(), 
objectId, filter, false, false, null);
                return object.getProperties();
        }
 
@@ -250,19 +237,19 @@ public class FileShareService extends Ab
        @Override
        public void moveObject(String repositoryId, Holder<String> objectId, 
String targetFolderId, String sourceFolderId,
                        ExtensionsData extension) {
-               getRepository().moveObject(getThreadCallContext(), objectId, 
targetFolderId, null);
+               getRepository().moveObject(getCallContext(), objectId, 
targetFolderId, null);
        }
 
        @Override
        public void setContentStream(String repositoryId, Holder<String> 
objectId, Boolean overwriteFlag,
                        Holder<String> changeToken, ContentStream 
contentStream, ExtensionsData extension) {
-               getRepository().setContentStream(getThreadCallContext(), 
objectId, overwriteFlag, contentStream);
+               getRepository().setContentStream(getCallContext(), objectId, 
overwriteFlag, contentStream);
        }
 
        @Override
        public void updateProperties(String repositoryId, Holder<String> 
objectId, Holder<String> changeToken,
                        Properties properties, ExtensionsData extension) {
-               getRepository().updateProperties(getThreadCallContext(), 
objectId, properties, null);
+               getRepository().updateProperties(getCallContext(), objectId, 
properties, null);
        }
 
        // --- versioning service ---
@@ -270,7 +257,7 @@ public class FileShareService extends Ab
        @Override
        public List<ObjectData> getAllVersions(String repositoryId, String 
objectId, String versionSeriesId, String filter,
                        Boolean includeAllowableActions, ExtensionsData 
extension) {
-               ObjectData theVersion = 
getRepository().getObject(getThreadCallContext(), versionSeriesId, filter,
+               ObjectData theVersion = 
getRepository().getObject(getCallContext(), versionSeriesId, filter,
                                includeAllowableActions, false, null);
 
                return Collections.singletonList(theVersion);
@@ -280,15 +267,14 @@ public class FileShareService extends Ab
        public ObjectData getObjectOfLatestVersion(String repositoryId, String 
objectId, String versionSeriesId,
                        Boolean major, String filter, Boolean 
includeAllowableActions, IncludeRelationships includeRelationships,
                        String renditionFilter, Boolean includePolicyIds, 
Boolean includeAcl, ExtensionsData extension) {
-               return getRepository().getObject(getThreadCallContext(), 
versionSeriesId, filter, includeAllowableActions,
+               return getRepository().getObject(getCallContext(), 
versionSeriesId, filter, includeAllowableActions,
                                includeAcl, null);
        }
 
        @Override
        public Properties getPropertiesOfLatestVersion(String repositoryId, 
String objectId, String versionSeriesId,
                        Boolean major, String filter, ExtensionsData extension) 
{
-               ObjectData object = 
getRepository().getObject(getThreadCallContext(), versionSeriesId, filter, 
false, false,
-                               null);
+               ObjectData object = getRepository().getObject(getCallContext(), 
versionSeriesId, filter, false, false, null);
 
                return object.getProperties();
        }
@@ -297,6 +283,6 @@ public class FileShareService extends Ab
 
        @Override
        public Acl getAcl(String repositoryId, String objectId, Boolean 
onlyBasicPermissions, ExtensionsData extension) {
-               return getRepository().getAcl(getThreadCallContext(), objectId);
+               return getRepository().getAcl(getCallContext(), objectId);
        }
 }

Modified: 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareServiceFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareServiceFactory.java?rev=935546&r1=935545&r2=935546&view=diff
==============================================================================
--- 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareServiceFactory.java
 (original)
+++ 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-fileshare/src/main/java/org/apache/chemistry/opencmis/fileshare/FileShareServiceFactory.java
 Mon Apr 19 12:49:41 2010
@@ -40,8 +40,7 @@ public class FileShareServiceFactory ext
        private RepositoryMap repositoryMap;
        private TypeManager typeManager;
 
-       private FileShareService fileShareService;
-       private CmisService wrapperService;
+       private ThreadLocal<CmisServiceWrapper<FileShareService>> 
threadLocalService = new ThreadLocal<CmisServiceWrapper<FileShareService>>();
 
        public FileShareServiceFactory() {
        }
@@ -52,17 +51,25 @@ public class FileShareServiceFactory ext
                typeManager = new TypeManager();
 
                readConfiguration(parameters);
+       }
 
-               // create service object and wrapper
-               fileShareService = new FileShareService(repositoryMap);
-               wrapperService = new CmisServiceWrapper(fileShareService, 
DEFAULT_MAX_ITEMS_TYPES, DEFAULT_DEPTH_TYPES,
-                               DEFAULT_MAX_ITEMS_OBJECTS, 
DEFAULT_DEPTH_OBJECTS);
+       @Override
+       public void destroy() {
+               threadLocalService = null;
        }
 
        @Override
        public CmisService getService(CallContext context) {
                repositoryMap.getAuthenticatedRepository(context, 
context.getRepositoryId());
-               fileShareService.setThreadCallContext(context);
+
+               CmisServiceWrapper<FileShareService> wrapperService = 
threadLocalService.get();
+               if (wrapperService == null) {
+                       wrapperService = new 
CmisServiceWrapper<FileShareService>(new FileShareService(repositoryMap),
+                                       DEFAULT_MAX_ITEMS_TYPES, 
DEFAULT_DEPTH_TYPES, DEFAULT_MAX_ITEMS_OBJECTS, DEFAULT_DEPTH_OBJECTS);
+                       threadLocalService.set(wrapperService);
+               }
+
+               wrapperService.getWrappedService().setCallContext(context);
 
                return wrapperService;
        }

Modified: 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/CmisServiceWrapper.java
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/CmisServiceWrapper.java?rev=935546&r1=935545&r2=935546&view=diff
==============================================================================
--- 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/CmisServiceWrapper.java
 (original)
+++ 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/CmisServiceWrapper.java
 Mon Apr 19 12:49:41 2010
@@ -36,7 +36,7 @@ import org.apache.commons.logging.LogFac
 /**
  * Service wrapper.
  */
-public class CmisServiceWrapper implements CmisService {
+public class CmisServiceWrapper<T extends CmisService> implements CmisService {
 
        public static final BigInteger MINUS_ONE = BigInteger.valueOf(-1);
 
@@ -48,12 +48,12 @@ public class CmisServiceWrapper implemen
        private BigInteger defaultMaxItems = null;
        private BigInteger defaultDepth = MINUS_ONE;
 
-       private CmisService service;
+       private T service;
 
        /**
         * Constructor.
         */
-       public CmisServiceWrapper(CmisService service, BigInteger 
defaultTypesMaxItems, BigInteger defaultTypesDepth,
+       public CmisServiceWrapper(T service, BigInteger defaultTypesMaxItems, 
BigInteger defaultTypesDepth,
                        BigInteger defaultMaxItems, BigInteger defaultDepth) {
                if (service == null) {
                        throw new IllegalArgumentException("Service must be 
set!");
@@ -400,8 +400,12 @@ public class CmisServiceWrapper implemen
 
        // --- service operations ---
 
-       public ObjectInfo getObjectInfo(String objectId) {
-               return service.getObjectInfo(objectId);
+       public T getWrappedService() {
+               return service;
+       }
+
+       public ObjectInfo getObjectInfo(String repositoryId, String objectId) {
+               return service.getObjectInfo(repositoryId, objectId);
        }
 
        public void close() {

Modified: 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/ObjectInfoHelper.java
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/ObjectInfoHelper.java?rev=935546&r1=935545&r2=935546&view=diff
==============================================================================
--- 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/ObjectInfoHelper.java
 (original)
+++ 
incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/ObjectInfoHelper.java
 Mon Apr 19 12:49:41 2010
@@ -44,7 +44,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.enums.CapabilityAcl;
 import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
 import org.apache.chemistry.opencmis.commons.impl.server.ObjectInfoImpl;
-import org.apache.chemistry.opencmis.commons.impl.server.RenditionInfosImpl;
+import org.apache.chemistry.opencmis.commons.impl.server.RenditionInfoImpl;
 import org.apache.chemistry.opencmis.server.spi.CmisNavigationService;
 import org.apache.chemistry.opencmis.server.spi.CmisObjectService;
 import org.apache.chemistry.opencmis.server.spi.CmisRepositoryService;
@@ -444,7 +444,7 @@ public class ObjectInfoHelper {
                        return null;
 
                List<RenditionInfo> rendInfos = new 
ArrayList<RenditionInfo>(renditions.size());
-               RenditionInfosImpl ri = new RenditionInfosImpl();
+               RenditionInfoImpl ri = new RenditionInfoImpl();
                for (RenditionData rd : renditions) {
                        ri.setContentType(rd.getMimeType());
                        ri.setId(rd.getStreamId());


Reply via email to