/* * Copyright (c) 2008, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * 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. */ package org.wso2.carbon.governance.api.services.dataobjects; import org.apache.axiom.om.OMElement; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.governance.api.common.dataobjects.GovernanceArtifact; import org.wso2.carbon.governance.api.common.dataobjects.GovernanceArtifactImpl; import org.wso2.carbon.governance.api.endpoints.dataobjects.Endpoint; import org.wso2.carbon.governance.api.endpoints.dataobjects.EndpointImpl; import org.wso2.carbon.governance.api.exception.GovernanceException; import org.wso2.carbon.governance.api.policies.dataobjects.Policy; import org.wso2.carbon.governance.api.policies.dataobjects.PolicyImpl; import org.wso2.carbon.governance.api.schema.dataobjects.Schema; import org.wso2.carbon.governance.api.schema.dataobjects.SchemaImpl; import org.wso2.carbon.governance.api.util.GovernanceConstants; import org.wso2.carbon.governance.api.util.GovernanceUtils; import org.wso2.carbon.governance.api.wsdls.dataobjects.Wsdl; import org.wso2.carbon.governance.api.wsdls.dataobjects.WsdlImpl; 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.exceptions.RegistryException; import org.wso2.carbon.registry.core.utils.RegistryUtils; import org.wso2.carbon.registry.extensions.utils.CommonUtil; import javax.xml.namespace.QName; import java.util.*; /** * This represents a service artifact stored on the Registry. Service artifacts are created as a * result of adding a new service or uploading or importing a WSDL file into the registry. */ public class ServiceImpl extends GovernanceArtifactImpl implements Service { private static final Log log = LogFactory.getLog(ServiceImpl.class); private static final String ACTIVATE_PROPERTY_FLAG_NAME = "active"; private QName qName; /** * Copy constructor used for cloning. * * @param service the object to be copied. */ protected ServiceImpl(GovernanceArtifact service) { super((GovernanceArtifactImpl)service); this.qName = service.getQName(); setLcName(((GovernanceArtifactImpl) service).getLcName()); setLcState(((GovernanceArtifactImpl) service).getLcState()); setArtifactPath(((GovernanceArtifactImpl) service).getArtifactPath()); } /** * Constructor accepting resource identifier and the qualified name. * * @param id the resource identifier. * @param qName the qualified name. */ public ServiceImpl(String id, QName qName) { super(id); this.qName = qName; } /** * Constructor accepting resource identifier and the service content. * * @param id the resource identifier. * @param serviceContentElement an XML element containing the service content. * * @throws GovernanceException if the construction fails. */ public ServiceImpl(String id, OMElement serviceContentElement) throws GovernanceException { super(id, serviceContentElement); String serviceName = CommonUtil.getServiceName(serviceContentElement); String serviceNamespace = CommonUtil.getServiceNamespace(serviceContentElement); if (serviceName != null && !serviceName.equals("")) { this.qName = new QName(serviceNamespace, serviceName); } } public QName getQName() { return qName; } /** * Method to set the qualified name of this service artifact. * * @param qName the qualified name. * * @throws GovernanceException if the operation failed. */ public void setQName(QName qName) throws GovernanceException { // the path will be synced with the qualified name this.qName = qName; } /** * Method to activate this service. * @deprecated since active functionality is no longer used. * * @throws GovernanceException if the operation failed. */ public void activate() throws GovernanceException { checkRegistryResourceAssociation(); try { Registry registry = getAssociatedRegistry(); String path = getPath(); Resource r = registry.get(path); r.setProperty(ACTIVATE_PROPERTY_FLAG_NAME, Boolean.toString(true)); registry.put(path, r); } catch (RegistryException e) { String msg = "Error in activating the service: id:" + getId() + ", path: " + getPath() + "."; log.error(msg, e); throw new GovernanceException(msg, e); } } /** * Method to deactivate this service. * @deprecated since active functionality is no longer used. * * @throws GovernanceException if the operation failed. */ public void deactivate() throws GovernanceException { checkRegistryResourceAssociation(); try { Registry registry = getAssociatedRegistry(); String path = getPath(); Resource r = registry.get(path); r.setProperty(ACTIVATE_PROPERTY_FLAG_NAME, Boolean.toString(false)); registry.put(path, r); } catch (RegistryException e) { String msg = "Error in activating the service: id:" + getId() + ", path: " + getPath() + "."; log.error(msg, e); throw new GovernanceException(msg, e); } } /** * Method to set/unset the active status of this service. * * @param isActive whether the service is active. * @deprecated since active functionality is no longer used. * * @throws GovernanceException if the operation failed. */ //TODO remove this in the next release @Deprecated public void setActive(boolean isActive) throws GovernanceException { checkRegistryResourceAssociation(); try { Registry registry = getAssociatedRegistry(); String path = getPath(); Resource r = registry.get(path); r.setProperty(ACTIVATE_PROPERTY_FLAG_NAME, Boolean.toString(isActive)); registry.put(path, r); } catch (RegistryException e) { String msg = "Error in activating the service: id:" + getId() + ", path: " + getPath() + "."; log.error(msg, e); throw new GovernanceException(msg, e); } } /** * Method to obtain whether this service is active or not. * @deprecated since active functionality is no longer used. * * @return true if this service is active, and false if not. * @throws GovernanceException if the operation failed. */ public boolean isActive() throws GovernanceException { checkRegistryResourceAssociation(); try { Registry registry = getAssociatedRegistry(); String path = getPath(); Resource r = registry.get(path); // if the inactive flag is not set explicitly it is active. return !Boolean.toString(false).equals(r.getProperty(ACTIVATE_PROPERTY_FLAG_NAME)); } catch (RegistryException e) { String msg = "Error in checking the activeness of the service: id:" + getId() + ", path: " + getPath() + "."; log.error(msg, e); throw new GovernanceException(msg, e); } } /** * Attach a policy artifact to a service artifact. Both the artifacts should be saved, before * calling this method. * * @param policy the policy to attach. * * @throws GovernanceException if the operation failed. */ @Override public void attachPolicy(Policy policy) throws GovernanceException { attach(policy); } /** * Detach a policy artifact from a service artifact. Both the artifacts should be saved, before * calling this method. * * @param policyId the identifier of the policy to detach. * * @throws GovernanceException if the operation failed. */ @Override @SuppressWarnings("unused") public void detachPolicy(String policyId) throws GovernanceException { detach(policyId); } /** * Method to retrieve all policies attached to this service artifact. * * @return all policies attached to this service artifact. * @throws GovernanceException if the operation failed. */ @Override public Policy[] getAttachedPolicies() throws GovernanceException { checkRegistryResourceAssociation(); Registry registry = getAssociatedRegistry(); String path = getPath(); List<Policy> policies = new ArrayList<Policy>(); try { Association[] associations = registry.getAssociations(path, GovernanceConstants.DEPENDS); for (Association association : associations) { String destinationPath = association.getDestinationPath(); GovernanceArtifact governanceArtifact = GovernanceUtils.retrieveGovernanceArtifactByPath(registry, destinationPath); if (governanceArtifact instanceof PolicyImpl) { policies.add((Policy) governanceArtifact); } } } catch (RegistryException e) { String msg = "Error in getting attached policies from the artifact at path: " + path + "."; log.error(msg, e); throw new GovernanceException(msg, e); } return policies.toArray(new Policy[policies.size()]); } /** * Attach a schema artifact to a service artifact. Both the artifacts should be saved, before * calling this method. * * @param schema the schema to attach. * * @throws GovernanceException if the operation failed. */ @Override @SuppressWarnings("unused") public void attachSchema(Schema schema) throws GovernanceException { attach(schema); } /** * Detach a schema artifact from a service artifact. Both the artifacts should be saved, before * calling this method. * * @param schemaId the identifier of the schema to detach. * * @throws GovernanceException if the operation failed. */ @Override @SuppressWarnings("unused") public void detachSchema(String schemaId) throws GovernanceException { detach(schemaId); } /** * Method to retrieve all schemas attached to this service artifact. * * @return all schemas attached to this service artifact. * @throws GovernanceException if the operation failed. */ @Override @SuppressWarnings("unused") public Schema[] getAttachedSchemas() throws GovernanceException { checkRegistryResourceAssociation(); Registry registry = getAssociatedRegistry(); String path = getPath(); List<Schema> schemas = new ArrayList<Schema>(); try { Association[] associations = registry.getAssociations(path, GovernanceConstants.DEPENDS); for (Association association : associations) { String destinationPath = association.getDestinationPath(); GovernanceArtifact governanceArtifact = GovernanceUtils.retrieveGovernanceArtifactByPath(registry, destinationPath); if (governanceArtifact instanceof SchemaImpl) { schemas.add((Schema) governanceArtifact); } } } catch (RegistryException e) { String msg = "Error in getting attached schemas from the artifact at path: " + path + "."; log.error(msg, e); throw new GovernanceException(msg, e); } return schemas.toArray(new Schema[schemas.size()]); } /** * Attach a WSDL artifact to a service artifact. Both the artifacts should be saved, before * calling this method. * * @param wsdl the WSDL to attach. * * @throws GovernanceException if the operation failed. */ @Override public void attachWSDL(Wsdl wsdl) throws GovernanceException { attach(wsdl); addAttribute(GovernanceConstants.SERVICE_WSDL_ATTRIBUTE, RegistryUtils.getAbsolutePathToOriginal(wsdl.getPath(), RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH)); } /** * Detach a WSDL artifact from a service artifact. Both the artifacts should be saved, before * calling this method. * * @param wsdlId the identifier of the WSDL to detach. * * @throws GovernanceException if the operation failed. */ @Override @SuppressWarnings("unused") public void detachWSDL(String wsdlId) throws GovernanceException { detach(wsdlId); } /** * Method to retrieve all WSDLs attached to this service artifact. * * @return all WSDLs attached to this service artifact. * @throws GovernanceException if the operation failed. */ @Override public Wsdl[] getAttachedWsdls() throws GovernanceException { checkRegistryResourceAssociation(); Registry registry = getAssociatedRegistry(); String path = getPath(); List<Wsdl> wsdls = new ArrayList<Wsdl>(); try { Association[] associations = registry.getAssociations(path, GovernanceConstants.DEPENDS); for (Association association : associations) { String destinationPath = association.getDestinationPath(); GovernanceArtifact governanceArtifact = GovernanceUtils.retrieveGovernanceArtifactByPath(registry, destinationPath); if (governanceArtifact instanceof WsdlImpl) { wsdls.add((Wsdl) governanceArtifact); } } } catch (RegistryException e) { String msg = "Error in getting attached wsdls from the artifact at path: " + path + "."; log.error(msg, e); throw new GovernanceException(msg, e); } return wsdls.toArray(new Wsdl[wsdls.size()]); } // currently only the valid services are possible to add //public void validate() throws GovernanceException { // TODO: add the service validation code.. //} /** * Attach an endpoint artifact to a service artifact. Both the artifacts should be saved, before * calling this method. * * @param endpoint the endpoint to attach. * * @throws GovernanceException if the operation failed. */ @Override public void attachEndpoint(Endpoint endpoint) throws GovernanceException { // add an endpoint and attache to the service.. attach(endpoint); } /** * Detach an endpoint artifact from a service artifact. Both the artifacts should be saved, * before calling this method. * * @param endpointId the identifier of the endpoint to detach. * * @throws GovernanceException if the operation failed. */ @Override public void detachEndpoint(String endpointId) throws GovernanceException { // detach the endpoint and delete the endpoint. detach(endpointId); } /** * Method to retrieve all endpoints attached to this service artifact. * * @return all endpoints attached to this service artifact. * @throws GovernanceException if the operation failed. */ @Override public Endpoint[] getAttachedEndpoints() throws GovernanceException { checkRegistryResourceAssociation(); Registry registry = getAssociatedRegistry(); String path = getPath(); List<Endpoint> endpoints = new ArrayList<Endpoint>(); try { Association[] associations = registry.getAssociations(path, GovernanceConstants.DEPENDS); for (Association association : associations) { String destinationPath = association.getDestinationPath(); GovernanceArtifact governanceArtifact = GovernanceUtils.retrieveGovernanceArtifactByPath(registry, destinationPath); if (governanceArtifact instanceof EndpointImpl) { endpoints.add((Endpoint) governanceArtifact); } } } catch (RegistryException e) { String msg = "Error in getting attached endpoints from the artifact at path: " + path + "."; log.error(msg, e); throw new GovernanceException(msg, e); } return endpoints.toArray(new Endpoint[endpoints.size()]); } /* public PeopleArtifact[] getOwners() throws GovernanceException { return GovernanceUtils.extractPeopleFromAttribute(getAssociatedRegistry(), this, GovernanceConstants.SERVICE_OWNERS_ATTRIBUTE); } */ /* public PeopleArtifact[] getConsumers() throws GovernanceException { return GovernanceUtils.extractPeopleFromAttribute(getAssociatedRegistry(), this, GovernanceConstants.SERVICE_CONSUMERS_ATTRIBUTE); } */ }