/**
* Copyright 2009 Red Hat, Inc.
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.safehaus.penrose.service;
import org.safehaus.penrose.server.PenroseServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author Endi S. Dewata
*/
public class ServiceManager {
public Logger log = LoggerFactory.getLogger(getClass());
PenroseServer penroseServer;
private Map<String,Service> services = new LinkedHashMap<String,Service>();
private ServiceConfigManager serviceConfigManager;
public ServiceManager(PenroseServer penroseServer, ServiceConfigManager serviceConfigManager) {
this.penroseServer = penroseServer;
this.serviceConfigManager = serviceConfigManager;
}
public void addServiceConfig(ServiceConfig serviceConfig) throws Exception {
serviceConfigManager.addServiceConfig(serviceConfig);
}
public File getServicesDir() {
return serviceConfigManager.getServicesDir();
}
public void addService(Service service) {
services.put(service.getName(), service);
}
public Service getService(String name) {
return services.get(name);
}
public Collection<String> getServiceNames() {
return services.keySet();
}
public Collection<Service> getServices() {
return services.values();
}
public Service removeService(String name) {
return services.remove(name);
}
public void clear() {
services.clear();
}
public void loadServiceConfig(String name) throws Exception {
log.debug("Loading "+name+" service.");
ServiceConfig serviceConfig = serviceConfigManager.load(name);
serviceConfigManager.addServiceConfig(serviceConfig);
}
public Service startService(String serviceName) throws Exception {
ServiceConfig serviceConfig = serviceConfigManager.getServiceConfig(serviceName);
if (!serviceConfig.isEnabled()) {
log.debug(serviceConfig.getName()+" service is disabled.");
return null;
}
log.debug("Starting "+serviceName+" service.");
ServiceContext serviceContext = createServiceContext(serviceConfig);
Service service = createService(serviceConfig, serviceContext);
service.init(serviceConfig, serviceContext);
addService(service);
return service;
}
public ServiceContext createServiceContext(ServiceConfig serviceConfig) throws Exception {
File serviceDir = new File(serviceConfigManager.getServicesDir(), serviceConfig.getName());
ClassLoader classLoader = new ServiceClassLoader(serviceDir, getClass().getClassLoader());
//Collection<URL> classPaths = serviceConfig.getClassPaths();
//URLClassLoader classLoader = new URLClassLoader(classPaths.toArray(new URL[classPaths.size()]), getClass().getClassLoader());
ServiceContext serviceContext = new ServiceContext();
serviceContext.setPath(serviceDir);
serviceContext.setPenroseServer(penroseServer);
serviceContext.setClassLoader(classLoader);
return serviceContext;
}
public Service createService(ServiceConfig serviceConfig, ServiceContext serviceContext) throws Exception {
ClassLoader classLoader = serviceContext.getClassLoader();
Class clazz = classLoader.loadClass(serviceConfig.getServiceClass());
return (Service)clazz.newInstance();
}
public void stopService(String name) throws Exception {
log.debug("Stopping "+name+" service.");
Service service = getService(name);
if (service == null) return;
service.destroy();
services.remove(name);
}
public void unloadService(String name) throws Exception {
serviceConfigManager.removeServiceConfig(name);
}
public String getServiceStatus(String name) {
Service service = services.get(name);
if (service == null) {
return "STOPPED";
} else {
return "STARTED";
}
}
public ServiceConfigManager getServiceConfigManager() {
return serviceConfigManager;
}
public void setServiceConfigManager(ServiceConfigManager serviceConfigManager) {
this.serviceConfigManager = serviceConfigManager;
}
public ServiceConfig getServiceConfig(String serviceName) {
return serviceConfigManager.getServiceConfig(serviceName);
}
}