package org.safehaus.penrose.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; import java.util.LinkedHashMap; import java.util.Collection; import java.util.ArrayList; import java.io.File; /** * @author Endi S. Dewata */ public class ServiceConfigManager { public ServiceReader serviceReader = new ServiceReader(); public ServiceWriter serviceWriter = new ServiceWriter(); private Map<String,ServiceConfig> serviceConfigs = new LinkedHashMap<String,ServiceConfig>(); private File servicesDir; public ServiceConfigManager(File servicesDir) throws Exception { this.servicesDir = servicesDir; } public void addServiceConfig(ServiceConfig serviceConfig) throws Exception { Logger log = LoggerFactory.getLogger(getClass()); boolean debug = log.isDebugEnabled(); String serviceName = serviceConfig.getName(); if (debug) log.debug("Adding service \""+serviceName+"\"."); validate(serviceConfig); serviceConfigs.put(serviceName, serviceConfig); } public void validate(ServiceConfig serviceConfig) throws Exception { String serviceName = serviceConfig.getName(); if (serviceName == null || "".equals(serviceName)) { throw new Exception("Missing service name."); } char startingChar = serviceName.charAt(0); if (!Character.isLetter(startingChar)) { throw new Exception("Invalid service name: "+serviceName); } for (int i = 1; i<serviceName.length(); i++) { char c = serviceName.charAt(i); if (Character.isLetterOrDigit(c) || c == '_') continue; throw new Exception("Invalid service name: "+serviceName); } if (serviceConfigs.containsKey(serviceName)) { throw new Exception("Service "+serviceName+" already exists."); } } public Collection<String> getAvailableServiceNames() throws Exception { Collection<String> list = new ArrayList<String>(); for (File serviceDir : servicesDir.listFiles()) { list.add(serviceDir.getName()); } return list; } public ServiceConfig load(String serviceName) throws Exception { Logger log = LoggerFactory.getLogger(getClass()); boolean debug = log.isDebugEnabled(); File dir = new File(servicesDir, serviceName); if (debug) log.debug("Loading service from "+dir+"."); return serviceReader.read(dir); } public void store(String serviceName, ServiceConfig serviceConfig) throws Exception { Logger log = LoggerFactory.getLogger(getClass()); boolean debug = log.isDebugEnabled(); File dir = new File(servicesDir, serviceName); if (debug) log.debug("Storing service from "+dir+"."); serviceWriter.write(dir, serviceConfig); } public ServiceConfig getServiceConfig(String name) { return serviceConfigs.get(name); } public Collection<String> getServiceNames() { return serviceConfigs.keySet(); } public Collection<ServiceConfig> getServiceConfigs() { return serviceConfigs.values(); } public ServiceConfig removeServiceConfig(String name) { return serviceConfigs.remove(name); } public void clear() { serviceConfigs.clear(); } public File getServicesDir() { return servicesDir; } public void setServicesDir(File servicesDir) { this.servicesDir = servicesDir; } }