blob: 24471441f8857a11e214f5a5805392d826a8ce45 [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.storedobj.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.data.Properties;
import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
import org.apache.chemistry.opencmis.inmemory.FilterParser;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.DocumentVersion;
import org.apache.chemistry.opencmis.inmemory.storedobj.api.VersionedDocument;
public class VersionedDocumentImpl extends FilingImpl implements VersionedDocument {
private boolean fIsCheckedOut;
private String fCheckedOutUser;
private final List<DocumentVersion> fVersions;
public VersionedDocumentImpl() {
super();
fVersions = new ArrayList<DocumentVersion>();
fIsCheckedOut = false;
}
@Override
public DocumentVersion addVersion(VersioningState verState, String user) {
if (isCheckedOut()) {
throw new CmisConstraintException("Cannot add a version to document, document is checked out.");
}
DocumentVersionImpl ver = new DocumentVersionImpl(fRepositoryId, this, verState);
ver.setSystemBasePropertiesWhenCreatedDirect(getName(), getTypeId(), user); // copy
// name and type id from version series.
fVersions.add(ver);
if (verState == VersioningState.CHECKEDOUT) {
fCheckedOutUser = user;
fIsCheckedOut = true;
}
return ver;
}
@Override
public boolean deleteVersion(DocumentVersion version) {
if (fIsCheckedOut) {
// Note: Do not throw an exception here if the document is
// checked-out. In AtomPub binding cancelCheckout
// mapped to a deleteVersion() call!
DocumentVersion pwc = getPwc();
if (pwc == version) { // NOSONAR
cancelCheckOut(false); // note object is already deleted from
// map in ObjectStore
return !fVersions.isEmpty();
}
}
boolean found = fVersions.remove(version);
if (!found) {
throw new CmisInvalidArgumentException("Version is not contained in the document:" + version.getId());
}
return !fVersions.isEmpty();
}
@Override
public void cancelCheckOut(String user) {
cancelCheckOut(true);
}
@Override
public void checkIn(boolean isMajor, Properties properties, ContentStream content, String checkinComment,
List<String> policyIds, String user) {
if (fIsCheckedOut) {
if (fCheckedOutUser.equals(user)) {
fIsCheckedOut = false;
fCheckedOutUser = null;
} else {
throw new CmisConstraintException("Error: Can't checkin. Document " + getId() + " user " + user
+ " has not checked out the document");
}
} else {
throw new CmisConstraintException("Error: Can't cancel checkout, Document " + getId()
+ " is not checked out.");
}
DocumentVersion pwc = getPwc();
if (null != content) {
pwc.setContent(content);
}
if (null != properties && null != properties.getProperties()) {
((DocumentVersionImpl) pwc).setCustomProperties(properties.getProperties());
}
pwc.setCheckinComment(checkinComment);
pwc.commit(isMajor);
if (policyIds != null && policyIds.size() > 0) {
((DocumentVersionImpl) pwc).setAppliedPolicies(policyIds);
}
}
@Override
public DocumentVersion checkOut(String user) {
if (fIsCheckedOut) {
throw new CmisConstraintException("Error: Can't checkout, Document " + getId()
+ " is already checked out.");
}
// create PWC
DocumentVersion pwc = addVersion(VersioningState.CHECKEDOUT, user); // will
// set check-out flag
return pwc;
}
@Override
public List<DocumentVersion> getAllVersions() {
return fVersions;
}
@Override
public DocumentVersion getLatestVersion(boolean major) {
DocumentVersion latest = null;
if (fVersions.size() == 0) {
return null;
}
if (major) {
for (DocumentVersion ver : fVersions) {
if (ver.isMajor() && !ver.isPwc()) {
latest = ver;
}
}
} else {
if (null == getPwc()) {
latest = fVersions.get(fVersions.size() - 1);
} else if (fVersions.size() > 1) {
latest = fVersions.get(fVersions.size() - 2);
} else {
latest = null;
}
if (null == getPwc()) {
latest = fVersions.get(fVersions.size() - 1);
} else if (fVersions.size() > 1) {
latest = fVersions.get(fVersions.size() - 2);
} else {
latest = null;
}
}
return latest;
}
@Override
public boolean isCheckedOut() {
return fIsCheckedOut;
}
@Override
public String getCheckedOutBy() {
return fCheckedOutUser;
}
@Override
public DocumentVersion getPwc() {
for (DocumentVersion ver : fVersions) {
if (ver.isPwc()) {
return ver;
}
}
return null;
}
@Override
public void fillProperties(Map<String, PropertyData<?>> properties, BindingsObjectFactory objFactory,
List<String> requestedIds) {
DocumentVersion pwc = getPwc();
super.fillProperties(properties, objFactory, requestedIds);
if (FilterParser.isContainedInFilter(PropertyIds.IS_IMMUTABLE, requestedIds)) {
properties.put(PropertyIds.IS_IMMUTABLE,
objFactory.createPropertyBooleanData(PropertyIds.IS_IMMUTABLE, false));
}
// overwrite the version related properties
if (FilterParser.isContainedInFilter(PropertyIds.VERSION_SERIES_ID, requestedIds)) {
properties.put(PropertyIds.VERSION_SERIES_ID,
objFactory.createPropertyIdData(PropertyIds.VERSION_SERIES_ID, getId()));
}
if (FilterParser.isContainedInFilter(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT, requestedIds)) {
properties.put(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT,
objFactory.createPropertyBooleanData(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT, isCheckedOut()));
}
if (FilterParser.isContainedInFilter(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY, requestedIds)) {
properties.put(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY,
objFactory.createPropertyStringData(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY, getCheckedOutBy()));
}
if (FilterParser.isContainedInFilter(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID, requestedIds)) {
properties.put(
PropertyIds.VERSION_SERIES_CHECKED_OUT_ID,
objFactory.createPropertyIdData(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID,
pwc == null ? null : pwc.getId()));
}
}
private void cancelCheckOut(boolean deleteInObjectStore) {
DocumentVersion pwc = getPwc();
fIsCheckedOut = false;
fCheckedOutUser = null;
fVersions.remove(pwc);
if (fVersions.size() > 0) {
String nameLatestVer = getLatestVersion(false).getName();
if (!getName().equals(nameLatestVer)) {
setName(nameLatestVer);
}
}
if (deleteInObjectStore) {
// TODO:
}
}
}