Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* 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 static org.apache.chemistry.opencmis.commons.impl.CollectionsHelper.isNullOrEmpty;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.FileableCmisObject;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.FolderType;
import org.apache.chemistry.opencmis.client.api.Item;
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.Tree;
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.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
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.PropertyData;
import org.apache.chemistry.opencmis.commons.data.PropertyId;
import org.apache.chemistry.opencmis.commons.data.PropertyString;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
import org.apache.chemistry.opencmis.commons.spi.NavigationService;
public class FolderImpl extends AbstractFilableCmisObject implements Folder {
private static final long serialVersionUID = 1L;
/**
* Constructor.
*/
public FolderImpl(SessionImpl session, ObjectType objectType, ObjectData objectData, OperationContext context) {
initialize(session, objectType, objectData, context);
}
@Override
public FolderType getFolderType() {
ObjectType objectType = super.getType();
if (objectType instanceof FolderType) {
return (FolderType) objectType;
} else {
throw new ClassCastException("Object type is not a folder type.");
}
}
@Override
public Document createDocument(Map properties, ContentStream contentStream,
VersioningState versioningState, List policies, List addAces, List removeAces,
OperationContext context) {
ObjectId newId = getSession().createDocument(properties, this, contentStream, versioningState, policies,
addAces, removeAces);
// if no context is provided the object will not be fetched
if (context == null || newId == null) {
return null;
}
// get the new object
CmisObject object = getSession().getObject(newId, context);
if (!(object instanceof Document)) {
throw new CmisRuntimeException("Newly created object is not a document! New id: " + newId);
}
return (Document) object;
}
@Override
public Document createDocumentFromSource(ObjectId source, Map properties,
VersioningState versioningState, List policies, List addAces, List removeAces,
OperationContext context) {
ObjectId newId = getSession().createDocumentFromSource(source, properties, this, versioningState, policies,
addAces, removeAces);
// if no context is provided the object will not be fetched
if (context == null || newId == null) {
return null;
}
// get the new object
CmisObject object = getSession().getObject(newId, context);
if (!(object instanceof Document)) {
throw new CmisRuntimeException("Newly created object is not a document! New id: " + newId);
}
return (Document) object;
}
@Override
public Folder createFolder(Map properties, List policies, List addAces,
List removeAces, OperationContext context) {
ObjectId newId = getSession().createFolder(properties, this, policies, addAces, removeAces);
// if no context is provided the object will not be fetched
if (context == null || newId == null) {
return null;
}
// get the new object
CmisObject object = getSession().getObject(newId, context);
if (!(object instanceof Folder)) {
throw new CmisRuntimeException("Newly created object is not a folder! New id: " + newId);
}
return (Folder) object;
}
@Override
public Policy createPolicy(Map properties, List policies, List addAces,
List removeAces, OperationContext context) {
ObjectId newId = getSession().createPolicy(properties, this, policies, addAces, removeAces);
// if no context is provided the object will not be fetched
if (context == null || newId == null) {
return null;
}
// get the new object
CmisObject object = getSession().getObject(newId, context);
if (!(object instanceof Policy)) {
throw new CmisRuntimeException("Newly created object is not a policy! New id: " + newId);
}
return (Policy) object;
}
@Override
public Item createItem(Map properties, List policies, List addAces, List removeAces,
OperationContext context) {
ObjectId newId = getSession().createItem(properties, this, policies, addAces, removeAces);
// if no context is provided the object will not be fetched
if (context == null || newId == null) {
return null;
}
// get the new object
CmisObject object = getSession().getObject(newId, context);
if (!(object instanceof Item)) {
throw new CmisRuntimeException("Newly created object is not an item! New id: " + newId);
}
return (Item) object;
}
@Override
public List deleteTree(boolean allVersions, UnfileObject unfile, boolean continueOnFailure) {
return getSession().deleteTree(this, allVersions, unfile, continueOnFailure);
}
@Override
public String getParentId() {
return getPropertyValue(PropertyIds.PARENT_ID);
}
@Override
public List getAllowedChildObjectTypes() {
List result = new ArrayList();
readLock();
try {
List otids = getPropertyValue(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS);
if (otids == null) {
return result;
}
for (String otid : otids) {
result.add(getSession().getTypeDefinition(otid));
}
} finally {
readUnlock();
}
return result;
}
@Override
public ItemIterable getCheckedOutDocs() {
return getCheckedOutDocs(getSession().getDefaultContext());
}
@Override
public ItemIterable getCheckedOutDocs(OperationContext context) {
final String objectId = getObjectId();
final NavigationService navigationService = getBinding().getNavigationService();
final ObjectFactory objectFactory = getSession().getObjectFactory();
final OperationContext ctxt = new OperationContextImpl(context);
return new CollectionIterable(new AbstractPageFetcher(ctxt.getMaxItemsPerPage()) {
@Override
protected AbstractPageFetcher.Page fetchPage(long skipCount) {
// get checked out documents for this folder
ObjectList checkedOutDocs = navigationService.getCheckedOutDocs(getRepositoryId(), objectId,
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());
}
});
}
@Override
public ItemIterable getChildren() {
return getChildren(getSession().getDefaultContext());
}
@Override
public ItemIterable getChildren(OperationContext context) {
final String objectId = getObjectId();
final NavigationService navigationService = getBinding().getNavigationService();
final ObjectFactory objectFactory = getSession().getObjectFactory();
final OperationContext ctxt = new OperationContextImpl(context);
return new CollectionIterable(new AbstractPageFetcher(ctxt.getMaxItemsPerPage()) {
@Override
protected AbstractPageFetcher.Page fetchPage(long skipCount) {
// get the children
ObjectInFolderList children = navigationService.getChildren(getRepositoryId(), objectId,
ctxt.getFilterString(), ctxt.getOrderBy(), ctxt.isIncludeAllowableActions(),
ctxt.getIncludeRelationships(), ctxt.getRenditionFilterString(), ctxt.isIncludePathSegments(),
BigInteger.valueOf(this.maxNumItems), BigInteger.valueOf(skipCount), null);
// convert objects
List page = new ArrayList();
List childObjects = children.getObjects();
if (childObjects != null) {
for (ObjectInFolderData objectData : childObjects) {
if (objectData.getObject() != null) {
page.add(objectFactory.convertObject(objectData.getObject(), ctxt));
}
}
}
return new AbstractPageFetcher.Page(page, children.getNumItems(), children.hasMoreItems());
}
});
}
@Override
public List> getDescendants(int depth) {
return getDescendants(depth, getSession().getDefaultContext());
}
@Override
public List> getDescendants(int depth, OperationContext context) {
String objectId = getObjectId();
// get the descendants
List providerContainerList = getBinding().getNavigationService().getDescendants(
getRepositoryId(), objectId, BigInteger.valueOf(depth), context.getFilterString(),
context.isIncludeAllowableActions(), context.getIncludeRelationships(),
context.getRenditionFilterString(), context.isIncludePathSegments(), null);
return convertBindingContainer(providerContainerList, context);
}
@Override
public List> getFolderTree(int depth) {
return getFolderTree(depth, getSession().getDefaultContext());
}
@Override
public List> getFolderTree(int depth, OperationContext context) {
String objectId = getObjectId();
// get the folder tree
List providerContainerList = getBinding().getNavigationService().getFolderTree(
getRepositoryId(), objectId, BigInteger.valueOf(depth), context.getFilterString(),
context.isIncludeAllowableActions(), context.getIncludeRelationships(),
context.getRenditionFilterString(), context.isIncludePathSegments(), null);
return convertBindingContainer(providerContainerList, context);
}
/**
* Converts a binding container into an API container.
*/
private List> convertBindingContainer(List bindingContainerList,
OperationContext context) {
if (bindingContainerList == null) {
return null;
}
ObjectFactory of = getSession().getObjectFactory();
List> result = new ArrayList>();
for (ObjectInFolderContainer oifc : bindingContainerList) {
if (oifc.getObject() == null || oifc.getObject().getObject() == null) {
// shouldn't happen ...
continue;
}
// convert the object
CmisObject object = of.convertObject(oifc.getObject().getObject(), context);
if (!(object instanceof FileableCmisObject)) {
// the repository must not return objects that are not fileable,
// but you never know...
continue;
}
// convert the children
List> children = convertBindingContainer(oifc.getChildren(), context);
// add both to current container
result.add(new TreeImpl((FileableCmisObject) object, children));
}
return result;
}
@Override
public boolean isRootFolder() {
String objectId = getObjectId();
String rootFolderId = getSession().getRepositoryInfo().getRootFolderId();
return objectId.equals(rootFolderId);
}
@Override
public Folder getFolderParent() {
if (isRootFolder()) {
return null;
}
List parents = getParents(getSession().getDefaultContext());
if (isNullOrEmpty(parents)) {
return null;
}
return parents.get(0);
}
@Override
public String getPath() {
String path;
readLock();
try {
// get the path property
path = getPropertyValue(PropertyIds.PATH);
// if the path property isn't set, get it
if (path == null) {
String objectId = getObjectId();
ObjectData objectData = getBinding().getObjectService().getObject(getRepositoryId(), objectId,
getPropertyQueryName(PropertyIds.PATH), false, IncludeRelationships.NONE, "cmis:none", false,
false, null);
if (objectData.getProperties() != null && objectData.getProperties().getProperties() != null) {
PropertyData> pathProperty = objectData.getProperties().getProperties().get(PropertyIds.PATH);
if (pathProperty instanceof PropertyString) {
path = ((PropertyString) pathProperty).getFirstValue();
}
}
}
} finally {
readUnlock();
}
// we still don't know the path ... it's not a CMIS compliant repository
if (path == null) {
throw new CmisRuntimeException("Repository didn't return " + PropertyIds.PATH + "!");
}
return path;
}
@Override
public List getParents(OperationContext context) {
if (isRootFolder()) {
return Collections.emptyList();
}
String objectId = getObjectId();
ObjectData bindingParent = getBinding().getNavigationService().getFolderParent(getRepositoryId(), objectId,
getPropertyQueryName(PropertyIds.OBJECT_ID), null);
if (bindingParent.getProperties() == null) {
// should not happen...
throw new CmisRuntimeException("Repository sent invalid data!");
}
// get id property
PropertyData> idProperty = bindingParent.getProperties().getProperties().get(PropertyIds.OBJECT_ID);
if (!(idProperty instanceof PropertyId) && !(idProperty instanceof PropertyString)) {
// 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
CmisObject parentFolder = getSession().getObject((String) idProperty.getFirstValue(), context);
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!");
}
return Collections.singletonList((Folder) parentFolder);
}
@Override
public List getPaths() {
return Collections.singletonList(getPath());
}
@Override
public Document createDocument(Map properties, ContentStream contentStream,
VersioningState versioningState) {
return this.createDocument(properties, contentStream, versioningState, null, null, null, getSession()
.getDefaultContext());
}
@Override
public Document createDocumentFromSource(ObjectId source, Map properties, VersioningState versioningState) {
return this.createDocumentFromSource(source, properties, versioningState, null, null, null, getSession()
.getDefaultContext());
}
@Override
public Folder createFolder(Map properties) {
return this.createFolder(properties, null, null, null, getSession().getDefaultContext());
}
@Override
public Policy createPolicy(Map properties) {
return this.createPolicy(properties, null, null, null, getSession().getDefaultContext());
}
@Override
public Item createItem(Map properties) {
return this.createItem(properties, null, null, null, getSession().getDefaultContext());
}
}