blob: 44d3355fba2dcd769513316a9b59c5714d891b89 [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.server;
import java.util.ArrayList;
import java.util.List;
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.ObjectParentData;
import org.apache.chemistry.opencmis.commons.data.RenditionData;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
import org.apache.chemistry.opencmis.commons.impl.server.ObjectInfoImpl;
import org.apache.chemistry.opencmis.commons.impl.server.RenditionInfoImpl;
import org.apache.chemistry.opencmis.commons.server.ObjectInfoHandler;
import org.apache.chemistry.opencmis.commons.server.RenditionInfo;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Content;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.DocumentVersion;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.Filing;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.ObjectStore;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoreManager;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoredObject;
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;
/**
* For the Atom binding more information might be required than the result of a
* service call provides (mainly to fill all the links). This class fills the
* objectInfoHolder that was introduced for this purpose
*
*/
public class AtomLinkInfoProvider {
private final StoreManager fStoreManager;
public AtomLinkInfoProvider(StoreManager storeManager) {
fStoreManager = storeManager;
}
/**
* FillObjectInfoHolder object with required information needed for Atom
* binding for a single object.
*
* @param repositoryId
* id of repository
* @param so
* object to retrieve information for
* @param od
* object data
* @param objInfo
* Holder to fill with information
*/
public void fillInformationForAtomLinks(String repositoryId, StoredObject so, ObjectData od,
ObjectInfoImpl objInfo) {
if (null == objInfo || null == so) {
return;
}
TypeDefinition typeDef = fStoreManager.getTypeById(repositoryId, so.getTypeId()).getTypeDefinition();
ObjectStore objStore = fStoreManager.getObjectStore(repositoryId);
// Fill all setters:
objInfo.setId(so.getId());
objInfo.setName(so.getName());
objInfo.setCreatedBy(so.getCreatedBy()); // !
objInfo.setCreationDate(so.getCreatedAt()); // !
objInfo.setLastModificationDate(so.getModifiedAt());
objInfo.setTypeId(so.getTypeId());
objInfo.setBaseType(typeDef.getBaseTypeId());
objInfo.setObject(od);
// versioning information:
if (so instanceof DocumentVersion) {
DocumentVersion ver = (DocumentVersion) so;
DocumentVersion pwc = ver.getParentDocument().getPwc();
objInfo.setIsCurrentVersion(ver == ver.getParentDocument().getLatestVersion(false));
objInfo.setVersionSeriesId(ver.getParentDocument().getId());
objInfo.setWorkingCopyId(pwc == null ? null : pwc.getId());
objInfo.setWorkingCopyOriginalId(pwc == ver && ver.getParentDocument().getLatestVersion(false) != null ? ver
.getParentDocument().getLatestVersion(false).getId()
: null);
} else if (so instanceof VersionedDocument) {
VersionedDocument doc = (VersionedDocument) so;
DocumentVersion pwc = doc.getPwc();
objInfo.setIsCurrentVersion(false);
objInfo.setVersionSeriesId(doc.getId());
objInfo.setWorkingCopyId(pwc == null ? null : pwc.getId());
objInfo.setWorkingCopyOriginalId(null);
} else { // unversioned document
objInfo.setIsCurrentVersion(true);
objInfo.setVersionSeriesId(null);
objInfo.setWorkingCopyId(null);
objInfo.setWorkingCopyOriginalId(null);
}
if (so instanceof Content) {
ContentStream contentStream = ((Content) so).getContent();
objInfo.setHasContent(contentStream != null);
objInfo.setContentType(contentStream != null ? contentStream.getMimeType() : null);
objInfo.setFileName(contentStream != null ? contentStream.getFileName() : null);
} else {
objInfo.setHasContent(false);
objInfo.setContentType(null);
objInfo.setFileName(null);
}
// Filing
if (so instanceof Filing) {
Filing sop = ((Filing) so);
objInfo.setHasParent(sop.hasParent());
} else {
objInfo.setHasParent(false);
}
List<RenditionData> renditions = objStore.getRenditions(so, "*", 0, 0);
if (renditions == null || renditions.size() == 0) {
objInfo.setRenditionInfos(null);
} else {
List<RenditionInfo> infos = new ArrayList<RenditionInfo>();
for (RenditionData rendition : renditions) {
RenditionInfoImpl info = new RenditionInfoImpl();
info.setKind(rendition.getKind());
info.setId(rendition.getStreamId());
info.setContentType(rendition.getMimeType());
info.setLength(rendition.getBigLength());
info.setTitle(rendition.getTitle());
infos.add(info);
}
objInfo.setRenditionInfos(infos);
}
// Relationships
objInfo.setSupportsRelationships(true);
List<StoredObject> rels = objStore.getRelationships(so.getId(), null, RelationshipDirection.SOURCE);
List<String> srcIds = new ArrayList<String>(rels.size());
for (StoredObject rel : rels) {
srcIds.add(rel.getId());
}
rels = objStore.getRelationships(so.getId(), null, RelationshipDirection.TARGET);
List<String> targetIds = new ArrayList<String>(rels.size());
for (StoredObject rel : rels) {
targetIds.add(rel.getId());
}
objInfo.setRelationshipSourceIds(srcIds);
objInfo.setRelationshipTargetIds(targetIds);
objInfo.setSupportsPolicies(true);
objInfo.setHasAcl(true);
objInfo.setSupportsDescendants(true);
objInfo.setSupportsFolderTree(true);
}
/**
* FillObjectInfoHolder object with required information needed for Atom
* binding for a single object.
*
* @param repositoryId
* id of repository
* @param so
* object to retrieve information for
* @param objectInfo
* Holder to fill with information
*/
public void fillInformationForAtomLinks(String repositoryId, StoredObject so, ObjectInfoImpl objectInfo) {
TypeManager tm = fStoreManager.getTypeManager(repositoryId);
ObjectStore objStore = fStoreManager.getObjectStore(repositoryId);
ObjectData od = PropertyCreationHelper.getObjectData(tm, objStore, so, null, null, false,
IncludeRelationships.NONE, null, false, false, null);
fillInformationForAtomLinks(repositoryId, so, od, objectInfo);
}
/**
* FillObjectInfoHolder object with required information needed for Atom
* binding for a single object.
*
* @param repositoryId
* id of repository
* @param objectId
* object to retrieve information for
* @param objectInfo
* Holder to fill with information
*/
public void fillInformationForAtomLinks(String repositoryId, String objectId, ObjectInfoImpl objectInfo) {
if (null == objectInfo || null == objectId) {
return;
}
ObjectStore objectStore = fStoreManager.getObjectStore(repositoryId);
StoredObject so = objectStore.getObjectById(objectId);
fillInformationForAtomLinks(repositoryId, so, objectInfo);
}
/**
* FillObjectInfoHolder object with required information needed for Atom
* binding after a getChildren() call in navigation service.
*
* @param repositoryId
* id of repository
* @param objectId
* object to retrieve information for
* @param objectInfos
* Holder to fill with information
* @param objList
* result of getChildren call
*/
public void fillInformationForAtomLinks(String repositoryId, String objectId, ObjectInfoHandler objectInfos,
ObjectInFolderList objList) {
if (null == objectInfos || null == objList || null == objectId) {
return;
}
// Fill object information for requested object
ObjectInfoImpl objectInfo = new ObjectInfoImpl();
fillInformationForAtomLinks(repositoryId, objectId, objectInfo);
objectInfos.addObjectInfo(objectInfo);
// Fill object information for all children in result list
for (ObjectInFolderData object : objList.getObjects()) {
objectInfo = new ObjectInfoImpl();
fillInformationForAtomLinks(repositoryId, object.getObject().getId(), objectInfo);
objectInfos.addObjectInfo(objectInfo);
}
}
/**
* FillObjectInfoHolder object with required information needed for Atom
* binding for an object list.
*
* @param repositoryId
* id of repository
* @param objectId
* object to retrieve information for
* @param objectInfos
* Holder to fill with information
* @param objList
* result of getChildren call
*/
public void fillInformationForAtomLinks(String repositoryId, String objectId, ObjectInfoHandler objectInfos,
ObjectList objList) {
ObjectInfoImpl objectInfo = new ObjectInfoImpl();
if (null != objectId) {
// Fill object information for requested object
fillInformationForAtomLinks(repositoryId, objectId, objectInfo);
objectInfos.addObjectInfo(objectInfo);
}
if (null != objList && null != objList.getObjects()) {
// Fill object information for all children in result list
List<ObjectData> listObjects = objList.getObjects();
if (null != listObjects) {
for (ObjectData object : listObjects) {
objectInfo = new ObjectInfoImpl();
fillInformationForAtomLinks(object, objectInfo);
objectInfos.addObjectInfo(objectInfo);
}
}
}
}
private void fillInformationForAtomLinks(ObjectData od, ObjectInfoImpl objectInfo) {
objectInfo.setObject(od);
}
/**
* FillObjectInfoHolder object with required information needed for Atom
* binding for an ObjectInFolderContainer.
*
* @param repositoryId
* id of repository
* @param objectInfos
* Holder to fill with information
* @param oifc
* result of previous call
*/
private void fillInformationForAtomLinks(String repositoryId, ObjectInfoHandler objectInfos,
ObjectInFolderContainer oifc) {
if (null == objectInfos || null == oifc) {
return;
}
// Fill object information for all elements in result list
fillInformationForAtomLinks(repositoryId, objectInfos, oifc.getObject());
if (null != oifc.getChildren()) {
for (ObjectInFolderContainer object : oifc.getChildren()) {
// call recursively
ObjectInfoImpl objectInfo = new ObjectInfoImpl();
fillInformationForAtomLinks(repositoryId, objectInfos, object);
objectInfos.addObjectInfo(objectInfo);
}
}
}
/**
* FillObjectInfoHolder object with required information needed for Atom
* binding for a list with ObjectInFolderContainers.
*
* @param repositoryId
* id of repository
* @param objectId
* object to retrieve information for
* @param objectInfos
* Holder to fill with information
* @param oifcList
* result of getDescendants call
*/
public void fillInformationForAtomLinks(String repositoryId, String objectId, ObjectInfoHandler objectInfos,
List<ObjectInFolderContainer> oifcList) {
if (null == objectInfos || null == oifcList || null == objectId) {
return;
}
ObjectInfoImpl objectInfo = new ObjectInfoImpl();
// Fill object information for requested object
fillInformationForAtomLinks(repositoryId, objectId, objectInfo);
objectInfos.addObjectInfo(objectInfo);
for (ObjectInFolderContainer object : oifcList) {
fillInformationForAtomLinks(repositoryId, objectInfos, object);
}
}
private void fillInformationForAtomLinks(String repositoryId, ObjectInfoHandler objectInfos,
ObjectInFolderData object) {
ObjectInfoImpl objectInfo = new ObjectInfoImpl();
fillInformationForAtomLinks(repositoryId, object.getObject().getId(), objectInfo);
objectInfos.addObjectInfo(objectInfo);
}
/**
* FillObjectInfoHolder object with required information needed for Atom
* binding for a list with ObjectParentData objects.
*
* @param repositoryId
* id of repository
* @param objectId
* object to retrieve information for
* @param objectInfos
* Holder to fill with information
* @param objParents
* result of getObjectParents call
*/
public void fillInformationForAtomLinksGetParents(String repositoryId, String objectId,
ObjectInfoHandler objectInfos, List<ObjectParentData> objParents) {
if (null == objectInfos || null == objParents || null == objectId) {
return;
}
// Fill object information for requested object
ObjectInfoImpl objectInfo = new ObjectInfoImpl();
fillInformationForAtomLinks(repositoryId, objectId, objectInfo);
for (ObjectParentData object : objParents) {
objectInfo = new ObjectInfoImpl();
fillInformationForAtomLinks(repositoryId, object.getObject().getId(), objectInfo);
objectInfos.addObjectInfo(objectInfo);
}
}
}