All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.chemistry.opencmis.client.runtime.SessionImpl Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.chemistry.opencmis.client.runtime;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.apache.chemistry.opencmis.client.api.ChangeEvents;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.ExtensionHandler;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.ItemIterable;
import org.apache.chemistry.opencmis.client.api.ObjectFactory;
import org.apache.chemistry.opencmis.client.api.ObjectId;
import org.apache.chemistry.opencmis.client.api.ObjectType;
import org.apache.chemistry.opencmis.client.api.OperationContext;
import org.apache.chemistry.opencmis.client.api.Policy;
import org.apache.chemistry.opencmis.client.api.QueryResult;
import org.apache.chemistry.opencmis.client.api.QueryStatement;
import org.apache.chemistry.opencmis.client.api.Relationship;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.client.api.Tree;
import org.apache.chemistry.opencmis.client.runtime.cache.Cache;
import org.apache.chemistry.opencmis.client.runtime.cache.CacheImpl;
import org.apache.chemistry.opencmis.client.runtime.repository.ObjectFactoryImpl;
import org.apache.chemistry.opencmis.client.runtime.util.AbstractPageFetcher;
import org.apache.chemistry.opencmis.client.runtime.util.CollectionIterable;
import org.apache.chemistry.opencmis.client.runtime.util.TreeImpl;
import org.apache.chemistry.opencmis.commons.SessionParameter;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.Acl;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.data.ObjectData;
import org.apache.chemistry.opencmis.commons.data.ObjectList;
import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionList;
import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
import org.apache.chemistry.opencmis.commons.enums.Updatability;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
import org.apache.chemistry.opencmis.commons.spi.AuthenticationProvider;
import org.apache.chemistry.opencmis.commons.spi.CmisBinding;
import org.apache.chemistry.opencmis.commons.spi.DiscoveryService;
import org.apache.chemistry.opencmis.commons.spi.Holder;
import org.apache.chemistry.opencmis.commons.spi.NavigationService;
import org.apache.chemistry.opencmis.commons.spi.RelationshipService;
import org.apache.chemistry.opencmis.commons.spi.RepositoryService;

/**
 * Persistent model session.
 */
public class SessionImpl implements Session {

    private static final OperationContext DEFAULT_CONTEXT = new OperationContextImpl(null, false, true, false,
            IncludeRelationships.NONE, null, true, null, true, 100);

    private static final Set CREATE_UPDATABILITY = new HashSet();
    static {
        CREATE_UPDATABILITY.add(Updatability.ONCREATE);
        CREATE_UPDATABILITY.add(Updatability.READWRITE);
    }

    // private static Log log = LogFactory.getLog(SessionImpl.class);

    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    /*
     * default session context (serializable)
     */
    private OperationContext context = DEFAULT_CONTEXT;

    /*
     * session parameter (serializable)
     */
    private Map parameters = null;

    /*
     * CMIS binding (serializable)
     */
    private CmisBinding binding = null;

    /*
     * Session Locale, determined from session parameter (serializable)
     */
    private Locale locale = null;

    /*
     * Object factory (serializable)
     */
    private final ObjectFactory objectFactory;

    /*
     * Authentication provider (serializable)
     */
    private final AuthenticationProvider authenticationProvider;

    /*
     * Object cache (serializable)
     */
    private Cache cache;
    private final boolean cachePathOmit;

    /*
     * Repository info (serializable)
     */
    private RepositoryInfo repositoryInfo;

    /**
     * required for serialization
     */
    private static final long serialVersionUID = 1L;

    /**
     * Constructor.
     */
    public SessionImpl(Map parameters, ObjectFactory objectFactory,
            AuthenticationProvider authenticationProvider, Cache cache) {
        if (parameters == null) {
            throw new IllegalArgumentException("No parameters provided!");
        }

        this.parameters = parameters;
        this.locale = determineLocale(parameters);

        this.objectFactory = (objectFactory == null ? createObjectFactory() : objectFactory);
        this.authenticationProvider = authenticationProvider;
        this.cache = (cache == null ? createCache() : cache);

        cachePathOmit = Boolean.parseBoolean(parameters.get(SessionParameter.CACHE_PATH_OMIT));
    }

