package cloudone.cumulonimbus; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.HashSet; import java.util.Properties; import java.util.Set; import cloudone.C1Application; import cloudone.C1Services; import cloudone.cumulonimbus.resources.ConfigurationResource; import cloudone.cumulonimbus.resources.LaterResource; import cloudone.cumulonimbus.resources.ResourceDiscoveryResource; import cloudone.cumulonimbus.resources.ServiceResource; import cloudone.internal.provider.DurationMessageBodyWriter; import cloudone.internal.resources.LifecycleResource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Cumulonimbus represents central cloudOne service. Main goals are to provide configuration and navigation services. * * @author Martin Mares (martin.mares at oracle.com) */ public class CumulonimbusApp extends C1Application { private static final Logger LOGGER = LoggerFactory.getLogger(CumulonimbusApp.class); public static final String BASE_DIR_NAME = "cumulonimbus"; private static final String CONFIG_DIR_NAME = "config"; private static final String FILE_NAME = "cumulonimbus.properties"; private File cumulonimbusDir; public Set<Class<?>> getClasses() { return new HashSet<Class<?>>(Arrays.asList(new Class<?>[] { LifecycleResource.class, ConfigurationResource.class, ServiceResource.class, ResourceDiscoveryResource.class, DurationMessageBodyWriter.class, LaterResource.class })); } @Override public void init() throws Exception { super.init(); cumulonimbusDir = new File(C1Services.getInstance().getRuntimeInfo().getHomeDirectory(), CumulonimbusApp.BASE_DIR_NAME); if (!cumulonimbusDir.exists()) { if (!cumulonimbusDir.mkdirs()) { throw new IOException("Cumulonimbus home directory " + cumulonimbusDir.getPath() + " does not exists and cannot be created!"); } } Properties properties = loadConfiguration(cumulonimbusDir); PortService portService = PortService.init(properties); ResourceRegistryService resourceRegistry = ResourceRegistryService.getInstance(); ServiceRegistryService.init(cumulonimbusDir, portService.getNewListener(), resourceRegistry.getNewListener()); } private Properties loadConfiguration(File cumulonimbusDir) throws Exception { File dir = new File(cumulonimbusDir, CONFIG_DIR_NAME); if (!dir.exists()) { if (!dir.mkdirs()) { throw new IOException("Configuration directory " + dir.getPath() + " does not exists and cannot be created!"); } } File propsFile = new File(dir, FILE_NAME); if (!propsFile.exists()) { LOGGER.info("Writing default Cumulonimbus configuration to " + propsFile.getPath()); try (InputStream is = getClass().getClassLoader().getResourceAsStream("cumulonimbus_default.properties"); OutputStream os = new FileOutputStream(propsFile)) { byte[] buff = new byte[64]; int ind = 0; while ((ind = is.read(buff)) > 0) { os.write(buff, 0, ind); } } } //Read props from the file Properties result = new Properties(); result.load(new FileInputStream(propsFile)); return result; } public File getCumulonimbusDir() { return cumulonimbusDir; } }