/* * This file is part of anycook. The new internet cookbook * Copyright (C) 2014 Jan Graßegger * * 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 3 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, see [http://www.gnu.org/licenses/]. */ package de.anycook.conf; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.xml.bind.annotation.XmlElement; /** * Loads app properties. For further information about the property options * see https://github.com/anycook/anycook-core/wiki/Configuration-File */ public class Configuration { private static final Logger logger = LogManager.getLogger(Configuration.class); private static final String PROPERTIES = "anycook.properties", ADMIN_MAIL = "ADMIN_MAIL", ADMIN_PASSWORD = "ADMIN_PASSWORD", AWS_ACCESS_KEY = "AWS_ACCESS_KEY", AWS_ACCESS_SECRET = "AWS_ACCESS_SECRET", COOKIE_DOMAIN = "COOKIE_DOMAIN", DEVELOPMENT_MODE = "DEVELOPMENT_MODE", DYNAMO_DB_DRAFTS = "DYNAMO_DB_DRAFTS", DYNAMO_DB_ACCESS_KEY = "DYNAMO_DB_ACCESS_KEY", DYNAMO_DB_ACCESS_SECRET = "DYNAMO_DB_ACCESS_SECRET", FACEBOOK_APP_ID = "FACEBOOK_APP_ID", FACEBOOK_APP_SECRET = "FACEBOOK_APP_SECRET", FULL_TEXT_INDEX_PATH = "FULL_TEXT_INDEX_PATH", IMAGE_ROOT = "IMAGE_ROOT", IMAGE_BASE_PATH = "IMAGE_BASE_PATH", IMAGE_S3_UPLOAD = "IMAGE_S3_UPLOAD", IMAGE_S3_ACCESS_KEY = "IMAGE_S3_ACCESS_KEY", IMAGE_S3_ACCESS_SECRET = "IMAGE_S3_ACCESS_SECRET", IMAGE_S3_BUCKET = "IMAGE_S3_BUCKET", LOGIN_ATTEMPTS_MAX = "LOGIN_ATTEMPTS_MAX", LOGIN_ATTEMPTS_TIME = "LOGIN_ATTEMPTS_TIME", MAIL_ADDRESS = "MAIL_ADDRESS", MAIL_SENDER = "MAIL_SENDER", MYSQL_ADDRESS = "MYSQL_ADDRESS", MYSQL_DB = "MYSQL_DB", MYSQL_MAX_ACTIVE = "MYSQL_MAX_ACTIVE", MYSQL_MAX_IDLE = "MYSQL_MAX_IDLE", MYSQL_PORT = "MYSQL_PORT", MYSQL_USER = "MYSQL_USER", MYSQL_PASSWORD = "MYSQL_PASSWORD", REDIRECT_DOMAIN = "REDIRECT_DOMAIN", SMTP_HOST = "SMTP_HOST", SMTP_PORT = "SMTP_PORT", SMTP_USER = "SMTP_USER", SMTP_PASSWORD = "SMTP_PASSWORD", TUMBLR_APP_ID = "TUMBLR_APP_ID", TUMBLR_APP_SECRET = "TUMBLR_APP_SECRET", SITEMAP_ROOT = "SITEMAP_ROOT"; private static Configuration instance; public static Configuration getInstance() { if(instance == null) instance = new Configuration(); return instance; } private Properties properties; public Configuration() { properties = initProperties(); } /** * Loads property file anycook-api.properties and returns parsed properties. * At first it searches for global properties at /etc/anycook/ * Afterwards it looks into the classpath. * * @throws Error If no conf file has been found or failed to parse the file */ public Properties initProperties() { Properties p = new Properties(); File globalConf = new File("/etc/anycook", PROPERTIES); InputStream in = null; if (globalConf.exists()) { logger.info("loading global properties"); try { in = new FileInputStream(globalConf); } catch (FileNotFoundException e) { //nope. checked it before! } } else { logger.info("loading properties from classpath"); ClassLoader cl = Configuration.class.getClassLoader(); in = cl.getResourceAsStream(PROPERTIES); } if (in == null) logger.error("failed to load property file"); else { try { p.load(in); in.close(); } catch (IOException e) { logger.error(e,e); } } return p; } @XmlElement public boolean isDeveloperMode() { String developmentMode = properties.getProperty(DEVELOPMENT_MODE, "OFF"); return developmentMode.equals("ON"); } @XmlElement public String getAdminMail() { return properties.getProperty(ADMIN_MAIL, "admin@anycook.de"); } public String getAdminPassword() { return properties.getProperty(ADMIN_PASSWORD); } @XmlElement public String getAwsAccessKey() { return properties.getProperty(AWS_ACCESS_KEY); } public String getAwsAccessSecret() { return properties.getProperty(AWS_ACCESS_SECRET); } @XmlElement public String getCookieDomain() { return properties.getProperty(COOKIE_DOMAIN, ".anycook.de"); } @XmlElement public boolean isDynamoDbDrafts() { return properties.getProperty(DYNAMO_DB_DRAFTS, "OFF").equals("ON"); } @XmlElement public String getDynamoDbAccessKey() { return properties.getProperty(DYNAMO_DB_ACCESS_KEY, getAwsAccessKey()); } public String getDynamoDbAccessSecret() { return properties.getProperty(DYNAMO_DB_ACCESS_SECRET, getAwsAccessSecret()); } @XmlElement public String getFacebookAppId() { return properties.getProperty(FACEBOOK_APP_ID); } public String getFacebookAppSecret() { return properties.getProperty(FACEBOOK_APP_SECRET); } @XmlElement public String getFullTextIndexPath(){ return properties.getProperty(FULL_TEXT_INDEX_PATH, "/tmp/full_text_index"); } @XmlElement public String getImageRoot() { return properties.getProperty(IMAGE_ROOT); } @XmlElement public String getImageBasePath() { String path = properties.getProperty(IMAGE_BASE_PATH, "/images/"); if(!path.endsWith("/")) path += '/'; return path; } @XmlElement public boolean isImageS3Upload(){ String uploadToS3 = properties.getProperty(IMAGE_S3_UPLOAD, "OFF"); return uploadToS3.equals("ON"); } @XmlElement public String getImageS3AccessKey() { return properties.getProperty(IMAGE_S3_ACCESS_KEY, getAwsAccessKey()); } public String getImageS3AccessSecret() { return properties.getProperty(IMAGE_S3_ACCESS_SECRET, getAwsAccessSecret()); } @XmlElement public String getImageS3Bucket() { return properties.getProperty(IMAGE_S3_BUCKET, "images.anycook.de"); } @XmlElement public int getLoginAttemptsMax() { return Integer.parseInt(properties.getProperty(LOGIN_ATTEMPTS_MAX, "5")); } @XmlElement public int getLoginAttemptsTime() { return Integer.parseInt(properties.getProperty(LOGIN_ATTEMPTS_TIME, "600")); } @XmlElement public String getMailAddress() { return properties.getProperty(MAIL_ADDRESS, "no-reply@anycook.de"); } @XmlElement public String getMailSender() { return properties.getProperty(MAIL_SENDER, "anycook"); } @XmlElement public String getMysqlAddress() { return properties.getProperty(MYSQL_ADDRESS, "localhost"); } @XmlElement public int getMysqlMaxActive() { return Integer.parseInt(properties.getProperty(MYSQL_MAX_ACTIVE, "24")); } @XmlElement public int getMysqlMaxIdle() { return Integer.parseInt(properties.getProperty(MYSQL_MAX_IDLE, "24")); } @XmlElement public String getMysqlDb() { return properties.getProperty(MYSQL_DB, "anycook_db"); } @XmlElement public int getPropertyMysqlPort() { return Integer.parseInt(properties.getProperty(MYSQL_PORT, "3306")); } @XmlElement public String getMysqlUser() { return properties.getProperty(MYSQL_USER, "anycook"); } public String getMysqlPassword() { return properties.getProperty(MYSQL_PASSWORD, ""); } @XmlElement public String getRedirectDomain() { return properties.getProperty(REDIRECT_DOMAIN, "anycook.de"); } @XmlElement public String getSMTPHost() { return properties.getProperty(SMTP_HOST); } @XmlElement public String getSMTPPort() { return properties.getProperty(SMTP_PORT, "465"); } @XmlElement public String getSMTPUser() { return properties.getProperty(SMTP_USER); } public String getSMTPPassword() { return properties.getProperty(SMTP_PASSWORD); } @XmlElement public String getTumblrAppId() { return properties.getProperty(TUMBLR_APP_ID); } public String getTumblrAppSecret() { return properties.getProperty(TUMBLR_APP_SECRET); } @XmlElement public String getSitemapRoot() { return properties.getProperty(SITEMAP_ROOT, "/var/www/anycook-sitemaps"); } }