    private static Locale determineLocale(Map parameters) {
        Locale locale = null;

        String language = parameters.get(SessionParameter.LOCALE_ISO639_LANGUAGE);
        String country = parameters.get(SessionParameter.LOCALE_ISO3166_COUNTRY);
        String variant = parameters.get(SessionParameter.LOCALE_VARIANT);

        if (variant != null) {
            // all 3 parameter must not be null and valid
            locale = new Locale(language, country, variant);
        } else {
            if (country != null) {
                // 2 parameter must not be null and valid
                locale = new Locale(language, country);
            } else {
                if (language != null) {
                    // 1 parameter must not be null and valid
                    locale = new Locale(language);
                } else {
                    locale = Locale.getDefault();
                }
            }
        }

        return locale;
    }

    private ObjectFactory createObjectFactory() {
        try {
            String classname = parameters.get(SessionParameter.OBJECT_FACTORY_CLASS);

            Class objectFactoryClass;
            if (classname == null) {
                objectFactoryClass = ObjectFactoryImpl.class;
            } else {
                objectFactoryClass = Class.forName(classname);
            }

            Object of = objectFactoryClass.newInstance();
            if (!(of instanceof ObjectFactory)) {
                throw new Exception("Class does not implement ObjectFactory!");
            }

            ((ObjectFactory) of).initialize(this, parameters);

            return (ObjectFactory) of;
        } catch (Exception e) {
            throw new IllegalArgumentException("Unable to create object factory: " + e, e);
        }
    }

    private Cache createCache() {
        try {
            String classname = parameters.get(SessionParameter.CACHE_CLASS);

            Class cacheClass;
            if (classname == null) {
                cacheClass = CacheImpl.class;
            } else {
                cacheClass = Class.forName(classname);
            }

            Object of = cacheClass.newInstance();
            if (!(of instanceof Cache)) {
                throw new Exception("Class does not implement Cache!");
            }

            ((Cache) of).initialize(this, parameters);

            return (Cache) of;
        } catch (Exception e) {
            throw new IllegalArgumentException("Unable to create cache: " + e, e);
        }
    }

    public void clear() {
        lock.writeLock().lock();
        try {
            // create new object cache
            this.cache = createCache();

            // clear provider cache
            getBinding().clearAllCaches();
        } finally {
            lock.writeLock().unlock();
        }
    }

    public ObjectFactory getObjectFactory() {
        return this.objectFactory;
    }

    public ItemIterable getCheckedOutDocs() {
        return getCheckedOutDocs(getDefaultContext());
    }

    public ItemIterable getCheckedOutDocs(OperationContext context) {
        if (context == null) {
            throw new IllegalArgumentException("Operation context must be set!");
        }

        final NavigationService navigationService = getBinding().getNavigationService();
        final ObjectFactory objectFactory = getObjectFactory();
        final OperationContext ctxt = new OperationContextImpl(context);

        return new CollectionIterable(new AbstractPageFetcher(ctxt.getMaxItemsPerPage()) {

            @Override
            protected AbstractPageFetcher.Page fetchPage(long skipCount) {

                // get all checked out documents
                ObjectList checkedOutDocs = navigationService.getCheckedOutDocs(getRepositoryId(), null,
                        ctxt.getFilterString(), ctxt.getOrderBy(), ctxt.isIncludeAllowableActions(),
                        ctxt.getIncludeRelationships(), ctxt.getRenditionFilterString(),
                        BigInteger.valueOf(this.maxNumItems), BigInteger.valueOf(skipCount), null);

                // convert objects
                List page = new ArrayList();
                if (checkedOutDocs.getObjects() != null) {
                    for (ObjectData objectData : checkedOutDocs.getObjects()) {
                        CmisObject doc = objectFactory.convertObject(objectData, ctxt);
                        if (!(doc instanceof Document)) {
                            // should not happen...
                            continue;
                        }

                        page.add((Document) doc);
                    }
                }

                return new AbstractPageFetcher.Page(page, checkedOutDocs.getNumItems(),
                        checkedOutDocs.hasMoreItems());
            }
        });
    }

    public ChangeEvents getContentChanges(String changeLogToken, boolean includeProperties, long maxNumItems) {
        return getContentChanges(changeLogToken, includeProperties, maxNumItems, getDefaultContext());
    }

