blob: 93f1ffad63673c9f220c7bdd0129c44d21a8932e [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.server.impl.browser;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.ObjectData;
import org.apache.chemistry.opencmis.commons.data.Properties;
import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
import org.apache.chemistry.opencmis.commons.server.CallContext;
import org.apache.chemistry.opencmis.commons.server.CmisService;
import org.apache.chemistry.opencmis.commons.server.CmisServiceFactory;
import org.apache.chemistry.opencmis.server.impl.CallContextImpl;
import org.apache.chemistry.opencmis.server.shared.TempStoreOutputStreamFactory;
/**
* A {@link CallContext} implementation that holds browser binding specific
* values
*/
public class BrowserCallContextImpl extends CallContextImpl {
private CmisService service;
private String objectId;
private String[] pathFragments;
private String typeId;
private BaseTypeId baseTypeId;
private String token;
public BrowserCallContextImpl(String binding, CmisVersion cmisVersion, String repositoryId,
ServletContext servletContext, HttpServletRequest request, HttpServletResponse response,
CmisServiceFactory factory, TempStoreOutputStreamFactory streamFactory) {
super(binding, cmisVersion, repositoryId, servletContext, request, response, factory, streamFactory);
}
/**
* Sets the necessary details to retrieve the object id, type id, and token
* if requested.
*/
@SuppressWarnings("PMD.ArrayIsStoredDirectly")
public void setCallDetails(CmisService service, String objectId, String[] pathFragments, String token) {
this.service = service;
this.objectId = objectId;
this.pathFragments = pathFragments;
this.token = token;
}
/**
* Returns the token.
*/
public String getToken() {
return token;
}
/**
* Returns the object id of the current object. If the object is unknown,
* that is the object has been addressed by path, the object is loaded to
* get the object id.
*/
public String getObjectId() {
if (objectId != null) {
return objectId;
}
loadObject();
return objectId;
}
/**
* Returns the type id of the current object.
*/
public String getTypeId() {
return typeId;
}
/**
* Returns the base type id of the current object. If the base type is
* unknown, the object is loaded to get the base type id.
*/
public BaseTypeId getBaseTypeId() {
if (baseTypeId != null) {
return baseTypeId;
}
loadObject();
return baseTypeId;
}
/**
* Loads the object.
*/
private void loadObject() {
ObjectData object = null;
if (objectId != null) {
object = service.getObject(getRepositoryId(), objectId, "cmis:objectId,cmis:objectTypeId,cmis:baseTypeId",
false, IncludeRelationships.NONE, "cmis:none", false, false, null);
} else if (pathFragments != null) {
object = service.getObjectByPath(getRepositoryId(), getPath(),
"cmis:objectId,cmis:objectTypeId,cmis:baseTypeId", false, IncludeRelationships.NONE, "cmis:none",
false, false, null);
} else {
// this is a repository URL call without object id
// -> there is nothing to load
return;
}
objectId = object.getId();
typeId = getStringPropertyValue(object, PropertyIds.OBJECT_TYPE_ID);
baseTypeId = BaseTypeId.fromValue(getStringPropertyValue(object, PropertyIds.BASE_TYPE_ID));
}
/**
* Builds the object path.
*/
private String getPath() {
if (pathFragments.length < 2) {
throw new CmisRuntimeException("Internal error!");
}
if (pathFragments.length == 2) {
return "/";
}
StringBuilder sb = new StringBuilder();
for (int i = 2; i < pathFragments.length; i++) {
if (pathFragments[i].length() == 0) {
continue;
}
sb.append('/');
sb.append(pathFragments[i]);
}
return sb.toString();
}
/**
* Extracts a property from an object.
*/
protected String getStringPropertyValue(ObjectData object, String name) {
if (object == null) {
return null;
}
Properties propData = object.getProperties();
if (propData == null) {
return null;
}
Map<String, PropertyData<?>> properties = propData.getProperties();
if (properties == null) {
return null;
}
PropertyData<?> property = properties.get(name);
if (property == null) {
return null;
}
Object value = property.getFirstValue();
if (!(value instanceof String)) {
return null;
}
return (String) value;
}
}