/**
* personium.io
* Copyright 2014 FUJITSU LIMITED
*
* 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.fujitsu.dc.core;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Map;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 設定情報を保持するクラス. このクラスからクラスパス上にある dc-config.propertiesの内容にアクセスできます。
*/
public class DcCoreConfig {
private static final int DEFAULT_BATCH_TIMEOUT = 270000;
private static final int DEFAULT_BATCH_SLEEP_INTERVAL = 1000;
private static final int DEFAULT_BATCH_SLEEP = 50;
/**
* dc-config.propertiesの設定ファイルパスキー.
*/
static final String KEY_CONFIG_FILE = "io.personium.configurationFile";
/**
* 本アプリで使うプロパティキーのプレフィクス.
*/
static final String KEY_ROOT = "io.personium.core.";
/**
* Core version設定のキー.
*/
public static final String CORE_VERSION = KEY_ROOT + "version";
/**
* マスタートークン設定のキー.
*/
public static final String MASTER_TOKEN = KEY_ROOT + "masterToken";
/**
* ユニットユーザトークン発行者として認定するホスト名.
*/
public static final String UNIT_USER_ISSUERS = KEY_ROOT + "unitUser.issuers";
/**
* ユニットのスキーム設定キー.
*/
public static final String UNIT_SCHEME = KEY_ROOT + "unitScheme";
/**
* ステータス取得用のリクエストURL.
*/
public static final String STATUS_REQUEST_URL = KEY_ROOT + "status.requestProxyUrl";
/**
* OData廻りの設定.
*/
public static final class OData {
/**
* $batch処理を行う際の処理単位のサイズ(件数).
*/
public static final String BATCH_BULK_SIZE = KEY_ROOT + "odata.batch.bulkSize";
/**
* $batch処理を行う際の処理単位間のSleepミリ秒.
*/
public static final String BATCH_BULK_INTERVAL = KEY_ROOT + "odata.batch.bulkInterval";
/**
* $batch処理を行う際のリクエスト最大件数.
*/
public static final String BATCH_BULK_REQUEST_MAX_SIZE = KEY_ROOT + "odata.batch.bulkRequestMaxSize";
/**
* $batch処理のタイムアウト時間.
*/
public static final String BATCH_REQUEST_TIMEOUT_IN_MILLIS = KEY_ROOT + "odata.batch.timeoutInMillis";
/**
* $batch処理のスリープ時間.
*/
public static final String BATCH_SLEEP_IN_MILLIS = KEY_ROOT + "odata.batch.sleepInMillis";
/**
* $batch処理のスリープ間隔.
*/
public static final String BATCH_SLEEP_INTERVAL_IN_MILLIS = KEY_ROOT + "odata.batch.sleepIntervalInMillis";
/**
* リクエストボディのプロパティの最大要素数.
*/
public static final String PROPERTY_MAX_NUM = KEY_ROOT + "odata.property.maxnum";
/**
* N:Nの$linksが作成可能な最大件数.
*/
public static final String NN_LINKS_MAX_NUM = KEY_ROOT + "odata.links.NtoN.maxnum";
/**
* $expand指定時の$top最大数.
*/
public static final String EXPAND_TOP_MAXNUM = KEY_ROOT + "odata.query.expand.top.maxnum";
/**
* $expandの最大展開数(一覧取得時).
*/
public static final String EXPAND_LIST_MAXNUM = KEY_ROOT + "odata.expand.list.maxnum";
/**
* $expandの最大展開数(一件取得時).
*/
public static final String EXPAND_RETRIEVE_MAXNUM = KEY_ROOT + "odata.expand.retrieve.maxnum";
/**
* $topの最大値数.
*/
public static final String TOP_MAX_NUM = KEY_ROOT + "odata.query.top.maxnum";
/**
* $skipの最大値数.
*/
public static final String SKIP_MAX_NUM = KEY_ROOT + "odata.query.skip.maxnum";
/**
* 一覧取得時のデフォルト返却件数.
*/
public static final String TOP_DEFAULT_NUM = KEY_ROOT + "odata.query.top.defaultnum";
/**
* $expandのプロパティの最大値数(一覧取得時).
*/
public static final String EXPAND_PROPERTY_MAX_NUM_LIST = KEY_ROOT + "odata.query.expand.property.maxnum.list";
/**
* $expandのプロパティの最大値数(一件取得時).
*/
public static final String EXPAND_PROPERTY_MAX_NUM_RETRIEVE = KEY_ROOT
+ "odata.query.expand.property.maxnum.retrieve";
/**
* $orderbyのソート順を変更するための設定値.
*/
public static final String ORDERBY_SORT_ORDER = KEY_ROOT
+ "odata.query.orderby.sort.order";
}
/**
* Account廻りの設定.
*/
public static final class Account {
/**
* パスワード認証成功時に、Accountの最終ログイン時刻を更新するか否か(true:更新する(デフォルト) false:更新しない).
*/
public static final String ACCOUNT_LAST_AUTHENTICATED_ENABLED = KEY_ROOT + "account.lastauthenticated.enabled";
}
/**
* Dav廻りの設定.
*/
public static final class Dav {
/**
* コレクションの子要素の最大数.
*/
public static final String COLLECTION_CHILDRESOURCE_MAX_NUM = KEY_ROOT + "dav.childresource.maxnum";
/**
* コレクションの階層の深さの最大数.
*/
public static final String COLLECTION_DEPTH_MAX_NUM = KEY_ROOT + "dav.depth.maxnum";
}
/**
* Security廻りの設定.
*/
public static final class Security {
/**
* トークンを暗号化する際に利用している秘密鍵.
*/
public static final String TOKEN_SECRET_KEY = KEY_ROOT + "security.sercret16";
/**
* トークンを暗号化する際に利用している秘密鍵.
*/
public static final String AUTH_PASSWORD_SALT = KEY_ROOT + "security.auth.password.salt";
}
/**
* Lockの設定.
*/
public static final class Lock {
/**
* Lockのタイプ.
* 許容値: memcached
*/
public static final String TYPE = KEY_ROOT + "lock.type";
/**
* アカウントロックの有効期限(s).
*/
public static final String ACCOUNTLOCK_LIFETIME = KEY_ROOT + "lock.accountlock.time";
/**
* ロック取得時のリトライ回数.
*/
public static final String RETRY_TIMES = KEY_ROOT + "lock.retry.times";
/**
* ロック取得リトライ時の間隔.
*/
public static final String RETRY_INTERVAL = KEY_ROOT + "lock.retry.interval";
/**
* セルロック取得時のリトライ回数.
*/
public static final String CELL_RETRY_TIMES = KEY_ROOT + "lock.cell.retry.times";
/**
* セルロック取得リトライ時の間隔.
*/
public static final String CELL_RETRY_INTERVAL = KEY_ROOT + "lock.cell.retry.interval";
/**
* ロックをmemcachedに保持する際のmemcachedホスト名.
*/
public static final String MEMCACHED_HOST = KEY_ROOT + "lock.memcached.host";
/**
* ロックをmemcachedに保持する際のmemcachedポート番号.
*/
public static final String MEMCACHED_PORT = KEY_ROOT + "lock.memcached.port";
/**
* ロック用memcached operationタイムアウト値(ms).
*/
public static final String MEMCACHED_OPTIMEOUT = KEY_ROOT + "lock.memcached.opTimeout";
}
/**
* Elastic Search 関連の設定.
*/
public static final class ES {
/**
* Elastic Search ホスト設定のプロパティキー.
*/
public static final String HOSTS = KEY_ROOT + "es.hosts";
/**
* Elastic Search クラスタ名設定のプロパティキー.
*/
public static final String CLUSTERNAME = KEY_ROOT + "es.cluster.name";
/**
* Elastic Search を使用する際、DB生成時に用いるDB命名に用いるUNIT名に対応したプレフィクス設定のプロパティキー.
*/
public static final String UNIT_PREFIX = KEY_ROOT + "es.unitPrefix";
/**
* Elastic Search を使用する際、CELL生成時に用いるCellId命名に用いるプレフィクス設定のプロパティキー.
*/
public static final String CELL_CREATION_TARGET = KEY_ROOT + "es.creationTarget.cell";
/**
* Elastic Search の検索結果出力上限設定のプロパティキー.
*/
public static final String TOP_NUM = KEY_ROOT + "es.topnum";
/**
* ルーティングフラグ .
*/
public static final String ROUTING_FLAG = KEY_ROOT + "es.routingFlag";
/**
* エラー発生時のリトライ回数.
*/
public static final String RETRY_TIMES = KEY_ROOT + "es.retryTimes";
/**
* エラー発生時のリトライ間隔.
*/
public static final String RETRY_INTERVAL = KEY_ROOT + "es.retryInterval";
/**
* AuthenticDataStoreの設定.
*/
public static final class ADS {
/**
* AuthenticDataStore jdbc.
*/
public static final String TYPE_JDBC = "jdbc";
static final String ADS_ROOT = KEY_ROOT + "es.ads.";
/**
* AuthenticDataStoreのタイプ.
* 許容値: none/jdbc
*/
public static final String TYPE = ADS_ROOT + "type";
/**
* JDBCドライバクラス名.タイプがdbcpであるときのみ有効.
*/
public static final String JDBC_DRIVER_CLASSNAME = ADS_ROOT + "jdbc.driverClassName";
/**
* JDBC接続先URL.
*/
public static final String JDBC_URL = ADS_ROOT + "jdbc.url";
/**
* JDBC接続ユーザ名.
*/
public static final String JDBC_USER = ADS_ROOT + "jdbc.user";
/**
* JDBC接続パスワード.
*/
public static final String JDBC_PASSWORD = ADS_ROOT + "jdbc.password";
/**
* コネクションプールのInitial Size.
*/
public static final String CP_INITIAL_SIZE = ADS_ROOT + "jdbc.cp.initialSize";
/**
* コネクションプールの Max Active.
*/
public static final String CP_MAX_ACTIVE = ADS_ROOT + "jdbc.cp.maxActive";
/**
* コネクションプールの Max Idle.
*/
public static final String CP_MAX_IDLE = ADS_ROOT + "jdbc.cp.maxIdle";
/**
* コネクションプールのMax Wait.
*/
public static final String CP_MAX_WAIT = ADS_ROOT + "jdbc.cp.maxWait";
/**
* コネクションプールのvalidationQuery.
*/
public static final String CP_VALIDATION_QUERY = ADS_ROOT + "jdbc.cp.validationQuery";
}
}
/**
* BinaryDataの設定.
*/
public static final class BinaryData {
/**
* ファイル削除時に物理削除するかどうかの設定.
* 有効値 boolean(true: 物理削除, false: 論理削除)
*/
public static final String PHYSICAL_DELETE_MODE = KEY_ROOT + "binaryData.physical.delete.mode";
/**
* ファイルへの書き込み時にfsyncを有効にするか否か(true:有効 false:無効(デフォルト)).
*/
public static final String FSYNC_ENABLED = KEY_ROOT + "binaryData.fsync.enabled";
/**
* Davファイルの読み書き時、ハードリンク作成/ファイル名改変時の最大リトライ回数.
*/
public static final String MAX_RETRY_COUNT = KEY_ROOT + "binaryData.dav.retry.count";
/**
* Davファイルの読み書き時、ハードリンク作成/ファイル名改変時のリトライ間隔(msec).
*/
public static final String RETRY_INTERVAL = KEY_ROOT + "binaryData.dav.retry.interval";
}
/**
* Blobの設定.
*/
public static final class BlobStore {
/**
* Elastic Search を使用する際、blobデータを格納する方式設定のプロパティキー.
* 有効値: fs
*/
public static final String TYPE = KEY_ROOT + "blobStore.type";
/**
* Elastic Search を使用する際、blobデータを格納するルート(URL, PATH)設定のプロパティキー.
*/
public static final String ROOT = KEY_ROOT + "blobStore.root";
}
/**
* ユーザデータ内のプロパティの数、階層の制限設定.
*/
public static final class UserDataProperties {
/**
* EntityTypeの最大数制限.
*/
public static final String MAX_ENTITY_TYPES = KEY_ROOT + "box.odata.schema.MaxEntityTypes";
/**
* EntityTypeに含まれるプロパティの最大数.
*/
public static final String MAX_PROPERTY_COUNT_IN_ENTITY = KEY_ROOT + "box.odata.schema.MaxProperties";
/**
* 各階層のSimpleTypeの制限数 (e.g. 400,100,20,0).
*/
public static final String SIMPLE_TYPE_PROPERTY_LIMITS =
KEY_ROOT + "box.odata.schema.property.LayerLimits.SimpleType";
/**
* 各階層のComplexTypeの制限数 (e.g. 20,20,50,0).
*/
public static final String COMPLEX_TYPE_PROPERTY_LIMITS =
KEY_ROOT + "box.odata.schema.property.LayerLimits.ComplexType";
}
/**
* イベントの設定.
*/
public static final class Event {
/**
* 最新のイベントログファイルの格納ディレクトリ.
*/
public static final String EVENT_LOG_CURRENT_DIR = KEY_ROOT + "event.log.current.dir";
}
/**
* Cache廻りの設定.
*/
public static final class Cache {
/**
* Cacheのタイプ.
* 許容値: none/memcached
*/
public static final String TYPE = KEY_ROOT + "cache.type";
/**
* セルのキャッシュを有効とするか否か.
* 許容値: true/false
*/
public static final String CELL_CACHE_ENABLED = KEY_ROOT + "cache.cell.enabled";
/**
* ボックスのキャッシュを有効とするか否か.
* 許容値: true/false
*/
public static final String BOX_CACHE_ENABLED = KEY_ROOT + "cache.box.enabled";
/**
* スキーマのキャッシュを有効とするか否か.
* 許容値: true/false
*/
public static final String SCHEMA_CACHE_ENABLED = KEY_ROOT + "cache.schema.enabled";
/**
* memcachedホスト名.
*/
public static final String MEMCACHED_HOST = KEY_ROOT + "cache.memcached.host";
/**
* memcachedポート番号.
*/
public static final String MEMCACHED_PORT = KEY_ROOT + "cache.memcached.port";
/**
* memcached operationタイムアウト値(ms).
*/
public static final String MEMCACHED_OPTIMEOUT = KEY_ROOT + "cache.memcached.opTimeout";
/**
* キャッシュ有効期限.
*/
public static final String MEMCACHED_EXPIRES_IN = KEY_ROOT + "cache.memcached.expiresin";
}
/**
* Engine廻りの設定.
*/
public static final class Engine {
/**
* Engineの有効化.
* 許容値: true/false
*/
public static final String ENABLED = KEY_ROOT + "engine.enabled";
/**
* EngineのHostキー.
*/
public static final String HOST = KEY_ROOT + "engine.host";
/**
* EngineのPortキー.
*/
public static final String PORT = KEY_ROOT + "engine.port";
/**
* EngineのPathキー.
*/
public static final String PATH = KEY_ROOT + "engine.path";
}
/**
* X509廻りの設定.
*/
public static final class X509 {
/**
* X509ルート証明書を配置したパス設定のプロパティキー.
*/
public static final String ROOT_CRT = KEY_ROOT + "x509.root";
/**
* X509証明書を配置したパス設定のプロパティキー.
*/
public static final String CRT = KEY_ROOT + "x509.crt";
/**
* X509秘密鍵を配置したパス設定のプロパティキー.
*/
public static final String KEY = KEY_ROOT + "x509.key";
}
/**
* CouchDB関連の設定.
*/
public static final class COUCHDB {
/**
* CouchDBホスト設定のプロパティキー.
*/
public static final String HOST = KEY_ROOT + "couchdb.host";
/**
* CouchDBポート設定のプロパティキー.
*/
public static final String PORT = KEY_ROOT + "couchdb.port";
/**
* CouchDBを使用する際、DB生成時に用いるDB命名に用いるUNIT名に対応したプレフィクス設定のプロパティキー.
*/
public static final String UNIT_PREFIX = KEY_ROOT + "couchdb.unitPrefix";
/**
* CouchDBを使用する際、CELL生成時に用いるCellId命名に用いるプレフィクス設定のプロパティキー.
*/
public static final String CELL_CREATION_TARGET = KEY_ROOT + "couchdb.creationTarget.cell";
/**
* CouchDBを使用する際、Box生成時に用いるbox内部id命名に用いるプレフィクス設定のプロパティキー.
*/
public static final String BOX_CREATION_TARGET = KEY_ROOT + "couchdb.creationTarget.box";
}
/**
* bar file export/install関連の設定.
*/
public static final class BAR {
/**
* barファイルの最大ファイルサイズ(MB)のプロパティキー.
*/
public static final String BAR_FILE_MAX_SIZE = KEY_ROOT + "bar.file.maxSize";
/**
* barファイル内エントリの最大ファイルサイズ(MB)のプロパティキー.
*/
public static final String BAR_ENTRY_MAX_SIZE = KEY_ROOT + "bar.entry.maxSize";
/**
* ユーザデータのリンク処理時にレスポンスを返却するサイズのプロパティキー.
*/
public static final String BAR_USERDATA_LINKS_OUTPUT_STREAM_SIZE = KEY_ROOT
+ "bar.userdata.linksOutputStreamSize";
/**
* ユーザデータの一括登録件数のプロパティキー.
*/
public static final String BAR_USERDATA_BULK_SIZE = KEY_ROOT + "bar.userdata.bulkSize";
/**
* barファイルやログ詳細の格納用ルートディレクトリ.
*/
public static final String BAR_INSTALLFILE_DIR = KEY_ROOT + "bar.installfile.dir";
/**
* memcachedに格納するbarインストール処理状況の有効期限(秒).
*/
public static final String BAR_PROGRESS_EXPIRE_IN_SEC = KEY_ROOT + "bar.progress.expireInSec";
}
/**
* Ads Repair処理スケジューラー周りの設定.
*/
public static final class AdsRepair {
/**
* Repair処理が最初に起動するまでの遅延時間.
*/
public static final String REPAIR_SERVICE_INITIAL_DELAY_IN_SEC = KEY_ROOT + "es.ads.repair.initialDelayInSec";
static final long DEFAULT_REPAIR_SERVICE_INITIAL_DELAY_IN_SEC = 120L;
/**
* Repair処理間の実行間隔.
*/
public static final String REPAIR_SERVICE_DELAY_INTERVAL_IN_SEC = KEY_ROOT + "es.ads.repair.intervalInSec";
static final long DEFAULT_REPAIR_SERVICE_DELAY_INTERVAL_IN_SEC = 60L;
/**
* shutdown時、実行中タスクの完了待ち時間.
*/
public static final String REPAIR_SERVICE_AWAIT_SHUTDOWN_IN_SEC = KEY_ROOT + "es.ads.repair.awaitShutdownInSec";
static final long DEFAULT_REPAIR_SERVICE_AWAIT_SHUTDOWN_IN_SEC = 600L;
/**
* RepairAdsを起動するか否かを示すファイルのパス. ファイルが存在する場合のみ、RepairAdsが起動する。
*/
public static final String REPAIR_ADS_INVOCATION_FILE_PATH = KEY_ROOT + "es.ads.repair.invocationFlagFile";
static final String DEFAULT_REPAIR_ADS_INVOCATION_FILE_PATH = "/personium/dc-core/invokeRepair";
}
/**
* Ads失敗ログ用の設定.
*/
public static final class AdsFailureLog {
/**
* Ads失敗ログの出力先ディレクトリ.
*/
public static final String LOG_DIR = KEY_ROOT + "es.ads.log.dir";
/**
* Ads失敗ログを物理削除するかどうかのフラグ (true: 物理削除, false: 論理削除) .
*/
public static final String PHYSICAL_DELETE = KEY_ROOT + "es.ads.physical.delete";
/**
* AuthenticDataStoreへのデータ補正時に使用するログの読み込み行数.
*/
public static final String COUNT_ITERATION = KEY_ROOT + "es.ads.log.count.iteration";
}
/**
* OpenID Connect用の設定.
*/
public static final class OIDC {
/**
* Google OpenID Connectにおいて、このユニットが信頼するClientIDを指定するためのキー.
*/
public static final String OIDC_GOOGLE_TRUSTED_CLIENTIDS = KEY_ROOT + "oidc.google.trustedClientIds";
/**
* 引数のGoogleClientIDがこのユニットが信頼するリストに含まれるかどうか判定する.
* @param clientId ClientID
* @return boolean 含まれる場合:True
*/
public static boolean isGoogleClientIdTrusted(String clientId) {
String val = get(OIDC_GOOGLE_TRUSTED_CLIENTIDS);
//アスタリスクが指定されていたら無条件にtrue
return isAstarisk(val) || isSpaceSeparatedValueIncluded(val, clientId);
}
}
static {
// 各種メッセージ出力クラスを強制的にロードする
DcCoreLog.loadConfig();
DcCoreException.loadConfig();
DcCoreAuthnException.loadConfig();
}
/**
* singleton.
*/
private static DcCoreConfig singleton = new DcCoreConfig();
// static Logger log = LoggerFactory.getLogger(DcCoreConfig.class);
/**
* 設定値を格納するプロパティ実体.
*/
private final Properties props = new Properties();
/**
* オーバーライドする設定値を格納するプロパティ実体.
*/
private final Properties propsOverride = new Properties();
/**
* protectedなコンストラクタ.
*/
protected DcCoreConfig() {
this.doReload();
}
/**
* 設定のリロード.
*/
private synchronized void doReload() {
Logger log = LoggerFactory.getLogger(DcCoreConfig.class);
Properties properties = getDcConfigDefaultProperties();
Properties propertiesOverride = getDcConfigProperties();
// 読み込みに成功した場合、メンバ変数へ置換する
if (!properties.isEmpty()) {
this.props.clear();
for (Map.Entry<Object, Object> entry : properties.entrySet()) {
if (!(entry.getKey() instanceof String)) {
continue;
}
this.props.setProperty((String) entry.getKey(), (String) entry.getValue());
}
}
if (!propertiesOverride.isEmpty()) {
this.propsOverride.clear();
for (Map.Entry<Object, Object> entry : propertiesOverride.entrySet()) {
if (!(entry.getKey() instanceof String)) {
continue;
}
this.propsOverride.setProperty((String) entry.getKey(), (String) entry.getValue());
}
}
for (Object keyObj : propsOverride.keySet()) {
String key = (String) keyObj;
String value = this.propsOverride.getProperty(key);
if (value == null) {
continue;
}
log.debug("Overriding Config " + key + "=" + value);
this.props.setProperty(key, value);
}
}
private static boolean isSpaceSeparatedValueIncluded(String spaceSeparatedValue, String testValue) {
if (testValue == null || spaceSeparatedValue == null) {
return false;
}
String[] values = spaceSeparatedValue.split(" ");
for (String val : values) {
if (testValue.equals(val)) {
return true;
}
}
return false;
}
private static boolean isAstarisk(String val) {
if (val == null) {
return false;
} else if ("*".equals(val)) {
return true;
}
return false;
}
/**
* dc-config-default.propertiesファイルを読み込む.
* @return dc-config-default.properties
*/
protected Properties getDcConfigDefaultProperties() {
Properties properties = new Properties();
InputStream is = DcCoreConfig.class.getClassLoader().getResourceAsStream("dc-config-default.properties");
try {
properties.load(is);
} catch (IOException e) {
throw new RuntimeException("failed to load config!", e);
} finally {
try {
is.close();
} catch (IOException e) {
throw new RuntimeException("failed to close config stream", e);
}
}
return properties;
}
/**
* dc-config.propertiesファイルを読み込む.
* @return dc-config.properties
*/
protected Properties getDcConfigProperties() {
Logger log = LoggerFactory.getLogger(DcCoreConfig.class);
Properties propertiesOverride = new Properties();
String configFilePath = System.getProperty(KEY_CONFIG_FILE);
InputStream is = getConfigFileInputStream(configFilePath);
try {
if (is != null) {
propertiesOverride.load(is);
} else {
log.debug("[dc-config.properties] file not found on the classpath. using default config.");
}
} catch (IOException e) {
log.debug("IO Exception when loading [dc-config.properties] file.");
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
log.debug("IO Exception when closing [dc-config.properties] file.");
}
}
return propertiesOverride;
}
/**
* dc-config.propertiesをInputStream形式で取得する.
* @param configFilePath 設定ファイルパス
* @return dc-config.properties
*/
protected InputStream getConfigFileInputStream(String configFilePath) {
Logger log = LoggerFactory.getLogger(DcCoreConfig.class);
InputStream configFileInputStream = null;
if (configFilePath == null) {
configFileInputStream = DcCoreConfig.class.getClassLoader().getResourceAsStream("dc-config.properties");
return configFileInputStream;
}
try {
// 設定ファイルを指定されたパスから読み込む
File configFile = new File(configFilePath);
configFileInputStream = new FileInputStream(configFile);
log.info("dc-config.properties from system properties.");
} catch (FileNotFoundException e) {
// 指定されたパスにファイルが存在しない場合は、クラスパス上のファイルを読み込む
configFileInputStream = DcCoreConfig.class.getClassLoader().getResourceAsStream("dc-config.properties");
log.info("dc-config.properties from class path.");
}
return configFileInputStream;
}
/**
* 設定値の取得.
* @param key キー
* @return 設定値
*/
private String doGet(final String key) {
return props.getProperty(key);
}
/**
* 設定値の設定.
* @param key キー
* @param value 値
*/
private void doSet(final String key, final String value) {
props.setProperty(key, value);
}
/**
* すべてのプロパティを取得します。
* @return プロパティ一覧オブジェクト
*/
public static Properties getProperties() {
return singleton.props;
}
/**
* Key文字列を指定して設定情報を取得します.
* @param key 設定キー
* @return 設定値
*/
public static String get(final String key) {
return singleton.doGet(key);
}
/**
* Key文字列を指定して設定情報を変更します.
* @param key 設定キー
* @param value 値
*/
public static void set(final String key, final String value) {
singleton.doSet(key, value);
}
/**
* Core Versionの値を取得します.
* @return Core Versionの値
*/
public static String getCoreVersion() {
return get(CORE_VERSION);
}
/**
* ユニットマスタートークンの値を取得します.
* @return マスタートークンの値
*/
public static String getMasterToken() {
return get(MASTER_TOKEN);
}
/**
* @return ユニットユーザトークン発行者として認定するホスト名.
*/
public static String getUnitUserIssuers() {
return get(UNIT_USER_ISSUERS);
}
/**
* @return ユニットのスキーム設定キー.
*/
public static String getUnitScheme() {
return get(UNIT_SCHEME);
}
/**
* @return ステータス取得用のリクエストURL.
*/
public static String getStatusRequestUrl() {
return get(STATUS_REQUEST_URL);
}
/**
* @return $batch処理を行う際の処理単位のサイズ(件数).
*/
public static String getOdataBatchBulkSize() {
return get(OData.BATCH_BULK_SIZE);
}
/**
* @return $batch処理を行う際のリクエスト最大件数.
*/
public static String getOdataBatchBulkRequestMaxSize() {
String cnt = get(OData.BATCH_BULK_REQUEST_MAX_SIZE);
if (cnt == null) {
cnt = "1000";
}
return cnt;
}
/**
* @return $batch処理のタイムアウト時間(ミリ秒)
*/
public static long getOdataBatchRequestTimeoutInMillis() {
String mSecInStr = get(OData.BATCH_REQUEST_TIMEOUT_IN_MILLIS);
if (null != mSecInStr && !mSecInStr.isEmpty()) {
return Long.parseLong(mSecInStr);
}
return DEFAULT_BATCH_TIMEOUT;
}
/**
* @return $batch処理のスリープ時間(ミリ秒)
*/
public static long getOdataBatchSleepInMillis() {
String mSecInStr = get(OData.BATCH_SLEEP_IN_MILLIS);
if (null != mSecInStr && !mSecInStr.isEmpty()) {
return Long.parseLong(mSecInStr);
}
return DEFAULT_BATCH_SLEEP;
}
/**
* @return $batch処理のスリープ間隔(ミリ秒)
*/
public static long getOdataBatchSleepIntervalInMillis() {
String mSecInStr = get(OData.BATCH_SLEEP_INTERVAL_IN_MILLIS);
if (null != mSecInStr && !mSecInStr.isEmpty()) {
return Long.parseLong(mSecInStr);
}
return DEFAULT_BATCH_SLEEP_INTERVAL;
}
/**
* @return $batch処理を行う際の処理単位間のSleepミリ秒.
*/
public static String getOdataBatchBulkInterval() {
return get(OData.BATCH_BULK_INTERVAL);
}
/**
* コレクションの子要素の最大制限数を取得.
* @return コレクションの子要素の最大数
*/
public static int getMaxChildResourceCount() {
return Integer.parseInt(get(Dav.COLLECTION_CHILDRESOURCE_MAX_NUM));
}
/**
* コレクションの階層の最大制限数を取得.
* @return コレクションの階層の最大数
*/
public static int getMaxCollectionDepth() {
return Integer.parseInt(get(Dav.COLLECTION_DEPTH_MAX_NUM));
}
/**
* ファイル書き込み時にfsyncが有効であるか否かを返す.
* @return 有効である場合はtrue
*/
public static boolean getFsyncEnabled() {
return Boolean.parseBoolean(get(BinaryData.FSYNC_ENABLED));
}
/**
* @return N:Nの$linksが作成可能な最大件数を取得.
*/
public static int getLinksNtoNMaxSize() {
return Integer.parseInt(get(OData.NN_LINKS_MAX_NUM));
}
/**
* @return $expand指定時の$top最大数.
*/
public static int getTopQueryMaxSizeWithExpand() {
return Integer.parseInt(get(OData.EXPAND_TOP_MAXNUM));
}
/**
* @return $expandの最大展開数(一覧取得時).
*/
public static int getMaxExpandSizeForList() {
return Integer.parseInt(get(OData.EXPAND_LIST_MAXNUM));
}
/**
* @return $expandの最大展開数(一件取得時).
*/
public static int getMaxExpandSizeForRetrive() {
return Integer.parseInt(get(OData.EXPAND_RETRIEVE_MAXNUM));
}
/**
* @return $topに指定可能な最大値.
*/
public static int getTopQueryMaxSize() {
return Integer.parseInt(get(OData.TOP_MAX_NUM));
}
/**
* @return $skipに指定可能な最大値.
*/
public static int getSkipQueryMaxSize() {
return Integer.parseInt(get(OData.SKIP_MAX_NUM));
}
/**
* @return 一覧取得時のデフォルト返却件数.
*/
public static int getTopQueryDefaultSize() {
return Integer.parseInt(get(OData.TOP_DEFAULT_NUM));
}
/**
* @return $expandのプロパティの最大値数(一覧取得時).
*/
public static int getExpandPropertyMaxSizeForList() {
return Integer.parseInt(get(OData.EXPAND_PROPERTY_MAX_NUM_LIST));
}
/**
* @return $expandのプロパティの最大値数(一件取得時).
*/
public static int getExpandPropertyMaxSizeForRetrieve() {
return Integer.parseInt(get(OData.EXPAND_PROPERTY_MAX_NUM_RETRIEVE));
}
/**
* @return $orderbyのソート順を変更するための設定値.
*/
public static boolean getOrderbySortOrder() {
return Boolean.parseBoolean(get(OData.ORDERBY_SORT_ORDER));
}
/**
* @return Lockのタイプ.
*/
public static String getLockType() {
return get(Lock.TYPE);
}
/**
* @return アカウントロックの有効期限(s).
*/
public static String getAccountLockLifetime() {
return get(Lock.ACCOUNTLOCK_LIFETIME);
}
/**
* @return ロック取得時のリトライ回数.
*/
public static String getLockRetryTimes() {
return get(Lock.RETRY_TIMES);
}
/**
* @return ロック取得リトライ時の間隔.
*/
public static String getLockRetryInterval() {
return get(Lock.RETRY_INTERVAL);
}
/**
* @return セルロック取得時のリトライ回数.
*/
public static String getCellLockRetryTimes() {
return get(Lock.CELL_RETRY_TIMES);
}
/**
* @return セルロック取得リトライ時の間隔.
*/
public static String getCellLockRetryInterval() {
return get(Lock.CELL_RETRY_INTERVAL);
}
/**
* @return ロックをmemcachedに保持する際のmemcachedホスト名.
*/
public static String getLockMemcachedHost() {
return get(Lock.MEMCACHED_HOST);
}
/**
* @return ロックをmemcachedに保持する際のmemcachedポート番号.
*/
public static String getLockMemcachedPort() {
return get(Lock.MEMCACHED_PORT);
}
/**
* @return ロック用memcached operationタイムアウト値(ms).
*/
public static long getLockMemcachedOpTimeout() {
return Long.parseLong(get(Lock.MEMCACHED_OPTIMEOUT));
}
/**
* @return 最新のイベントログファイルの格納ディレクトリ.
*/
public static String getEventLogCurrentDir() {
return get(Event.EVENT_LOG_CURRENT_DIR);
}
/**
* ElasticSearchのホスト名の設定値を取得します.
* @return 設定値
*/
public static String getEsHosts() {
return get(ES.HOSTS);
}
/**
* ElasticSearchのクラスタ名の設定値を取得します.
* @return 設定値
*/
public static String getEsClusterName() {
return get(ES.CLUSTERNAME);
}
/**
* 本アプリが担当するUnitのElasticSearch上のindex名接頭辞を取得します. 例えばu0と設定すると、管理情報indexとしてu0_adwoという名前のものを使います。
* @return 設定値
*/
public static String getEsUnitPrefix() {
return get(ES.UNIT_PREFIX);
}
/**
* @return CELL生成時に用いるCellId命名に用いるプレフィクス.
*/
public static String getEsCellCreationTarget() {
return get(ES.CELL_CREATION_TARGET);
}
/**
* @return Esの検索結果出力上限の設定値を取得します.
*/
public static int getEsTopNum() {
return Integer.parseInt(get(ES.TOP_NUM));
}
/**
* @return blobデータを格納する方式.
*/
public static String getBlobStoreType() {
return get(BlobStore.TYPE);
}
/**
* @return blobデータを格納するルート(URL, PATH).
*/
public static String getBlobStoreRoot() {
return get(BlobStore.ROOT);
}
/**
* バイナリデータ(Dav/Eventlog)削除時に物理削除するかどうかの設定.
* @return true: 物理削除, false: 論理削除
*/
public static boolean getPhysicalDeleteMode() {
return Boolean.parseBoolean(get(BinaryData.PHYSICAL_DELETE_MODE));
}
/**
* Davファイルのハードリンク作成/改名/削除時のリトライ回数.
* @return リトライ回数
*/
public static int getDavFileOperationRetryCount() {
return Integer.parseInt(get(BinaryData.MAX_RETRY_COUNT));
}
/**
* Davファイルのハードリンク作成/改名/削除時のリトライ間隔(msec).
* @return リトライ間隔(msec)
*/
public static long getDavFileOperationRetryInterval() {
return Long.parseLong(get(BinaryData.RETRY_INTERVAL));
}
/**
* @return ES ADS (Elastic Search Authentic Data Store) のタイプ.
*/
public static String getEsAdsType() {
return get(ES.ADS.TYPE);
}
/**
* @return ルーティングフラグ (trueの場合、ルーティング処理を行う).
*/
public static boolean getRoutingFlag() {
return Boolean.parseBoolean(get(ES.ROUTING_FLAG));
}
/**
* @return ESでエラー発生時のリトライ回数.
*/
public static String getESRetryTimes() {
return get(ES.RETRY_TIMES);
}
/**
* @return ESでエラー発生時のリトライ間隔(ミリ秒).
*/
public static String getESRetryInterval() {
return get(ES.RETRY_INTERVAL);
}
/**
* @return barインストールの非同期処理状況の有効期限(s).
*/
public static String getBarInstallProgressLifeTimeExpireInSec() {
return get(BAR.BAR_PROGRESS_EXPIRE_IN_SEC);
}
/**
* @return ES ADSにjdbcを使うときの、DBCP用Property.
*/
public static Properties getEsAdsDbcpProps() {
Properties ret = new Properties();
ret.setProperty("driverClassName", get(ES.ADS.JDBC_DRIVER_CLASSNAME));
ret.setProperty("url", get(ES.ADS.JDBC_URL));
ret.setProperty("username", get(ES.ADS.JDBC_USER));
ret.setProperty("password", get(ES.ADS.JDBC_PASSWORD));
ret.setProperty("initialSize", get(ES.ADS.CP_INITIAL_SIZE));
ret.setProperty("maxActive", get(ES.ADS.CP_MAX_ACTIVE));
ret.setProperty("maxIdle", get(ES.ADS.CP_MAX_IDLE));
ret.setProperty("maxWait", get(ES.ADS.CP_MAX_WAIT));
ret.setProperty("validationQuery", get(ES.ADS.CP_VALIDATION_QUERY));
return ret;
}
/**
* @return Cacheのタイプ.
*/
public static String getCacheType() {
return get(Cache.TYPE);
}
/**
* @return memcachedホスト名.
*/
public static String getCacheMemcachedHost() {
return get(Cache.MEMCACHED_HOST);
}
/**
* @return memcachedポート番号.
*/
public static String getCacheMemcachedPort() {
return get(Cache.MEMCACHED_PORT);
}
/**
* @return cache用memcached operationタイムアウト値(ms).
*/
public static long getCacheMemcachedOpTimeout() {
return Long.parseLong(get(Cache.MEMCACHED_OPTIMEOUT));
}
/**
* Cellのキャッシュが有効か否かを返す.
* @return 有効な場合はtrue.
*/
public static boolean isCellCacheEnabled() {
return Boolean.parseBoolean(get(Cache.CELL_CACHE_ENABLED));
}
/**
* Boxのキャッシュが有効か否かを返す.
* @return 有効な場合はtrue.
*/
public static boolean isBoxCacheEnabled() {
return Boolean.parseBoolean(get(Cache.BOX_CACHE_ENABLED));
}
/**
* スキーマのキャッシュが有効か否かを返す.
* @return 有効な場合はtrue.
*/
public static boolean isSchemaCacheEnabled() {
return Boolean.parseBoolean(get(Cache.SCHEMA_CACHE_ENABLED));
}
/**
* @return memcachedキャッシュ有効期限.
*/
public static int getCacheMemcachedExpiresIn() {
return Integer.parseInt(get(Cache.MEMCACHED_EXPIRES_IN));
}
/**
* Engineが有効かどうかを返却する.
* @return true:Engine有効 / false:Engine無効
*/
public static String getEngineEnabled() {
return get(Engine.ENABLED);
}
/**
* Enineのホスト名設定値を取得します.
* @return 設定値
*/
public static String getEngineHost() {
return get(Engine.HOST);
}
/**
* Enineのportの設定値を取得します.
* @return 設定値
*/
public static String getEnginePort() {
return get(Engine.PORT);
}
/**
* Enineののパスの設定値を取得します.
* @return 設定値
*/
public static String getEnginePath() {
return get(Engine.PATH);
}
/**
* 本UNITのX509秘密鍵ファイルのパスの設定値を取得します.
* @return 設定値
*/
public static String getX509PrivateKey() {
return get(X509.KEY);
}
/**
* 本UNITのX509ルート証明書ファイルのパスの設定値の配列を取得します.
* @return 設定値
*/
public static String[] getX509RootCertificate() {
String[] x509RootCertificate = null;
String value = get(X509.ROOT_CRT);
if (value != null) {
x509RootCertificate = value.split(" ");
}
return x509RootCertificate;
}
/**
* 本UNITのX509証明書ファイルのパスの設定値を取得します.
* @return 設定値
*/
public static String getX509Certificate() {
return get(X509.CRT);
}
/**
* CouchDBホストの設定値を取得します.
* @return 設定値
*/
public static String getCouchDbHost() {
return get(COUCHDB.HOST);
}
/**
* CouchDBポートの設定値を取得します.
* @return 設定値
*/
public static String getCouchDbPort() {
return get(COUCHDB.PORT);
}
/**
* CouchDBを使用する際、DB生成時に用いるDB命名に用いるUNIT名に対応したプレフィクス設定.
* @return 設定値
*/
public static String getCouchDbUnitPrefix() {
return get(COUCHDB.UNIT_PREFIX);
}
/**
* CouchDBを使用する際、CELL生成時に用いるCellId命名に用いるプレフィクス設定.
* @return 設定値
*/
public static String getCouchDbCellCreationTarget() {
return get(COUCHDB.CELL_CREATION_TARGET);
}
/**
* CouchDBを使用する際、Box生成時に用いるbox内部id命名に用いるプレフィクス設定.
* @return 設定値
*/
public static String getCouchDbBoxCreationTarget() {
return get(COUCHDB.BOX_CREATION_TARGET);
}
/**
* トークンを暗号化する際に利用している秘密鍵設定.
* @return 設定値
*/
public static String getTokenSecretKey() {
return get(Security.TOKEN_SECRET_KEY);
}
/**
* 認証時に使用するパスワードのソルト値.
* @return パスワードのソルト値
*/
public static String getAuthPasswordSalt() {
return get(Security.AUTH_PASSWORD_SALT);
}
/**
* Repair処理が最初に起動するまでの遅延時間.
* @return Repair処理が最初に起動するまでの遅延時間.
*/
public static long getAdsRepairInitialDelayInSec() {
String value = get(AdsRepair.REPAIR_SERVICE_INITIAL_DELAY_IN_SEC);
if (null != value && !value.isEmpty()) {
return Long.valueOf(value);
} else {
// Default値.
return AdsRepair.DEFAULT_REPAIR_SERVICE_INITIAL_DELAY_IN_SEC;
}
}
/**
* Repair処理間の実行間隔.
* @return Repair処理間の実行間隔.
*/
public static long getAdsRepairIntervalInSec() {
String value = get(AdsRepair.REPAIR_SERVICE_DELAY_INTERVAL_IN_SEC);
if (null != value && !value.isEmpty()) {
return Long.valueOf(value);
} else {
// Default値.
return AdsRepair.DEFAULT_REPAIR_SERVICE_DELAY_INTERVAL_IN_SEC;
}
}
/**
* RepairAdsを起動するか否かを示すファイルのパス. ファイルが存在する場合のみ、RepairAdsが起動する.
* @return RepairAdsを起動するか否かを示すファイルのパス.
*/
public static String getRepairAdsInvocationFilePath() {
String value = get(AdsRepair.REPAIR_ADS_INVOCATION_FILE_PATH);
if (null != value && !value.isEmpty()) {
return value;
} else {
// Default値.
return AdsRepair.DEFAULT_REPAIR_ADS_INVOCATION_FILE_PATH;
}
}
/**
* shutdown時、実行中タスクの完了待ち時間.
* @return shutdown時、実行中タスクの完了待ち時間.
*/
public static long getAdsRepairAwaitShutdownInSec() {
String value = get(AdsRepair.REPAIR_SERVICE_AWAIT_SHUTDOWN_IN_SEC);
if (null != value && !value.isEmpty()) {
return Long.valueOf(value);
} else {
// Default値.
return AdsRepair.DEFAULT_REPAIR_SERVICE_AWAIT_SHUTDOWN_IN_SEC;
}
}
/**
* 設定情報をリロードします.
*/
public static void reload() {
singleton.doReload();
}
/**
* 実行環境がhttpsかどうかを返却します.
* @return boolean httpsの場合:true
*/
public static boolean isHttps() {
return DcCoreConfig.getUnitScheme().equals("https");
}
/**
* 引数URLがユニットユーザトークン発行者として認定するホスト名に含まれるか判定する.
* @param url URL
* @return boolean 含まれる場合:True
*/
public static boolean checkUnitUserIssuers(String url) {
return isSpaceSeparatedValueIncluded(getUnitUserIssuers(), url);
}
/**
* EntityTypeの最大制限数を取得.
* @return EntityTypeの最大数
*/
public static int getUserdataMaxEntityCount() {
return Integer.parseInt(get(UserDataProperties.MAX_ENTITY_TYPES));
}
/**
* EntityTypeに包含可能なプロパティの最大制限数を取得.
* @return EntityType内の最大プロパティ数
*/
public static int getMaxPropertyCountInEntityType() {
return Integer.parseInt(get(UserDataProperties.MAX_PROPERTY_COUNT_IN_ENTITY));
}
/**
* UsetData内のSimpleTypeの制限数の配列を取得.
* @return 各階層における SimpleTypeの制限数のリスト
*/
public static int[] getUserdataSimpleTypePropertyLimits() {
String expr = get(UserDataProperties.SIMPLE_TYPE_PROPERTY_LIMITS);
return getPropertyLimits(expr, -1);
}
/**
* UsetData内のComplexTypeの制限数の配列を取得.
* @return 各階層における SimpleTypeの制限数のリスト
*/
public static int[] getUserdataComplexTypePropertyLimits() {
int depth = getUserdataSimpleTypePropertyLimits().length;
String expr = get(UserDataProperties.COMPLEX_TYPE_PROPERTY_LIMITS);
return getPropertyLimits(expr, depth);
}
/**
* Ads失敗ログの出力先ディレクトリを取得.
* @return Ads失敗ログの出力先ディレクトリ
*/
public static String getAdsWriteFailureLogDir() {
return get(AdsFailureLog.LOG_DIR);
}
/**
* Ads失敗ログを物理削除するかどうかのフラグ を取得 (true: 物理削除, false: 論理削除) .
* @return Ads失敗ログを物理削除するかどうかのフラグ
*/
public static boolean getAdsWriteFailureLogPhysicalDelete() {
return Boolean.parseBoolean(get(AdsFailureLog.PHYSICAL_DELETE));
}
/**
* Ads書き込み失敗ログの読み込み行数を取得.
* @return Ads書き込み失敗ログの読み込み行数
*/
public static int getAdsWriteFailureLogCountPerIteration() {
return Integer.parseInt(get(AdsFailureLog.COUNT_ITERATION));
}
/**
* パスワード認証成功時に、Accountの最終ログイン時刻を更新するか否か().
* @return true:更新する(デフォルト) false:更新しない
*/
public static boolean getAccountLastAuthenticatedEnable() {
return Boolean.parseBoolean(get(Account.ACCOUNT_LAST_AUTHENTICATED_ENABLED));
}
/**
* カンマ区切りで指定された数値リスト(文字列)を、int型の配列にして返す。
* arrayLengthで指定された長さよりも、数値リストの内容が長い場合は、長い部分は捨てられる。<br/>
* e.g. limitExpression : "1,2,3,4", arrayLength = 2 → int[] { 1, 2 }
* arrayLengthで指定された長さよりも、数値リストの内容が短い場合は、足りない部分が 0詰めされる。<br/>
* e.g. limitExpression : "1,2", arrayLength = 4 → int[] { 1, 2, 0, 0 }
* @param limitExpression カンマ区切りの数値リスト(文字列)
* @param arrayLength 返す配列の長さ。0以下の場合は、limitExpressionから得られる要素数の配列を指定したのと同じとなる。
* @return 整数配列
*/
private static int[] getPropertyLimits(String limitExpression, int arrayLength) {
if (null != limitExpression) {
String[] values = limitExpression.split(",");
if (arrayLength < 1) {
arrayLength = values.length;
}
int[] result = new int[arrayLength];
Arrays.fill(result, 0);
for (int i = 0; i < values.length && i < arrayLength; i++) {
if ("*".equals(values[i])) {
// -1 は無制限を示す数値
result[i] = -1;
} else {
result[i] = Integer.parseInt(values[i]);
// Notice: 数値で無かった場合は、NumberFormatExceptionが投げられる。
}
}
return result;
}
return new int[] {};
}
}