    public ChangeEvents getContentChanges(String changeLogToken, boolean includeProperties, long maxNumItems,
            OperationContext context) {
        if (context == null) {
            throw new IllegalArgumentException("Operation context must be set!");
        }

        lock.readLock().lock();
        try {
            Holder changeLogTokenHolder = new Holder(changeLogToken);

            ObjectList objectList = getBinding().getDiscoveryService().getContentChanges(getRepositoryInfo().getId(),
                    changeLogTokenHolder, includeProperties, context.getFilterString(), context.isIncludePolicies(),
                    context.isIncludeAcls(), BigInteger.valueOf(maxNumItems), null);

            return objectFactory.convertChangeEvents(changeLogTokenHolder.getValue(), objectList);
        } finally {
            lock.readLock().unlock();
        }
    }

    public OperationContext getDefaultContext() {
        lock.readLock().lock();
        try {
            return this.context;
        } finally {
            lock.readLock().unlock();
        }
    }

    public void setDefaultContext(OperationContext context) {
        lock.writeLock().lock();
        try {
            this.context = (context == null ? DEFAULT_CONTEXT : context);
        } finally {
            lock.writeLock().unlock();
        }
    }

    public OperationContext createOperationContext(Set filter, boolean includeAcls,
            boolean includeAllowableActions, boolean includePolicies, IncludeRelationships includeRelationships,
            Set renditionFilter, boolean includePathSegments, String orderBy, boolean cacheEnabled,
            int maxItemsPerPage) {
        return new OperationContextImpl(filter, includeAcls, includeAllowableActions, includePolicies,
                includeRelationships, renditionFilter, includePathSegments, orderBy, cacheEnabled, maxItemsPerPage);
    }

    public OperationContext createOperationContext() {
        return new OperationContextImpl();
    }

    public ObjectId createObjectId(String id) {
        return new ObjectIdImpl(id);
    }

    public Locale getLocale() {
        return this.locale;
    }

    public CmisObject getObject(ObjectId objectId) {
        return getObject(objectId, getDefaultContext());
    }

    public CmisObject getObject(ObjectId objectId, OperationContext context) {
        if ((objectId == null) || (objectId.getId() == null)) {
            throw new IllegalArgumentException("Object Id must be set!");
        }

        return getObject(objectId.getId(), context);
    }

    public CmisObject getObject(String objectId) {
        return getObject(objectId, getDefaultContext());
    }

    public CmisObject getObject(String objectId, OperationContext context) {
        if (objectId == null) {
            throw new IllegalArgumentException("Object Id must be set!");
        }
        if (context == null) {
            throw new IllegalArgumentException("Operation context must be set!");
        }

        CmisObject result = null;

        // ask the cache first
        if (context.isCacheEnabled()) {
            result = this.cache.getById(objectId, context.getCacheKey());
            if (result != null) {
                return result;
            }
        }

        // get the object
        ObjectData objectData = this.binding.getObjectService().getObject(getRepositoryId(), objectId,
                context.getFilterString(), context.isIncludeAllowableActions(), context.getIncludeRelationships(),
                context.getRenditionFilterString(), context.isIncludePolicies(), context.isIncludeAcls(), null);

        result = getObjectFactory().convertObject(objectData, context);

        // put into cache
        if (context.isCacheEnabled()) {
            this.cache.put(result, context.getCacheKey());
        }

        return result;
    }

    public CmisObject getObjectByPath(String path) {
        return getObjectByPath(path, getDefaultContext());
    }

    public CmisObject getObjectByPath(String path, OperationContext context) {
        if (path == null) {
            throw new IllegalArgumentException("Path must be set!");
        }
        if (context == null) {
            throw new IllegalArgumentException("Operation context must be set!");
        }

        CmisObject result = null;

        // ask the cache first
        if (context.isCacheEnabled() && !cachePathOmit) {
            result = this.cache.getByPath(path, context.getCacheKey());
            if (result != null) {
                return result;
            }
        }

        // get the object
        ObjectData objectData = this.binding.getObjectService().getObjectByPath(getRepositoryId(), path,
                context.getFilterString(), context.isIncludeAllowableActions(), context.getIncludeRelationships(),
                context.getRenditionFilterString(), context.isIncludePolicies(), context.isIncludeAcls(), null);

        result = getObjectFactory().convertObject(objectData, context);

        // put into cache
        if (context.isCacheEnabled()) {
            this.cache.putPath(path, result, context.getCacheKey());
        }

        return result;
    }

    public void removeObjectFromCache(ObjectId objectId) {
        if ((objectId == null) || (objectId.getId() == null)) {
            return;
        }

        removeObjectFromCache(objectId.getId());
    }

    public void removeObjectFromCache(String objectId) {
        cache.remove(objectId);
    }

