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 2010/03/23 13:23:29 UTC

svn commit: r926534 [2/2] - in /incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src: main/java/org/apache/opencmis/inmemory/clientprovider/ main/java/org/apache/opencmis/inmemory/server/ test/java/org/apache/opencmis/inmemory/

Modified: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java?rev=926534&r1=926533&r2=926534&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java Tue Mar 23 12:23:29 2010
@@ -38,160 +38,186 @@ import org.apache.opencmis.inmemory.stor
 import org.apache.opencmis.server.spi.CallContext;
 import org.apache.opencmis.server.spi.CmisRepositoryService;
 
-public class InMemoryRepositoryServiceImpl extends AbstractServiceImpl implements CmisRepositoryService {
-  
+public class InMemoryRepositoryServiceImpl extends AbstractServiceImpl implements
+    CmisRepositoryService {
+
   public InMemoryRepositoryServiceImpl(StoreManager storeManager) {
     super(storeManager);
   }
 
   public RepositoryInfoData getRepositoryInfo(CallContext context, String repositoryId,
       ExtensionsData extension) {
-    
+
     // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
-    
+    RuntimeContext.attachCfg(context);
+
     RepositoryInfoData repoInfo = getRepositoryInfoFromStoreManager(repositoryId);
 
     return repoInfo;
-   }
+  }
 
   public List<RepositoryInfoData> getRepositoryInfos(CallContext context, ExtensionsData extension) {
-    
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
 
-    List<RepositoryInfoData> res = new ArrayList<RepositoryInfoData>();
-    List<String> repIds = fStoreManager.getAllRepositoryIds();
-    for (String repId : repIds) {
-      res.add(fStoreManager.getRepositoryInfo(repId));
+    try {
+      // Attach the CallContext to a thread local context that can be accessed from everywhere
+      RuntimeContext.attachCfg(context);
+
+      List<RepositoryInfoData> res = new ArrayList<RepositoryInfoData>();
+      List<String> repIds = fStoreManager.getAllRepositoryIds();
+      for (String repId : repIds) {
+        res.add(fStoreManager.getRepositoryInfo(repId));
+      }
+      return res;
+    }
+    finally {
+      RuntimeContext.remove();
     }
-    return res;
   }
 
   public TypeDefinitionList getTypeChildren(CallContext context, String repositoryId,
       String typeId, Boolean includePropertyDefinitions, BigInteger maxItems, BigInteger skipCount,
       ExtensionsData extension) {
-    
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
 
-    getRepositoryInfoFromStoreManager(repositoryId); // just to check if repository exists
+    try {
+      // Attach the CallContext to a thread local context that can be accessed from everywhere
+      RuntimeContext.attachCfg(context);
+
+      getRepositoryInfoFromStoreManager(repositoryId); // just to check if repository exists
+
+      int skip = skipCount == null ? 0 : skipCount.intValue();
+      int max = maxItems == null ? -1 : maxItems.intValue();
+
+      TypeDefinitionListImpl result = new TypeDefinitionListImpl();
+      List<TypeDefinitionContainer> children;
+      if (typeId == null) {
+        // spec says that base types must be returned in this case
+        children = fStoreManager.getRootTypes(repositoryId);
+      }
+      else {
+        children = getTypeDescendants(context, repositoryId, typeId, BigInteger.valueOf(1),
+            includePropertyDefinitions, null);
+      }
+      result.setNumItems(BigInteger.valueOf(children.size()));
+      result.setHasMoreItems(children.size() > max - skip);
+      List<TypeDefinition> childrenTypes = new ArrayList<TypeDefinition>();
+      ListIterator<TypeDefinitionContainer> it = children.listIterator(skip);
+      if (max < 0)
+        max = children.size();
+      for (int i = skip; i < max + skip && it.hasNext(); i++)
+        childrenTypes.add(it.next().getTypeDefinition());
 
-    int skip = skipCount == null ? 0 : skipCount.intValue();
-    int max = maxItems == null ? -1 : maxItems.intValue();
-      
-    TypeDefinitionListImpl result = new TypeDefinitionListImpl();
-    List<TypeDefinitionContainer> children;
-    if (typeId == null) {
-      // spec says that base types must be returned in this case
-      children = fStoreManager.getRootTypes(repositoryId);
-    } else {    
-      children = getTypeDescendants(context, repositoryId, typeId, 
-        BigInteger.valueOf(1), includePropertyDefinitions, null);
-    }
-    result.setNumItems(BigInteger.valueOf(children.size()));
-    result.setHasMoreItems(children.size() > max - skip);
-    List<TypeDefinition> childrenTypes = new ArrayList<TypeDefinition>();
-    ListIterator<TypeDefinitionContainer> it = children.listIterator(skip);
-    if (max<0)
-      max = children.size();
-    for (int i=skip; i<max+skip && it.hasNext(); i++)
-      childrenTypes.add(it.next().getTypeDefinition());
-
-    result.setList(childrenTypes);      
-    return result;
-  }
-  
-  public TypeDefinition getTypeDefinition(CallContext context, String repositoryId,
-      String typeId, ExtensionsData extension) {
-    
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
+      result.setList(childrenTypes);
+      return result;
+    }
+    finally {
+      RuntimeContext.remove();
+    }
+  }
+
+  public TypeDefinition getTypeDefinition(CallContext context, String repositoryId, String typeId,
+      ExtensionsData extension) {
+
+    try {
+      // Attach the CallContext to a thread local context that can be accessed from everywhere
+      RuntimeContext.attachCfg(context);
 
-    getRepositoryInfoFromStoreManager(repositoryId); // just to check if repository exists
+      getRepositoryInfoFromStoreManager(repositoryId); // just to check if repository exists
 
-    TypeDefinitionContainer tc = fStoreManager.getTypeById(repositoryId, typeId);
-    if (tc != null) {
-      return tc.getTypeDefinition();
+      TypeDefinitionContainer tc = fStoreManager.getTypeById(repositoryId, typeId);
+      if (tc != null) {
+        return tc.getTypeDefinition();
+      }
+      else
+        throw new CmisObjectNotFoundException("unknown type id: " + typeId);
+    }
+    finally {
+      RuntimeContext.remove();
     }
-    else
-      throw new CmisObjectNotFoundException("unknown type id: " + typeId);        
   }
 
   public List<TypeDefinitionContainer> getTypeDescendants(CallContext context, String repositoryId,
       String typeId, BigInteger depth, Boolean includePropertyDefinitions, ExtensionsData extension) {
-    
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
-
-    getRepositoryInfoFromStoreManager(repositoryId); // just to check if repository exists
 
-    if (depth != null && depth.intValue() == 0)
-      throw new CmisInvalidArgumentException("depth == 0 is illegal in getTypeDescendants");
-    
-    List<TypeDefinitionContainer> result =  null;
-    if (typeId == null) {
-      // spec says that depth must be ignored in this case
-        Collection<TypeDefinitionContainer> typeColl = fStoreManager.getTypeDefinitionList(repositoryId);
+    try {
+      // Attach the CallContext to a thread local context that can be accessed from everywhere
+      RuntimeContext.attachCfg(context);
+
+      getRepositoryInfoFromStoreManager(repositoryId); // just to check if repository exists
+
+      if (depth != null && depth.intValue() == 0)
+        throw new CmisInvalidArgumentException("depth == 0 is illegal in getTypeDescendants");
+
+      List<TypeDefinitionContainer> result = null;
+      if (typeId == null) {
+        // spec says that depth must be ignored in this case
+        Collection<TypeDefinitionContainer> typeColl = fStoreManager
+            .getTypeDefinitionList(repositoryId);
         result = new ArrayList<TypeDefinitionContainer>(typeColl);
         if (!includePropertyDefinitions) {
           // copy list and omit properties
           for (TypeDefinitionContainer c : result) {
-            AbstractTypeDefinition td = ((AbstractTypeDefinition)c.getTypeDefinition()).clone();
+            AbstractTypeDefinition td = ((AbstractTypeDefinition) c.getTypeDefinition()).clone();
             TypeDefinitionContainerImpl tdc = new TypeDefinitionContainerImpl(td);
             tdc.setChildren(c.getChildren());
             td.setPropertyDefinitions(null);
           }
         }
-    }
-    else {
-      TypeDefinitionContainer tc = fStoreManager.getTypeById(repositoryId, typeId);
-      if (tc != null) {
-        if (null==depth || depth.intValue() == -1) {
-          result = tc.getChildren();
-          if (!includePropertyDefinitions)
-            cloneTypeList(depth.intValue()-1, false, result);
-        } else if (depth.intValue() == 0 || depth.intValue() < -1)
-          throw new CmisInvalidArgumentException("illegal depth value: " + depth.intValue());        
-        else {
-          result = tc.getChildren();
-          cloneTypeList(depth.intValue()-1, includePropertyDefinitions, result);
+      }
+      else {
+        TypeDefinitionContainer tc = fStoreManager.getTypeById(repositoryId, typeId);
+        if (tc != null) {
+          if (null == depth || depth.intValue() == -1) {
+            result = tc.getChildren();
+            if (!includePropertyDefinitions)
+              cloneTypeList(depth.intValue() - 1, false, result);
+          }
+          else if (depth.intValue() == 0 || depth.intValue() < -1)
+            throw new CmisInvalidArgumentException("illegal depth value: " + depth.intValue());
+          else {
+            result = tc.getChildren();
+            cloneTypeList(depth.intValue() - 1, includePropertyDefinitions, result);
+          }
         }
+        else
+          throw new CmisInvalidArgumentException("unknown type id: " + typeId);
       }
-      else
-        throw new CmisInvalidArgumentException("unknown type id: " + typeId);        
+
+      return result;
+    }
+    finally {
+      RuntimeContext.remove();
     }
-    
-    return result;
   }
 
   /**
-   * traverse tree and replace each need node with a clone. remove properties on 
-   * clone if requested, cut children of clone if depth is exceeded.
+   * traverse tree and replace each need node with a clone. remove properties on clone if requested,
+   * cut children of clone if depth is exceeded.
+   * 
    * @param depth
    * @param types
    */
   private void cloneTypeList(int depth, boolean includePropertyDefinitions,
       List<TypeDefinitionContainer> types) {
-  
+
     ListIterator<TypeDefinitionContainer> it = types.listIterator();
     while (it.hasNext()) {
       TypeDefinitionContainer tdc = it.next();
-      AbstractTypeDefinition td = ((AbstractTypeDefinition)tdc.getTypeDefinition()).clone();
+      AbstractTypeDefinition td = ((AbstractTypeDefinition) tdc.getTypeDefinition()).clone();
       if (!includePropertyDefinitions)
         td.setPropertyDefinitions(null);
       TypeDefinitionContainerImpl tdcClone = new TypeDefinitionContainerImpl(td);
       if (depth > 0) {
-        ArrayList<TypeDefinitionContainer> children = new ArrayList<TypeDefinitionContainer>(tdc.getChildren().size());
+        ArrayList<TypeDefinitionContainer> children = new ArrayList<TypeDefinitionContainer>(tdc
+            .getChildren().size());
         children.addAll(tdc.getChildren());
         tdcClone.setChildren(children);
-        cloneTypeList(depth-1, includePropertyDefinitions, children);
+        cloneTypeList(depth - 1, includePropertyDefinitions, children);
       }
-      it.set(tdcClone);       
+      it.set(tdcClone);
     }
   }
 
-  private RepositoryInfoData getRepositoryInfoFromStoreManager(String repositoryId ) {
+  private RepositoryInfoData getRepositoryInfoFromStoreManager(String repositoryId) {
     RepositoryInfoData repoInfo = fStoreManager.getRepositoryInfo(repositoryId);
     if (null == repoInfo || !repoInfo.getRepositoryId().equals(repositoryId)) {
       throw new CmisInvalidArgumentException("Unknown repository: " + repositoryId);

Modified: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryVersioningServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryVersioningServiceImpl.java?rev=926534&r1=926533&r2=926534&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryVersioningServiceImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryVersioningServiceImpl.java Tue Mar 23 12:23:29 2010
@@ -64,116 +64,138 @@ public class InMemoryVersioningServiceIm
   public void cancelCheckOut(CallContext context, String repositoryId, String objectId,
       ExtensionsData extension) {
 
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
+    try {
+      // Attach the CallContext to a thread local context that can be accessed from everywhere
+      RuntimeContext.attachCfg(context);
+
+      StoredObject so = checkStandardParameters(repositoryId, objectId);
+      String user = RuntimeContext.getRuntimeConfigValue(CallContext.USERNAME);
+      VersionedDocument verDoc = testHasProperCheckedOutStatus(so, user);
 
-    StoredObject so = checkStandardParameters(repositoryId, objectId);
-    String user = RuntimeContext.getRuntimeConfigValue(CallContext.USERNAME);
-    VersionedDocument verDoc = testHasProperCheckedOutStatus(so, user);
-
-    verDoc.cancelCheckOut(user);
+      verDoc.cancelCheckOut(user);
+    }
+    finally {
+      RuntimeContext.remove();
+    }
   }
 
   public ObjectData checkIn(CallContext context, String repositoryId, Holder<String> objectId,
       Boolean major, PropertiesData properties, ContentStreamData contentStream,
       String checkinComment, List<String> policies, AccessControlList addAces,
       AccessControlList removeAces, ExtensionsData extension, ObjectInfoHolder objectInfos) {
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
 
-    StoredObject so = checkStandardParameters(repositoryId, objectId.getValue());
-    String user = RuntimeContext.getRuntimeConfigValue(CallContext.USERNAME);
-    VersionedDocument verDoc = testHasProperCheckedOutStatus(so, user);
+    try {
+      // Attach the CallContext to a thread local context that can be accessed from everywhere
+      RuntimeContext.attachCfg(context);
 
-    DocumentVersion pwc = verDoc.getPwc();
+      StoredObject so = checkStandardParameters(repositoryId, objectId.getValue());
+      String user = RuntimeContext.getRuntimeConfigValue(CallContext.USERNAME);
+      VersionedDocument verDoc = testHasProperCheckedOutStatus(so, user);
 
-    if (null != contentStream)
-      pwc.setContent(contentStream, false);
+      DocumentVersion pwc = verDoc.getPwc();
 
-    if (null != properties && null != properties.getProperties())
-      pwc.setCustomProperties(properties.getProperties());
+      if (null != contentStream)
+        pwc.setContent(contentStream, false);
 
-    verDoc.checkIn(major, checkinComment, user);
+      if (null != properties && null != properties.getProperties())
+        pwc.setCustomProperties(properties.getProperties());
 
-    // To be able to provide all Atom links in the response we need additional information:
-    fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfos);
+      verDoc.checkIn(major, checkinComment, user);
 
-    ObjectData od = PropertyCreationHelper.getObjectData(fStoreManager, so, null, false,
-        IncludeRelationships.NONE, null, false, false, extension);
+      // To be able to provide all Atom links in the response we need additional information:
+      fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfos);
 
-    return od;
+      ObjectData od = PropertyCreationHelper.getObjectData(fStoreManager, so, null, false,
+          IncludeRelationships.NONE, null, false, false, extension);
+
+      return od;
+    }
+    finally {
+      RuntimeContext.remove();
+    }
   }
 
   public ObjectData checkOut(CallContext context, String repositoryId, Holder<String> objectId,
       ExtensionsData extension, Holder<Boolean> contentCopied, ObjectInfoHolder objectInfos) {
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
 
-    StoredObject so = checkStandardParameters(repositoryId, objectId.getValue());
-    TypeDefinition typeDef = getTypeDefinition(repositoryId, so);
-    if (!typeDef.getBaseId().equals(BaseObjectTypeIds.CMIS_DOCUMENT))
-      throw new CmisNotSupportedException("Only documents can be checked-out.");
-    else if (!((DocumentTypeDefinition) typeDef).isVersionable())
-      throw new CmisNotSupportedException("Object can't be checked-out, type is not versionable.");
+    try {
+      // Attach the CallContext to a thread local context that can be accessed from everywhere
+      RuntimeContext.attachCfg(context);
 
-    checkIsVersionableObject(so);
+      StoredObject so = checkStandardParameters(repositoryId, objectId.getValue());
+      TypeDefinition typeDef = getTypeDefinition(repositoryId, so);
+      if (!typeDef.getBaseId().equals(BaseObjectTypeIds.CMIS_DOCUMENT))
+        throw new CmisNotSupportedException("Only documents can be checked-out.");
+      else if (!((DocumentTypeDefinition) typeDef).isVersionable())
+        throw new CmisNotSupportedException("Object can't be checked-out, type is not versionable.");
 
-    VersionedDocument verDoc = getVersionedDocumentOfObjectId(so);
+      checkIsVersionableObject(so);
 
-    ContentStreamData content = null;
+      VersionedDocument verDoc = getVersionedDocumentOfObjectId(so);
 
-    if (so instanceof DocumentVersion) {
-      // get document the version is contained in to c
-      content = ((DocumentVersion) so).getContent(0, -1);
-    }
-    else {
-      content = ((VersionedDocument) so).getLatestVersion(false).getContent(0, -1);
-    }
+      ContentStreamData content = null;
+
+      if (so instanceof DocumentVersion) {
+        // get document the version is contained in to c
+        content = ((DocumentVersion) so).getContent(0, -1);
+      }
+      else {
+        content = ((VersionedDocument) so).getLatestVersion(false).getContent(0, -1);
+      }
 
-    if (verDoc.isCheckedOut())
-      throw new CmisUpdateConflictException("Document " + objectId.getValue()
-          + " is already checked out.");
+      if (verDoc.isCheckedOut())
+        throw new CmisUpdateConflictException("Document " + objectId.getValue()
+            + " is already checked out.");
 
-    String user = RuntimeContext.getRuntimeConfigValue(CallContext.USERNAME);
-    checkHasUser(user);
+      String user = RuntimeContext.getRuntimeConfigValue(CallContext.USERNAME);
+      checkHasUser(user);
 
-    DocumentVersion pwc = verDoc.checkOut(content, user);
-    objectId.setValue(pwc.getId()); // return the id of the created pwc
+      DocumentVersion pwc = verDoc.checkOut(content, user);
+      objectId.setValue(pwc.getId()); // return the id of the created pwc
 
-    // To be able to provide all Atom links in the response we need additional information:
-    fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfos);
+      // To be able to provide all Atom links in the response we need additional information:
+      fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfos);
 
-    ObjectData od = PropertyCreationHelper.getObjectData(fStoreManager, so, null, false,
-        IncludeRelationships.NONE, null, false, false, extension);
+      ObjectData od = PropertyCreationHelper.getObjectData(fStoreManager, so, null, false,
+          IncludeRelationships.NONE, null, false, false, extension);
 
-    return od;
+      return od;
+    }
+    finally {
+      RuntimeContext.remove();
+    }
   }
 
   public List<ObjectData> getAllVersions(CallContext context, String repositoryId,
       String versionSeriesId, String filter, Boolean includeAllowableActions,
       ExtensionsData extension, ObjectInfoHolder objectInfos) {
 
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
+    try {
+      // Attach the CallContext to a thread local context that can be accessed from everywhere
+      RuntimeContext.attachCfg(context);
 
-    StoredObject so = checkStandardParameters(repositoryId, versionSeriesId);
+      StoredObject so = checkStandardParameters(repositoryId, versionSeriesId);
 
-    if (!(so instanceof VersionedDocument))
-      throw new RuntimeException("Object is not instance of a VersionedDocument (version series)");
+      if (!(so instanceof VersionedDocument))
+        throw new RuntimeException("Object is not instance of a VersionedDocument (version series)");
 
-    VersionedDocument verDoc = (VersionedDocument) so;
-    List<ObjectData> res = new ArrayList<ObjectData>();
-    List<DocumentVersion> versions = verDoc.getAllVersions();
-    for (DocumentVersion version : versions) {
-      ObjectData objData = getObject(context, repositoryId, version.getId(), filter,
-          includeAllowableActions, extension, objectInfos);
-      res.add(objData);
-    }
+      VersionedDocument verDoc = (VersionedDocument) so;
+      List<ObjectData> res = new ArrayList<ObjectData>();
+      List<DocumentVersion> versions = verDoc.getAllVersions();
+      for (DocumentVersion version : versions) {
+        ObjectData objData = getObject(context, repositoryId, version.getId(), filter,
+            includeAllowableActions, extension, objectInfos);
+        res.add(objData);
+      }
 
-    // provide information for Atom links for version series:
-    fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfos);
+      // provide information for Atom links for version series:
+      fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfos);
 
-    return res;
+      return res;
+    }
+    finally {
+      RuntimeContext.remove();
+    }
   }
 
   public ObjectData getObjectOfLatestVersion(CallContext context, String repositoryId,
@@ -181,54 +203,65 @@ public class InMemoryVersioningServiceIm
       IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
       Boolean includeAcl, ExtensionsData extension, ObjectInfoHolder objectInfos) {
 
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
+    try {
+      // Attach the CallContext to a thread local context that can be accessed from everywhere
+      RuntimeContext.attachCfg(context);
+
+      StoredObject so = checkStandardParameters(repositoryId, versionSeriesId);
+      ObjectData objData = null;
+
+      if (so instanceof VersionedDocument) {
+        VersionedDocument verDoc = (VersionedDocument) so;
+        DocumentVersion latestVersion = verDoc.getLatestVersion(major);
+        objData = getObject(context, repositoryId, latestVersion.getId(), filter,
+            includeAllowableActions, extension, objectInfos);
+      }
+      else if (so instanceof Document) {
+        objData = getObject(context, repositoryId, so.getId(), filter, includeAllowableActions,
+            extension, objectInfos);
+      }
+      else
+        throw new RuntimeException("Object is not instance of a document (version series)");
 
-    StoredObject so = checkStandardParameters(repositoryId, versionSeriesId);
-    ObjectData objData = null;
+      // provide information for Atom links for version series:
+      fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfos);
 
-    if (so instanceof VersionedDocument) {
-      VersionedDocument verDoc = (VersionedDocument) so;
-      DocumentVersion latestVersion = verDoc.getLatestVersion(major);
-      objData = getObject(context, repositoryId, latestVersion.getId(), filter,
-          includeAllowableActions, extension, objectInfos);
+      return objData;
     }
-    else if (so instanceof Document) {
-      objData = getObject(context, repositoryId, so.getId(), filter, includeAllowableActions,
-          extension, objectInfos);
+    finally {
+      RuntimeContext.remove();
     }
-    else
-      throw new RuntimeException("Object is not instance of a document (version series)");
-
-    // provide information for Atom links for version series:
-    fAtomLinkProvider.fillInformationForAtomLinks(repositoryId, so, objectInfos);
-
-    return objData;
   }
 
   public PropertiesData getPropertiesOfLatestVersion(CallContext context, String repositoryId,
       String versionSeriesId, Boolean major, String filter, ExtensionsData extension) {
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(context);
 
-    StoredObject so = checkStandardParameters(repositoryId, versionSeriesId);
-    StoredObject latestVersionObject = null;
+    try {
+      // Attach the CallContext to a thread local context that can be accessed from everywhere
+      RuntimeContext.attachCfg(context);
+
+      StoredObject so = checkStandardParameters(repositoryId, versionSeriesId);
+      StoredObject latestVersionObject = null;
+
+      if (so instanceof VersionedDocument) {
+        VersionedDocument verDoc = (VersionedDocument) so;
+        latestVersionObject = verDoc.getLatestVersion(major);
+      }
+      else if (so instanceof Document) {
+        latestVersionObject = so;
+      }
+      else
+        throw new RuntimeException("Object is not instance of a document (version series)");
+
+      List<String> requestedIds = FilterParser.getRequestedIdsFromFilter(filter);
+      PropertiesData props = PropertyCreationHelper.getPropertiesFromObject(repositoryId,
+          latestVersionObject, fStoreManager, requestedIds);
 
-    if (so instanceof VersionedDocument) {
-      VersionedDocument verDoc = (VersionedDocument) so;
-      latestVersionObject = verDoc.getLatestVersion(major);
+      return props;
     }
-    else if (so instanceof Document) {
-      latestVersionObject = so;
+    finally {
+      RuntimeContext.remove();
     }
-    else
-      throw new RuntimeException("Object is not instance of a document (version series)");
-
-    List<String> requestedIds = FilterParser.getRequestedIdsFromFilter(filter);
-    PropertiesData props = PropertyCreationHelper.getPropertiesFromObject(repositoryId,
-        latestVersionObject, fStoreManager, requestedIds);
-
-    return props;
   }
 
   private ObjectData getObject(CallContext context, String repositoryId, String objectId,

Modified: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/RuntimeContext.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/RuntimeContext.java?rev=926534&r1=926533&r2=926534&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/RuntimeContext.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/RuntimeContext.java Tue Mar 23 12:23:29 2010
@@ -28,6 +28,8 @@ import org.apache.opencmis.server.spi.Ca
  * @author jens
  *
  */
+
+/*
 public class RuntimeContext {
   public static class ThreadLocalRuntimeConfig extends ThreadLocal<CallContext> {    
 
@@ -55,4 +57,34 @@ public class RuntimeContext {
     return CONN.getConfigValue(key);
   }
   
+  public static void remove() {
+    CONN.remove();
+  }
+}
+*/
+
+public class RuntimeContext {
+  
+  private static ThreadLocal<CallContext> CTX_TLS =  new ThreadLocal<CallContext>(); 
+
+  public static void attachCfg(CallContext ctx) {      
+    CTX_TLS.set(ctx);      
+  }
+
+  public static synchronized String getRuntimeConfigValue(String key) {
+    CallContext ctx = CTX_TLS.get();
+    if (null == ctx)
+      return null;
+    else      
+      return CTX_TLS.get().get(key) ;
+  }
+  
+  public static void remove() {
+    CTX_TLS.remove();
+  }
+
+  public static final CallContext getCurrentContext() {
+    return CTX_TLS.get();
+  }
+  
 }

Modified: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/ServiceFactory.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/ServiceFactory.java?rev=926534&r1=926533&r2=926534&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/ServiceFactory.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/ServiceFactory.java Tue Mar 23 12:23:29 2010
@@ -254,7 +254,7 @@ public class ServiceFactory extends Abst
 
     // Simulate a runtime context with configuration parameters
     // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(new DummyCallContext());
+   RuntimeContext.attachCfg(new DummyCallContext());
 
     // Build the tree
     RepositoryInfoData rep = repSvc.getRepositoryInfo(repositoryId, null);

Modified: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/AbstractServiceTst.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/AbstractServiceTst.java?rev=926534&r1=926533&r2=926534&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/AbstractServiceTst.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/AbstractServiceTst.java Tue Mar 23 12:23:29 2010
@@ -54,7 +54,7 @@ public class AbstractServiceTst /* exten
   protected RepositoryService fRepSvc;
   protected VersioningService fVerSvc;
   protected MultiFilingService fMultiSvc;
-  
+  protected DummyCallContext fTestCallContext;
   private String fTypeCreatorClassName;
   private boolean fUseClientProviderInterface;
   
@@ -92,6 +92,10 @@ public class AbstractServiceTst /* exten
     // give subclasses a chance to provide additional parameters for special tests
     addParameters(parameters);
     
+    fTestCallContext = new DummyCallContext();
+    // Attach a standatrd CallContext to a thread before the services are initialized.
+    RuntimeContext.attachCfg(fTestCallContext);
+
     if (fUseClientProviderInterface)
       initializeUsingClientProvider(parameters);
     else
@@ -106,10 +110,7 @@ public class AbstractServiceTst /* exten
     fRepositoryId = rep.getRepositoryId();
     
     assertNotNull(fRepositoryId);
-    assertNotNull(fRootFolderId);
-    
-    // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(new DummyCallContext());
+    assertNotNull(fRootFolderId);    
   }
   
   // Override this method in subclasses if you want to provide additional configuration

Modified: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/VersioningTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/VersioningTest.java?rev=926534&r1=926533&r2=926534&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/VersioningTest.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/VersioningTest.java Tue Mar 23 12:23:29 2010
@@ -55,11 +55,6 @@ import org.apache.opencmis.commons.provi
 import org.apache.opencmis.commons.provider.PropertyIdData;
 import org.apache.opencmis.commons.provider.PropertyStringData;
 import org.apache.opencmis.inmemory.clientprovider.DummyCallContext;
-import org.apache.opencmis.inmemory.clientprovider.MultiFilingServiceImpl;
-import org.apache.opencmis.inmemory.clientprovider.NavigationServiceImpl;
-import org.apache.opencmis.inmemory.clientprovider.ObjectServiceImpl;
-import org.apache.opencmis.inmemory.clientprovider.RepositoryServiceImpl;
-import org.apache.opencmis.inmemory.clientprovider.VersioningServiceImpl;
 import org.apache.opencmis.inmemory.server.RuntimeContext;
 import org.apache.opencmis.inmemory.types.InMemoryDocumentTypeDefinition;
 import org.apache.opencmis.inmemory.types.PropertyCreationHelper;
@@ -93,10 +88,13 @@ public class VersioningTest extends Abst
 
   private void setRuntimeContext(String user) {
 
+    /*
     DummyCallContext ctx = new DummyCallContext();
     ctx.put(CallContext.USERNAME, user);
     // Attach the CallContext to a thread local context that can be accessed from everywhere
-    RuntimeContext.getRuntimeConfig().attachCfg(ctx); 
+    RuntimeContext.attachCfg(ctx);
+    */
+    fTestCallContext.put(CallContext.USERNAME, user);
   }
     
   @Test