blob: b56a3bc6ed4095cf13679a2f7fc3f56077127500 [file] [log] [blame]
/*
* 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.inmemory;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.Acl;
import org.apache.chemistry.opencmis.commons.data.AllowableActions;
import org.apache.chemistry.opencmis.commons.data.ChangeEventInfo;
import org.apache.chemistry.opencmis.commons.data.ObjectData;
import org.apache.chemistry.opencmis.commons.data.PolicyIdList;
import org.apache.chemistry.opencmis.commons.enums.Action;
import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlListImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.AllowableActionsImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ChangeEventInfoDataImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PolicyIdListImpl;
import org.apache.chemistry.opencmis.inmemory.server.InMemoryServiceContext;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Content;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Filing;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Folder;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Item;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.ObjectStore;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Policy;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Relationship;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoredObject;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Version;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.VersionedDocument;
import org.apache.chemistry.opencmis.inmemory.types.PropertyCreationHelper;
import org.apache.chemistry.opencmis.server.support.TypeManager;
/**
* A collection of utility functions to fill the data objects used
* as return values for the service object calls
*/
public final class DataObjectCreator {
// Utility class
private DataObjectCreator() {
}
public static AllowableActions fillAllowableActions(StoredObject so, String user) {
boolean isFolder = so instanceof Folder;
boolean isDocument = so instanceof Content;
boolean isItem = so instanceof Item;
boolean isRelationship = so instanceof Relationship;
boolean isFileable = isFolder || isDocument || isItem;
boolean isPolicy = so instanceof Policy;
boolean isCheckedOut = false;
boolean canCheckOut = false;
boolean canCheckIn = false;
boolean isVersioned = so instanceof Version || so instanceof VersionedDocument;
boolean hasContent = so instanceof Content && ((Content) so).hasContent();
boolean isRootFolder = isFolder && ((Folder) so).getParentId() == null;
boolean hasRendition = so.hasRendition(user);
boolean canGetAcl = user != null && (isDocument || isFolder || isItem);
boolean canSetAcl = canGetAcl;
boolean cmis11 = InMemoryServiceContext.getCallContext().getCmisVersion() != CmisVersion.CMIS_1_0;
if (so instanceof Version) {
isCheckedOut = ((Version) so).isPwc();
canCheckIn = isCheckedOut && ((Version) so).getParentDocument().getCheckedOutBy().equals(user);
canCheckOut = !((Version) so).getParentDocument().isCheckedOut();
} else if (so instanceof VersionedDocument) {
isCheckedOut = ((VersionedDocument) so).isCheckedOut();
canCheckOut = !((VersionedDocument) so).isCheckedOut();
canCheckIn = isCheckedOut && ((VersionedDocument) so).getCheckedOutBy().equals(user);
}
AllowableActionsImpl allowableActions = new AllowableActionsImpl();
Set<Action> set = allowableActions.getAllowableActions();
if (!isRootFolder) {
set.add(Action.CAN_DELETE_OBJECT);
set.add(Action.CAN_UPDATE_PROPERTIES);
set.add(Action.CAN_APPLY_POLICY);
set.add(Action.CAN_GET_APPLIED_POLICIES);
}
if (isFolder || isDocument || isItem || isRelationship || isPolicy) {
set.add(Action.CAN_GET_PROPERTIES);
if (!isRootFolder && isFileable) {
set.add(Action.CAN_GET_OBJECT_PARENTS);
set.add(Action.CAN_MOVE_OBJECT);
}
}
if (isFolder) {
if (!isRootFolder) {
set.add(Action.CAN_GET_FOLDER_PARENT);
set.add(Action.CAN_DELETE_TREE);
}
set.add(Action.CAN_GET_FOLDER_TREE);
set.add(Action.CAN_GET_DESCENDANTS);
set.add(Action.CAN_CREATE_DOCUMENT);
set.add(Action.CAN_CREATE_FOLDER);
if (cmis11) {
set.add(Action.CAN_CREATE_ITEM);
}
set.add(Action.CAN_GET_CHILDREN);
}
if (hasContent) {
set.add(Action.CAN_DELETE_CONTENT_STREAM);
set.add(Action.CAN_GET_CONTENT_STREAM);
}
if (isVersioned) {
if (canCheckOut) {
set.add(Action.CAN_CHECK_OUT);
}
if (canCheckIn) {
set.add(Action.CAN_CANCEL_CHECK_OUT);
set.add(Action.CAN_CHECK_IN);
}
set.add(Action.CAN_GET_ALL_VERSIONS);
}
if (isDocument || isItem) {
if (so instanceof Filing && ((Filing) so).hasParent()) {
set.add(Action.CAN_ADD_OBJECT_TO_FOLDER);
set.add(Action.CAN_REMOVE_OBJECT_FROM_FOLDER);
}
if (isDocument) {
if (isVersioned) {
if (canCheckIn) {
set.add(Action.CAN_SET_CONTENT_STREAM);
}
} else {
set.add(Action.CAN_SET_CONTENT_STREAM);
}
}
}
if (hasRendition) {
set.add(Action.CAN_GET_RENDITIONS);
}
if (canSetAcl) {
set.add(Action.CAN_APPLY_ACL);
}
if (canGetAcl) {
set.add(Action.CAN_GET_ACL);
}
allowableActions.setAllowableActions(set);
return allowableActions;
}
public static Acl fillACL(StoredObject so) {
AccessControlListImpl acl = new AccessControlListImpl();
List<Ace> aces = new ArrayList<Ace>();
acl.setAces(aces);
return acl;
}
public static PolicyIdList fillPolicyIds(StoredObject so) {
PolicyIdListImpl polIds = new PolicyIdListImpl();
List<String> pols = so.getAppliedPolicies();
polIds.setPolicyIds(pols);
return polIds;
}
public static List<ObjectData> fillRelationships(TypeManager tm, ObjectStore objStore,
IncludeRelationships includeRelationships, StoredObject so, String user) {
return getRelationships(tm, objStore, includeRelationships, so, user);
}
public static ChangeEventInfo fillChangeEventInfo(StoredObject so) {
// TODO: to be completed if change information is implemented
ChangeEventInfo changeEventInfo = new ChangeEventInfoDataImpl();
return changeEventInfo;
}
public static List<ObjectData> getRelationships(TypeManager tm, ObjectStore objStore,
IncludeRelationships includeRelationships, StoredObject spo, String user) {
if (includeRelationships != IncludeRelationships.NONE) {
RelationshipDirection relationshipDirection = RelationshipDirection.SOURCE;
// source is default
if (includeRelationships == IncludeRelationships.TARGET) {
relationshipDirection = RelationshipDirection.TARGET;
} else if (includeRelationships == IncludeRelationships.BOTH) {
relationshipDirection = RelationshipDirection.EITHER;
}
List<StoredObject> relationships = objStore.getRelationships(spo.getId(), null, relationshipDirection);
List<ObjectData> res = new ArrayList<ObjectData>(relationships.size());
for (StoredObject so : relationships) {
ObjectData od = PropertyCreationHelper.getObjectData(tm, objStore, so, null, user, false,
IncludeRelationships.NONE, null, false, false, null);
res.add(od);
}
return res;
}
return null;
}
}