    public RepositoryInfo getRepositoryInfo() {
        lock.readLock().lock();
        try {
            return this.repositoryInfo;
        } finally {
            lock.readLock().unlock();
        }
    }

    public Folder getRootFolder() {
        return getRootFolder(getDefaultContext());
    }

    public Folder getRootFolder(OperationContext context) {
        String rootFolderId = getRepositoryInfo().getRootFolderId();

        CmisObject rootFolder = getObject(createObjectId(rootFolderId), context);
        if (!(rootFolder instanceof Folder)) {
            throw new CmisRuntimeException("Root folder object is not a folder!");
        }

        return (Folder) rootFolder;
    }

    public ItemIterable getTypeChildren(final String typeId, final boolean includePropertyDefinitions) {
        final RepositoryService repositoryService = getBinding().getRepositoryService();
        final ObjectFactory objectFactory = this.getObjectFactory();

        return new CollectionIterable(new AbstractPageFetcher(this.getDefaultContext()
                .getMaxItemsPerPage()) {

            @Override
            protected AbstractPageFetcher.Page fetchPage(long skipCount) {

                // fetch the data
                TypeDefinitionList tdl = repositoryService.getTypeChildren(SessionImpl.this.getRepositoryId(), typeId,
                        includePropertyDefinitions, BigInteger.valueOf(this.maxNumItems),
                        BigInteger.valueOf(skipCount), null);

                // convert type definitions
                List page = new ArrayList(tdl.getList().size());
                for (TypeDefinition typeDefinition : tdl.getList()) {
                    page.add(objectFactory.convertTypeDefinition(typeDefinition));
                }

                return new AbstractPageFetcher.Page(page, tdl.getNumItems(), tdl.hasMoreItems()) {
                };
            }
        });
    }

    public ObjectType getTypeDefinition(String typeId) {
        TypeDefinition typeDefinition = getBinding().getRepositoryService().getTypeDefinition(getRepositoryId(),
                typeId, null);
        return objectFactory.convertTypeDefinition(typeDefinition);
    }

    public List> getTypeDescendants(String typeId, int depth, boolean includePropertyDefinitions) {
        List descendants = getBinding().getRepositoryService().getTypeDescendants(
                getRepositoryId(), typeId, BigInteger.valueOf(depth), includePropertyDefinitions, null);

        return convertTypeDescendants(descendants);
    }

    /**
     * Converts binding TypeDefinitionContainer to API
     * Container.
     */
    private List> convertTypeDescendants(List descendantsList) {
        List> result = new ArrayList>();

        for (TypeDefinitionContainer container : descendantsList) {
            ObjectType objectType = objectFactory.convertTypeDefinition(container.getTypeDefinition());
            List> children = convertTypeDescendants(container.getChildren());

            result.add(new TreeImpl(objectType, children));
        }

        return result;
    }

    public ItemIterable query(final String statement, final boolean searchAllVersions) {
        return query(statement, searchAllVersions, getDefaultContext());
    }

    public ItemIterable query(final String statement, final boolean searchAllVersions,
            OperationContext context) {
        if (context == null) {
            throw new IllegalArgumentException("Operation context must be set!");
        }

        final DiscoveryService discoveryService = getBinding().getDiscoveryService();
        final ObjectFactory objectFactory = this.getObjectFactory();
        final OperationContext ctxt = new OperationContextImpl(context);

        return new CollectionIterable(new AbstractPageFetcher(ctxt.getMaxItemsPerPage()) {

            @Override
            protected AbstractPageFetcher.Page fetchPage(long skipCount) {

                // fetch the data
                ObjectList resultList = discoveryService.query(getRepositoryId(), statement, searchAllVersions,
                        ctxt.isIncludeAllowableActions(), ctxt.getIncludeRelationships(),
                        ctxt.getRenditionFilterString(), BigInteger.valueOf(this.maxNumItems),
                        BigInteger.valueOf(skipCount), null);

                // convert query results
                List page = new ArrayList();
                if (resultList.getObjects() != null) {
                    for (ObjectData objectData : resultList.getObjects()) {
                        if (objectData == null) {
                            continue;
                        }

                        page.add(objectFactory.convertQueryResult(objectData));
                    }
                }

                return new AbstractPageFetcher.Page(page, resultList.getNumItems(),
                        resultList.hasMoreItems());
            }
        });
    }

    public QueryStatement createQueryStatement(final String statement) {
        return new QueryStatementImpl(this, statement);
    }

