You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by dc...@apache.org on 2010/04/16 16:07:12 UTC

svn commit: r934889 [1/5] - in /incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src: main/java/org/apache/chemistry/opencmis/client/ main/java/org/apache/chemistry/opencmis/client/runtime/ main/java/org/apach...

Author: dcaruana
Date: Fri Apr 16 14:07:11 2010
New Revision: 934889

URL: http://svn.apache.org/viewvc?rev=934889&view=rev
Log:
Apply Chemistry code style.

Modified:
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/SessionFactoryImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/AbstractPersistentCmisObject.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/AbstractPersistentFilableCmisObject.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/CmisBindingHelper.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/ObjectIdImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/OperationContextImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentDocumentImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentFolderImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentPolicyImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentPropertyImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentRelationshipImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentSessionImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/QueryResultImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/RenditionImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/cache/Cache.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/cache/CacheImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/objecttype/DocumentTypeImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/objecttype/FolderTypeImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/objecttype/ObjectTypeHelper.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/objecttype/PolicyTypeImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/objecttype/RelationshipTypeImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/repository/RepositoryImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/util/AbstractPageFetch.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/util/AbstractPagingList.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/util/ContainerImpl.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/util/DefaultPagingIterable.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/util/DefaultPagingIterator.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/test/java/org/apache/chemistry/opencmis/client/runtime/CacheTest.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/test/java/org/apache/chemistry/opencmis/client/runtime/PagingListTest.java

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/SessionFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/SessionFactoryImpl.java?rev=934889&r1=934888&r2=934889&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/SessionFactoryImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/SessionFactoryImpl.java Fri Apr 16 14:07:11 2010
@@ -35,8 +35,8 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
 
 /**
- * Default implementation of a session factory. Used by unit tests or applications that depend
- * directly on runtime implementation.
+ * Default implementation of a session factory. Used by unit tests or
+ * applications that depend directly on runtime implementation.
  * <p>
  * <code>
  * SessionFactory sf = new SessionFactoryImpl();<br>
@@ -53,65 +53,67 @@ import org.apache.chemistry.opencmis.com
  */
 public class SessionFactoryImpl implements SessionFactory {
 
-  protected SessionFactoryImpl() {
+	protected SessionFactoryImpl() {
 
-  }
+	}
 
-  public static SessionFactory newInstance() {
-    return new SessionFactoryImpl();
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.apache.opencmis.client.api.SessionFactory#createSession(java.util.Map)
-   */
-  @SuppressWarnings("unchecked")
-  public <T extends Session> T createSession(Map<String, String> parameters) {
-    Session s = null;
-    SessionType t = null;
-
-    // determine session type
-    if (parameters.containsKey(SessionParameter.SESSION_TYPE)) {
-      t = SessionType.fromValue(parameters.get(SessionParameter.SESSION_TYPE));
-    }
-    else {
-      // default session type if type is not set
-      t = SessionType.PERSISTENT;
-    }
-
-    switch (t) {
-    case PERSISTENT:
-      PersistentSessionImpl ps = new PersistentSessionImpl(parameters);
-      ps.connect(); // connect session with provider
-      s = ps;
-      break;
-    case TRANSIENT:
-      throw new CmisNotSupportedException("SessionType " + t + "not implemented!");
-    default:
-      throw new CmisRuntimeException("SessionType " + t + "not known!");
-    }
-
-    return (T) s;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.apache.opencmis.client.api.SessionFactory#getRepositories(java.util.Map)
-   */
-  public List<Repository> getRepositories(Map<String, String> parameters) {
-    CmisBinding binding = CmisBindingHelper.createProvider(parameters);
-
-    List<RepositoryInfo> repositoryInfos = binding.getRepositoryService().getRepositoryInfos(
-        null);
-
-    List<Repository> result = new ArrayList<Repository>();
-    for (RepositoryInfo data : repositoryInfos) {
-      result.add(new RepositoryImpl(data, parameters, this));
-    }
+	public static SessionFactory newInstance() {
+		return new SessionFactoryImpl();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.SessionFactory#createSession(java.util
+	 * .Map)
+	 */
+	@SuppressWarnings("unchecked")
+	public <T extends Session> T createSession(Map<String, String> parameters) {
+		Session s = null;
+		SessionType t = null;
+
+		// determine session type
+		if (parameters.containsKey(SessionParameter.SESSION_TYPE)) {
+			t = SessionType.fromValue(parameters.get(SessionParameter.SESSION_TYPE));
+		} else {
+			// default session type if type is not set
+			t = SessionType.PERSISTENT;
+		}
+
+		switch (t) {
+		case PERSISTENT:
+			PersistentSessionImpl ps = new PersistentSessionImpl(parameters);
+			ps.connect(); // connect session with provider
+			s = ps;
+			break;
+		case TRANSIENT:
+			throw new CmisNotSupportedException("SessionType " + t + "not implemented!");
+		default:
+			throw new CmisRuntimeException("SessionType " + t + "not known!");
+		}
+
+		return (T) s;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.SessionFactory#getRepositories(java.util
+	 * .Map)
+	 */
+	public List<Repository> getRepositories(Map<String, String> parameters) {
+		CmisBinding binding = CmisBindingHelper.createProvider(parameters);
+
+		List<RepositoryInfo> repositoryInfos = binding.getRepositoryService().getRepositoryInfos(null);
+
+		List<Repository> result = new ArrayList<Repository>();
+		for (RepositoryInfo data : repositoryInfos) {
+			result.add(new RepositoryImpl(data, parameters, this));
+		}
 
-    return result;
-  }
+		return result;
+	}
 
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/AbstractPersistentCmisObject.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/AbstractPersistentCmisObject.java?rev=934889&r1=934888&r2=934889&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/AbstractPersistentCmisObject.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/AbstractPersistentCmisObject.java Fri Apr 16 14:07:11 2010
@@ -62,889 +62,876 @@ import org.apache.chemistry.opencmis.com
  */
 public abstract class AbstractPersistentCmisObject implements CmisObject {
 
-  private PersistentSessionImpl session;
-  private ObjectType objectType;
-  private Map<String, Property<?>> properties;
-  private AllowableActions allowableActions;
-  private List<Rendition> renditions;
-  private Acl acl;
-  private List<Policy> policies;
-  private List<Relationship> relationships;
-  private OperationContext creationContext;
-  private boolean isChanged = false;
-  private long refreshTimestamp;
-
-  private final ReentrantReadWriteLock fLock = new ReentrantReadWriteLock();
-
-  /**
-   * Initializes the object.
-   */
-  protected void initialize(PersistentSessionImpl session, ObjectType objectType,
-      ObjectData objectData, OperationContext context) {
-    if (session == null) {
-      throw new IllegalArgumentException("Session must be set!");
-    }
-
-    if (objectType == null) {
-      throw new IllegalArgumentException("Object type must be set!");
-    }
-
-    if (objectType.getPropertyDefinitions().size() < 9) {
-      // there must be at least the 9 standard properties that all objects have
-      throw new IllegalArgumentException("Object type must have property defintions!");
-    }
-
-    this.session = session;
-    this.objectType = objectType;
-    this.creationContext = new OperationContextImpl(context);
-    this.refreshTimestamp = System.currentTimeMillis();
-
-    ObjectFactory of = getObjectFactory();
-
-    if (objectData != null) {
-      // handle properties
-      if (objectData.getProperties() != null) {
-        this.properties = of.convertProperties(objectType, objectData.getProperties());
-      }
-
-      // handle allowable actions
-      if (objectData.getAllowableActions() != null) {
-        this.allowableActions = objectData.getAllowableActions();
-      }
-
-      // handle renditions
-      if (objectData.getRenditions() != null) {
-        this.renditions = new ArrayList<Rendition>();
-        for (RenditionData rd : objectData.getRenditions()) {
-          this.renditions.add(of.convertRendition(getId(), rd));
-        }
-      }
-
-      // handle ACL
-      if (objectData.getAcl() != null) {
-        acl = objectData.getAcl();
-      }
-
-      // handle policies
-      if ((objectData.getPolicyIds() != null) && (objectData.getPolicyIds().getPolicyIds() != null)) {
-        policies = new ArrayList<Policy>();
-        for (String pid : objectData.getPolicyIds().getPolicyIds()) {
-          CmisObject policy = session.getObject(getSession().createObjectId(pid));
-          if (policy instanceof Policy) {
-            policies.add((Policy) policy);
-          }
-        }
-      }
-
-      // handle relationships
-      if (objectData.getRelationships() != null) {
-        relationships = new ArrayList<Relationship>();
-        for (ObjectData rod : objectData.getRelationships()) {
-          CmisObject relationship = of.convertObject(rod, this.creationContext);
-          if (relationship instanceof Relationship) {
-            relationships.add((Relationship) relationship);
-          }
-        }
-      }
-    }
-
-    isChanged = false;
-  }
-
-  /**
-   * Acquires a write lock.
-   */
-  protected void writeLock() {
-    fLock.writeLock().lock();
-  }
-
-  /**
-   * Releases a write lock.
-   */
-  protected void writeUnlock() {
-    fLock.writeLock().unlock();
-  }
-
-  /**
-   * Acquires a read lock.
-   */
-  protected void readLock() {
-    fLock.readLock().lock();
-  }
-
-  /**
-   * Releases a read lock.
-   */
-  protected void readUnlock() {
-    fLock.readLock().unlock();
-  }
-
-  /**
-   * Returns the session object.
-   */
-  protected PersistentSessionImpl getSession() {
-    return this.session;
-  }
-
-  /**
-   * Returns the repository id.
-   */
-  protected String getRepositoryId() {
-    return getSession().getRepositoryId();
-  }
-
-  /**
-   * Returns the object type.
-   */
-  protected ObjectType getObjectType() {
-    readLock();
-    try {
-      return this.objectType;
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  /**
-   * Returns the binding object.
-   */
-  protected CmisBinding getBinding() {
-    return getSession().getBinding();
-  }
-
-  /**
-   * Returns the object factory.
-   */
-  protected ObjectFactory getObjectFactory() {
-    return getSession().getObjectFactory();
-  }
-
-  /**
-   * Returns the id of this object or throws an exception if the id is unknown.
-   */
-  protected String getObjectId() {
-    String objectId = getId();
-    if (objectId == null) {
-      throw new IllegalStateException("Object Id is unknown!");
-    }
-
-    return objectId;
-  }
-
-  // --- operations ---
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#delete(boolean)
-   */
-  public void delete(boolean allVersions) {
-    String objectId = getObjectId();
-    getBinding().getObjectService().deleteObject(getRepositoryId(), objectId, allVersions, null);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#updateProperties()
-   */
-  public ObjectId updateProperties() {
-    readLock();
-    try {
-      String objectId = getObjectId();
-      Holder<String> objectIdHolder = new Holder<String>(objectId);
-
-      String changeToken = getChangeToken();
-      Holder<String> changeTokenHolder = new Holder<String>(changeToken);
-
-      Set<Updatability> updatebility = new HashSet<Updatability>();
-      updatebility.add(Updatability.READWRITE);
-
-      // check if checked out
-      Boolean isCheckedOut = getPropertyValue(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT);
-      if ((isCheckedOut != null) && isCheckedOut.booleanValue()) {
-        updatebility.add(Updatability.WHENCHECKEDOUT);
-      }
-
-      // it's time to update
-      getBinding().getObjectService().updateProperties(getRepositoryId(), objectIdHolder,
-          changeTokenHolder,
-          getObjectFactory().convertProperties(this.properties, this.objectType, updatebility),
-          null);
-
-      if (objectIdHolder.getValue() == null) {
-        return null;
-      }
-
-      return getSession().createObjectId(objectIdHolder.getValue());
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#updateProperties(java.util.Map)
-   */
-  public ObjectId updateProperties(Map<String, ?> properties) {
-    if ((properties == null) || (properties.isEmpty())) {
-      throw new IllegalArgumentException("Properties must not be empty!");
-    }
-
-    readLock();
-    try {
-      String objectId = getObjectId();
-      Holder<String> objectIdHolder = new Holder<String>(objectId);
-
-      String changeToken = getChangeToken();
-      Holder<String> changeTokenHolder = new Holder<String>(changeToken);
-
-      Set<Updatability> updatebility = new HashSet<Updatability>();
-      updatebility.add(Updatability.READWRITE);
-
-      // check if checked out
-      Boolean isCheckedOut = getPropertyValue(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT);
-      if ((isCheckedOut != null) && isCheckedOut.booleanValue()) {
-        updatebility.add(Updatability.WHENCHECKEDOUT);
-      }
-
-      // it's time to update
-      getBinding().getObjectService().updateProperties(getRepositoryId(), objectIdHolder,
-          changeTokenHolder,
-          getObjectFactory().convertProperties(properties, this.objectType, updatebility), null);
-
-      if (objectIdHolder.getValue() == null) {
-        return null;
-      }
-
-      return getSession().createObjectId(objectIdHolder.getValue());
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  // --- properties ---
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getBaseType()
-   */
-  public ObjectType getBaseType() {
-    BaseTypeId baseTypeId = getBaseTypeId();
-    if (baseTypeId == null) {
-      return null;
-    }
-
-    return getSession().getTypeDefinition(baseTypeId.value());
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getBaseTypeId()
-   */
-  public BaseTypeId getBaseTypeId() {
-    String baseType = getPropertyValue(PropertyIds.BASE_TYPE_ID);
-    if (baseType == null) {
-      return null;
-    }
-
-    return BaseTypeId.fromValue(baseType);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getChangeToken()
-   */
-  public String getChangeToken() {
-    return getPropertyValue(PropertyIds.CHANGE_TOKEN);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getCreatedBy()
-   */
-  public String getCreatedBy() {
-    return getPropertyValue(PropertyIds.CREATED_BY);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getCreationDate()
-   */
-  public GregorianCalendar getCreationDate() {
-    return getPropertyValue(PropertyIds.CREATION_DATE);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getId()
-   */
-  public String getId() {
-    return getPropertyValue(PropertyIds.OBJECT_ID);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getLastModificationDate()
-   */
-  public GregorianCalendar getLastModificationDate() {
-    return getPropertyValue(PropertyIds.LAST_MODIFICATION_DATE);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getLastModifiedBy()
-   */
-  public String getLastModifiedBy() {
-    return getPropertyValue(PropertyIds.LAST_MODIFIED_BY);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getName()
-   */
-  public String getName() {
-    return getPropertyValue(PropertyIds.NAME);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getProperties()
-   */
-  public List<Property<?>> getProperties() {
-    readLock();
-    try {
-      return new ArrayList<Property<?>>(this.properties.values());
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getProperty(java.lang.String)
-   */
-  @SuppressWarnings("unchecked")
-  public <T> Property<T> getProperty(String id) {
-    readLock();
-    try {
-      return (Property<T>) this.properties.get(id);
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getPropertyMultivalue(java.lang.String)
-   */
-  public <T> List<T> getPropertyMultivalue(String id) {
-    Property<T> property = getProperty(id);
-    if (property == null) {
-      return null;
-    }
-
-    return property.getValues();
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getPropertyValue(java.lang.String)
-   */
-  public <T> T getPropertyValue(String id) {
-    Property<T> property = getProperty(id);
-    if (property == null) {
-      return null;
-    }
-
-    return property.getFirstValue();
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#setName(java.lang.String)
-   */
-  public void setName(String name) {
-    setProperty(PropertyIds.NAME, name);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#setProperty(java.lang.String, java.lang.Object)
-   */
-  @SuppressWarnings("unchecked")
-  public <T> void setProperty(String id, T value) {
-    PropertyDefinition<?> propertyDefinition = checkProperty(id, value);
-
-    // check updatability
-    if (propertyDefinition.getUpdatability() == Updatability.READONLY) {
-      throw new IllegalArgumentException("Property is read-only!");
-    }
-
-    // create property
-    Property<T> newProperty = (Property<T>) getObjectFactory().createProperty(
-        (PropertyDefinition<T>) propertyDefinition, value);
-
-    writeLock();
-    try {
-      setChanged();
-      this.properties.put(id, newProperty);
-    }
-    finally {
-      writeUnlock();
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#setPropertyMultivalue(java.lang.String,
-   * java.util.List)
-   */
-  @SuppressWarnings("unchecked")
-  public <T> void setPropertyMultivalue(String id, List<T> value) {
-    PropertyDefinition<?> propertyDefinition = checkProperty(id, value);
-
-    // check updatability
-    if (propertyDefinition.getUpdatability() == Updatability.READONLY) {
-      throw new IllegalArgumentException("Property is read-only!");
-    }
-
-    // create property
-    Property<T> newProperty = (Property<T>) getObjectFactory().createPropertyMultivalue(
-        (PropertyDefinition<T>) propertyDefinition, value);
-
-    writeLock();
-    try {
-      setChanged();
-      this.properties.put(id, newProperty);
-    }
-    finally {
-      writeUnlock();
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getType()
-   */
-  public ObjectType getType() {
-    readLock();
-    try {
-      return this.objectType;
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  // --- allowable actions ---
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getAllowableActions()
-   */
-  public AllowableActions getAllowableActions() {
-    readLock();
-    try {
-      return this.allowableActions;
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  // --- renditions ---
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getRenditions()
-   */
-  public List<Rendition> getRenditions() {
-    readLock();
-    try {
-      return this.renditions;
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  // --- ACL ---
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getAcl(boolean)
-   */
-  public Acl getAcl(boolean onlyBasicPermissions) {
-    String objectId = getObjectId();
-
-    ObjectFactory of = getObjectFactory();
-
-    return getBinding().getAclService().getAcl(getRepositoryId(), objectId,
-        onlyBasicPermissions, null);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#applyAcl(java.util.List, java.util.List,
-   * org.apache.opencmis.commons.enums.AclPropagation)
-   */
-  public Acl applyAcl(List<Ace> addAces, List<Ace> removeAces, AclPropagation aclPropagation) {
-    String objectId = getObjectId();
-
-    ObjectFactory of = getObjectFactory();
-
-    return getBinding().getAclService().applyAcl(getRepositoryId(), objectId,
-        of.convertAces(addAces), of.convertAces(removeAces), aclPropagation, null);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#addAcl(java.util.List,
-   * org.apache.opencmis.commons.enums.AclPropagation)
-   */
-  public void addAcl(List<Ace> addAces, AclPropagation aclPropagation) {
-    applyAcl(addAces, null, aclPropagation);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#removeAcl(java.util.List,
-   * org.apache.opencmis.commons.enums.AclPropagation)
-   */
-  public void removeAcl(List<Ace> removeAces, AclPropagation aclPropagation) {
-    applyAcl(null, removeAces, aclPropagation);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getAcl()
-   */
-  public Acl getAcl() {
-    readLock();
-    try {
-      return this.acl;
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  // --- policies ---
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see
-   * org.apache.opencmis.client.api.CmisObject#applyPolicy(org.apache.opencmis.client.api.ObjectId)
-   */
-  public void applyPolicy(ObjectId policyId) {
-    if ((policyId == null) || (policyId.getId() == null)) {
-      throw new IllegalArgumentException("Policy Id is not set!");
-    }
-
-    String objectId = getObjectId();
-    getBinding().getPolicyService()
-        .applyPolicy(getRepositoryId(), policyId.getId(), objectId, null);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see
-   * org.apache.opencmis.client.api.CmisObject#removePolicy(org.apache.opencmis.client.api.ObjectId)
-   */
-  public void removePolicy(ObjectId policyId) {
-    if ((policyId == null) || (policyId.getId() == null)) {
-      throw new IllegalArgumentException("Policy Id is not set!");
-    }
-
-    String objectId = getObjectId();
-    getBinding().getPolicyService().removePolicy(getRepositoryId(), policyId.getId(), objectId,
-        null);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getPolicies()
-   */
-  public List<Policy> getPolicies() {
-    readLock();
-    try {
-      return this.policies;
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  // --- relationships ---
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getRelationships()
-   */
-  public List<Relationship> getRelationships() {
-    readLock();
-    try {
-      return this.relationships;
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getRelationships(boolean,
-   * org.apache.opencmis.commons.enums.RelationshipDirection,
-   * org.apache.opencmis.client.api.objecttype.ObjectType,
-   * org.apache.opencmis.client.api.OperationContext, int)
-   */
-  public PagingList<Relationship> getRelationships(final boolean includeSubRelationshipTypes,
-      final RelationshipDirection relationshipDirection, ObjectType type, OperationContext context,
-      final int itemsPerPage) {
-    if (itemsPerPage < 1) {
-      throw new IllegalArgumentException("itemsPerPage must be > 0!");
-    }
-
-    final String objectId = getObjectId();
-    final String typeId = (type == null ? null : type.getId());
-    final RelationshipService relationshipService = getBinding().getRelationshipService();
-    final OperationContext ctxt = (context != null ? context : new OperationContextImpl(
-        getSession().getDefaultContext()));
-
-    return new AbstractPagingList<Relationship>() {
-
-      @Override
-      protected FetchResult fetchPage(int pageNumber) {
-        int skipCount = pageNumber * getMaxItemsPerPage();
-
-        // fetch the relationships
-        ObjectList relList = relationshipService.getObjectRelationships(getRepositoryId(),
-            objectId, includeSubRelationshipTypes, relationshipDirection, typeId, ctxt
-                .getFilterString(), ctxt.isIncludeAllowableActions(), BigInteger
-                .valueOf(getMaxItemsPerPage()), BigInteger.valueOf(skipCount), null);
-
-        // convert relationship objects
-        List<Relationship> page = new ArrayList<Relationship>();
-        if (relList.getObjects() != null) {
-          for (ObjectData rod : relList.getObjects()) {
-            Relationship relationship = new PersistentRelationshipImpl(getSession(),
-                getObjectFactory().getTypeFromObjectData(rod), rod, ctxt);
-
-            page.add(relationship);
-          }
-        }
-
-        return new FetchResult(page, relList.getNumItems(), relList.hasMoreItems());
-      }
-
-      @Override
-      public int getMaxItemsPerPage() {
-        return itemsPerPage;
-      }
-    };
-  }
-
-  // --- other ---
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#isChanged()
-   */
-  public boolean isChanged() {
-    readLock();
-    try {
-      return isChanged;
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  /**
-   * Sets the isChanged flag to <code>true</code>
-   */
-  protected void setChanged() {
-    writeLock();
-    try {
-      isChanged = true;
-    }
-    finally {
-      writeUnlock();
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#getRefreshTimestamp()
-   */
-  public long getRefreshTimestamp() {
-    readLock();
-    try {
-      return this.refreshTimestamp;
-    }
-    finally {
-      readUnlock();
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see
-   * org.apache.opencmis.client.api.CmisObject#refresh(org.apache.opencmis.client.api.OperationContext
-   * )
-   */
-  public void refresh() {
-    writeLock();
-    try {
-      String objectId = getObjectId();
-
-      // get the latest data from the repository
-      ObjectData objectData = getSession().getBinding().getObjectService().getObject(
-          getRepositoryId(), objectId, creationContext.getFilterString(),
-          creationContext.isIncludeAllowableActions(), creationContext.getIncludeRelationships(),
-          creationContext.getRenditionFilterString(), creationContext.isIncludePolicies(),
-          creationContext.isIncludeAcls(), null);
-
-      // reset this object
-      initialize(getSession(), getObjectType(), objectData, this.creationContext);
-    }
-    finally {
-      writeUnlock();
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.opencmis.client.api.CmisObject#refreshIfOld(long)
-   */
-  public void refreshIfOld(long durationInMillis) {
-    writeLock();
-    try {
-      if (this.refreshTimestamp < System.currentTimeMillis() - durationInMillis) {
-        refresh();
-      }
-    }
-    finally {
-      writeUnlock();
-    }
-  }
-
-  // --- internal ---
-
-  /**
-   * Checks if a value matches a property definition.
-   */
-  private PropertyDefinition<?> checkProperty(String id, Object value) {
-    PropertyDefinition<?> propertyDefinition = getObjectType().getPropertyDefinitions().get(id);
-    if (propertyDefinition == null) {
-      throw new IllegalArgumentException("Unknown property '" + id + "'!");
-    }
-
-    // null values are ok for updates
-    if (value == null) {
-      return propertyDefinition;
-    }
-
-    // single and multi value check
-    List<?> values = null;
-    if (value instanceof List<?>) {
-      if (propertyDefinition.getCardinality() != Cardinality.MULTI) {
-        throw new IllegalArgumentException("Property '" + propertyDefinition.getId()
-            + "' is not a multi value property!");
-      }
-
-      values = (List<?>) value;
-      if (values.isEmpty()) {
-        return propertyDefinition;
-      }
-    }
-    else {
-      if (propertyDefinition.getCardinality() != Cardinality.SINGLE) {
-        throw new IllegalArgumentException("Property '" + propertyDefinition.getId()
-            + "' is not a single value property!");
-      }
-
-      values = Collections.singletonList(value);
-    }
-
-    // check if list contains null values
-    for (Object o : values) {
-      if (o == null) {
-        throw new IllegalArgumentException("Property '" + propertyDefinition.getId()
-            + "' contains null values!");
-      }
-    }
-
-    // take a sample and test the data type
-    boolean typeMatch = false;
-    Object firstValue = values.get(0);
-
-    switch (propertyDefinition.getPropertyType()) {
-    case STRING:
-    case ID:
-    case URI:
-    case HTML:
-      typeMatch = (firstValue instanceof String);
-      break;
-    case INTEGER:
-      typeMatch = (firstValue instanceof BigInteger);
-      break;
-    case DECIMAL:
-      typeMatch = (firstValue instanceof BigDecimal);
-      break;
-    case BOOLEAN:
-      typeMatch = (firstValue instanceof Boolean);
-      break;
-    case DATETIME:
-      typeMatch = (firstValue instanceof GregorianCalendar);
-      break;
-    }
-
-    if (!typeMatch) {
-      throw new IllegalArgumentException("Value of property '" + propertyDefinition.getId()
-          + "' does not match property type!");
-    }
+	private PersistentSessionImpl session;
+	private ObjectType objectType;
+	private Map<String, Property<?>> properties;
+	private AllowableActions allowableActions;
+	private List<Rendition> renditions;
+	private Acl acl;
+	private List<Policy> policies;
+	private List<Relationship> relationships;
+	private OperationContext creationContext;
+	private boolean isChanged = false;
+	private long refreshTimestamp;
+
+	private final ReentrantReadWriteLock fLock = new ReentrantReadWriteLock();
+
+	/**
+	 * Initializes the object.
+	 */
+	protected void initialize(PersistentSessionImpl session, ObjectType objectType, ObjectData objectData,
+			OperationContext context) {
+		if (session == null) {
+			throw new IllegalArgumentException("Session must be set!");
+		}
+
+		if (objectType == null) {
+			throw new IllegalArgumentException("Object type must be set!");
+		}
+
+		if (objectType.getPropertyDefinitions().size() < 9) {
+			// there must be at least the 9 standard properties that all objects
+			// have
+			throw new IllegalArgumentException("Object type must have property defintions!");
+		}
+
+		this.session = session;
+		this.objectType = objectType;
+		this.creationContext = new OperationContextImpl(context);
+		this.refreshTimestamp = System.currentTimeMillis();
+
+		ObjectFactory of = getObjectFactory();
+
+		if (objectData != null) {
+			// handle properties
+			if (objectData.getProperties() != null) {
+				this.properties = of.convertProperties(objectType, objectData.getProperties());
+			}
+
+			// handle allowable actions
+			if (objectData.getAllowableActions() != null) {
+				this.allowableActions = objectData.getAllowableActions();
+			}
+
+			// handle renditions
+			if (objectData.getRenditions() != null) {
+				this.renditions = new ArrayList<Rendition>();
+				for (RenditionData rd : objectData.getRenditions()) {
+					this.renditions.add(of.convertRendition(getId(), rd));
+				}
+			}
+
+			// handle ACL
+			if (objectData.getAcl() != null) {
+				acl = objectData.getAcl();
+			}
+
+			// handle policies
+			if ((objectData.getPolicyIds() != null) && (objectData.getPolicyIds().getPolicyIds() != null)) {
+				policies = new ArrayList<Policy>();
+				for (String pid : objectData.getPolicyIds().getPolicyIds()) {
+					CmisObject policy = session.getObject(getSession().createObjectId(pid));
+					if (policy instanceof Policy) {
+						policies.add((Policy) policy);
+					}
+				}
+			}
+
+			// handle relationships
+			if (objectData.getRelationships() != null) {
+				relationships = new ArrayList<Relationship>();
+				for (ObjectData rod : objectData.getRelationships()) {
+					CmisObject relationship = of.convertObject(rod, this.creationContext);
+					if (relationship instanceof Relationship) {
+						relationships.add((Relationship) relationship);
+					}
+				}
+			}
+		}
+
+		isChanged = false;
+	}
+
+	/**
+	 * Acquires a write lock.
+	 */
+	protected void writeLock() {
+		fLock.writeLock().lock();
+	}
+
+	/**
+	 * Releases a write lock.
+	 */
+	protected void writeUnlock() {
+		fLock.writeLock().unlock();
+	}
+
+	/**
+	 * Acquires a read lock.
+	 */
+	protected void readLock() {
+		fLock.readLock().lock();
+	}
+
+	/**
+	 * Releases a read lock.
+	 */
+	protected void readUnlock() {
+		fLock.readLock().unlock();
+	}
+
+	/**
+	 * Returns the session object.
+	 */
+	protected PersistentSessionImpl getSession() {
+		return this.session;
+	}
+
+	/**
+	 * Returns the repository id.
+	 */
+	protected String getRepositoryId() {
+		return getSession().getRepositoryId();
+	}
+
+	/**
+	 * Returns the object type.
+	 */
+	protected ObjectType getObjectType() {
+		readLock();
+		try {
+			return this.objectType;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/**
+	 * Returns the binding object.
+	 */
+	protected CmisBinding getBinding() {
+		return getSession().getBinding();
+	}
+
+	/**
+	 * Returns the object factory.
+	 */
+	protected ObjectFactory getObjectFactory() {
+		return getSession().getObjectFactory();
+	}
+
+	/**
+	 * Returns the id of this object or throws an exception if the id is
+	 * unknown.
+	 */
+	protected String getObjectId() {
+		String objectId = getId();
+		if (objectId == null) {
+			throw new IllegalStateException("Object Id is unknown!");
+		}
+
+		return objectId;
+	}
+
+	// --- operations ---
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#delete(boolean)
+	 */
+	public void delete(boolean allVersions) {
+		String objectId = getObjectId();
+		getBinding().getObjectService().deleteObject(getRepositoryId(), objectId, allVersions, null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#updateProperties()
+	 */
+	public ObjectId updateProperties() {
+		readLock();
+		try {
+			String objectId = getObjectId();
+			Holder<String> objectIdHolder = new Holder<String>(objectId);
+
+			String changeToken = getChangeToken();
+			Holder<String> changeTokenHolder = new Holder<String>(changeToken);
+
+			Set<Updatability> updatebility = new HashSet<Updatability>();
+			updatebility.add(Updatability.READWRITE);
+
+			// check if checked out
+			Boolean isCheckedOut = getPropertyValue(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT);
+			if ((isCheckedOut != null) && isCheckedOut.booleanValue()) {
+				updatebility.add(Updatability.WHENCHECKEDOUT);
+			}
+
+			// it's time to update
+			getBinding().getObjectService().updateProperties(getRepositoryId(), objectIdHolder, changeTokenHolder,
+					getObjectFactory().convertProperties(this.properties, this.objectType, updatebility), null);
+
+			if (objectIdHolder.getValue() == null) {
+				return null;
+			}
+
+			return getSession().createObjectId(objectIdHolder.getValue());
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.CmisObject#updateProperties(java.util.Map)
+	 */
+	public ObjectId updateProperties(Map<String, ?> properties) {
+		if ((properties == null) || (properties.isEmpty())) {
+			throw new IllegalArgumentException("Properties must not be empty!");
+		}
+
+		readLock();
+		try {
+			String objectId = getObjectId();
+			Holder<String> objectIdHolder = new Holder<String>(objectId);
+
+			String changeToken = getChangeToken();
+			Holder<String> changeTokenHolder = new Holder<String>(changeToken);
+
+			Set<Updatability> updatebility = new HashSet<Updatability>();
+			updatebility.add(Updatability.READWRITE);
+
+			// check if checked out
+			Boolean isCheckedOut = getPropertyValue(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT);
+			if ((isCheckedOut != null) && isCheckedOut.booleanValue()) {
+				updatebility.add(Updatability.WHENCHECKEDOUT);
+			}
+
+			// it's time to update
+			getBinding().getObjectService().updateProperties(getRepositoryId(), objectIdHolder, changeTokenHolder,
+					getObjectFactory().convertProperties(properties, this.objectType, updatebility), null);
+
+			if (objectIdHolder.getValue() == null) {
+				return null;
+			}
+
+			return getSession().createObjectId(objectIdHolder.getValue());
+		} finally {
+			readUnlock();
+		}
+	}
+
+	// --- properties ---
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getBaseType()
+	 */
+	public ObjectType getBaseType() {
+		BaseTypeId baseTypeId = getBaseTypeId();
+		if (baseTypeId == null) {
+			return null;
+		}
+
+		return getSession().getTypeDefinition(baseTypeId.value());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getBaseTypeId()
+	 */
+	public BaseTypeId getBaseTypeId() {
+		String baseType = getPropertyValue(PropertyIds.BASE_TYPE_ID);
+		if (baseType == null) {
+			return null;
+		}
+
+		return BaseTypeId.fromValue(baseType);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getChangeToken()
+	 */
+	public String getChangeToken() {
+		return getPropertyValue(PropertyIds.CHANGE_TOKEN);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getCreatedBy()
+	 */
+	public String getCreatedBy() {
+		return getPropertyValue(PropertyIds.CREATED_BY);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getCreationDate()
+	 */
+	public GregorianCalendar getCreationDate() {
+		return getPropertyValue(PropertyIds.CREATION_DATE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getId()
+	 */
+	public String getId() {
+		return getPropertyValue(PropertyIds.OBJECT_ID);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getLastModificationDate()
+	 */
+	public GregorianCalendar getLastModificationDate() {
+		return getPropertyValue(PropertyIds.LAST_MODIFICATION_DATE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getLastModifiedBy()
+	 */
+	public String getLastModifiedBy() {
+		return getPropertyValue(PropertyIds.LAST_MODIFIED_BY);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getName()
+	 */
+	public String getName() {
+		return getPropertyValue(PropertyIds.NAME);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getProperties()
+	 */
+	public List<Property<?>> getProperties() {
+		readLock();
+		try {
+			return new ArrayList<Property<?>>(this.properties.values());
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.CmisObject#getProperty(java.lang.String)
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> Property<T> getProperty(String id) {
+		readLock();
+		try {
+			return (Property<T>) this.properties.get(id);
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.CmisObject#getPropertyMultivalue(java.
+	 * lang.String)
+	 */
+	public <T> List<T> getPropertyMultivalue(String id) {
+		Property<T> property = getProperty(id);
+		if (property == null) {
+			return null;
+		}
+
+		return property.getValues();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.CmisObject#getPropertyValue(java.lang.
+	 * String)
+	 */
+	public <T> T getPropertyValue(String id) {
+		Property<T> property = getProperty(id);
+		if (property == null) {
+			return null;
+		}
+
+		return property.getFirstValue();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#setName(java.lang.String)
+	 */
+	public void setName(String name) {
+		setProperty(PropertyIds.NAME, name);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.CmisObject#setProperty(java.lang.String,
+	 * java.lang.Object)
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> void setProperty(String id, T value) {
+		PropertyDefinition<?> propertyDefinition = checkProperty(id, value);
+
+		// check updatability
+		if (propertyDefinition.getUpdatability() == Updatability.READONLY) {
+			throw new IllegalArgumentException("Property is read-only!");
+		}
+
+		// create property
+		Property<T> newProperty = (Property<T>) getObjectFactory().createProperty(
+				(PropertyDefinition<T>) propertyDefinition, value);
+
+		writeLock();
+		try {
+			setChanged();
+			this.properties.put(id, newProperty);
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.CmisObject#setPropertyMultivalue(java.
+	 * lang.String, java.util.List)
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> void setPropertyMultivalue(String id, List<T> value) {
+		PropertyDefinition<?> propertyDefinition = checkProperty(id, value);
+
+		// check updatability
+		if (propertyDefinition.getUpdatability() == Updatability.READONLY) {
+			throw new IllegalArgumentException("Property is read-only!");
+		}
+
+		// create property
+		Property<T> newProperty = (Property<T>) getObjectFactory().createPropertyMultivalue(
+				(PropertyDefinition<T>) propertyDefinition, value);
+
+		writeLock();
+		try {
+			setChanged();
+			this.properties.put(id, newProperty);
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getType()
+	 */
+	public ObjectType getType() {
+		readLock();
+		try {
+			return this.objectType;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	// --- allowable actions ---
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getAllowableActions()
+	 */
+	public AllowableActions getAllowableActions() {
+		readLock();
+		try {
+			return this.allowableActions;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	// --- renditions ---
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getRenditions()
+	 */
+	public List<Rendition> getRenditions() {
+		readLock();
+		try {
+			return this.renditions;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	// --- ACL ---
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getAcl(boolean)
+	 */
+	public Acl getAcl(boolean onlyBasicPermissions) {
+		String objectId = getObjectId();
+
+		ObjectFactory of = getObjectFactory();
+
+		return getBinding().getAclService().getAcl(getRepositoryId(), objectId, onlyBasicPermissions, null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#applyAcl(java.util.List,
+	 * java.util.List, org.apache.opencmis.commons.enums.AclPropagation)
+	 */
+	public Acl applyAcl(List<Ace> addAces, List<Ace> removeAces, AclPropagation aclPropagation) {
+		String objectId = getObjectId();
+
+		ObjectFactory of = getObjectFactory();
+
+		return getBinding().getAclService().applyAcl(getRepositoryId(), objectId, of.convertAces(addAces),
+				of.convertAces(removeAces), aclPropagation, null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#addAcl(java.util.List,
+	 * org.apache.opencmis.commons.enums.AclPropagation)
+	 */
+	public void addAcl(List<Ace> addAces, AclPropagation aclPropagation) {
+		applyAcl(addAces, null, aclPropagation);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#removeAcl(java.util.List,
+	 * org.apache.opencmis.commons.enums.AclPropagation)
+	 */
+	public void removeAcl(List<Ace> removeAces, AclPropagation aclPropagation) {
+		applyAcl(null, removeAces, aclPropagation);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getAcl()
+	 */
+	public Acl getAcl() {
+		readLock();
+		try {
+			return this.acl;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	// --- policies ---
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.CmisObject#applyPolicy(org.apache.opencmis
+	 * .client.api.ObjectId)
+	 */
+	public void applyPolicy(ObjectId policyId) {
+		if ((policyId == null) || (policyId.getId() == null)) {
+			throw new IllegalArgumentException("Policy Id is not set!");
+		}
+
+		String objectId = getObjectId();
+		getBinding().getPolicyService().applyPolicy(getRepositoryId(), policyId.getId(), objectId, null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.CmisObject#removePolicy(org.apache.opencmis
+	 * .client.api.ObjectId)
+	 */
+	public void removePolicy(ObjectId policyId) {
+		if ((policyId == null) || (policyId.getId() == null)) {
+			throw new IllegalArgumentException("Policy Id is not set!");
+		}
+
+		String objectId = getObjectId();
+		getBinding().getPolicyService().removePolicy(getRepositoryId(), policyId.getId(), objectId, null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getPolicies()
+	 */
+	public List<Policy> getPolicies() {
+		readLock();
+		try {
+			return this.policies;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	// --- relationships ---
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getRelationships()
+	 */
+	public List<Relationship> getRelationships() {
+		readLock();
+		try {
+			return this.relationships;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getRelationships(boolean,
+	 * org.apache.opencmis.commons.enums.RelationshipDirection,
+	 * org.apache.opencmis.client.api.objecttype.ObjectType,
+	 * org.apache.opencmis.client.api.OperationContext, int)
+	 */
+	public PagingList<Relationship> getRelationships(final boolean includeSubRelationshipTypes,
+			final RelationshipDirection relationshipDirection, ObjectType type, OperationContext context,
+			final int itemsPerPage) {
+		if (itemsPerPage < 1) {
+			throw new IllegalArgumentException("itemsPerPage must be > 0!");
+		}
+
+		final String objectId = getObjectId();
+		final String typeId = (type == null ? null : type.getId());
+		final RelationshipService relationshipService = getBinding().getRelationshipService();
+		final OperationContext ctxt = (context != null ? context : new OperationContextImpl(getSession()
+				.getDefaultContext()));
+
+		return new AbstractPagingList<Relationship>() {
+
+			@Override
+			protected FetchResult fetchPage(int pageNumber) {
+				int skipCount = pageNumber * getMaxItemsPerPage();
+
+				// fetch the relationships
+				ObjectList relList = relationshipService.getObjectRelationships(getRepositoryId(), objectId,
+						includeSubRelationshipTypes, relationshipDirection, typeId, ctxt.getFilterString(), ctxt
+								.isIncludeAllowableActions(), BigInteger.valueOf(getMaxItemsPerPage()), BigInteger
+								.valueOf(skipCount), null);
+
+				// convert relationship objects
+				List<Relationship> page = new ArrayList<Relationship>();
+				if (relList.getObjects() != null) {
+					for (ObjectData rod : relList.getObjects()) {
+						Relationship relationship = new PersistentRelationshipImpl(getSession(), getObjectFactory()
+								.getTypeFromObjectData(rod), rod, ctxt);
+
+						page.add(relationship);
+					}
+				}
+
+				return new FetchResult(page, relList.getNumItems(), relList.hasMoreItems());
+			}
+
+			@Override
+			public int getMaxItemsPerPage() {
+				return itemsPerPage;
+			}
+		};
+	}
+
+	// --- other ---
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#isChanged()
+	 */
+	public boolean isChanged() {
+		readLock();
+		try {
+			return isChanged;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/**
+	 * Sets the isChanged flag to <code>true</code>
+	 */
+	protected void setChanged() {
+		writeLock();
+		try {
+			isChanged = true;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#getRefreshTimestamp()
+	 */
+	public long getRefreshTimestamp() {
+		readLock();
+		try {
+			return this.refreshTimestamp;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.CmisObject#refresh(org.apache.opencmis
+	 * .client.api.OperationContext )
+	 */
+	public void refresh() {
+		writeLock();
+		try {
+			String objectId = getObjectId();
+
+			// get the latest data from the repository
+			ObjectData objectData = getSession().getBinding().getObjectService().getObject(getRepositoryId(), objectId,
+					creationContext.getFilterString(), creationContext.isIncludeAllowableActions(),
+					creationContext.getIncludeRelationships(), creationContext.getRenditionFilterString(),
+					creationContext.isIncludePolicies(), creationContext.isIncludeAcls(), null);
+
+			// reset this object
+			initialize(getSession(), getObjectType(), objectData, this.creationContext);
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.CmisObject#refreshIfOld(long)
+	 */
+	public void refreshIfOld(long durationInMillis) {
+		writeLock();
+		try {
+			if (this.refreshTimestamp < System.currentTimeMillis() - durationInMillis) {
+				refresh();
+			}
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	// --- internal ---
+
+	/**
+	 * Checks if a value matches a property definition.
+	 */
+	private PropertyDefinition<?> checkProperty(String id, Object value) {
+		PropertyDefinition<?> propertyDefinition = getObjectType().getPropertyDefinitions().get(id);
+		if (propertyDefinition == null) {
+			throw new IllegalArgumentException("Unknown property '" + id + "'!");
+		}
+
+		// null values are ok for updates
+		if (value == null) {
+			return propertyDefinition;
+		}
+
+		// single and multi value check
+		List<?> values = null;
+		if (value instanceof List<?>) {
+			if (propertyDefinition.getCardinality() != Cardinality.MULTI) {
+				throw new IllegalArgumentException("Property '" + propertyDefinition.getId()
+						+ "' is not a multi value property!");
+			}
+
+			values = (List<?>) value;
+			if (values.isEmpty()) {
+				return propertyDefinition;
+			}
+		} else {
+			if (propertyDefinition.getCardinality() != Cardinality.SINGLE) {
+				throw new IllegalArgumentException("Property '" + propertyDefinition.getId()
+						+ "' is not a single value property!");
+			}
+
+			values = Collections.singletonList(value);
+		}
+
+		// check if list contains null values
+		for (Object o : values) {
+			if (o == null) {
+				throw new IllegalArgumentException("Property '" + propertyDefinition.getId()
+						+ "' contains null values!");
+			}
+		}
+
+		// take a sample and test the data type
+		boolean typeMatch = false;
+		Object firstValue = values.get(0);
+
+		switch (propertyDefinition.getPropertyType()) {
+		case STRING:
+		case ID:
+		case URI:
+		case HTML:
+			typeMatch = (firstValue instanceof String);
+			break;
+		case INTEGER:
+			typeMatch = (firstValue instanceof BigInteger);
+			break;
+		case DECIMAL:
+			typeMatch = (firstValue instanceof BigDecimal);
+			break;
+		case BOOLEAN:
+			typeMatch = (firstValue instanceof Boolean);
+			break;
+		case DATETIME:
+			typeMatch = (firstValue instanceof GregorianCalendar);
+			break;
+		}
+
+		if (!typeMatch) {
+			throw new IllegalArgumentException("Value of property '" + propertyDefinition.getId()
+					+ "' does not match property type!");
+		}
 
-    return propertyDefinition;
-  }
+		return propertyDefinition;
+	}
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/AbstractPersistentFilableCmisObject.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/AbstractPersistentFilableCmisObject.java?rev=934889&r1=934888&r2=934889&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/AbstractPersistentFilableCmisObject.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/AbstractPersistentFilableCmisObject.java Fri Apr 16 14:07:11 2010
@@ -37,161 +37,157 @@ import org.apache.chemistry.opencmis.com
 /**
  * Base class for all filable persistent session object impl classes.
  */
-public abstract class AbstractPersistentFilableCmisObject extends AbstractPersistentCmisObject
-    implements FileableCmisObject {
+public abstract class AbstractPersistentFilableCmisObject extends AbstractPersistentCmisObject implements
+		FileableCmisObject {
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.apache.opencmis.client.api.FileableCmisObject#getParents()
-   */
-  public List<Folder> getParents() {
-    String objectId = getObjectId();
-
-    // get object ids of the parent folders
-    List<ObjectParentData> providerParents = getBinding().getNavigationService().getObjectParents(
-        getRepositoryId(), objectId, PropertyIds.OBJECT_ID, false, IncludeRelationships.NONE,
-        null, false, null);
-
-    List<Folder> parents = new ArrayList<Folder>();
-
-    for (ObjectParentData p : providerParents) {
-      if ((p == null) || (p.getObject() == null) || (p.getObject().getProperties() == null)) {
-        // should not happen...
-        throw new CmisRuntimeException("Repository sent invalid data!");
-      }
-
-      // get id property
-      PropertyData<?> idProperty = p.getObject().getProperties().getProperties().get(
-          PropertyIds.OBJECT_ID);
-      if (!(idProperty instanceof PropertyId)) {
-        // the repository sent an object without a valid object id...
-        throw new CmisRuntimeException("Repository sent invalid data! No object id!");
-      }
-
-      // fetch the object and make sure it is a folder
-      ObjectId parentId = getSession().createObjectId((String) idProperty.getFirstValue());
-      CmisObject parentFolder = getSession().getObject(parentId);
-      if (!(parentFolder instanceof Folder)) {
-        // the repository sent an object that is not a folder...
-        throw new CmisRuntimeException("Repository sent invalid data! Object is not a folder!");
-      }
-
-      parents.add((Folder) parentFolder);
-    }
-
-    return parents;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.apache.opencmis.client.api.FileableCmisObject#getPaths()
-   */
-  public List<String> getPaths() {
-    String objectId = getObjectId();
-
-    // get object paths of the parent folders
-    List<ObjectParentData> providerParents = getBinding().getNavigationService().getObjectParents(
-        getRepositoryId(), objectId, PropertyIds.PATH, false, IncludeRelationships.NONE, null,
-        true, null);
-
-    List<String> paths = new ArrayList<String>();
-
-    for (ObjectParentData p : providerParents) {
-      if ((p == null) || (p.getObject() == null) || (p.getObject().getProperties() == null)) {
-        // should not happen...
-        throw new CmisRuntimeException("Repository sent invalid data!");
-      }
-
-      // get path property
-      PropertyData<?> pathProperty = p.getObject().getProperties().getProperties().get(
-          PropertyIds.PATH);
-      if (!(pathProperty instanceof PropertyString)) {
-        // the repository sent a folder without a valid path...
-        throw new CmisRuntimeException("Repository sent invalid data! No path property!");
-      }
-
-      if (p.getRelativePathSegment() == null) {
-        // the repository didn't send a relative path segment
-        throw new CmisRuntimeException("Repository sent invalid data! No relative path segement!");
-      }
-
-      String folderPath = ((String) pathProperty.getFirstValue());
-      paths.add(folderPath + (folderPath.endsWith("/") ? "" : "/") + p.getRelativePathSegment());
-    }
-
-    return paths;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see
-   * org.apache.opencmis.client.api.FileableCmisObject#move(org.apache.opencmis.client.api.ObjectId,
-   * org.apache.opencmis.client.api.ObjectId)
-   */
-  public FileableCmisObject move(ObjectId sourceFolderId, ObjectId targetFolderId) {
-    String objectId = getObjectId();
-    Holder<String> objectIdHolder = new Holder<String>(objectId);
-
-    if ((sourceFolderId == null) || (sourceFolderId.getId() == null)) {
-      throw new IllegalArgumentException("Source folder id must be set!");
-    }
-
-    if ((targetFolderId == null) || (targetFolderId.getId() == null)) {
-      throw new IllegalArgumentException("Target folder id must be set!");
-    }
-
-    getBinding().getObjectService().moveObject(getRepositoryId(), objectIdHolder,
-        targetFolderId.getId(), sourceFolderId.getId(), null);
-
-    if (objectIdHolder.getValue() == null) {
-      return null;
-    }
-
-    CmisObject movedObject = getSession().getObject(
-        getSession().createObjectId(objectIdHolder.getValue()));
-    if (!(movedObject instanceof FileableCmisObject)) {
-      throw new CmisRuntimeException("Moved object is invalid!");
-    }
-
-    return (FileableCmisObject) movedObject;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see
-   * org.apache.opencmis.client.api.FileableCmisObject#addToFolder(org.apache.opencmis.client.api
-   * .ObjectId, boolean)
-   */
-  public void addToFolder(ObjectId folderId, boolean allVersions) {
-    String objectId = getObjectId();
-
-    if ((folderId == null) || (folderId.getId() == null)) {
-      throw new IllegalArgumentException("Folder Id must be set!");
-    }
-
-    getBinding().getMultiFilingService().addObjectToFolder(getRepositoryId(), objectId,
-        folderId.getId(), allVersions, null);
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see
-   * org.apache.opencmis.client.api.FileableCmisObject#removeFromFolder(org.apache.opencmis.client
-   * .api.ObjectId)
-   */
-  public void removeFromFolder(ObjectId folderId) {
-    String objectId = getObjectId();
-
-    if ((folderId == null) || (folderId.getId() == null)) {
-      throw new IllegalArgumentException("Folder Id must be set!");
-    }
-
-    getBinding().getMultiFilingService().removeObjectFromFolder(getRepositoryId(), objectId,
-        folderId.getId(), null);
-  }
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.FileableCmisObject#getParents()
+	 */
+	public List<Folder> getParents() {
+		String objectId = getObjectId();
+
+		// get object ids of the parent folders
+		List<ObjectParentData> providerParents = getBinding().getNavigationService()
+				.getObjectParents(getRepositoryId(), objectId, PropertyIds.OBJECT_ID, false, IncludeRelationships.NONE,
+						null, false, null);
+
+		List<Folder> parents = new ArrayList<Folder>();
+
+		for (ObjectParentData p : providerParents) {
+			if ((p == null) || (p.getObject() == null) || (p.getObject().getProperties() == null)) {
+				// should not happen...
+				throw new CmisRuntimeException("Repository sent invalid data!");
+			}
+
+			// get id property
+			PropertyData<?> idProperty = p.getObject().getProperties().getProperties().get(PropertyIds.OBJECT_ID);
+			if (!(idProperty instanceof PropertyId)) {
+				// the repository sent an object without a valid object id...
+				throw new CmisRuntimeException("Repository sent invalid data! No object id!");
+			}
+
+			// fetch the object and make sure it is a folder
+			ObjectId parentId = getSession().createObjectId((String) idProperty.getFirstValue());
+			CmisObject parentFolder = getSession().getObject(parentId);
+			if (!(parentFolder instanceof Folder)) {
+				// the repository sent an object that is not a folder...
+				throw new CmisRuntimeException("Repository sent invalid data! Object is not a folder!");
+			}
+
+			parents.add((Folder) parentFolder);
+		}
+
+		return parents;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.FileableCmisObject#getPaths()
+	 */
+	public List<String> getPaths() {
+		String objectId = getObjectId();
+
+		// get object paths of the parent folders
+		List<ObjectParentData> providerParents = getBinding().getNavigationService().getObjectParents(
+				getRepositoryId(), objectId, PropertyIds.PATH, false, IncludeRelationships.NONE, null, true, null);
+
+		List<String> paths = new ArrayList<String>();
+
+		for (ObjectParentData p : providerParents) {
+			if ((p == null) || (p.getObject() == null) || (p.getObject().getProperties() == null)) {
+				// should not happen...
+				throw new CmisRuntimeException("Repository sent invalid data!");
+			}
+
+			// get path property
+			PropertyData<?> pathProperty = p.getObject().getProperties().getProperties().get(PropertyIds.PATH);
+			if (!(pathProperty instanceof PropertyString)) {
+				// the repository sent a folder without a valid path...
+				throw new CmisRuntimeException("Repository sent invalid data! No path property!");
+			}
+
+			if (p.getRelativePathSegment() == null) {
+				// the repository didn't send a relative path segment
+				throw new CmisRuntimeException("Repository sent invalid data! No relative path segement!");
+			}
+
+			String folderPath = ((String) pathProperty.getFirstValue());
+			paths.add(folderPath + (folderPath.endsWith("/") ? "" : "/") + p.getRelativePathSegment());
+		}
+
+		return paths;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.FileableCmisObject#move(org.apache.opencmis
+	 * .client.api.ObjectId, org.apache.opencmis.client.api.ObjectId)
+	 */
+	public FileableCmisObject move(ObjectId sourceFolderId, ObjectId targetFolderId) {
+		String objectId = getObjectId();
+		Holder<String> objectIdHolder = new Holder<String>(objectId);
+
+		if ((sourceFolderId == null) || (sourceFolderId.getId() == null)) {
+			throw new IllegalArgumentException("Source folder id must be set!");
+		}
+
+		if ((targetFolderId == null) || (targetFolderId.getId() == null)) {
+			throw new IllegalArgumentException("Target folder id must be set!");
+		}
+
+		getBinding().getObjectService().moveObject(getRepositoryId(), objectIdHolder, targetFolderId.getId(),
+				sourceFolderId.getId(), null);
+
+		if (objectIdHolder.getValue() == null) {
+			return null;
+		}
+
+		CmisObject movedObject = getSession().getObject(getSession().createObjectId(objectIdHolder.getValue()));
+		if (!(movedObject instanceof FileableCmisObject)) {
+			throw new CmisRuntimeException("Moved object is invalid!");
+		}
+
+		return (FileableCmisObject) movedObject;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.FileableCmisObject#addToFolder(org.apache
+	 * .opencmis.client.api .ObjectId, boolean)
+	 */
+	public void addToFolder(ObjectId folderId, boolean allVersions) {
+		String objectId = getObjectId();
+
+		if ((folderId == null) || (folderId.getId() == null)) {
+			throw new IllegalArgumentException("Folder Id must be set!");
+		}
+
+		getBinding().getMultiFilingService().addObjectToFolder(getRepositoryId(), objectId, folderId.getId(),
+				allVersions, null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.apache.opencmis.client.api.FileableCmisObject#removeFromFolder(org
+	 * .apache.opencmis.client .api.ObjectId)
+	 */
+	public void removeFromFolder(ObjectId folderId) {
+		String objectId = getObjectId();
+
+		if ((folderId == null) || (folderId.getId() == null)) {
+			throw new IllegalArgumentException("Folder Id must be set!");
+		}
+
+		getBinding().getMultiFilingService()
+				.removeObjectFromFolder(getRepositoryId(), objectId, folderId.getId(), null);
+	}
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/CmisBindingHelper.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/CmisBindingHelper.java?rev=934889&r1=934888&r2=934889&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/CmisBindingHelper.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/CmisBindingHelper.java Fri Apr 16 14:07:11 2010
@@ -30,59 +30,59 @@ import org.apache.chemistry.opencmis.com
  * Helper methods for binding handling.
  */
 public class CmisBindingHelper {
-  /**
-   * Creates a {@link CmisProvider} object.
-   */
-  public static CmisBinding createProvider(Map<String, String> parameters) {
-    if (parameters == null || parameters.isEmpty()) {
-      throw new CmisRuntimeException("Session parameter not set!");
-    }
-
-    if (!parameters.containsKey(SessionParameter.BINDING_TYPE)) {
-      parameters.put(SessionParameter.BINDING_TYPE, BindingType.CUSTOM.value());
-    }
-
-    BindingType bt = BindingType.fromValue(parameters.get(SessionParameter.BINDING_TYPE));
-
-    switch (bt) {
-    case ATOMPUB:
-      return createAtomPubBinding(parameters);
-    case WEBSERVICES:
-      return createWebServiceBinding(parameters);
-    case CUSTOM:
-      return createCustomBinding(parameters);
-    default:
-      throw new CmisRuntimeException("Ambiguous session parameter: " + parameters);
-    }
-  }
-
-  /**
-   * Creates a provider with custom parameters.
-   */
-  private static CmisBinding createCustomBinding(Map<String, String> parameters) {
-    CmisBindingFactory factory = CmisBindingFactory.newInstance();
-    CmisBinding binding = factory.createCmisBinding(parameters);
-
-    return binding;
-  }
-
-  /**
-   * Creates a Web Services provider.
-   */
-  private static CmisBinding createWebServiceBinding(Map<String, String> parameters) {
-    CmisBindingFactory factory = CmisBindingFactory.newInstance();
-    CmisBinding binding = factory.createCmisWebServicesBinding(parameters);
-
-    return binding;
-  }
-
-  /**
-   * Creates an AtomPub provider.
-   */
-  private static CmisBinding createAtomPubBinding(Map<String, String> parameters) {
-    CmisBindingFactory factory = CmisBindingFactory.newInstance();
-    CmisBinding binding = factory.createCmisAtomPubBinding(parameters);
+	/**
+	 * Creates a {@link CmisProvider} object.
+	 */
+	public static CmisBinding createProvider(Map<String, String> parameters) {
+		if (parameters == null || parameters.isEmpty()) {
+			throw new CmisRuntimeException("Session parameter not set!");
+		}
+
+		if (!parameters.containsKey(SessionParameter.BINDING_TYPE)) {
+			parameters.put(SessionParameter.BINDING_TYPE, BindingType.CUSTOM.value());
+		}
+
+		BindingType bt = BindingType.fromValue(parameters.get(SessionParameter.BINDING_TYPE));
+
+		switch (bt) {
+		case ATOMPUB:
+			return createAtomPubBinding(parameters);
+		case WEBSERVICES:
+			return createWebServiceBinding(parameters);
+		case CUSTOM:
+			return createCustomBinding(parameters);
+		default:
+			throw new CmisRuntimeException("Ambiguous session parameter: " + parameters);
+		}
+	}
+
+	/**
+	 * Creates a provider with custom parameters.
+	 */
+	private static CmisBinding createCustomBinding(Map<String, String> parameters) {
+		CmisBindingFactory factory = CmisBindingFactory.newInstance();
+		CmisBinding binding = factory.createCmisBinding(parameters);
+
+		return binding;
+	}
+
+	/**
+	 * Creates a Web Services provider.
+	 */
+	private static CmisBinding createWebServiceBinding(Map<String, String> parameters) {
+		CmisBindingFactory factory = CmisBindingFactory.newInstance();
+		CmisBinding binding = factory.createCmisWebServicesBinding(parameters);
+
+		return binding;
+	}
+
+	/**
+	 * Creates an AtomPub provider.
+	 */
+	private static CmisBinding createAtomPubBinding(Map<String, String> parameters) {
+		CmisBindingFactory factory = CmisBindingFactory.newInstance();
+		CmisBinding binding = factory.createCmisAtomPubBinding(parameters);
 
-    return binding;
-  }
+		return binding;
+	}
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/ObjectIdImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/ObjectIdImpl.java?rev=934889&r1=934888&r2=934889&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/ObjectIdImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/ObjectIdImpl.java Fri Apr 16 14:07:11 2010
@@ -25,32 +25,32 @@ import org.apache.chemistry.opencmis.cli
  */
 public class ObjectIdImpl implements ObjectId {
 
-  private String id;
+	private String id;
 
-  /**
-   * Constructor.
-   */
-  public ObjectIdImpl(String id) {
-    setId(id);
-  }
+	/**
+	 * Constructor.
+	 */
+	public ObjectIdImpl(String id) {
+		setId(id);
+	}
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.apache.opencmis.client.api.ObjectId#getId()
-   */
-  public String getId() {
-    return id;
-  }
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.opencmis.client.api.ObjectId#getId()
+	 */
+	public String getId() {
+		return id;
+	}
 
-  /**
-   * Sets the id.
-   */
-  public void setId(String id) {
-    if ((id == null) || (id.length() == 0)) {
-      throw new IllegalArgumentException("Id must be set!");
-    }
+	/**
+	 * Sets the id.
+	 */
+	public void setId(String id) {
+		if ((id == null) || (id.length() == 0)) {
+			throw new IllegalArgumentException("Id must be set!");
+		}
 
-    this.id = id;
-  }
+		this.id = id;
+	}
 }