/* * Copyright 2012 buddycloud * * 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 com.buddycloud.mediaserver.commons; import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.buddycloud.mediaserver.commons.configuration.ConfigurationException; import com.buddycloud.mediaserver.commons.configuration.DatabaseLoader; import com.buddycloud.mediaserver.commons.configuration.FileLoader; import com.buddycloud.mediaserver.commons.configuration.Loader; import com.buddycloud.mediaserver.commons.exception.LoadConfigurationException; public class MediaServerConfiguration { // File System public static final String MEDIA_STORAGE_ROOT_PROPERTY = "media.storage.root"; public static final String MEDIA_SIZE_LIMIT_PROPERTY = "media.sizelimit"; public static final String MEDIA_TO_DISK_THRESHOLD_PROPERTY = "media.todisk.threshold"; // JDBC public static final String JDBC_DRIVER_CLASS_PROPERTY = "jdbc.driver.class"; public static final String JDBC_DB_URL_PROPERTY = "jdbc.db.url"; // XMPP public static final String XMPP_COMPONENT_HOST = "xmpp.component.host"; public static final String XMPP_COMPONENT_PORT = "xmpp.component.port"; public static final String XMPP_COMPONENT_SUBDOMAIN = "xmpp.component.subdomain"; public static final String XMPP_COMPONENT_SECRETKEY = "xmpp.component.secretkey"; public static final String XMPP_COMPONENT_SERVERNAME = "xmpp.component.servername"; public static final String XMPP_CONNECTION_USERNAME = "xmpp.connection.username"; public static final String XMPP_CONNECTION_PASSWORD = "xmpp.connection.password"; public static final String XMPP_CONNECTION_HOST = "xmpp.connection.host"; public static final String XMPP_CONNECTION_PORT = "xmpp.connection.port"; public static final String XMPP_CONNECTION_SERVICENAME = "xmpp.connection.servicename"; public static final String XMPP_CONNECTION_SASL = "xmpp.connection.saslenabled"; public static final String XMPP_CONNECTION_SECURITY = "xmpp.connection.securitymode"; public static final String XMPP_REPLY_TIMEOUT = "xmpp.reply.timeout"; // HTTP public static final String HTTP_PORT = "http.port"; public static final String HTTP_ENDPOINT = "http.endpoint"; public static final String HTTP_TESTS_PORT = "http.tests.port"; public static final String HTTPS_PORT = "https.port"; public static final String HTTPS_ENABLED = "https.enabled"; public static final String HTTPS_KEYSTORE_PATH = "https.keystore.path"; public static final String HTTPS_KEYSTORE_TYPE = "https.keystore.type"; public static final String HTTPS_KEYSTORE_PASSWORD = "https.keystore.password"; public static final String HTTPS_KEY_PASSWORD = "https.key.password"; // CACHE public static final String CACHE_MAX_AGE = "cache.max.age"; /* * mediaserver.properties default values */ // XMPP public static final Integer DEF_XMPP_REPLY_TIMEOUT = 30000; // 30 seconds // CACHE public static final Integer DEF_CACHE_MAX_AGE = 86400; // 1 day; // JDBC public static final String DEF_JDBC_DRIVER_CLASS_PROPERTY = "org.postgresql.Driver"; // File System public static final Long DEF_MEDIA_SIZE_LIMIT = 104857600L; public static final Long DEF_MEDIA_TO_DISK_THRESHOLD = 1048576L; // HTTP public static final Integer DEF_HTTP_TESTS_PORT = 9091; public static final Integer DEF_HTTP_PORT = 8080; public static final Boolean DEF_HTTPS_ENABLED = false; // XMPP sec private static final Boolean DEF_XMPP_CONNECTION_SASL = true; private static final String DEF_XMPP_CONNECTION_SECURITY = SecurityMode.enabled.toString(); private static MediaServerConfiguration instance; public static final String BUDDYCLOUD_NS_API = "http://buddycloud.org/v1/api"; public static final String API_ENDPOINT_FIELD_VAR = "endpoint"; private static Logger LOGGER = LoggerFactory.getLogger(MediaServerConfiguration.class); private Properties configuration; public static final String DATABASE_ENV = "DATABASE"; private MediaServerConfiguration() { this.configuration = new Properties(); try { String databaseConnectionString = System.getenv(DATABASE_ENV); Loader loader = null; if (null == databaseConnectionString) { loader = new FileLoader(this.configuration); } else { loader = new DatabaseLoader(this.configuration, databaseConnectionString); } loader.load(); } catch (ConfigurationException e) { LOGGER.error(e.getMessage()); System.exit(1); } loadDefault(); validate(); } public static MediaServerConfiguration getInstance() { if (instance == null) { instance = new MediaServerConfiguration(); } return instance; } public Properties getConfiguration() { return this.configuration; } public void loadDefault() { if (configuration.get(XMPP_REPLY_TIMEOUT) == null) { configuration.put(XMPP_REPLY_TIMEOUT, DEF_XMPP_REPLY_TIMEOUT.toString()); } if (configuration.get(CACHE_MAX_AGE) == null) { configuration.put(CACHE_MAX_AGE, DEF_CACHE_MAX_AGE.toString()); } if (configuration.get(JDBC_DRIVER_CLASS_PROPERTY) == null) { configuration.put(JDBC_DRIVER_CLASS_PROPERTY, DEF_JDBC_DRIVER_CLASS_PROPERTY); } if (configuration.get(MEDIA_TO_DISK_THRESHOLD_PROPERTY) == null) { configuration.put(MEDIA_TO_DISK_THRESHOLD_PROPERTY, DEF_MEDIA_TO_DISK_THRESHOLD.toString()); } if (configuration.get(MEDIA_SIZE_LIMIT_PROPERTY) == null) { configuration.put(MEDIA_SIZE_LIMIT_PROPERTY, DEF_MEDIA_SIZE_LIMIT.toString()); } if (configuration.get(HTTP_PORT) == null) { configuration.put(HTTP_PORT, DEF_HTTP_PORT.toString()); } if (configuration.get(HTTP_TESTS_PORT) == null) { configuration.put(HTTP_TESTS_PORT, DEF_HTTP_TESTS_PORT.toString()); } if (configuration.get(HTTPS_ENABLED) == null) { configuration.put(HTTPS_ENABLED, DEF_HTTPS_ENABLED.toString()); } if (configuration.get(XMPP_CONNECTION_SASL) == null) { configuration.put(XMPP_CONNECTION_SASL, DEF_XMPP_CONNECTION_SASL.toString()); } if (configuration.get(XMPP_CONNECTION_SECURITY) == null) { configuration.put(XMPP_CONNECTION_SECURITY, DEF_XMPP_CONNECTION_SECURITY); } } private void validate() { List<String> missingProperties = new ArrayList<String>(); if (configuration.get(MEDIA_STORAGE_ROOT_PROPERTY) == null) { missingProperties.add(MEDIA_STORAGE_ROOT_PROPERTY); } if (configuration.get(JDBC_DB_URL_PROPERTY) == null) { missingProperties.add(JDBC_DB_URL_PROPERTY); } if (configuration.get(XMPP_COMPONENT_HOST) == null) { missingProperties.add(XMPP_COMPONENT_HOST); } if (configuration.get(XMPP_COMPONENT_PORT) == null) { missingProperties.add(XMPP_COMPONENT_PORT); } if (configuration.get(XMPP_COMPONENT_SUBDOMAIN) == null) { missingProperties.add(XMPP_COMPONENT_SUBDOMAIN); } if (configuration.get(XMPP_COMPONENT_SERVERNAME) == null) { if (configuration.get(XMPP_COMPONENT_SUBDOMAIN) == null) { missingProperties.add(XMPP_COMPONENT_SERVERNAME); } else { String subdomain = configuration.get(XMPP_COMPONENT_SUBDOMAIN).toString(); int pos = subdomain.indexOf("."); if (pos < 0) { missingProperties.add(XMPP_COMPONENT_SERVERNAME); } else { configuration.put(XMPP_COMPONENT_SUBDOMAIN, subdomain.substring(0, pos)); configuration.put(XMPP_COMPONENT_SERVERNAME, subdomain.substring(pos + 1)); } } } if (configuration.get(XMPP_COMPONENT_SECRETKEY) == null) { missingProperties.add(XMPP_COMPONENT_SECRETKEY); } if (configuration.get(XMPP_CONNECTION_USERNAME) == null) { missingProperties.add(XMPP_CONNECTION_USERNAME); } if (configuration.get(XMPP_CONNECTION_PASSWORD) == null) { missingProperties.add(XMPP_CONNECTION_PASSWORD); } if (configuration.get(XMPP_COMPONENT_HOST) == null) { missingProperties.add(XMPP_COMPONENT_HOST); } if (configuration.get(XMPP_CONNECTION_PORT) == null) { missingProperties.add(XMPP_CONNECTION_PORT); } if (configuration.get(XMPP_CONNECTION_SERVICENAME) == null) { missingProperties.add(XMPP_CONNECTION_SERVICENAME); } if (missingProperties.size() > 0) { throw new LoadConfigurationException("Media Server configuration could not be loaded. " + "The following mandatory properties are missing: " + missingProperties); } } }