    public String setExtensionContext(String context) {
        throw new CmisRuntimeException("not implemented");
    }

    public ExtensionHandler setExtensionHandler(String context, ExtensionHandler extensionHandler) {
        throw new CmisRuntimeException("not implemented");
    }

    /**
     * Connect session object to the provider. This is the very first call after
     * a session is created.
     * 

* In dependency of the parameter set an {@code AtomPub}, a * {@code WebService} or an {@code InMemory} provider is selected. */ public void connect() { lock.writeLock().lock(); try { this.binding = CmisBindingHelper.createBinding(parameters, authenticationProvider); /* get initial repository id from session parameter */ String repositoryId = parameters.get(SessionParameter.REPOSITORY_ID); if (repositoryId == null) { throw new IllegalStateException("Repository Id is not set!"); } repositoryInfo = objectFactory.convertRepositoryInfo(getBinding().getRepositoryService().getRepositoryInfo( repositoryId, null)); } finally { lock.writeLock().unlock(); } } public CmisBinding getBinding() { lock.readLock().lock(); try { return this.binding; } finally { lock.readLock().unlock(); } } public Cache getCache() { lock.readLock().lock(); try { return this.cache; } finally { lock.readLock().unlock(); } } /** * Returns the repository id. */ public String getRepositoryId() { return getRepositoryInfo().getId(); } // creates public ObjectId createDocument(Map properties, ObjectId folderId, ContentStream contentStream, VersioningState versioningState, List policies, List addAces, List removeAces) { if ((properties == null) || (properties.isEmpty())) { throw new IllegalArgumentException("Properties must not be empty!"); } String newId = getBinding().getObjectService().createDocument(getRepositoryId(), objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY), (folderId == null ? null : folderId.getId()), objectFactory.convertContentStream(contentStream), versioningState, objectFactory.convertPolicies(policies), objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null); if (newId == null) { return null; } return createObjectId(newId); } public ObjectId createDocumentFromSource(ObjectId source, Map properties, ObjectId folderId, VersioningState versioningState, List policies, List addAces, List removeAces) { if ((source == null) || (source.getId() == null)) { throw new IllegalArgumentException("Source must be set!"); } // get the type of the source document ObjectType type = null; if (source instanceof CmisObject) { type = ((CmisObject) source).getType(); } else { CmisObject sourceObj = getObject(source); type = sourceObj.getType(); } if (type.getBaseTypeId() != BaseTypeId.CMIS_DOCUMENT) { throw new IllegalArgumentException("Source object must be a document!"); } String newId = getBinding().getObjectService().createDocumentFromSource(getRepositoryId(), source.getId(), objectFactory.convertProperties(properties, type, CREATE_UPDATABILITY), (folderId == null ? null : folderId.getId()), versioningState, objectFactory.convertPolicies(policies), objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null); if (newId == null) { return null; } return createObjectId(newId); } public ObjectId createFolder(Map properties, ObjectId folderId, List policies, List addAces, List removeAces) { if ((folderId == null) || (folderId.getId() == null)) { throw new IllegalArgumentException("Folder Id must be set!"); } if ((properties == null) || (properties.isEmpty())) { throw new IllegalArgumentException("Properties must not be empty!"); } String newId = getBinding().getObjectService().createFolder(getRepositoryId(), objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY), folderId.getId(), objectFactory.convertPolicies(policies), objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null); if (newId == null) { return null; } return createObjectId(newId); } public ObjectId createPolicy(Map properties, ObjectId folderId, List policies, List addAces, List removeAces) { if ((properties == null) || (properties.isEmpty())) { throw new IllegalArgumentException("Properties must not be empty!"); } String newId = getBinding().getObjectService().createPolicy(getRepositoryId(), objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY), (folderId == null ? null : folderId.getId()), objectFactory.convertPolicies(policies), objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null); if (newId == null) { return null; } return createObjectId(newId); } public ObjectId createRelationship(Map properties, List policies, List addAces, List removeAces) { if ((properties == null) || (properties.isEmpty())) { throw new IllegalArgumentException("Properties must not be empty!"); } String newId = getBinding().getObjectService().createRelationship(getRepositoryId(), objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY), objectFactory.convertPolicies(policies), objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null); if (newId == null) { return null; } return createObjectId(newId); } public ObjectId createDocument(Map properties, ObjectId folderId, ContentStream contentStream, VersioningState versioningState) { return this.createDocument(properties, folderId, contentStream, versioningState, null, null, null); } public ObjectId createDocumentFromSource(ObjectId source, Map properties, ObjectId folderId, VersioningState versioningState) { return this.createDocumentFromSource(source, properties, folderId, versioningState, null, null, null); } public ObjectId createFolder(Map properties, ObjectId folderId) { return this.createFolder(properties, folderId, null, null, null); } public ObjectId createPolicy(Map properties, ObjectId folderId) { return this.createPolicy(properties, folderId, null, null, null); } public ObjectId createRelationship(Map properties) { return this.createRelationship(properties, null, null, null); } public ItemIterable getRelationships(ObjectId objectId, final boolean includeSubRelationshipTypes, final RelationshipDirection relationshipDirection, ObjectType type, OperationContext context) { if ((objectId == null) || (objectId.getId() == null)) { throw new IllegalArgumentException("Invalid object id!"); } if (context == null) { throw new IllegalArgumentException("Operation context must be set!"); } final String id = objectId.getId(); final String typeId = (type == null ? null : type.getId()); final RelationshipService relationshipService = getBinding().getRelationshipService(); final OperationContext ctxt = new OperationContextImpl(context); return new CollectionIterable(new AbstractPageFetcher(ctxt.getMaxItemsPerPage()) { @Override protected AbstractPageFetcher.Page fetchPage(long skipCount) { // fetch the relationships ObjectList relList = relationshipService.getObjectRelationships(getRepositoryId(), id, includeSubRelationshipTypes, relationshipDirection, typeId, ctxt.getFilterString(), ctxt.isIncludeAllowableActions(), BigInteger.valueOf(this.maxNumItems), BigInteger.valueOf(skipCount), null); // convert relationship objects List page = new ArrayList(); if (relList.getObjects() != null) { for (ObjectData rod : relList.getObjects()) { CmisObject relationship = getObject(createObjectId(rod.getId()), ctxt); if (!(relationship instanceof Relationship)) { throw new CmisRuntimeException("Repository returned an object that is not a relationship!"); } page.add((Relationship) relationship); } } return new AbstractPageFetcher.Page(page, relList.getNumItems(), relList.hasMoreItems()); } }); } public Acl getAcl(ObjectId objectId, boolean onlyBasicPermissions) { if ((objectId == null) || (objectId.getId() == null)) { throw new IllegalArgumentException("Invalid object id!"); } String id = objectId.getId(); return getBinding().getAclService().getAcl(getRepositoryId(), id, onlyBasicPermissions, null); } public Acl applyAcl(ObjectId objectId, List addAces, List removeAces, AclPropagation aclPropagation) { if ((objectId == null) || (objectId.getId() == null)) { throw new IllegalArgumentException("Invalid object id!"); } ObjectFactory of = getObjectFactory(); return getBinding().getAclService().applyAcl(getRepositoryId(), objectId.getId(), of.convertAces(addAces), of.convertAces(removeAces), aclPropagation, null); } public void applyPolicy(ObjectId objectId, ObjectId... policyIds) { if ((objectId == null) || (objectId.getId() == null)) { throw new IllegalArgumentException("Invalid object id!"); } if ((policyIds == null) || (policyIds.length == 0)) { throw new IllegalArgumentException("No Policies provided!"); } String[] ids = new String[policyIds.length]; for (int i = 0; i < policyIds.length; i++) { if ((policyIds[i] == null) || (policyIds[i].getId() == null)) { throw new IllegalArgumentException("A Policy Id is not set!"); } ids[i] = policyIds[i].getId(); } for (String id : ids) { getBinding().getPolicyService().applyPolicy(getRepositoryId(), id, objectId.getId(), null); } } public void removePolicy(ObjectId objectId, ObjectId... policyIds) { if ((objectId == null) || (objectId.getId() == null)) { throw new IllegalArgumentException("Invalid object id!"); } if ((policyIds == null) || (policyIds.length == 0)) { throw new IllegalArgumentException("No Policies provided!"); } String[] ids = new String[policyIds.length]; for (int i = 0; i < policyIds.length; i++) { if ((policyIds[i] == null) || (policyIds[i].getId() == null)) { throw new IllegalArgumentException("A Policy Id is not set!"); } ids[i] = policyIds[i].getId(); } for (String id : ids) { getBinding().getPolicyService().removePolicy(getRepositoryId(), id, objectId.getId(), null); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy