/*
* (C) Copyright 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed 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.
*
* Contributors:
* Florent Guillaume
*/
package org.nuxeo.ecm.core.opencmis.bindings;
import java.io.File;
import java.math.BigInteger;
import java.util.Map;
import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
import org.apache.chemistry.opencmis.commons.impl.server.AbstractServiceFactory;
import org.apache.chemistry.opencmis.commons.server.CallContext;
import org.apache.chemistry.opencmis.commons.server.CmisService;
import org.apache.chemistry.opencmis.server.support.wrapper.CallContextAwareCmisService;
import org.apache.chemistry.opencmis.server.support.wrapper.CmisServiceWrapperManager;
import org.apache.chemistry.opencmis.server.support.wrapper.ConformanceCmisServiceWrapper;
import org.apache.commons.lang.StringUtils;
import org.nuxeo.ecm.core.opencmis.impl.server.NuxeoCmisService;
import org.nuxeo.ecm.core.opencmis.impl.server.NuxeoRepositories;
import org.nuxeo.ecm.core.opencmis.impl.server.NuxeoRepository;
import org.nuxeo.runtime.api.Framework;
/**
* Factory for a wrapped {@link NuxeoCmisService}.
* <p>
* Called for each method dispatch by {@link org.apache.chemistry.opencmis.server.impl.atompub.CmisAtomPubServlet} or
* {@link org.apache.chemistry.opencmis.server.impl.atompub.CmisBrowserBindingServlet} or
* {@link org.apache.chemistry.opencmis.server.impl.webservices.AbstractService}.
*/
public class NuxeoCmisServiceFactory extends AbstractServiceFactory {
public static final String PROP_TEMP_DIRECTORY = "service.tempDirectory";
public static final String PROP_ENCRYPT_TEMP_FILES = "service.encryptTempFiles";
public static final String PROP_MEMORY_THERESHOLD = "service.memoryThreshold";
public static final String PROP_MAX_CONTENT_SIZE = "service.maxContentSize";
public static final String PROP_DEFAULT_TYPES_MAX_ITEMS = "service.defaultTypesMaxItems";
public static final String PROP_DEFAULT_TYPES_DEPTH = "service.defaultTypesDepth";
public static final String PROP_DEFAULT_MAX_ITEMS = "service.defaultMaxItems";
public static final String PROP_DEFAULT_DEPTH = "service.defaultDepth";
public static final int DEFAULT_TYPES_MAX_ITEMS = 100;
public static final int DEFAULT_TYPES_DEPTH = -1;
public static final int DEFAULT_MAX_ITEMS = 100;
public static final int DEFAULT_DEPTH = 2;
protected CmisServiceWrapperManager wrapperManager;
protected BigInteger defaultTypesMaxItems;
protected BigInteger defaultTypesDepth;
protected BigInteger defaultMaxItems;
protected BigInteger defaultDepth;
protected File tempDirectory;
protected boolean encryptTempFiles;
protected long memoryThreshold;
protected long maxContentSize;
@Override
public void init(Map<String, String> parameters) {
initParameters(parameters);
wrapperManager = new CmisServiceWrapperManager();
wrapperManager.addWrappersFromServiceFactoryParameters(parameters);
// wrap the service to provide default parameter checks
wrapperManager.addOuterWrapper(NuxeoCmisServiceWrapper.class, defaultTypesMaxItems, defaultTypesDepth,
defaultMaxItems, defaultDepth);
}
protected void initParameters(Map<String, String> parameters) {
String tempDirectoryStr = parameters.get(PROP_TEMP_DIRECTORY);
tempDirectory = StringUtils.isBlank(tempDirectoryStr) ? super.getTempDirectory() : new File(
tempDirectoryStr.trim());
String encryptTempStr = parameters.get(PROP_ENCRYPT_TEMP_FILES);
encryptTempFiles = StringUtils.isBlank(encryptTempStr) ? super.encryptTempFiles()
: Boolean.parseBoolean(encryptTempStr.trim());
memoryThreshold = getLongParameter(parameters, PROP_MEMORY_THERESHOLD, super.getMemoryThreshold());
maxContentSize = getLongParameter(parameters, PROP_MAX_CONTENT_SIZE, Long.MAX_VALUE);
defaultTypesMaxItems = getBigIntegerParameter(parameters, PROP_DEFAULT_TYPES_MAX_ITEMS, DEFAULT_TYPES_MAX_ITEMS);
defaultTypesDepth = getBigIntegerParameter(parameters, PROP_DEFAULT_TYPES_DEPTH, DEFAULT_TYPES_DEPTH);
defaultMaxItems = getBigIntegerParameter(parameters, PROP_DEFAULT_MAX_ITEMS, DEFAULT_MAX_ITEMS);
defaultDepth = getBigIntegerParameter(parameters, PROP_DEFAULT_DEPTH, DEFAULT_DEPTH);
}
protected static long getLongParameter(Map<String, String> parameters, String key, long def) {
String value = parameters.get(key);
try {
return StringUtils.isBlank(value) ? def : Long.parseLong(value);
} catch (NumberFormatException e) {
throw new CmisRuntimeException("Could not parse configuration values for " + key + ": " + e.getMessage(), e);
}
}
protected static BigInteger getBigIntegerParameter(Map<String, String> parameters, String key, int def) {
String value = parameters.get(key);
try {
return StringUtils.isBlank(value) ? BigInteger.valueOf(def) : new BigInteger(value);
} catch (NumberFormatException e) {
throw new CmisRuntimeException("Could not parse configuration values for " + key + ": " + e.getMessage(), e);
}
}
@Override
public CmisService getService(CallContext context) {
String repositoryId = context.getRepositoryId();
if (StringUtils.isBlank(repositoryId)) {
repositoryId = null;
} else {
NuxeoRepository repository = Framework.getService(NuxeoRepositories.class).getRepository(repositoryId);
if (repository == null) {
throw new CmisInvalidArgumentException("No such repository: " + repositoryId);
}
}
NuxeoCmisService nuxeoCmisService = new NuxeoCmisService(repositoryId);
CallContextAwareCmisService service = (CallContextAwareCmisService) wrapperManager.wrap(nuxeoCmisService);
service.setCallContext(context);
return service;
}
@Override
public File getTempDirectory() {
return tempDirectory;
}
@Override
public boolean encryptTempFiles() {
return encryptTempFiles;
}
@Override
public int getMemoryThreshold() {
return (int) memoryThreshold;
}
@Override
public long getMaxContentSize() {
return maxContentSize;
}
}