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

org.opencms.cmis.CmsCmisRepository Maven / Gradle / Ivy

Go to download

OpenCms is an enterprise-ready, easy to use website content management system based on Java and XML technology. Offering a complete set of features, OpenCms helps content managers worldwide to create and maintain beautiful websites fast and efficiently.

There is a newer version: 18.0
Show newest version
/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (C) Alkacon Software (http://www.alkacon.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * For further information about Alkacon Software, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.opencms.cmis;

import static org.opencms.cmis.CmsCmisUtil.checkResourceName;
import static org.opencms.cmis.CmsCmisUtil.ensureLock;
import static org.opencms.cmis.CmsCmisUtil.handleCmsException;
import static org.opencms.cmis.CmsCmisUtil.splitFilter;

import org.opencms.configuration.CmsConfigurationException;
import org.opencms.configuration.CmsParameterConfiguration;
import org.opencms.file.CmsFile;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsProject;
import org.opencms.file.CmsProperty;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.file.CmsVfsResourceAlreadyExistsException;
import org.opencms.file.types.CmsResourceTypeFolder;
import org.opencms.file.types.I_CmsResourceType;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.relations.CmsRelation;
import org.opencms.relations.CmsRelationFilter;
import org.opencms.repository.CmsRepositoryFilter;
import org.opencms.search.CmsSearchException;
import org.opencms.search.solr.CmsSolrIndex;
import org.opencms.search.solr.CmsSolrQuery;
import org.opencms.search.solr.CmsSolrResultList;
import org.opencms.util.CmsFileUtil;
import org.opencms.util.CmsRequestUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.Acl;
import org.apache.chemistry.opencmis.commons.data.AllowableActions;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.data.FailedToDeleteData;
import org.apache.chemistry.opencmis.commons.data.ObjectData;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderContainer;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderData;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
import org.apache.chemistry.opencmis.commons.data.ObjectList;
import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
import org.apache.chemistry.opencmis.commons.data.PermissionMapping;
import org.apache.chemistry.opencmis.commons.data.Properties;
import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.data.RenditionData;
import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
import org.apache.chemistry.opencmis.commons.definitions.PermissionDefinition;
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.CapabilityAcl;
import org.apache.chemistry.opencmis.commons.enums.CapabilityChanges;
import org.apache.chemistry.opencmis.commons.enums.CapabilityContentStreamUpdates;
import org.apache.chemistry.opencmis.commons.enums.CapabilityJoin;
import org.apache.chemistry.opencmis.commons.enums.CapabilityQuery;
import org.apache.chemistry.opencmis.commons.enums.CapabilityRenditions;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
import org.apache.chemistry.opencmis.commons.enums.SupportedPermissions;
import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisContentAlreadyExistsException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisNameConstraintViolationException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisNotSupportedException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisPermissionDeniedException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisStreamNotSupportedException;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.AclCapabilitiesDataImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.FailedToDeleteDataImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectInFolderContainerImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectInFolderDataImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectInFolderListImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectListImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectParentDataImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PermissionDefinitionDataImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PermissionMappingDataImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.RepositoryCapabilitiesImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.RepositoryInfoImpl;
import org.apache.chemistry.opencmis.commons.spi.Holder;
import org.apache.commons.logging.Log;

/**
 * Repository instance for CMIS repositories.

*/ public class CmsCmisRepository extends A_CmsCmisRepository { /** * Simple helper class to simplify creating a permission mapping.

*/ @SuppressWarnings("serial") private static class PermissionMappings extends HashMap { /** Default constructor.

*/ public PermissionMappings() { } /** * Creates a single mapping entry.

* * @param key the mapping key * @param permission the permission * * @return the mapping entry */ private static PermissionMapping createMapping(String key, String permission) { PermissionMappingDataImpl pm = new PermissionMappingDataImpl(); pm.setKey(key); pm.setPermissions(Collections.singletonList(permission)); return pm; } /** * Adds a permission mapping.

* * @param key the key * @param permission the permissions * * @return the instance itself */ public PermissionMappings add(String key, String permission) { put(key, createMapping(key, permission)); return this; } } /** The description parameter name. */ public static final String PARAM_DESCRIPTION = "description"; /** The project parameter name. */ public static final String PARAM_PROJECT = "project"; /** The property parameter name. */ public static final String PARAM_PROPERTY = "property"; /** The rendition parameter name. */ public static final String PARAM_RENDITION = "rendition"; /** The logger instance for this class. */ protected static final Log LOG = CmsLog.getLog(CmsCmisRepository.class); /** The index parameter name. */ private static final String PARAM_INDEX = "index"; /** The internal admin CMS context. */ private CmsObject m_adminCms; /** The repository description. */ private String m_description; /** The repository filter. */ private CmsRepositoryFilter m_filter; /** The repository id. */ private String m_id; /** The name of the SOLR index to use for querying. */ private String m_indexName; /** * Readonly flag to prevent write operations on the repository.

*/ private boolean m_isReadOnly; /** The parameter configuration map. */ private CmsParameterConfiguration m_parameterConfiguration = new CmsParameterConfiguration(); /** The project of the repository. */ private CmsProject m_project; /** List of dynamic property providers. */ private List m_propertyProviders = new ArrayList(); /** The relation object helper. */ private CmsCmisRelationHelper m_relationHelper = new CmsCmisRelationHelper(this); /** The map of rendition providers by stream ids. */ private Map m_renditionProviders = new HashMap(); /** The resource object helper. */ private CmsCmisResourceHelper m_resourceHelper = new CmsCmisResourceHelper(this); /** The root folder. */ private CmsResource m_root; /** * Creates a permission definition.

* * @param permission the permission name * @param description the permission description * * @return the new permission definition */ private static PermissionDefinition createPermission(String permission, String description) { PermissionDefinitionDataImpl pd = new PermissionDefinitionDataImpl(); pd.setId(permission); pd.setDescription(description); return pd; } /** * @see org.opencms.cmis.I_CmsCmisRepository#addConfigurationParameter(java.lang.String, java.lang.String) */ public void addConfigurationParameter(String paramName, String paramValue) { m_parameterConfiguration.add(paramName, paramValue); } /** * @see org.opencms.cmis.I_CmsCmisRepository#createDocument(org.opencms.cmis.CmsCmisCallContext, org.apache.chemistry.opencmis.commons.data.Properties, java.lang.String, org.apache.chemistry.opencmis.commons.data.ContentStream, org.apache.chemistry.opencmis.commons.enums.VersioningState, java.util.List, org.apache.chemistry.opencmis.commons.data.Acl, org.apache.chemistry.opencmis.commons.data.Acl) */ public synchronized String createDocument( CmsCmisCallContext context, Properties propertiesObj, String folderId, ContentStream contentStream, VersioningState versioningState, List policies, Acl addAces, Acl removeAces) { checkWriteAccess(); if ((addAces != null) || (removeAces != null)) { throw new CmisConstraintException("createDocument: ACEs not allowed"); } if (contentStream == null) { throw new CmisConstraintException("createDocument: no content stream given"); } try { CmsObject cms = getCmsObject(context); Map> properties = propertiesObj.getProperties(); String newDocName = (String)properties.get(PropertyIds.NAME).getFirstValue(); String defaultType = OpenCms.getResourceManager().getDefaultTypeForName(newDocName).getTypeName(); String resTypeName = getResourceTypeFromProperties(properties, defaultType); I_CmsResourceType cmsResourceType = OpenCms.getResourceManager().getResourceType(resTypeName); if (cmsResourceType.isFolder()) { throw new CmisConstraintException("Not a document type: " + resTypeName); } List cmsProperties = getOpenCmsProperties(properties); checkResourceName(newDocName); InputStream stream = contentStream.getStream(); byte[] content = CmsFileUtil.readFully(stream); CmsUUID parentFolderId = new CmsUUID(folderId); CmsResource parentFolder = cms.readResource(parentFolderId); String newFolderPath = CmsStringUtil.joinPaths(parentFolder.getRootPath(), newDocName); try { CmsResource newDocument = cms.createResource( newFolderPath, cmsResourceType.getTypeId(), content, cmsProperties); cms.unlockResource(newDocument.getRootPath()); return newDocument.getStructureId().toString(); } catch (CmsVfsResourceAlreadyExistsException e) { throw new CmisNameConstraintViolationException(e.getLocalizedMessage(), e); } } catch (CmsException e) { handleCmsException(e); return null; } catch (IOException e) { throw new CmisRuntimeException(e.getLocalizedMessage(), e); } } /** * @see org.opencms.cmis.I_CmsCmisRepository#createDocumentFromSource(org.opencms.cmis.CmsCmisCallContext, java.lang.String, org.apache.chemistry.opencmis.commons.data.Properties, java.lang.String, org.apache.chemistry.opencmis.commons.enums.VersioningState, java.util.List, org.apache.chemistry.opencmis.commons.data.Acl, org.apache.chemistry.opencmis.commons.data.Acl) */ public synchronized String createDocumentFromSource( CmsCmisCallContext context, String sourceId, Properties propertiesObj, String folderId, VersioningState versioningState, List policies, Acl addAces, Acl removeAces) { checkWriteAccess(); if ((addAces != null) || (removeAces != null)) { throw new CmisConstraintException("createDocument: ACEs not allowed"); } try { CmsObject cms = getCmsObject(context); Map> properties = new HashMap>(); if (propertiesObj != null) { properties = propertiesObj.getProperties(); } List cmsProperties = getOpenCmsProperties(properties); CmsUUID parentFolderId = new CmsUUID(folderId); CmsResource parentFolder = cms.readResource(parentFolderId); CmsUUID sourceUuid = new CmsUUID(sourceId); CmsResource source = cms.readResource(sourceUuid); String sourcePath = source.getRootPath(); PropertyData nameProp = properties.get(PropertyIds.NAME); String newDocName; if (nameProp != null) { newDocName = (String)nameProp.getFirstValue(); checkResourceName(newDocName); } else { newDocName = CmsResource.getName(source.getRootPath()); } String targetPath = CmsStringUtil.joinPaths(parentFolder.getRootPath(), newDocName); try { cms.copyResource(sourcePath, targetPath); } catch (CmsVfsResourceAlreadyExistsException e) { throw new CmisNameConstraintViolationException(e.getLocalizedMessage(), e); } CmsResource targetResource = cms.readResource(targetPath); cms.setDateLastModified(targetResource.getRootPath(), targetResource.getDateCreated(), false); cms.unlockResource(targetResource); boolean wasLocked = ensureLock(cms, targetResource); cms.writePropertyObjects(targetResource, cmsProperties); for (String key : properties.keySet()) { if (key.startsWith(CmsCmisTypeManager.PROPERTY_PREFIX_DYNAMIC)) { I_CmsPropertyProvider provider = getTypeManager().getPropertyProvider(key); try { String value = (String)(properties.get(key).getFirstValue()); provider.setPropertyValue(cms, targetResource, value); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); } } } if (wasLocked) { cms.unlockResource(targetResource); } return targetResource.getStructureId().toString(); } catch (CmsException e) { handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#createFolder(org.opencms.cmis.CmsCmisCallContext, org.apache.chemistry.opencmis.commons.data.Properties, java.lang.String, java.util.List, org.apache.chemistry.opencmis.commons.data.Acl, org.apache.chemistry.opencmis.commons.data.Acl) */ public synchronized String createFolder( CmsCmisCallContext context, Properties propertiesObj, String folderId, List policies, Acl addAces, Acl removeAces) { checkWriteAccess(); if ((addAces != null) || (removeAces != null)) { throw new CmisConstraintException("createFolder: ACEs not allowed"); } try { CmsObject cms = getCmsObject(context); Map> properties = propertiesObj.getProperties(); String resTypeName = getResourceTypeFromProperties(properties, CmsResourceTypeFolder.getStaticTypeName()); I_CmsResourceType cmsResourceType = OpenCms.getResourceManager().getResourceType(resTypeName); if (!cmsResourceType.isFolder()) { throw new CmisConstraintException("Invalid folder type: " + resTypeName); } List cmsProperties = getOpenCmsProperties(properties); String newFolderName = (String)properties.get(PropertyIds.NAME).getFirstValue(); checkResourceName(newFolderName); CmsUUID parentFolderId = new CmsUUID(folderId); CmsResource parentFolder = cms.readResource(parentFolderId); String newFolderPath = CmsStringUtil.joinPaths(parentFolder.getRootPath(), newFolderName); try { CmsResource newFolder = cms.createResource( newFolderPath, cmsResourceType.getTypeId(), null, cmsProperties); cms.unlockResource(newFolder); return newFolder.getStructureId().toString(); } catch (CmsVfsResourceAlreadyExistsException e) { throw new CmisNameConstraintViolationException(e.getLocalizedMessage(), e); } } catch (CmsException e) { handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#createRelationship(org.opencms.cmis.CmsCmisCallContext, org.apache.chemistry.opencmis.commons.data.Properties, java.util.List, org.apache.chemistry.opencmis.commons.data.Acl, org.apache.chemistry.opencmis.commons.data.Acl) */ public synchronized String createRelationship( CmsCmisCallContext context, Properties properties, List policies, Acl addAces, Acl removeAces) { try { CmsObject cms = getCmsObject(context); Map> propertyMap = properties.getProperties(); String sourceProp = (String)(propertyMap.get(PropertyIds.SOURCE_ID).getFirstValue()); String targetProp = (String)(propertyMap.get(PropertyIds.TARGET_ID).getFirstValue()); String typeId = (String)(propertyMap.get(PropertyIds.OBJECT_TYPE_ID).getFirstValue()); if (!typeId.startsWith("opencms:")) { throw new CmisConstraintException("Can't create this relationship type."); } String cmsTypeName = typeId.substring("opencms:".length()); CmsUUID sourceId = new CmsUUID(sourceProp); CmsUUID targetId = new CmsUUID(targetProp); CmsResource sourceRes = cms.readResource(sourceId); boolean wasLocked = ensureLock(cms, sourceRes); try { CmsResource targetRes = cms.readResource(targetId); cms.addRelationToResource(sourceRes.getRootPath(), targetRes.getRootPath(), cmsTypeName); return "REL_" + sourceRes.getStructureId() + "_" + targetRes.getStructureId() + "_" + cmsTypeName; } finally { if (wasLocked) { cms.unlockResource(sourceRes); } } } catch (CmsException e) { CmsCmisUtil.handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#deleteContentStream(org.opencms.cmis.CmsCmisCallContext, org.apache.chemistry.opencmis.commons.spi.Holder, org.apache.chemistry.opencmis.commons.spi.Holder) */ public synchronized void deleteContentStream( CmsCmisCallContext context, Holder objectId, Holder changeToken) { throw new CmisConstraintException("Content streams may not be deleted."); } /** * @see org.opencms.cmis.I_CmsCmisRepository#deleteObject(org.opencms.cmis.CmsCmisCallContext, java.lang.String, boolean) */ public synchronized void deleteObject(CmsCmisCallContext context, String objectId, boolean allVersions) { checkWriteAccess(); getHelper(objectId).deleteObject(context, objectId, allVersions); } /** * @see org.opencms.cmis.I_CmsCmisRepository#deleteTree(org.opencms.cmis.CmsCmisCallContext, java.lang.String, boolean, org.apache.chemistry.opencmis.commons.enums.UnfileObject, boolean) */ public synchronized FailedToDeleteData deleteTree( CmsCmisCallContext context, String folderId, boolean allVersions, UnfileObject unfileObjects, boolean continueOnFailure) { checkWriteAccess(); try { FailedToDeleteDataImpl result = new FailedToDeleteDataImpl(); result.setIds(new ArrayList()); CmsObject cms = getCmsObject(context); CmsUUID structureId = new CmsUUID(folderId); CmsResource folder = cms.readResource(structureId); if (!folder.isFolder()) { throw new CmisConstraintException("deleteTree can only be used on folders."); } ensureLock(cms, folder); cms.deleteResource(folder.getRootPath(), CmsResource.DELETE_PRESERVE_SIBLINGS); return result; } catch (CmsException e) { handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#getAcl(org.opencms.cmis.CmsCmisCallContext, java.lang.String, boolean) */ public synchronized Acl getAcl(CmsCmisCallContext context, String objectId, boolean onlyBasicPermissions) { return getHelper(objectId).getAcl(context, objectId, onlyBasicPermissions); } /** * @see org.opencms.cmis.I_CmsCmisRepository#getAllowableActions(org.opencms.cmis.CmsCmisCallContext, java.lang.String) */ public synchronized AllowableActions getAllowableActions(CmsCmisCallContext context, String objectId) { return getHelper(objectId).getAllowableActions(context, objectId); } /** * @see org.opencms.cmis.I_CmsCmisRepository#getCheckedOutDocs(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.lang.String, java.lang.String, boolean, org.apache.chemistry.opencmis.commons.enums.IncludeRelationships, java.lang.String, java.math.BigInteger, java.math.BigInteger) */ public synchronized ObjectList getCheckedOutDocs( CmsCmisCallContext context, String folderId, String filter, String orderBy, boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, BigInteger maxItems, BigInteger skipCount) { ObjectListImpl result = new ObjectListImpl(); result.setObjects(new ArrayList()); return result; } /** * @see org.opencms.cmis.I_CmsCmisRepository#getChildren(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.lang.String, java.lang.String, boolean, org.apache.chemistry.opencmis.commons.enums.IncludeRelationships, java.lang.String, boolean, java.math.BigInteger, java.math.BigInteger) */ public synchronized ObjectInFolderList getChildren( CmsCmisCallContext context, String folderId, String filter, String orderBy, boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, boolean includePathSegment, BigInteger maxItems, BigInteger skipCount) { try { CmsCmisResourceHelper helper = getResourceHelper(); // split filter Set filterCollection = splitFilter(filter); // skip and max int skip = (skipCount == null ? 0 : skipCount.intValue()); if (skip < 0) { skip = 0; } int max = (maxItems == null ? Integer.MAX_VALUE : maxItems.intValue()); if (max < 0) { max = Integer.MAX_VALUE; } CmsObject cms = getCmsObject(context); CmsUUID structureId = new CmsUUID(folderId); CmsResource folder = cms.readResource(structureId); if (!folder.isFolder()) { throw new CmisObjectNotFoundException("Not a folder!"); } // set object info of the the folder if (context.isObjectInfoRequired()) { helper.collectObjectData( context, cms, folder, null, renditionFilter, false, false, includeRelationships); } // prepare result ObjectInFolderListImpl result = new ObjectInFolderListImpl(); String folderSitePath = cms.getRequestContext().getSitePath(folder); List children = cms.getResourcesInFolder(folderSitePath, CmsResourceFilter.DEFAULT); CmsObjectListLimiter limiter = new CmsObjectListLimiter( children, maxItems, skipCount); List resultObjects = new ArrayList(); for (CmsResource child : limiter) { // build and add child object ObjectInFolderDataImpl objectInFolder = new ObjectInFolderDataImpl(); objectInFolder.setObject( helper.collectObjectData( context, cms, child, filterCollection, renditionFilter, includeAllowableActions, false, includeRelationships)); if (includePathSegment) { objectInFolder.setPathSegment(child.getName()); } resultObjects.add(objectInFolder); } result.setObjects(resultObjects); result.setNumItems(BigInteger.valueOf(children.size())); result.setHasMoreItems(Boolean.valueOf(limiter.hasMore())); return result; } catch (CmsException e) { handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#getConfiguration() */ public CmsParameterConfiguration getConfiguration() { return m_parameterConfiguration; } /** * @see org.opencms.cmis.I_CmsCmisRepository#getContentStream(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.lang.String, java.math.BigInteger, java.math.BigInteger) */ public synchronized ContentStream getContentStream( CmsCmisCallContext context, String objectId, String streamId, BigInteger offset, BigInteger length) { try { CmsObject cms = getCmsObject(context); CmsResource resource = cms.readResource(new CmsUUID(objectId)); byte[] contents = null; if (streamId != null) { I_CmsCmisRenditionProvider renditionProvider = m_renditionProviders.get(streamId); if (renditionProvider == null) { throw new CmisRuntimeException("Invalid stream id " + streamId); } contents = renditionProvider.getContent(cms, resource); } else if (resource.isFolder()) { throw new CmisStreamNotSupportedException("Not a file!"); } else { CmsFile file = cms.readFile(resource); contents = file.getContents(); } contents = extractRange(contents, offset, length); InputStream stream = new ByteArrayInputStream(contents); ContentStreamImpl result = new ContentStreamImpl(); result.setFileName(resource.getName()); result.setLength(BigInteger.valueOf(contents.length)); result.setMimeType(OpenCms.getResourceManager().getMimeType(resource.getRootPath(), null, "text/plain")); result.setStream(stream); return result; } catch (CmsException e) { handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#getDescendants(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.math.BigInteger, java.lang.String, boolean, boolean, boolean) */ public synchronized List getDescendants( CmsCmisCallContext context, String folderId, BigInteger depth, String filter, boolean includeAllowableActions, boolean includePathSegment, boolean foldersOnly) { try { CmsCmisResourceHelper helper = getResourceHelper(); // check depth int d = (depth == null ? 2 : depth.intValue()); if (d == 0) { throw new CmisInvalidArgumentException("Depth must not be 0!"); } if (d < -1) { d = -1; } // split filter Set filterCollection = splitFilter(filter); CmsObject cms = getCmsObject(context); CmsUUID folderStructureId = new CmsUUID(folderId); CmsResource folder = cms.readResource(folderStructureId); if (!folder.isFolder()) { throw new CmisObjectNotFoundException("Not a folder!"); } // set object info of the the folder if (context.isObjectInfoRequired()) { helper.collectObjectData( context, cms, folder, null, "cmis:none", false, false, IncludeRelationships.NONE); } // get the tree List result = new ArrayList(); gatherDescendants( context, cms, folder, result, foldersOnly, d, filterCollection, includeAllowableActions, includePathSegment); return result; } catch (CmsException e) { handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#getDescription() */ public String getDescription() { if (m_description != null) { return m_description; } if (m_project != null) { return m_project.getDescription(); } return m_id; } /** * @see org.opencms.cmis.I_CmsCmisRepository#getFilter() */ public CmsRepositoryFilter getFilter() { return m_filter; } /** * @see org.opencms.cmis.I_CmsCmisRepository#getFolderParent(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.lang.String) */ public synchronized ObjectData getFolderParent(CmsCmisCallContext context, String folderId, String filter) { List parents = getObjectParents(context, folderId, filter, false, false); if (parents.size() == 0) { throw new CmisInvalidArgumentException("The root folder has no parent!"); } return parents.get(0).getObject(); } /** * @see org.opencms.cmis.I_CmsCmisRepository#getId() */ public String getId() { return m_id; } /** * @see org.opencms.cmis.I_CmsCmisRepository#getName() */ public String getName() { return m_id; } /** * @see org.opencms.cmis.I_CmsCmisRepository#getObject(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.lang.String, boolean, org.apache.chemistry.opencmis.commons.enums.IncludeRelationships, java.lang.String, boolean, boolean) */ public synchronized ObjectData getObject( CmsCmisCallContext context, String objectId, String filter, boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, boolean includePolicyIds, boolean includeAcl) { return getHelper(objectId).getObject( context, objectId, filter, includeAllowableActions, includeRelationships, renditionFilter, includePolicyIds, includeAcl); } /** * @see org.opencms.cmis.I_CmsCmisRepository#getObjectByPath(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.lang.String, boolean, org.apache.chemistry.opencmis.commons.enums.IncludeRelationships, java.lang.String, boolean, boolean) */ public synchronized ObjectData getObjectByPath( CmsCmisCallContext context, String path, String filter, boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, boolean includePolicyIds, boolean includeAcl ) { try { CmsCmisResourceHelper helper = getResourceHelper(); // split filter Set filterCollection = splitFilter(filter); // check path if (CmsStringUtil.isEmptyOrWhitespaceOnly(path)) { throw new CmisInvalidArgumentException("Invalid folder path!"); } CmsObject cms = getCmsObject(context); CmsResource file = cms.readResource(path); return helper.collectObjectData( context, cms, file, filterCollection, renditionFilter, includeAllowableActions, includeAcl, IncludeRelationships.NONE); } catch (CmsException e) { handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#getObjectParents(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.lang.String, boolean, boolean) */ public synchronized List getObjectParents( CmsCmisCallContext context, String objectId, String filter, boolean includeAllowableActions, boolean includeRelativePathSegment) { try { CmsCmisResourceHelper helper = getResourceHelper(); // split filter Set filterCollection = splitFilter(filter); CmsObject cms = getCmsObject(context); CmsUUID structureId = new CmsUUID(objectId); CmsResource file = cms.readResource(structureId); // don't climb above the root folder if (m_root.equals(file)) { return Collections.emptyList(); } // set object info of the the object if (context.isObjectInfoRequired()) { helper.collectObjectData( context, cms, file, null, "cmis:none", false, false, IncludeRelationships.NONE); } // get parent folder CmsResource parent = cms.readParentFolder(file.getStructureId()); ObjectData object = helper.collectObjectData( context, cms, parent, filterCollection, "cmis:none", includeAllowableActions, false, IncludeRelationships.NONE); ObjectParentDataImpl result = new ObjectParentDataImpl(); result.setObject(object); if (includeRelativePathSegment) { result.setRelativePathSegment(file.getName()); } return Collections.singletonList((ObjectParentData)result); } catch (CmsException e) { handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#getObjectRelationships(org.opencms.cmis.CmsCmisCallContext, java.lang.String, boolean, org.apache.chemistry.opencmis.commons.enums.RelationshipDirection, java.lang.String, java.lang.String, boolean, java.math.BigInteger, java.math.BigInteger) */ public synchronized ObjectList getObjectRelationships( CmsCmisCallContext context, String objectId, boolean includeSubRelationshipTypes, RelationshipDirection relationshipDirection, String typeId, String filter, boolean includeAllowableActions, BigInteger maxItems, BigInteger skipCount) { try { CmsObject cms = getCmsObject(context); ObjectListImpl result = new ObjectListImpl(); CmsUUID structureId = new CmsUUID(objectId); CmsResource resource = cms.readResource(structureId); List resultObjects = getRelationshipObjectData( context, cms, resource, relationshipDirection, CmsCmisUtil.splitFilter(filter), includeAllowableActions); CmsObjectListLimiter limiter = new CmsObjectListLimiter( resultObjects, maxItems, skipCount); List limitedResults = new ArrayList(); for (ObjectData objectData : limiter) { limitedResults.add(objectData); } result.setNumItems(BigInteger.valueOf(resultObjects.size())); result.setHasMoreItems(Boolean.valueOf(limiter.hasMore())); result.setObjects(limitedResults); return result; } catch (CmsException e) { CmsCmisUtil.handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#getProperties(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.lang.String) */ public synchronized Properties getProperties(CmsCmisCallContext context, String objectId, String filter) { ObjectData object = getObject(context, objectId, null, false, null, null, false, false); return object.getProperties(); } /** * @see org.opencms.cmis.I_CmsCmisRepository#getRenditions(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.lang.String, java.math.BigInteger, java.math.BigInteger) */ public synchronized List getRenditions( CmsCmisCallContext context, String objectId, String renditionFilter, BigInteger maxItems, BigInteger skipCount) { try { CmsObject cms = getCmsObject(context); CmsResource resource = cms.readResource(new CmsUUID(objectId)); return getResourceHelper().collectObjectData( context, cms, resource, null, renditionFilter, false, false, IncludeRelationships.NONE).getRenditions(); } catch (CmsException e) { handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#getRepositoryInfo() */ public synchronized RepositoryInfo getRepositoryInfo() { // compile repository info RepositoryInfoImpl repositoryInfo = new RepositoryInfoImpl(); repositoryInfo.setId(m_id); repositoryInfo.setName(getName()); repositoryInfo.setDescription(getDescription()); repositoryInfo.setCmisVersionSupported("1.0"); repositoryInfo.setProductName("OpenCms"); repositoryInfo.setProductVersion(OpenCms.getSystemInfo().getVersion()); repositoryInfo.setVendorName("Alkacon Software GmbH & Co. KG"); repositoryInfo.setRootFolder(m_root.getStructureId().toString()); repositoryInfo.setThinClientUri(""); repositoryInfo.setPrincipalAnonymous(OpenCms.getDefaultUsers().getUserGuest()); repositoryInfo.setChangesIncomplete(Boolean.TRUE); RepositoryCapabilitiesImpl capabilities = new RepositoryCapabilitiesImpl(); capabilities.setCapabilityAcl(CapabilityAcl.DISCOVER); capabilities.setAllVersionsSearchable(Boolean.FALSE); capabilities.setCapabilityJoin(CapabilityJoin.NONE); capabilities.setSupportsMultifiling(Boolean.FALSE); capabilities.setSupportsUnfiling(Boolean.FALSE); capabilities.setSupportsVersionSpecificFiling(Boolean.FALSE); capabilities.setIsPwcSearchable(Boolean.FALSE); capabilities.setIsPwcUpdatable(Boolean.FALSE); capabilities.setCapabilityQuery(getIndex() != null ? CapabilityQuery.FULLTEXTONLY : CapabilityQuery.NONE); capabilities.setCapabilityChanges(CapabilityChanges.NONE); capabilities.setCapabilityContentStreamUpdates(CapabilityContentStreamUpdates.ANYTIME); capabilities.setSupportsGetDescendants(Boolean.TRUE); capabilities.setSupportsGetFolderTree(Boolean.TRUE); capabilities.setCapabilityRendition(CapabilityRenditions.READ); repositoryInfo.setCapabilities(capabilities); AclCapabilitiesDataImpl aclCapability = new AclCapabilitiesDataImpl(); aclCapability.setSupportedPermissions(SupportedPermissions.BOTH); aclCapability.setAclPropagation(AclPropagation.REPOSITORYDETERMINED); // permissions List permissions = new ArrayList(); permissions.add(createPermission(CMIS_READ, "Read")); permissions.add(createPermission(CMIS_WRITE, "Write")); permissions.add(createPermission(CMIS_ALL, "All")); aclCapability.setPermissionDefinitionData(permissions); // mappings PermissionMappings m = new PermissionMappings(); m.add(PermissionMapping.CAN_CREATE_DOCUMENT_FOLDER, CMIS_WRITE); m.add(PermissionMapping.CAN_CREATE_FOLDER_FOLDER, CMIS_WRITE); m.add(PermissionMapping.CAN_DELETE_CONTENT_DOCUMENT, CMIS_WRITE); m.add(PermissionMapping.CAN_DELETE_OBJECT, CMIS_WRITE); m.add(PermissionMapping.CAN_DELETE_TREE_FOLDER, CMIS_WRITE); m.add(PermissionMapping.CAN_GET_ACL_OBJECT, CMIS_READ); m.add(PermissionMapping.CAN_GET_ALL_VERSIONS_VERSION_SERIES, CMIS_READ); m.add(PermissionMapping.CAN_GET_CHILDREN_FOLDER, CMIS_READ); m.add(PermissionMapping.CAN_GET_DESCENDENTS_FOLDER, CMIS_READ); m.add(PermissionMapping.CAN_GET_FOLDER_PARENT_OBJECT, CMIS_READ); m.add(PermissionMapping.CAN_GET_PARENTS_FOLDER, CMIS_READ); m.add(PermissionMapping.CAN_GET_PROPERTIES_OBJECT, CMIS_READ); m.add(PermissionMapping.CAN_MOVE_OBJECT, CMIS_WRITE); m.add(PermissionMapping.CAN_MOVE_SOURCE, CMIS_WRITE); m.add(PermissionMapping.CAN_MOVE_TARGET, CMIS_WRITE); m.add(PermissionMapping.CAN_SET_CONTENT_DOCUMENT, CMIS_WRITE); m.add(PermissionMapping.CAN_UPDATE_PROPERTIES_OBJECT, CMIS_WRITE); m.add(PermissionMapping.CAN_VIEW_CONTENT_OBJECT, CMIS_READ); aclCapability.setPermissionMappingData(m); repositoryInfo.setAclCapabilities(aclCapability); return repositoryInfo; } /** * @see org.opencms.cmis.I_CmsCmisRepository#getTypeChildren(org.opencms.cmis.CmsCmisCallContext, java.lang.String, boolean, java.math.BigInteger, java.math.BigInteger) */ public synchronized TypeDefinitionList getTypeChildren( CmsCmisCallContext context, String typeId, boolean includePropertyDefinitions, BigInteger maxItems, BigInteger skipCount) { return m_typeManager.getTypeChildren(typeId, includePropertyDefinitions, maxItems, skipCount); } /** * @see org.opencms.cmis.I_CmsCmisRepository#getTypeDefinition(org.opencms.cmis.CmsCmisCallContext, java.lang.String) */ public synchronized TypeDefinition getTypeDefinition(CmsCmisCallContext context, String typeId) { return m_typeManager.getTypeDefinition(typeId); } /** * @see org.opencms.cmis.I_CmsCmisRepository#getTypeDescendants(org.opencms.cmis.CmsCmisCallContext, java.lang.String, java.math.BigInteger, boolean) */ public synchronized List getTypeDescendants( CmsCmisCallContext context, String typeId, BigInteger depth, boolean includePropertyDefinitions) { return m_typeManager.getTypeDescendants(typeId, depth, includePropertyDefinitions); } /** * @see org.opencms.cmis.I_CmsCmisRepository#initConfiguration() */ public void initConfiguration() throws CmsConfigurationException { if (m_filter != null) { m_filter.initConfiguration(); } m_description = m_parameterConfiguration.getString(PARAM_DESCRIPTION, null); List renditionProviderClasses = m_parameterConfiguration.getList( PARAM_RENDITION, Collections. emptyList()); for (String className : renditionProviderClasses) { try { I_CmsCmisRenditionProvider provider = (I_CmsCmisRenditionProvider)(Class.forName( className).newInstance()); String id = provider.getId(); m_renditionProviders.put(id, provider); } catch (Throwable e) { LOG.error(e.getLocalizedMessage(), e); } } List propertyProviderClasses = m_parameterConfiguration.getList( PARAM_PROPERTY, Collections. emptyList()); for (String className : propertyProviderClasses) { try { I_CmsPropertyProvider provider = (I_CmsPropertyProvider)(Class.forName(className).newInstance()); m_propertyProviders.add(provider); } catch (Throwable e) { LOG.error(e.getLocalizedMessage(), e); } } m_indexName = m_parameterConfiguration.getString(PARAM_INDEX, null); } /** * @see org.opencms.cmis.I_CmsCmisRepository#initializeCms(org.opencms.file.CmsObject) */ public void initializeCms(CmsObject cms) throws CmsException { m_adminCms = cms; m_typeManager = new CmsCmisTypeManager(cms, m_propertyProviders); String projectName = m_parameterConfiguration.getString(PARAM_PROJECT, CmsProject.ONLINE_PROJECT_NAME); CmsResource root = m_adminCms.readResource("/"); CmsObject offlineCms = OpenCms.initCmsObject(m_adminCms); CmsProject project = m_adminCms.readProject(projectName); m_project = project; offlineCms.getRequestContext().setCurrentProject(project); m_adminCms = offlineCms; m_root = root; m_isReadOnly = project.isOnlineProject(); } /** * @see org.opencms.cmis.I_CmsCmisRepository#moveObject(org.opencms.cmis.CmsCmisCallContext, org.apache.chemistry.opencmis.commons.spi.Holder, java.lang.String, java.lang.String) */ public synchronized void moveObject( CmsCmisCallContext context, Holder objectId, String targetFolderId, String sourceFolderId) { checkWriteAccess(); try { CmsObject cms = getCmsObject(context); CmsUUID structureId = new CmsUUID(objectId.getValue()); CmsUUID targetStructureId = new CmsUUID(targetFolderId); CmsResource targetFolder = cms.readResource(targetStructureId); CmsResource resourceToMove = cms.readResource(structureId); String name = CmsResource.getName(resourceToMove.getRootPath()); String newPath = CmsStringUtil.joinPaths(targetFolder.getRootPath(), name); boolean wasLocked = ensureLock(cms, resourceToMove); try { cms.moveResource(resourceToMove.getRootPath(), newPath); } finally { if (wasLocked) { CmsResource movedResource = cms.readResource(resourceToMove.getStructureId()); cms.unlockResource(movedResource); } } } catch (CmsException e) { handleCmsException(e); } } /** * @see org.opencms.cmis.I_CmsCmisRepository#query(org.opencms.cmis.CmsCmisCallContext, java.lang.String, boolean, boolean, org.apache.chemistry.opencmis.commons.enums.IncludeRelationships, java.lang.String, java.math.BigInteger, java.math.BigInteger) */ @Override public synchronized ObjectList query( CmsCmisCallContext context, String statement, boolean searchAllVersions, boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, BigInteger maxItems, BigInteger skipCount) { try { CmsObject cms = getCmsObject(context); CmsSolrIndex index = getIndex(); CmsCmisResourceHelper helper = getResourceHelper(); // split filter Set filterCollection = null; // skip and max int skip = (skipCount == null ? 0 : skipCount.intValue()); if (skip < 0) { skip = 0; } int max = (maxItems == null ? Integer.MAX_VALUE : maxItems.intValue()); if (max < 0) { max = Integer.MAX_VALUE; } CmsSolrResultList results = solrSearch(cms, index, statement, skip, max); ObjectListImpl resultObjectList = new ObjectListImpl(); List objectDataList = new ArrayList(); resultObjectList.setObjects(objectDataList); for (CmsResource resource : results) { // build and add child object objectDataList.add( helper.collectObjectData( context, cms, resource, filterCollection, renditionFilter, includeAllowableActions, false, includeRelationships)); } resultObjectList.setHasMoreItems(Boolean.valueOf(!results.isEmpty())); resultObjectList.setNumItems(BigInteger.valueOf(results.getVisibleHitCount())); return resultObjectList; } catch (CmsException e) { handleCmsException(e); return null; } } /** * @see org.opencms.cmis.I_CmsCmisRepository#setContentStream(org.opencms.cmis.CmsCmisCallContext, org.apache.chemistry.opencmis.commons.spi.Holder, boolean, org.apache.chemistry.opencmis.commons.spi.Holder, org.apache.chemistry.opencmis.commons.data.ContentStream) */ public synchronized void setContentStream( CmsCmisCallContext context, Holder objectId, boolean overwriteFlag, Holder changeToken, ContentStream contentStream) { checkWriteAccess(); try { CmsObject cms = getCmsObject(context); CmsUUID structureId = new CmsUUID(objectId.getValue()); if (!overwriteFlag) { throw new CmisContentAlreadyExistsException(); } CmsResource resource = cms.readResource(structureId); if (resource.isFolder()) { throw new CmisStreamNotSupportedException("Folders may not have content streams."); } CmsFile file = cms.readFile(resource); InputStream contentInput = contentStream.getStream(); byte[] newContent = CmsFileUtil.readFully(contentInput); file.setContents(newContent); boolean wasLocked = ensureLock(cms, resource); CmsFile newFile = cms.writeFile(file); if (wasLocked) { cms.unlockResource(newFile); } } catch (CmsException e) { handleCmsException(e); } catch (IOException e) { throw new CmisRuntimeException(e.getLocalizedMessage(), e); } } /** * @see org.opencms.cmis.I_CmsCmisRepository#setFilter(org.opencms.repository.CmsRepositoryFilter) */ public void setFilter(CmsRepositoryFilter filter) { m_filter = filter; LOG.warn("Filters not supported by CMIS repositories, ignoring configuration..."); } /** * @see org.opencms.cmis.I_CmsCmisRepository#setName(java.lang.String) */ public void setName(String name) { m_id = name; } /** * @see org.opencms.cmis.I_CmsCmisRepository#updateProperties(org.opencms.cmis.CmsCmisCallContext, org.apache.chemistry.opencmis.commons.spi.Holder, org.apache.chemistry.opencmis.commons.spi.Holder, org.apache.chemistry.opencmis.commons.data.Properties) */ public synchronized void updateProperties( CmsCmisCallContext context, Holder objectId, Holder changeToken, Properties properties) { checkWriteAccess(); try { CmsObject cms = getCmsObject(context); CmsUUID structureId = new CmsUUID(objectId.getValue()); CmsResource resource = cms.readResource(structureId); Map> propertyMap = properties.getProperties(); List cmsProperties = getOpenCmsProperties(propertyMap); boolean wasLocked = ensureLock(cms, resource); try { cms.writePropertyObjects(resource, cmsProperties); @SuppressWarnings("unchecked") PropertyData nameProperty = (PropertyData)propertyMap.get(PropertyIds.NAME); if (nameProperty != null) { String newName = nameProperty.getFirstValue(); checkResourceName(newName); String parentFolder = CmsResource.getParentFolder(resource.getRootPath()); String newPath = CmsStringUtil.joinPaths(parentFolder, newName); cms.moveResource(resource.getRootPath(), newPath); resource = cms.readResource(resource.getStructureId()); } for (String key : properties.getProperties().keySet()) { if (key.startsWith(CmsCmisTypeManager.PROPERTY_PREFIX_DYNAMIC)) { I_CmsPropertyProvider provider = getTypeManager().getPropertyProvider(key); try { String value = (String)(properties.getProperties().get(key).getFirstValue()); provider.setPropertyValue(cms, resource, value); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); } } } } finally { if (wasLocked) { cms.unlockResource(resource); } } } catch (CmsException e) { handleCmsException(e); } } /** * Checks whether we have write access to this repository and throws an exception otherwise.

*/ protected void checkWriteAccess() { if (m_isReadOnly) { throw new CmisNotSupportedException("Readonly repository '" + m_id + "' does not allow write operations."); } } /** * Initializes a CMS context for the authentication data contained in a call context.

* * @param context the call context * @return the initialized CMS context */ protected CmsObject getCmsObject(CmsCmisCallContext context) { try { if (context.getUsername() == null) { // user name can be null CmsObject cms = OpenCms.initCmsObject(OpenCms.getDefaultUsers().getUserGuest()); cms.getRequestContext().setCurrentProject(m_adminCms.getRequestContext().getCurrentProject()); return cms; } else { CmsObject cms = OpenCms.initCmsObject(m_adminCms); CmsProject projectBeforeLogin = cms.getRequestContext().getCurrentProject(); cms.loginUser(context.getUsername(), context.getPassword()); cms.getRequestContext().setCurrentProject(projectBeforeLogin); return cms; } } catch (CmsException e) { throw new CmisPermissionDeniedException(e.getLocalizedMessage(), e); } } /** * Gets the relationship data for a given resource.

* * @param context the call context * @param cms the CMS context * @param resource the resource * @param relationshipDirection the relationship direction * @param filterSet the property filter * @param includeAllowableActions true if allowable actions should be included * @return the list of relationship data * * @throws CmsException if something goes wrong */ protected List getRelationshipObjectData( CmsCmisCallContext context, CmsObject cms, CmsResource resource, RelationshipDirection relationshipDirection, Set filterSet, boolean includeAllowableActions) throws CmsException { List resultObjects = new ArrayList(); CmsRelationFilter relationFilter; if (relationshipDirection == RelationshipDirection.SOURCE) { relationFilter = CmsRelationFilter.TARGETS; } else if (relationshipDirection == RelationshipDirection.TARGET) { relationFilter = CmsRelationFilter.SOURCES; } else { relationFilter = CmsRelationFilter.ALL; } List unfilteredRelations = cms.getRelationsForResource(resource.getRootPath(), relationFilter); List relations = new ArrayList(); for (CmsRelation relation : unfilteredRelations) { if (relation.getTargetId().isNullUUID() || relation.getSourceId().isNullUUID()) { continue; } relations.add(relation); } CmsCmisRelationHelper helper = getRelationHelper(); for (CmsRelation relation : relations) { ObjectData objData = helper.collectObjectData( context, cms, resource, relation, filterSet, includeAllowableActions, false); resultObjects.add(objData); } return resultObjects; } /** * Gets the rendition providers matching the given filter.

* * @param filter the rendition filter * * @return the rendition providers matching the filter */ protected List getRenditionProviders(CmsCmisRenditionFilter filter) { List result = new ArrayList(); for (I_CmsCmisRenditionProvider provider : m_renditionProviders.values()) { String mimetype = provider.getMimeType(); String kind = provider.getKind(); if (filter.accept(kind, mimetype)) { result.add(provider); } } return result; } /** * Extracts the resource type from a set of CMIS properties.

* * @param properties the CMIS properties * @param defaultValue the default value * * @return the resource type property, or the default value if the property was not found */ protected String getResourceTypeFromProperties(Map> properties, String defaultValue) { PropertyData typeProp = properties.get(CmsCmisTypeManager.PROPERTY_RESOURCE_TYPE); String resTypeName = defaultValue; if (typeProp != null) { resTypeName = (String)typeProp.getFirstValue(); } return resTypeName; } /** * Gets the type manager instance.

* * @return the type manager instance */ protected CmsCmisTypeManager getTypeManager() { return m_typeManager; } /** * Gets the correct helper object for a given object id to perform operations on the corresponding object.

* * @param objectId the object id * * @return the helper object to use for the given object id */ I_CmsCmisObjectHelper getHelper(String objectId) { if (CmsUUID.isValidUUID(objectId)) { return getResourceHelper(); } else if (CmsCmisRelationHelper.RELATION_PATTERN.matcher(objectId).matches()) { return getRelationHelper(); } else { return null; } } /** * Helper method for executing a query.

* * @param cms the CMS context to use * @param index the index to use for the query * @param query the query to perform * @param start the start offset * @param rows the number of results to return * * @return the list of search results * @throws CmsSearchException if something goes wrong */ CmsSolrResultList solrSearch(CmsObject cms, CmsSolrIndex index, String query, int start, int rows) throws CmsSearchException { CmsSolrQuery q = new CmsSolrQuery(null, CmsRequestUtil.createParameterMap(query)); q.setStart(new Integer(start)); q.setRows(new Integer(rows)); CmsSolrResultList resultPage = index.search(cms, q, true); return resultPage; } /** * Helper method to collect the descendants of a given folder.

* * @param context the call context * @param cms the CMS context * @param folder the parent folder * @param list the list to which the descendants should be added * @param foldersOnly flag to exclude files from the result * @param depth the maximum depth * @param filter the property filter * @param includeAllowableActions flag to include allowable actions * @param includePathSegments flag to include path segments */ private void gatherDescendants( CmsCmisCallContext context, CmsObject cms, CmsResource folder, List list, boolean foldersOnly, int depth, Set filter, boolean includeAllowableActions, boolean includePathSegments) { try { CmsCmisResourceHelper helper = getResourceHelper(); List children = cms.getResourcesInFolder(cms.getSitePath(folder), CmsResourceFilter.DEFAULT); Collections.sort(children, new Comparator() { public int compare(CmsResource a, CmsResource b) { return a.getName().compareTo(b.getName()); } }); // iterate through children for (CmsResource child : children) { // folders only? if (foldersOnly && !child.isFolder()) { continue; } // add to list ObjectInFolderDataImpl objectInFolder = new ObjectInFolderDataImpl(); objectInFolder.setObject( helper.collectObjectData( context, cms, child, filter, "cmis:none", includeAllowableActions, false, IncludeRelationships.NONE)); if (includePathSegments) { objectInFolder.setPathSegment(child.getName()); } ObjectInFolderContainerImpl container = new ObjectInFolderContainerImpl(); container.setObject(objectInFolder); list.add(container); // move to next level if ((depth != 1) && child.isFolder()) { container.setChildren(new ArrayList()); gatherDescendants( context, cms, child, container.getChildren(), foldersOnly, depth - 1, filter, includeAllowableActions, includePathSegments); } } } catch (CmsException e) { handleCmsException(e); } } /** * Gets the index to use for queries.

* * @return the index to use for queries */ private CmsSolrIndex getIndex() { String indexName = m_indexName; if (indexName == null) { return null; } return OpenCms.getSearchManager().getIndexSolr(indexName); } /** * Gets the relation object helper.

* * @return the relation object helper */ private CmsCmisRelationHelper getRelationHelper() { return m_relationHelper; } /** * Gets the resource object helper.

* * @return the resource object helper */ private CmsCmisResourceHelper getResourceHelper() { return m_resourceHelper; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy