/* * Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. 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.wso2.carbon.registry.extensions.utils; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.util.AXIOMUtil; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.registry.core.Association; import org.wso2.carbon.registry.core.Registry; import org.wso2.carbon.registry.core.RegistryConstants; import org.wso2.carbon.registry.core.Resource; import org.wso2.carbon.registry.core.config.Mount; import org.wso2.carbon.registry.core.config.RegistryContext; import org.wso2.carbon.registry.core.exceptions.RegistryException; import org.wso2.carbon.registry.core.jdbc.handlers.RequestContext; import org.wso2.carbon.registry.core.session.CurrentSession; import org.wso2.carbon.registry.core.session.UserRegistry; import org.wso2.carbon.registry.core.utils.MediaTypesUtils; import org.wso2.carbon.registry.core.utils.RegistryUtils; import org.wso2.carbon.registry.extensions.beans.ServiceDocumentsBean; import org.wso2.carbon.registry.extensions.handlers.utils.EndpointUtils; import org.wso2.carbon.registry.extensions.services.Utils; import org.wso2.carbon.user.core.service.RealmService; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListSet; public class CommonUtil { private static final Log log = LogFactory.getLog(CommonUtil.class); private static Random generator = new Random(); public static String getUniqueNameforNamespace(String commonSchemaLocation, String targetNamespace1) { String resourcePath; String targetNamespace = targetNamespace1.replaceAll("\\s+$", ""); targetNamespace = targetNamespace.replace("://", RegistryConstants.PATH_SEPARATOR); targetNamespace = targetNamespace.replace(".", RegistryConstants.PATH_SEPARATOR); targetNamespace = targetNamespace.replace("#", RegistryConstants.PATH_SEPARATOR); while (targetNamespace.indexOf("//") > 0) { targetNamespace = targetNamespace.replace("//", "/"); } if (commonSchemaLocation.endsWith(RegistryConstants.PATH_SEPARATOR)) { resourcePath = new StringBuilder() .append(commonSchemaLocation) .append(targetNamespace).toString(); } else { resourcePath = new StringBuilder() .append(commonSchemaLocation) .append(RegistryConstants.PATH_SEPARATOR) .append(targetNamespace).toString(); } if (!targetNamespace.endsWith(RegistryConstants.PATH_SEPARATOR)) { resourcePath = new StringBuilder().append(resourcePath).append(RegistryConstants.PATH_SEPARATOR).toString(); } return resourcePath; } /** * Returned path fragment will always contain leading and trailing slashes * * @param namespace * @return the path fragment derived from the namespace */ public static String derivePathFragmentFromNamespace(String namespace) { String packageName; if (namespace == null || (packageName = URLProcessor.deriveRegistryPath(namespace)) == null) { return "//"; } String pathFragment = RegistryConstants.PATH_SEPARATOR + packageName.replace(".", RegistryConstants.PATH_SEPARATOR); if (pathFragment.endsWith(RegistryConstants.PATH_SEPARATOR)) { return pathFragment; } else { return pathFragment + RegistryConstants.PATH_SEPARATOR; } } public static String getServiceName(OMElement element) { OMElement overview = element.getFirstChildWithName(new QName("Overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName("Name")) != null) { return overview.getFirstChildWithName(new QName("Name")).getText(); } } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "name")) != null) { return overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "name")).getText(); } } return ""; } /** * Read service version that is input from the user. * * @param element * @return */ public static String getServiceVersion(OMElement element) { OMElement overview = element.getFirstChildWithName(new QName("Overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName("Version")) != null) { return overview.getFirstChildWithName(new QName("Version")).getText(); } } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "version")) != null) { return overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "version")).getText(); } } return ""; } /** * This method returns the attribute value of the given attribute. * @param element xml element(OMElement). * @param attributeName name of the attribute * @return value of the attribute */ public static String getAttributeValue(OMElement element, String attributeName) { String[] parts = attributeName.split("_"); OMElement attributeElement = element; for (int i = 0; i < parts.length; i++) { attributeElement = attributeElement.getFirstChildWithName(new QName(parts[i])); if (attributeElement != null && i == parts.length - 1) { return attributeElement.getText(); } else if (attributeElement != null) { continue; } else { break; } } attributeElement = element; for (int i = 0; i < parts.length; i++) { attributeElement = attributeElement .getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, parts[i])); if (attributeElement != null && i == parts.length - 1) { return attributeElement.getText(); } else if (attributeElement != null) { continue; } else { break; } } return null; } public static OMElement setServiceAttribute(OMElement element, String fieldName, String fieldValue) { OMElement overview = element.getFirstChildWithName(new QName("Overview")); if (overview != null) { OMElement omElement = OMAbstractFactory.getOMFactory().createOMElement(new QName(fieldName)); omElement.setText(fieldValue); overview.addChild(omElement); } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { OMElement omElement = OMAbstractFactory.getOMFactory().createOMElement(new QName( CommonConstants.SERVICE_ELEMENT_NAMESPACE, fieldName)); omElement.setText(fieldValue); overview.addChild(omElement); } return element; } public static void setServiceName(OMElement element, String serviceName) { OMElement overview = element.getFirstChildWithName(new QName("Overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName("Name")) != null) { overview.getFirstChildWithName(new QName("Name")).setText(serviceName); return; } } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "name")) != null) { overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "name")).setText(serviceName); } } } public static String getServiceNamespace(OMElement element) { OMElement overview = element.getFirstChildWithName(new QName("Overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName("Namespace")) != null) { return overview.getFirstChildWithName(new QName("Namespace")).getText(); } } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "namespace")) != null) { return overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "namespace")).getText(); } } return ""; } public static String computeServicePathWithVersion(String path, String version) throws RegistryException { String temp = version; String suffix = "-SNAPSHOT"; if (temp.endsWith(suffix)) { temp = temp.substring(0, temp.length() - suffix.length()); } if (!temp.matches(CommonConstants.SERVICE_VERSION_REGEX)) { String msg = "The specified service version " + version + " is invalid. " + "The requested path to store the service: " + path + "."; log.error(msg); throw new RegistryException(msg); } return path + RegistryConstants.PATH_SEPARATOR + version + RegistryConstants.PATH_SEPARATOR + "service"; } public static String computeProcessPathWithVersion(String path, String version) throws RegistryException { if (!version.matches(CommonConstants.SERVICE_VERSION_REGEX)) { String msg = "The specified process version " + version + " is invalid. " + "The requested path to store the process: " + path + "."; log.error(msg); throw new RegistryException(msg); } return path + RegistryConstants.PATH_SEPARATOR + version.replace(".", RegistryConstants.PATH_SEPARATOR) + RegistryConstants.PATH_SEPARATOR + "process"; } public static String computeSLAPathWithVersion(String path, String version) throws RegistryException { if (!version.matches(CommonConstants.SERVICE_VERSION_REGEX)) { String msg = "The specified sla version " + version + " is invalid. " + "The requested path to store the sla: " + path + "."; log.error(msg); throw new RegistryException(msg); } return path + RegistryConstants.PATH_SEPARATOR + version.replace(".", RegistryConstants.PATH_SEPARATOR) + RegistryConstants.PATH_SEPARATOR + "sla"; } public static void setServiceNamespace(OMElement element, String namespace) { OMElement overview = element.getFirstChildWithName(new QName("Overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName("Namespace")) != null) { overview.getFirstChildWithName(new QName("Namespace")).setText(namespace); return; } } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "namespace")) != null) { overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "namespace")).setText(namespace); } } } public static OMElement[] getEndpointEntries(OMElement element) { OMElement endPoints = element.getFirstChildWithName(new QName("endpoints")); if (endPoints != null) { Iterator it = endPoints.getChildrenWithLocalName("entry"); List<OMElement> endpointList = new ArrayList<OMElement>(); while (it.hasNext()) { endpointList.add(((OMElement) it.next())); } return endpointList.toArray(new OMElement[endpointList.size()]); } endPoints = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "endpoints")); if (endPoints != null) { Iterator it = endPoints.getChildrenWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "entry")); List<OMElement> endpointList = new ArrayList<OMElement>(); while (it.hasNext()) { endpointList.add(((OMElement) it.next())); } return endpointList.toArray(new OMElement[endpointList.size()]); } return null; } public static void setEndpointEntries(OMElement element, OMElement[] endPointsList) { OMElement endPoints = element.getFirstChildWithName(new QName("endpoints")); if (endPointsList != null) { if (endPoints != null) { Iterator it = endPoints.getChildElements(); while (it.hasNext()) { OMElement omElement = (OMElement) it.next(); omElement.detach(); } for (OMElement endPoint : endPointsList) { endPoints.addChild(endPoint); } return; } endPoints = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "endpoints")); if (endPoints != null) { Iterator it = endPoints.getChildElements(); while (it.hasNext()) { OMElement omElement = (OMElement) it.next(); omElement.detach(); } for (OMElement endPoint : endPointsList) { endPoints.addChild(endPoint); } } } } public static Map<String,String> getOverviewEntries(OMElement element) { Map<String,String> prop = new HashMap<String, String>(); OMElement endPoints = element.getFirstChildWithName(new QName("overview")); if (endPoints != null) { Iterator it = endPoints.getChildElements(); while (it.hasNext()) { OMElement omelement = (OMElement)it.next(); prop.put(omelement.getLocalName(), omelement.getText()); } return prop; } endPoints = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (endPoints != null) { Iterator it = endPoints.getChildElements(); while (it.hasNext()) { OMElement omelement = (OMElement)it.next(); prop.put(omelement.getLocalName(), omelement.getText()); } return prop; } return null; } public static void setServiceVersion(OMElement element, String version) { OMElement overview = element.getFirstChildWithName(new QName("Overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName("Version")) != null) { overview.getFirstChildWithName(new QName("Version")).setText(version); return; } else { OMElement omElement = OMAbstractFactory.getOMFactory().createOMElement(new QName("Version")); omElement.setText(version); overview.addChild(omElement); } } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "version")) != null) { overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "version")).setText(version); } else { OMElement omElement = OMAbstractFactory.getOMFactory().createOMElement( new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "version")); omElement.setText(version); overview.addChild(omElement); } } } public static void setDefinitionURL(OMElement element, String namespace) { // This is a path relative to the chroot OMElement overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "interface")); if(overview == null){ OMElement interfaceElement = OMAbstractFactory.getOMFactory().createOMElement( new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "interface")); OMElement wsdlURLElement = OMAbstractFactory.getOMFactory().createOMElement( new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "wsdlURL")); wsdlURLElement.setText(namespace); interfaceElement.addChild(wsdlURLElement); element.addChild(interfaceElement); return; } if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "wsdlURL")) != null) { overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "wsdlURL")).setText(namespace); } } public static String getDefinitionURL(OMElement element) { // This will return a path relative to the chroot OMElement overview = element.getFirstChildWithName(new QName("Interface")); if (overview != null) { if (overview.getFirstChildWithName(new QName("WSDL-URL")) != null) { return overview.getFirstChildWithName(new QName("WSDL-URL")).getText(); } } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "interface")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "wsdlURL")) != null) { return overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "wsdlURL")).getText(); } } return ""; } public static String getWorkflowURL(OMElement element) { // This will return a path relative to the chroot OMElement overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "definition")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "bpelURL")) != null) { return overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "bpelURL")).getText(); } } return ""; } public static ArrayList<ServiceDocumentsBean> getDocLinks(OMElement element) { ArrayList<ServiceDocumentsBean> documents = new ArrayList<ServiceDocumentsBean>(); OMElement docLinks = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "docLinks")); if (docLinks != null) { for (int itemNo = 0; itemNo <= CommonConstants.NO_OF_DOCUMENTS_ALLOWED; itemNo++) { ServiceDocumentsBean document = new ServiceDocumentsBean(); //This is used because items are separated in xml by appending number to the end, //<documentLinks> // <url></url><documentType></documentType> <url1></url1><documentType1></documentType1> // </documentLinks> String appender = (itemNo == 0 ? "" : "" + itemNo + ""); String description = CommonConstants.DOCUMENT_DESC + appender; String url = CommonConstants.DOCUMENT_URL + appender; String type = CommonConstants.DOCUMENT_TYPE + appender; if (docLinks.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, url)) != null) { String documentUrl = docLinks.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, url)).getText(); document.setDocumentUrl(documentUrl); } if (document.getDocumentUrl() == null||document.getDocumentUrl().isEmpty() ){ break; }else{ documents.add(document); } if (docLinks.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, description)) != null) { String documentDesc = docLinks.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, description)).getText(); document.setDocumentDescription(documentDesc); } if (docLinks.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, type)) != null) { String documentType = docLinks.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, type)).getText(); document.setDocumentType(documentType); } } } return documents; } public static String getServiceDescription(OMElement element) { OMElement overview; overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "description")) != null) { return overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "description")).getText(); } } return null; } public static void addService(OMElement service, RequestContext context)throws RegistryException{ Registry registry = context.getRegistry(); Resource resource = registry.newResource(); String path; if (Utils.getRxtService() == null){ String version = context.getResource().getProperty(RegistryConstants.VERSION_PARAMETER_NAME); String tempNamespace = CommonUtil.derivePathFragmentFromNamespace( CommonUtil.getServiceNamespace(service)); path = getChrootedServiceLocation(registry, context.getRegistryContext()) + tempNamespace + version + RegistryConstants.PATH_SEPARATOR + CommonUtil.getServiceName(service); path = CommonUtil.getRegistryPath(context.getRegistry().getRegistryContext(),path); } else { String pathExpression = Utils.getRxtService().getStoragePath(RegistryConstants.SERVICE_MEDIA_TYPE); path = RegistryUtils.getAbsolutePath(context.getRegistryContext(),getPathFromPathExpression(pathExpression, service,context.getResource().getProperties())); log.info("Checking local paths, absolute path: " +path+ " | path: "+ CommonUtil.getRegistryPath(context.getRegistry().getRegistryContext(),path)); } String content = service.toString(); resource.setContent(RegistryUtils.encodeString(content)); resource.setMediaType(RegistryConstants.SERVICE_MEDIA_TYPE); // when saving the resource we are expecting to call the service media type handler, so // we intentionally release the lock here. boolean lockAlreadyAcquired = !CommonUtil.isUpdateLockAvailable(); CommonUtil.releaseUpdateLock(); try { // We check for an existing resource and add its UUID here. if(registry.resourceExists(path)){ Resource existingResource = registry.get(path); resource.setUUID(existingResource.getUUID()); } else { resource.setUUID(UUID.randomUUID().toString()); } resource.setProperty(CommonConstants.SOURCE_PROPERTY, CommonConstants.SOURCE_AUTO); resource.setProperty("registry.DefinitionImport","true"); registry.put(path, resource); String defaultLifeCycle = getDefaultLifecycle(registry, "service"); if(defaultLifeCycle != null && !defaultLifeCycle.isEmpty()) { String[] lifeCycles = defaultLifeCycle.split(","); for (String lifeCycle : lifeCycles) { if (StringUtils.isNotEmpty(lifeCycle)){ registry.associateAspect(resource.getId(),lifeCycle); } } } } finally { if (lockAlreadyAcquired) { CommonUtil.acquireUpdateLock(); } } registry.addAssociation(path,RegistryUtils.getAbsolutePath(registry.getRegistryContext(), CommonUtil.getDefinitionURL(service)), CommonConstants.DEPENDS); registry.addAssociation(RegistryUtils.getAbsolutePath(registry.getRegistryContext(), CommonUtil.getDefinitionURL(service)),path, CommonConstants.USED_BY); } /** * This method will populate the registry path and store the SOAP service. * Afterwards create an association between WSDL and SOAP service. * @param service XML representation of the SOAP service. * @param context RequestContext * @throws RegistryException */ public static void addSoapService(OMElement service, RequestContext context) throws RegistryException { Registry registry = context.getRegistry(); Resource resource = registry.newResource(); String path; if (Utils.getRxtService() == null){ String version = context.getResource().getProperty(RegistryConstants.VERSION_PARAMETER_NAME); String tempNamespace = CommonUtil.derivePathFragmentFromNamespace( CommonUtil.getServiceNamespace(service)); path = getChrootedServiceLocation(registry, context.getRegistryContext()) + tempNamespace + version + RegistryConstants.PATH_SEPARATOR + CommonUtil.getServiceName(service); } else { String pathExpression = Utils.getRxtService().getStoragePath(CommonConstants.SOAP_SERVICE_MEDIA_TYPE); String absolutePath = RegistryUtils.getAbsolutePath(context.getRegistryContext(),getPathFromPathExpression(pathExpression, service, context.getResource().getProperties())); /** * Fix for the REGISTRY-3052 : validation is to check the whether this invoked by ZIPWSDLMediaTypeHandler * Setting the registry and absolute paths to current session to avoid incorrect resource path entry in REG_LOG table */ if (CurrentSession.getLocalPathMap() != null && !Boolean.valueOf(CurrentSession.getLocalPathMap().get(CommonConstants.ARCHIEVE_UPLOAD))) { path = CommonUtil.getRegistryPath(context.getRegistry().getRegistryContext(), absolutePath); if (log.isDebugEnabled()) { log.debug("Saving current session local paths, key: " + path + " | value: " + absolutePath); } CurrentSession.getLocalPathMap().put(path, absolutePath); } else { path = absolutePath; } } String content = service.toString(); resource.setContent(RegistryUtils.encodeString(content)); resource.setMediaType(CommonConstants.SOAP_SERVICE_MEDIA_TYPE); // when saving the resource we are expecting to call the service media type handler, so // we intentionally release the lock here. boolean lockAlreadyAcquired = !CommonUtil.isUpdateLockAvailable(); CommonUtil.releaseUpdateLock(); try { // We check for an existing resource and add its UUID here. if (registry.resourceExists(path)) { Resource existingResource = registry.get(path); resource.setUUID(existingResource.getUUID()); } else { resource.setUUID(UUID.randomUUID().toString()); } resource.setProperty(CommonConstants.SOURCE_PROPERTY, CommonConstants.SOURCE_AUTO); resource.setProperty("registry.DefinitionImport", "true"); registry.put(path, resource); String defaultLifeCycle = getDefaultLifecycle(registry, "soapservice"); applyDefaultLifeCycle(registry, resource, path, defaultLifeCycle); } finally { if (lockAlreadyAcquired) { CommonUtil.acquireUpdateLock(); } } registry.addAssociation(path, RegistryUtils.getAbsolutePath(registry.getRegistryContext(), CommonUtil.getDefinitionURL(service)), CommonConstants.DEPENDS); registry.addAssociation(RegistryUtils.getAbsolutePath(registry.getRegistryContext(), CommonUtil.getDefinitionURL(service)), path, CommonConstants.USED_BY); } public static void applyDefaultLifeCycle(Registry registry, Resource resource, String path, String defaultLifeCycle) throws RegistryException { if (defaultLifeCycle != null && !defaultLifeCycle.isEmpty()) { String[] lifeCycles = defaultLifeCycle.split(","); ArrayUtils.reverse(lifeCycles); if (CurrentSession.getLocalPathMap() != null && !Boolean.valueOf(CurrentSession.getLocalPathMap().get(CommonConstants.ARCHIEVE_UPLOAD))) { for (String lifeCycle : lifeCycles) { if (StringUtils.isNotEmpty(lifeCycle)){ registry.associateAspect(resource.getId(), lifeCycle); } } } else { for (String lifeCycle : lifeCycles) { if (StringUtils.isNotEmpty(lifeCycle)){ registry.associateAspect(path, lifeCycle); } } } } } /** * This method used to generate mount path.(Fix need to go to kernel, Since Kernel 4.4.0 already released * will maintain fix here.) * @param requestContext * @param servicePath * @return */ public static String getRegistryPath(RegistryContext requestContext, String servicePath){ List<Mount> mounts = requestContext.getMounts(); for (Mount mount: mounts) { String mountPath = mount.getPath(); if (servicePath.startsWith(mountPath) && !servicePath.startsWith(mount.getTargetPath())){ return servicePath.replace(mountPath, mount.getTargetPath()); } } return servicePath; } /** * This method replaces annotated path with real values * @param pathExpression registry path with annotated values * @param content XML representation of the meta data * @return registry path with real values */ public static String getPathFromPathExpression(String pathExpression, OMElement content, Properties properties) { String output = replaceNameAndNamespace(pathExpression, content); String[] elements = output.split("@"); for (int i = 1; i < elements.length; i++) { if (elements[i].indexOf("}") > 0 && elements[i].indexOf("{") == 0) { String key = elements[i].split("}")[0].substring(1); String artifactAttribute = getAttributeValue(content, key); if (artifactAttribute != null) { output = output.replace("@{" + key + "}", artifactAttribute); if (log.isDebugEnabled()) { String msg = "OutPut : " + output + " Key: " + key + " artifactAttribute: " + artifactAttribute; log.debug(msg); } } else { if (log.isDebugEnabled()){ String msg = "Value for required attribute " + key + " found empty."; log.debug(msg); } } } } return getPathFromPathExpression(output, properties, content); } public static String getPathFromPathExpression(String pathExpression, Properties properties, OMElement content) { String[] elements = pathExpression.split("@"); // Replace the short path values for (int i = 1; i < elements.length; i++) { if (elements[i].indexOf("}") > 0 && elements[i].indexOf("{") == 0) { String key = elements[i].split("}")[0].substring(1); if (properties.get(key.toLowerCase()) != null){ if (properties.get(key.toLowerCase()) instanceof List) { String artifactAttribute = (String)((List)properties.get(key.toLowerCase())).get(0); if (artifactAttribute != null) { pathExpression = pathExpression.replace("@{" + key + "}", artifactAttribute); if (log.isDebugEnabled()) { String msg = "pathExpression : " + pathExpression + " Key: " + key + " artifactAttribute: " + artifactAttribute; log.debug(msg); } } } } } } // elements = pathExpression.split("@"); // Replace the short path values for (int i = 1; i < elements.length; i++) { if (elements[i].indexOf("}") > 0 && elements[i].indexOf("{") == 0) { String key = elements[i].split("}")[0].substring(1); key = key.replace("overview_", ""); if (properties.get(key.toLowerCase()) != null){ String artifactAttribute = (String)((List)properties.get(key.toLowerCase())).get(0); if (artifactAttribute != null) { pathExpression = pathExpression.replace("@{" + "overview_" +key + "}", artifactAttribute); if (content != null){ setServiceAttribute(content,key,artifactAttribute ); } } } } } return pathExpression; } public static String replaceExpressionOfPath(String pathExpression, String namespace, String value) { String[] elements = pathExpression.split("@"); for (int i = 1; i < elements.length; i++) { if (elements[i].indexOf("}") > 0 && elements[i].indexOf("{") == 0) { String key = elements[i].split("}")[0].substring(1); if (namespace.equalsIgnoreCase(key)){ pathExpression = pathExpression.replace("@{" + key + "}", value); } else if (key.equalsIgnoreCase("overview_"+namespace)) { pathExpression = pathExpression.replace("@{" + "overview_"+namespace + "}", value); } } } return pathExpression; } /** * This method replaces annotated namespace and name with real values * @param pathExpression registry path with annotated values * @param content XML representation of the meta data * @return complete registry path with namespace and name information */ private static String replaceNameAndNamespace(String pathExpression, OMElement content) { String output = pathExpression; String tempNamespace = CommonUtil.derivePathFragmentFromNamespace(CommonUtil.getServiceNamespace(content)); String name = CommonUtil.getServiceName(content); if (name != null) { output = output.replace("@{name}", name); if (tempNamespace.startsWith("/")) { tempNamespace = tempNamespace.substring(1); } if (tempNamespace.endsWith("/")) { tempNamespace = tempNamespace.substring(0, tempNamespace.length() - 1); } output = output.replace("@{namespace}", tempNamespace); } return output; } private static String getChrootedServiceLocation(Registry registry, RegistryContext registryContext) { return RegistryUtils.getAbsolutePath(registryContext, registry.getRegistryContext().getServicePath()); // service path contains the base } public static String getDefaultLifecycle(Registry registry, String shortName) throws RegistryException { String[] rxtList = null; String lifecycle = ""; rxtList = MediaTypesUtils.getResultPaths(registry, CommonConstants.RXT_MEDIA_TYPE); for (String rxtContent : rxtList) { Resource resource = registry.get(rxtContent); Object content = resource.getContent(); String elementString; if (content instanceof String) { elementString = (String) content; } else { elementString = RegistryUtils.decodeBytes((byte[]) content); } OMElement configElement = null; try { configElement = AXIOMUtil.stringToOM(elementString); } catch (XMLStreamException e) { throw new RegistryException("Error while serializing to OM content from String", e); } if (shortName.equals(configElement.getAttributeValue(new QName("shortName")))) { OMElement lifecycleElement = configElement.getFirstChildWithName( new QName("lifecycle")); if (lifecycleElement != null) { lifecycle = lifecycleElement.getText(); } } } return lifecycle; } public static void copyProperties(Resource originResource, Resource targetResource){ Properties properties = originResource.getProperties(); if (properties != null) { List<String> linkProperties = Arrays.asList( RegistryConstants.REGISTRY_LINK, RegistryConstants.REGISTRY_USER, RegistryConstants.REGISTRY_MOUNT, RegistryConstants.REGISTRY_AUTHOR, RegistryConstants.REGISTRY_MOUNT_POINT, RegistryConstants.REGISTRY_TARGET_POINT, RegistryConstants.REGISTRY_ACTUAL_PATH, RegistryConstants.REGISTRY_REAL_PATH); for (Map.Entry<Object, Object> e : properties.entrySet()) { String key = (String) e.getKey(); if (!linkProperties.contains(key)) { targetResource.setProperty(key, (List<String>) e.getValue()); } } } } /* public static void removeArtifactEntry(Registry registry, String artifactId) throws RegistryException { Resource resource; boolean governancePath = false; String govIndexPath = RegistryUtils.getRelativePath(registry.getRegistryContext(), RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH + CommonConstants.GOVERNANCE_ARTIFACT_INDEX_PATH); if (registry.resourceExists(CommonConstants.GOVERNANCE_ARTIFACT_INDEX_PATH)) { resource = registry.get(CommonConstants.GOVERNANCE_ARTIFACT_INDEX_PATH); } else if (registry.resourceExists(govIndexPath)) { resource = registry.get(govIndexPath); governancePath = true; } else { String msg = "The artifact index doesn't exist. artifact index path: " + CommonConstants.GOVERNANCE_ARTIFACT_INDEX_PATH + "."; log.error(msg); throw new RegistryException(msg); } resource.removeProperty(artifactId); if(governancePath){ registry.put(govIndexPath, resource); }else{ registry.put(CommonConstants.GOVERNANCE_ARTIFACT_INDEX_PATH, resource); } } */ /** * Adding a governance artifact entry with relative values * * @param registry system registry (without governance base path) * @param artifactId the artifact id * @param artifactPath relative path * @throws RegistryException throws if the operation failed */ /* public static void addGovernanceArtifactEntryWithRelativeValues(Registry registry, String artifactId, String artifactPath) throws RegistryException { if (isArtifactIndexMapExisting()) { addToArtifactIndexMap(artifactId, artifactPath); return; } addGovernanceArtifactEntriesWithRelativeValues(registry, Collections.singletonMap(artifactId, artifactPath)); } */ /* public static void addGovernanceArtifactEntriesWithRelativeValues( Registry registry, Map<String, String> artifactMap) throws RegistryException { String govIndexPath = RegistryUtils.getAbsolutePath(registry.getRegistryContext(), RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH + CommonConstants.GOVERNANCE_ARTIFACT_INDEX_PATH); try { Resource govIndexResource; String path = RegistryUtils.getAbsolutePath(registry.getRegistryContext(), RegistryConstants.LOCAL_REPOSITORY_BASE_PATH); registry.put(path, registry.get(path)); if (registry.resourceExists(govIndexPath)) { govIndexResource = registry.get(govIndexPath); } else { govIndexResource = registry.newResource(); } String firstArtifactId = null; for (Map.Entry<String, String> e : artifactMap.entrySet()) { if (firstArtifactId == null) { firstArtifactId = e.getKey(); } govIndexResource.setProperty(e.getKey(), e.getValue()); } ((ResourceImpl) govIndexResource).setVersionableChange(false); registry.put(govIndexPath, govIndexResource); // Since puts can happen in multiple transactions, synchronization would not solve this issue. // Therefore, we need to rely on DBs properly doing row-level locking. In such a setup, puts // to a single row, would automatically be serialized. if (firstArtifactId != null && registry.get(govIndexPath).getProperty(firstArtifactId) == null) { // We have detected a concurrent modification, so we will retry. // But first, back-off for a while, to ensure that all threads get an equal chance. try { // Wait from 0 to 1s. Thread.sleep(generator.nextInt(11) * 100); } catch (InterruptedException ignored) { } addGovernanceArtifactEntriesWithRelativeValues(registry, artifactMap); } } catch (RegistryException e) { String msg = "Error in adding entries for the governance artifacts."; log.error(msg); throw new RegistryException(msg, e); } } */ /** * Adding a governance artifact entry with absolute values * * @param registry system registry (without governance base path) * @param artifactId the artifact id * @param artifactPath absolute path * @throws RegistryException throws if the operation failed */ /* public static void addGovernanceArtifactEntryWithAbsoluteValues(Registry registry, String artifactId, String artifactPath) throws RegistryException { String relativeArtifactPath = RegistryUtils.getRelativePath( registry.getRegistryContext(), artifactPath); // adn then get the relative path to the GOVERNANCE_BASE_PATH relativeArtifactPath = RegistryUtils.getRelativePathToOriginal(relativeArtifactPath, RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH); addGovernanceArtifactEntryWithRelativeValues(registry, artifactId, relativeArtifactPath); } */ // handling the possibility that handlers are not called within each other. private static InheritableThreadLocal<Map<String, String>> artifactIndexMap = new InheritableThreadLocal<Map<String, String>>() { protected Map<String, String> initialValue() { return null; } }; public static boolean isArtifactIndexMapExisting() { return artifactIndexMap.get() != null; } public static void createArtifactIndexMap() { artifactIndexMap.set(new ConcurrentHashMap<String, String>()); } public static void addToArtifactIndexMap(String key, String value) { artifactIndexMap.get().put(key, value); } public static Map<String, String> getAndRemoveArtifactIndexMap() { Map<String, String> output = artifactIndexMap.get(); artifactIndexMap.set(null); return output; } // handling the possibility that handlers are not called within each other. private static InheritableThreadLocal<Map<String, String>> symbolicLinkMap = new InheritableThreadLocal<Map<String, String>>() { protected Map<String, String> initialValue() { return null; } }; public static boolean isSymbolicLinkMapExisting() { return symbolicLinkMap.get() != null; } public static void createSymbolicLinkMap() { symbolicLinkMap.set(new ConcurrentHashMap<String, String>()); } public static void addToSymbolicLinkMap(String key, String value) { symbolicLinkMap.get().put(key, value); } public static Map<String, String> getAndRemoveSymbolicLinkMap() { Map<String, String> output = symbolicLinkMap.get(); symbolicLinkMap.set(null); return output; } private static InheritableThreadLocal<Set<String>> importedArtifacts = new InheritableThreadLocal<Set<String>>() { protected Set<String> initialValue() { return new ConcurrentSkipListSet<String>(); } }; public static void loadImportedArtifactMap() { importedArtifacts.get(); } public static void clearImportedArtifactMap() { importedArtifacts.remove(); } public static void addImportedArtifact(String path) { importedArtifacts.get().add(path); } public static boolean isImportedArtifactExisting(String path) { return importedArtifacts.get().contains(path); } // handling the possibility that handlers are not called within each other. private static ThreadLocal<Boolean> scmTaskInProgress = new ThreadLocal<Boolean>() { protected Boolean initialValue() { return false; } }; public static boolean isSCMLockAvailable() { return !scmTaskInProgress.get(); } public static void acquireSCMLock() { scmTaskInProgress.set(true); } public static void releaseSCMLock() { scmTaskInProgress.set(false); } // handling the possibility that handlers are not called within each other. private static ThreadLocal<Boolean> updateInProgress = new ThreadLocal<Boolean>() { protected Boolean initialValue() { return false; } }; public static boolean isUpdateLockAvailable() { return !updateInProgress.get(); } public static void acquireUpdateLock() { updateInProgress.set(true); } public static void releaseUpdateLock() { updateInProgress.set(false); } private static ThreadLocal<Boolean> deleteInProgress = new ThreadLocal<Boolean>() { protected Boolean initialValue() { return false; } }; public static boolean isDeleteLockAvailable() { return !deleteInProgress.get(); } public static void acquireDeleteLock() { deleteInProgress.set(true); } public static void releaseDeleteLock() { deleteInProgress.set(false); } private static ThreadLocal<Boolean> restoringInProgress = new ThreadLocal<Boolean>() { protected Boolean initialValue() { return false; } }; public static boolean isRestoringLockAvailable() { return !restoringInProgress.get(); } public static void acquireRestoringLock() { restoringInProgress.set(true); } public static void releaseRestoringLock() { restoringInProgress.set(false); } private static ThreadLocal<Boolean> addingAssociationInProgress = new ThreadLocal<Boolean>() { protected Boolean initialValue() { return false; } }; public static boolean isAddingAssociationLockAvailable() { return !addingAssociationInProgress.get(); } public static void acquireAddingAssociationLock() { addingAssociationInProgress.set(true); } public static void releaseAddingAssociationLock() { addingAssociationInProgress.set(false); } public static String getEndpointPathFromUrl(String url) { String urlToPath = EndpointUtils.deriveEndpointFromUrl(url); return EndpointUtils.getEndpointLocation() + urlToPath; } public static Registry getUnchrootedSystemRegistry(RequestContext requestContext) throws RegistryException { Registry registry = requestContext.getRegistry(); RealmService realmService = registry.getRegistryContext().getRealmService(); String systemUser = CarbonConstants.REGISTRY_SYSTEM_USERNAME; return new UserRegistry(systemUser, CurrentSession.getTenantId(), registry, realmService, null); } public static String getConsumerType(OMElement element) { //get rid of this method OMElement overview = element.getFirstChildWithName(new QName("Overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName("Type")) != null) { return overview.getFirstChildWithName(new QName("Type")).getText(); } } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "type")) != null) { return overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "type")).getText(); } } return ""; } public static String getPeopleGroup(OMElement element) { OMElement overview = element.getFirstChildWithName(new QName("Overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName("Group")) != null) { return overview.getFirstChildWithName(new QName("Group")).getText(); } } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "group")) != null) { return overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "group")).getText(); } } return ""; } public static String getPeopleType(OMElement element) { //get rid of this method OMElement overview = element.getFirstChildWithName(new QName("Overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName("Type")) != null) { return overview.getFirstChildWithName(new QName("Type")).getText(); } } overview = element.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "overview")); if (overview != null) { if (overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "type")) != null) { return overview.getFirstChildWithName(new QName(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "type")).getText(); } } return ""; } public static Association[] getDependenciesRecursively(Registry registry, String resourcePath) throws RegistryException { return getDependenciesRecursively(registry, resourcePath, new ArrayList<String>()); } private static Association[] getDependenciesRecursively(Registry registry, String resourcePath, List<String> traversedDependencyPaths) throws RegistryException { List<Association> dependencies = new ArrayList<Association>(); if (!traversedDependencyPaths.contains(resourcePath)) { traversedDependencyPaths.add(resourcePath); List<Association> tempDependencies = Arrays.asList(registry.getAssociations(resourcePath, CommonConstants.DEPENDS)); for (Association association : tempDependencies) { if (!traversedDependencyPaths.contains(association.getDestinationPath())) { dependencies.add(association); List<Association> childDependencies = Arrays.asList( getDependenciesRecursively( registry, association.getDestinationPath(), traversedDependencyPaths) ); if (!childDependencies.isEmpty()) { dependencies.addAll(childDependencies); } } } } return dependencies.toArray(new Association[dependencies.size()]); } /** * Reading content form the provided input stream. * * @param inputStream input stream to read. * @return Content as a {@link java.io.ByteArrayOutputStream} * @throws RegistryException If a failure occurs when reading the content. */ public static ByteArrayOutputStream readSourceContent(InputStream inputStream) throws RegistryException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int nextChar; try { while ((nextChar = inputStream.read()) != -1) { outputStream.write(nextChar); } outputStream.flush(); } catch (IOException e) { throw new RegistryException("Exception occurred while reading content", e); } return outputStream; } /** * Closes a given input stream. * * @param inputStream the input steam. */ public static void closeInputStream(InputStream inputStream) { if(inputStream != null) { try { inputStream.close(); } catch (IOException e) { log.error("Error occurred when closing the input stream", e); } } } /** * Closes a given output stream. * * @param outputStream the output steam. */ public static void closeOutputStream(OutputStream outputStream) { if(outputStream != null) { try { outputStream.close(); } catch (IOException e) { log.error("Error occurred when closing the output stream", e); } } } /** * Adds associations for a given source and target * * @param registry registry. * @param source source path. * @param target target path. * @throws RegistryException If fails to add a dependency. */ public static void addDependency(Registry registry, String source, String target) throws RegistryException { registry.addAssociation(source, target, CommonConstants.DEPENDS); registry.addAssociation(target, source, CommonConstants.USED_BY); } /** * Checks if a interface url is valid to import. * * @param url url. * @return True if url is valid and false otherwise. */ public static boolean isValidUrl(String url) { return StringUtils.isNotBlank(url) && !(url.startsWith(RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH)); } }