/*
* 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;
import org.apache.axiom.om.OMElement;
import org.wso2.carbon.governance.api.cache.ArtifactCache;
import org.wso2.carbon.governance.api.cache.ArtifactCacheManager;
import org.wso2.carbon.governance.api.common.GovernanceArtifactManager;
import org.wso2.carbon.governance.api.common.dataobjects.GovernanceArtifact;
import org.wso2.carbon.governance.api.exception.GovernanceException;
import org.wso2.carbon.governance.api.services.dataobjects.Service;
import org.wso2.carbon.governance.api.services.dataobjects.ServiceImpl;
import org.wso2.carbon.governance.api.util.GovernanceArtifactConfiguration;
import org.wso2.carbon.governance.api.util.GovernanceConstants;
import org.wso2.carbon.governance.api.util.GovernanceUtils;
import org.wso2.carbon.registry.core.Association;
import org.wso2.carbon.registry.core.Registry;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.core.session.UserRegistry;
import org.wso2.carbon.registry.extensions.utils.CommonUtil;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List;
/**
* This provides the management functionality for service artifacts stored on the registry.
*/
public class ServiceManager {
private GovernanceArtifactManager manager;
private Registry registry;
/**
* Constructor accepting an instance of the registry to use.
*
* @param registry the instance of the registry.
*/
public ServiceManager(Registry registry) throws RegistryException {
this(registry, GovernanceConstants.SERVICE_MEDIA_TYPE);
}
/**
* Constructor accepting an instance of the registry, and also details on the type of manager.
*
* @param registry the instance of the registry.
* @param mediaType the media type of resources being saved or fetched.
*/
protected ServiceManager(Registry registry, String mediaType) throws RegistryException {
GovernanceArtifactConfiguration configuration =
GovernanceUtils.findGovernanceArtifactConfiguration(
GovernanceConstants.SERVICE_ARTIFACT_KEY, registry);
this.manager = new GovernanceArtifactManager(
registry, mediaType,
configuration.getArtifactNameAttribute(),
configuration.getArtifactNamespaceAttribute(),
configuration.getArtifactElementRoot(),
GovernanceConstants.SERVICE_ELEMENT_NAMESPACE,
configuration.getPathExpression(), new Association[0]);
this.registry = registry;
}
/**
* Creates a new service artifact from the given qualified name.
*
* @param qName the qualified name of this service.
*
* @return the artifact added.
* @throws GovernanceException if the operation failed.
*/
public Service newService(QName qName) throws GovernanceException {
ServiceImpl service = new ServiceImpl(manager.newGovernanceArtifact()) {};
service.setQName(qName);
return service;
}
/**
* Creates a new service artifact from the given content.
*
* @param content the service content.
*
* @return the artifact added.
* @throws GovernanceException if the operation failed.
*/
public Service newService(OMElement content) throws GovernanceException {
ServiceImpl service = new ServiceImpl(manager.newGovernanceArtifact(content)) {};
String serviceName = CommonUtil.getServiceName(content);
String serviceNamespace = CommonUtil.getServiceNamespace(content);
if (serviceName != null && !serviceName.equals("")) {
service.setQName(new QName(serviceNamespace, serviceName));
} else {
throw new GovernanceException("Unable to compute QName from given XML payload, " +
"please ensure that the content passed in matches the configuration.");
}
return service;
}
/**
* Adds the given service artifact to the registry. Please do not use this method to update an
* existing artifact use the update method instead. If this method is used to update an existing
* artifact, all existing properties (such as lifecycle details) will be removed from the
* existing artifact.
*
* @param service the service artifact.
*
* @throws GovernanceException if the operation failed.
*/
public void addService(Service service) throws GovernanceException {
manager.addGovernanceArtifact(service);
// GovernanceUtils.writeOwnerAssociations(registry, service);
// GovernanceUtils.writeConsumerAssociations(registry, service);
}
/**
* Updates the given service artifact on the registry.
*
* @param service the service artifact.
*
* @throws GovernanceException if the operation failed.
*/
public void updateService(Service service) throws GovernanceException {
manager.updateGovernanceArtifact(service);
ArtifactCache artifactCache =
ArtifactCacheManager.getCacheManager().getTenantArtifactCache(((UserRegistry)registry).getTenantId());
if (artifactCache != null) {
artifactCache.addArtifact(service.getPath(),service);
}
}
/**
* Fetches the given service artifact on the registry.
*
* @param serviceId the identifier of the service artifact.
*
* @return the service artifact.
* @throws GovernanceException if the operation failed.
*/
public Service getService(String serviceId) throws GovernanceException {
GovernanceArtifact governanceArtifact;
String path = GovernanceUtils.getArtifactPath(registry, serviceId);
ArtifactCache cache = ArtifactCacheManager.getCacheManager().getTenantArtifactCache(((UserRegistry)registry).getTenantId());
if (cache != null) {
governanceArtifact = cache.getArtifact(path);
if (governanceArtifact != null) {
return new ServiceImpl(governanceArtifact) {};
}
}
governanceArtifact = manager.getGovernanceArtifact(serviceId);
if (governanceArtifact == null) {
return null;
}
if (cache != null) {
cache.addArtifact(governanceArtifact.getPath(), governanceArtifact);
}
return new ServiceImpl(governanceArtifact) {};
}
/**
* Removes the given service artifact from the registry.
*
* @param serviceId the identifier of the service artifact.
*
* @throws GovernanceException if the operation failed.
*/
public void removeService(String serviceId) throws GovernanceException {
manager.removeGovernanceArtifact(serviceId);
}
/**
* Finds all service artifacts matching the given filter criteria.
*
* @param criteria the filter criteria to be matched.
*
* @return the service artifacts that match.
* @throws GovernanceException if the operation failed.
*/
public Service[] findServices(ServiceFilter criteria) throws GovernanceException {
List<Service> services = new ArrayList<Service>();
for (Service service : getAllServices()) {
if (service != null) {
if (criteria.matches(service)) {
services.add(service);
}
}
}
return services.toArray(new Service[services.size()]);
}
/**
* Finds all the service path and used to list services
*
* @return all the service paths
* @throws GovernanceException if the operation failed
*/
public String[] getAllServicePaths() throws GovernanceException {
return GovernanceUtils.getResultPaths(registry,
GovernanceConstants.SERVICE_MEDIA_TYPE);
}
/**
* Finds all service artifacts on the registry.
*
* @return all service artifacts on the registry.
* @throws GovernanceException if the operation failed.
*/
public Service[] getAllServices() throws GovernanceException {
return getServices(manager.getAllGovernanceArtifacts());
}
// Method to obtain services from governance artifacts.
private Service[] getServices(GovernanceArtifact[] governanceArtifacts) {
Service[] services = new Service[governanceArtifacts.length];
for (int i = 0; i < governanceArtifacts.length; i++) {
services[i] = new ServiceImpl(governanceArtifacts[i]) {};
}
return services;
}
/**
* Finds all identifiers of the service artifacts on the registry.
*
* @return an array of identifiers of the service artifacts.
* @throws GovernanceException if the operation failed.
*/
public String[] getAllServiceIds() throws GovernanceException {
return manager.getAllGovernanceArtifactIds();
}
/**
* Retrieve all Services which associated with the given lifecycle
*
* @param lcName Name of the lifecycle
*
* @return Service array
* @throws GovernanceException if the operation failed.
*/
public Service[] getAllServicesByLifecycle(String lcName) throws GovernanceException {
return (Service[]) manager.getAllGovernanceArtifactsByLifecycle(lcName);
}
/**
* Retrieve all Services which associated with the given lifecycle in the given lifecycle state
*
* @param lcName Name of the lifecycle
* @param lcState Name of the current lifecycle state
*
* @return Service array
* @throws GovernanceException if the operation failed.
*/
public Service[] getAllServicesByLifecycleStatus(String lcName, String lcState) throws GovernanceException {
return (Service[]) manager.getAllGovernanceArtifactsByLIfecycleStatus(lcName, lcState);
}
}