package jp.aegif.nemaki.cmis.factory; import java.math.BigInteger; import java.util.HashMap; import java.util.Map; import javax.annotation.PostConstruct; import jp.aegif.nemaki.cmis.factory.auth.AuthenticationService; import jp.aegif.nemaki.cmis.factory.auth.CmisServiceWrapper; import jp.aegif.nemaki.cmis.factory.auth.impl.AuthenticationServiceImpl; import jp.aegif.nemaki.cmis.factory.info.RepositoryInfoMap; import jp.aegif.nemaki.util.DataUtil; import jp.aegif.nemaki.util.PropertyManager; import jp.aegif.nemaki.util.constant.PropertyKey; import jp.aegif.nemaki.util.spring.SpringUtil; import org.apache.chemistry.opencmis.commons.exceptions.CmisUnauthorizedException; import org.apache.chemistry.opencmis.commons.impl.server.AbstractServiceFactory; import org.apache.chemistry.opencmis.commons.server.CallContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * Service factory class, specified in repository.properties. */ public class CmisServiceFactory extends AbstractServiceFactory implements org.apache.chemistry.opencmis.commons.server.CmisServiceFactory, ApplicationContextAware{ private ApplicationContext applicationContext; private PropertyManager propertyManager; private RepositoryInfoMap repositoryInfoMap; private AuthenticationService authenticationService; private static BigInteger DEFAULT_MAX_ITEMS_TYPES; private static BigInteger DEFAULT_DEPTH_TYPES; private static BigInteger DEFAULT_MAX_ITEMS_OBJECTS; private static BigInteger DEFAULT_DEPTH_OBJECTS; private static final Log log = LogFactory .getLog(CmisServiceFactory.class); public CmisServiceFactory() { super(); } @PostConstruct public void setup(){ DEFAULT_MAX_ITEMS_TYPES = DataUtil.convertToBigInteger(propertyManager.readValue(PropertyKey.CMIS_SERVER_DEFAULT_MAX_ITEMS_TYPES)); DEFAULT_DEPTH_TYPES = DataUtil.convertToBigInteger(propertyManager.readValue(PropertyKey.CMIS_SERVER_DEFAULT_DEPTH_TYPES)); DEFAULT_MAX_ITEMS_OBJECTS = DataUtil.convertToBigInteger(propertyManager.readValue(PropertyKey.CMIS_SERVER_DEFAULT_MAX_ITEMS_OBJECTS)); DEFAULT_DEPTH_OBJECTS = DataUtil.convertToBigInteger(propertyManager.readValue(PropertyKey.CMIS_SERVER_DEFAULT_MAX_DEPTH_OBJECTS)); } /** * Add NemakiRepository into repository map at first. */ @Override public void init(Map<String, String> parameters) { } @Override public org.apache.chemistry.opencmis.commons.server.CmisService getService(CallContext callContext) { String repositoryId = callContext.getRepositoryId(); String userName = callContext.getUsername(); // Authentication boolean auth = authenticationService.login(callContext); if (auth) { // Create CmisService CmisService calledCmisService = SpringUtil.getBeanByType(applicationContext, CmisService.class); if(calledCmisService == null){ log.error("RepositoryId=" + repositoryId + " does not exist", new Throwable()); } CmisServiceWrapper wrapper = new CmisServiceWrapper( calledCmisService, DEFAULT_MAX_ITEMS_TYPES, DEFAULT_DEPTH_TYPES, DEFAULT_MAX_ITEMS_OBJECTS, DEFAULT_DEPTH_OBJECTS, callContext); if(log.isTraceEnabled()){ log.trace("nemaki_log[FACTORY]" + "CmisService@" + calledCmisService.hashCode() + " with CallContext@" + callContext.hashCode() + "[repositoryId=" + callContext.getRepositoryId() + ", userId=" + callContext.getUsername() + "] is generated"); } return wrapper; } else { String msg = String.format("[Repository=%1$s][UserName=%2$s]Authentication failed",repositoryId, userName); throw new CmisUnauthorizedException(msg, BigInteger.valueOf(401)); } } @Override public void destroy() { super.destroy(); } public void setPropertyManager(PropertyManager propertyManager) { this.propertyManager = propertyManager; } public void setAuthenticationService( AuthenticationService authenticationService) { this.authenticationService = authenticationService; } public void setRepositoryInfoMap(RepositoryInfoMap repositoryInfoMap) { this.repositoryInfoMap = repositoryInfoMap; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }