blob: 112f82c54c8caa665e46d90b2fc7433c6ec385d3 [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.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.Properties;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisPermissionDeniedException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisUpdateConflictException;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.CmisServiceValidator;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.DocumentVersion;
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;
/**
* Common functionality for all service implementations
*
*/
public class InMemoryAbstractServiceImpl {
protected final StoreManager fStoreManager;
protected final CmisServiceValidator validator;
protected final AtomLinkInfoProvider fAtomLinkProvider;
protected InMemoryAbstractServiceImpl(StoreManager storeManager, CmisServiceValidator validator) {
this.fStoreManager = storeManager;
this.validator = validator;
this.fAtomLinkProvider = new AtomLinkInfoProvider(fStoreManager);
}
protected InMemoryAbstractServiceImpl(StoreManager storeManager) {
this.fStoreManager = storeManager;
this.validator = storeManager.getServiceValidator();
this.fAtomLinkProvider = new AtomLinkInfoProvider(fStoreManager);
}
protected TypeDefinition getTypeDefinition(String repositoryId, Properties properties) {
if (null == properties) {
return null;
}
String typeId = (String) properties.getProperties().get(PropertyIds.OBJECT_TYPE_ID).getFirstValue();
TypeDefinitionContainer typeDefC = fStoreManager.getTypeById(repositoryId, typeId);
if (typeDefC == null) {
throw new CmisInvalidArgumentException("Cannot create object, a type with id " + typeId + " is unknown");
}
return typeDefC.getTypeDefinition();
}
protected List<TypeDefinition> getTypeDefinition(String repositoryId, List<String> typeIds) {
if (null == typeIds || typeIds.isEmpty()) {
return null;
}
List<TypeDefinition> result = new ArrayList<TypeDefinition>(typeIds.size());
for (String typeId : typeIds) {
TypeDefinitionContainer typeDefC = fStoreManager.getTypeById(repositoryId, typeId);
if (typeDefC == null) {
throw new CmisInvalidArgumentException("Cannot create object, a type with id " + typeId
+ " is unknown");
}
result.add(typeDefC.getTypeDefinition());
}
return result;
}
protected TypeDefinition getTypeDefinition(String repositoryId, StoredObject obj) {
TypeDefinitionContainer typeDefC = fStoreManager.getTypeById(repositoryId, obj.getTypeId());
return typeDefC == null ? null : typeDefC.getTypeDefinition();
}
/**
* We allow checkin, cancel, checkout operations on a single version as well
* as on a version series This method returns the versioned document
* (version series) in each case.
*
* @param so
* version or versioned document
* @return versioned document
*/
protected VersionedDocument getVersionedDocumentOfObjectId(StoredObject so) {
VersionedDocument verDoc;
if (so instanceof DocumentVersion) {
// get document the version is contained in to c
verDoc = ((DocumentVersion) so).getParentDocument();
} else {
verDoc = (VersionedDocument) so;
}
return verDoc;
}
protected VersionedDocument testIsNotCheckedOutBySomeoneElse(StoredObject so, String user) {
checkIsVersionableObject(so);
VersionedDocument verDoc = getVersionedDocumentOfObjectId(so);
if (verDoc.isCheckedOut()) {
testCheckedOutByCurrentUser(user, verDoc);
}
return verDoc;
}
protected VersionedDocument testHasProperCheckedOutStatus(StoredObject so, String user) {
checkIsVersionableObject(so);
VersionedDocument verDoc = getVersionedDocumentOfObjectId(so);
checkHasUser(user);
testIsCheckedOut(verDoc);
testCheckedOutByCurrentUser(user, verDoc);
return verDoc;
}
protected void checkIsVersionableObject(StoredObject so) {
if (!(so instanceof VersionedDocument || so instanceof DocumentVersion)) {
throw new CmisInvalidArgumentException(
"Object is of a versionable type but not instance of VersionedDocument or DocumentVersion.");
}
}
protected void checkHasUser(String user) {
if (null == user || user.length() == 0) {
throw new CmisPermissionDeniedException("Object can't be checked-in, no user is given.");
}
}
protected void testCheckedOutByCurrentUser(String user, VersionedDocument verDoc) {
if (!user.equals(verDoc.getCheckedOutBy())) {
throw new CmisUpdateConflictException("User " + verDoc.getCheckedOutBy()
+ " has checked out the document.");
}
}
protected void testIsCheckedOut(VersionedDocument verDoc) {
if (!verDoc.isCheckedOut()) {
throw new CmisUpdateConflictException("Document " + verDoc.getId() + " is not checked out.");
}
}
protected boolean isCheckedOut(StoredObject so, String user) {
if (so instanceof VersionedDocument || so instanceof DocumentVersion) {
VersionedDocument verDoc = getVersionedDocumentOfObjectId(so);
return verDoc.isCheckedOut() && user.equals(verDoc.getCheckedOutBy());
} else {
return false;
}
}
}