Java tutorial
/* Copyright (C) 2007-2011 BlueXML - www.bluexml.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.bluexml.side.Integration.alfresco.xforms.webscript; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; import org.alfresco.repo.search.impl.lucene.ADMLuceneIndexerAndSearcherFactory; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authority.AuthorityDAO; import org.alfresco.repo.tenant.TenantService; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.TypeDefinition; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.namespace.NamespaceException; import org.alfresco.service.namespace.NamespacePrefixResolver; import org.alfresco.service.namespace.QName; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.extensions.webscripts.AbstractWebScript; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; import org.springframework.extensions.webscripts.servlet.WebScriptServletRequest; public class XFormsWebscript extends AbstractWebScript { private static Log logger = LogFactory.getLog(XFormsWebscript.class); private Map<String, List<QName>> subTypesMapCache = new HashMap<String, List<QName>>(); private Map<QName, QName> parentsMapCache = null; private ServiceRegistry serviceRegistry; private ADMLuceneIndexerAndSearcherFactory indexerAndSearcherFactory; private TenantService tenantService; private DictionaryService dictionaryService; private NamespacePrefixResolver namespacePrefixResolver; private RetryingTransactionHelper transactionHelper; private AuthorityDAO authorityDAO; private StoreRef storeRef = new StoreRef("workspace://SpacesStore"); public enum XFormsQueryType { delete, upload, service, workflow, read, list, enum_, labels, createPath, addToPackage, auth, help, nodeinfo, batch; } public synchronized List<QName> getSubTypes(String type) { List<QName> list = subTypesMapCache.get(type); if (list == null) { if (parentsMapCache == null) { parentsMapCache = new HashMap<QName, QName>(); Collection<QName> allTypes = dictionaryService.getAllTypes(); for (QName name : allTypes) { TypeDefinition atype = dictionaryService.getType(name); QName parentName = atype.getParentName(); parentsMapCache.put(name, parentName); } } QName qType = getQName(type, dictionaryService.getAllTypes()); if (qType == null) { return null; } list = new ArrayList<QName>(); list.add(qType); Set<Entry<QName, QName>> entrySet = parentsMapCache.entrySet(); collectChilds(qType, entrySet, list); subTypesMapCache.put(type, list); } return list; } /** * Gets from the given collection the qname that matches (including * namespace prefix) the type. * * @param type * the type to find, with a namespace prefix and local name. * @param allTypes * a collection of types * @return the qname that was found, <code>null</code> if prefix or type * unknown. */ private QName getQName(String type, Collection<QName> allTypes) { int pos = type.indexOf(':'); // #1529 if (pos != -1) { String prefix = type.substring(0, pos); String localName = type.substring(pos + 1); String namespaceURI; try { namespaceURI = namespacePrefixResolver.getNamespaceURI(prefix); for (QName qname : allTypes) { if (qname.getNamespaceURI().equals(namespaceURI) && qname.getLocalName().equals(localName)) { return qname; } } } catch (NamespaceException e) { logger.error("Caught a NamespaceException. Prefix '" + prefix + "' is unknown."); } } logger.error("Did not find the data type: '" + type + "'. Registered types are:"); for (QName qname : allTypes) { logger.error(qname.toString()); } return null; } private void collectChilds(QName type, Set<Entry<QName, QName>> entrySet, List<QName> list) { for (Entry<QName, QName> entry : entrySet) { QName parentType = entry.getValue(); if (parentType != null) { if (parentType.equals(type)) { QName childType = entry.getKey(); list.add(childType); collectChilds(childType, entrySet, list); } } } } public StoreRef getStoreRef() { return storeRef; } public ServiceRegistry getServiceRegistry() { return serviceRegistry; } public void setServiceRegistry(ServiceRegistry serviceRegistry) { this.serviceRegistry = serviceRegistry; } public ADMLuceneIndexerAndSearcherFactory getIndexerAndSearcherFactory() { return indexerAndSearcherFactory; } public void setIndexerAndSearcherFactory(ADMLuceneIndexerAndSearcherFactory indexerAndSearcherFactory) { this.indexerAndSearcherFactory = indexerAndSearcherFactory; } public TenantService getTenantService() { return tenantService; } public void setTenantService(TenantService tenantService) { this.tenantService = tenantService; } public NamespacePrefixResolver getNamespacePrefixResolver() { return namespacePrefixResolver; } public RetryingTransactionHelper getTransactionHelper() { return transactionHelper; } public void setTransactionHelper(RetryingTransactionHelper transactionHelper) { this.transactionHelper = transactionHelper; } /** * @param authorityDAO * the authorityDAO to set */ public void setAuthorityDAO(AuthorityDAO authorityDAO) { this.authorityDAO = authorityDAO; } /** * @return the authorityDAO */ public AuthorityDAO getAuthorityDAO() { return authorityDAO; } public void execute(WebScriptRequest webscriptrequest, WebScriptResponse webscriptresponse) throws IOException { // WebScriptServletRequest webScriptServletRequest = (WebScriptServletRequest) webscriptrequest; // HttpServletRequest httpServletRequest = webScriptServletRequest.getHttpServletRequest(); // String remoteAddr = httpServletRequest.getRemoteAddr(); // String localAddr = httpServletRequest.getLocalAddr(); // if (StringUtils.equalsIgnoreCase(remoteAddr, "127.0.0.1") // || StringUtils.equalsIgnoreCase(remoteAddr, localAddr)) { String username = webscriptrequest.getParameter("username"); if (StringUtils.trimToNull(username) == null) { throw new RuntimeException("No user name provided."); } webscriptresponse.setContentType("text/xml"); String contentEncoding = "UTF-8"; webscriptresponse.setContentEncoding(contentEncoding); dictionaryService = serviceRegistry.getDictionaryService(); namespacePrefixResolver = serviceRegistry.getNamespaceService(); XFormsQueryType queryType = getQueryType(webscriptrequest); Map<String, String> parameters = getParameters(webscriptrequest); String result = AuthenticationUtil.runAs(new XFormsWork(this, queryType, parameters, getServiceRegistry()), username); OutputStream outputStream = webscriptresponse.getOutputStream(); outputStream.write(result.getBytes("UTF-8")); //} } private Map<String, String> getParameters(WebScriptRequest webscriptrequest) { Map<String, String> result = new HashMap<String, String>(); String[] parameterNames = webscriptrequest.getParameterNames(); for (String parameterName : parameterNames) { result.put(parameterName, webscriptrequest.getParameter(parameterName)); } return result; } private XFormsQueryType getQueryType(WebScriptRequest webscriptrequest) { XFormsQueryType result = XFormsQueryType.read; String query = webscriptrequest.getServicePath(); // the opcodes must be the same as in the webscript description file if (query.endsWith("read")) { result = XFormsQueryType.read; } if (query.endsWith("batch")) { result = XFormsQueryType.batch; } if (query.endsWith("nodeinfo")) { result = XFormsQueryType.nodeinfo; } if (query.endsWith("list")) { result = XFormsQueryType.list; } if (query.endsWith("delete")) { result = XFormsQueryType.delete; } if (query.endsWith("labels")) { result = XFormsQueryType.labels; } if (query.endsWith("enum")) { result = XFormsQueryType.enum_; } if (query.endsWith("workflow")) { result = XFormsQueryType.workflow; } if (query.endsWith("service")) { result = XFormsQueryType.service; } if (query.endsWith("package")) { result = XFormsQueryType.addToPackage; } if (query.endsWith("upload")) { result = XFormsQueryType.upload; } if (query.endsWith("mkdir")) { result = XFormsQueryType.createPath; } if (query.endsWith("auth")) { result = XFormsQueryType.auth; } if (query.endsWith("help")) { result = XFormsQueryType.help; } return result; } }