/* * #%L * P6Spy * %% * Copyright (C) 2013 P6Spy * %% * 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. * #L% */ package com.p6spy.engine.spy; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.management.StandardMBean; import com.p6spy.engine.common.P6Util; import com.p6spy.engine.logging.P6LogFactory; import com.p6spy.engine.spy.appender.FileLogger; import com.p6spy.engine.spy.appender.MessageFormattingStrategy; import com.p6spy.engine.spy.appender.P6Logger; import com.p6spy.engine.spy.appender.SingleLineFormat; import com.p6spy.engine.spy.option.P6OptionsRepository; public class P6SpyOptions extends StandardMBean implements P6SpyLoadableOptions { public static final String AUTOFLUSH = "autoflush"; public static final String DRIVERLIST = "driverlist"; public static final String LOGFILE = "logfile"; public static final String LOG_MESSAGE_FORMAT = "logMessageFormat"; public static final String APPEND = "append"; public static final String DATEFORMAT = "dateformat"; public static final String APPENDER = "appender"; public static final String MODULELIST = "modulelist"; public static final String STACKTRACE = "stacktrace"; public static final String STACKTRACECLASS = "stacktraceclass"; public static final String RELOADPROPERTIES = "reloadproperties"; public static final String RELOADPROPERTIESINTERVAL = "reloadpropertiesinterval"; public static final String JNDICONTEXTFACTORY = "jndicontextfactory"; public static final String JNDICONTEXTPROVIDERURL = "jndicontextproviderurl"; public static final String JNDICONTEXTCUSTOM = "jndicontextcustom"; public static final String REALDATASOURCE = "realdatasource"; public static final String REALDATASOURCECLASS = "realdatasourceclass"; public static final String REALDATASOURCEPROPERTIES = "realdatasourceproperties"; public static final String DATABASE_DIALECT_DATE_FORMAT = "databaseDialectDateFormat"; public static final String JMX = "jmx"; public static final String JMX_PREFIX = "jmxPrefix"; // those set indirectly (via properties visible from outside) public static final String DRIVER_NAMES = "driverNames"; public static final String MODULE_FACTORIES = "moduleFactories"; public static final String MODULE_NAMES = "moduleNames"; public static final String LOG_MESSAGE_FORMAT_INSTANCE = "logMessageFormatInstance"; public static final String APPENDER_INSTANCE = "appenderInstance"; public static final Map<String, String> defaults; static { defaults = new HashMap<String, String>(); defaults.put(LOG_MESSAGE_FORMAT, SingleLineFormat.class.getName()); defaults.put(LOGFILE, "spy.log"); defaults.put(APPEND, Boolean.TRUE.toString()); defaults.put(APPENDER, FileLogger.class.getName()); defaults.put(MODULELIST, P6SpyFactory.class.getName() + ","+ P6LogFactory.class.getName()); defaults.put(STACKTRACE, Boolean.FALSE.toString()); defaults.put(AUTOFLUSH, Boolean.FALSE.toString()); defaults.put(RELOADPROPERTIES, Boolean.FALSE.toString()); defaults.put(RELOADPROPERTIESINTERVAL, Long.toString(60)); defaults.put(DATABASE_DIALECT_DATE_FORMAT, "dd-MMM-yy"); defaults.put(JMX, Boolean.TRUE.toString()); } private final P6OptionsRepository optionsRepository; public P6SpyOptions(final P6OptionsRepository optionsRepository) { super(P6SpyOptionsMBean.class, false); this.optionsRepository = optionsRepository; } @Override public void load(Map<String, String> options) { setLogMessageFormat(options.get(LOG_MESSAGE_FORMAT)); setLogfile(options.get(LOGFILE)); setAppend(options.get(APPEND)); setDateformat(options.get(DATEFORMAT)); setAppender(options.get(APPENDER)); setModulelist(options.get(MODULELIST)); setDriverlist(options.get(DRIVERLIST)); setStackTrace(options.get(STACKTRACE)); setStackTraceClass(options.get(STACKTRACECLASS)); setAutoflush(options.get(AUTOFLUSH)); setReloadProperties(options.get(RELOADPROPERTIES)); setReloadPropertiesInterval(options.get(RELOADPROPERTIESINTERVAL)); setJNDIContextFactory(options.get(JNDICONTEXTFACTORY)); setJNDIContextProviderURL(options.get(JNDICONTEXTPROVIDERURL)); setJNDIContextCustom(options.get(JNDICONTEXTCUSTOM)); setRealDataSource(options.get(REALDATASOURCE)); setRealDataSourceClass(options.get(REALDATASOURCECLASS)); setRealDataSourceProperties(options.get(REALDATASOURCEPROPERTIES)); setDatabaseDialectDateFormat(options.get(DATABASE_DIALECT_DATE_FORMAT)); setJmx(options.get(JMX)); setJmxPrefix(options.get(JMX_PREFIX)); } /** * Utility method, to make accessing options from app less verbose. * * @return active instance of the {@link P6SpyLoadableOptions} */ public static P6SpyLoadableOptions getActiveInstance() { return P6ModuleManager.getInstance().getOptions(P6SpyOptions.class); } // JMX exporsed API @Override public void reload() { P6ModuleManager.getInstance().reload(); } @Override public Set<P6Factory> getModuleFactories() { return optionsRepository.getSet(P6Factory.class, MODULE_FACTORIES); } @Override public void setAutoflush(String autoflush) { optionsRepository.set(Boolean.class, AUTOFLUSH, autoflush); } @Override public void setAutoflush(boolean autoflush) { optionsRepository.set(Boolean.class, AUTOFLUSH, autoflush); } @Override public boolean getAutoflush() { return optionsRepository.get(Boolean.class, AUTOFLUSH); } @Override public String getDriverlist() { return optionsRepository.get(String.class, DRIVERLIST); } @Override public void setDriverlist(final String driverlist) { optionsRepository.setSet(String.class, DRIVER_NAMES, driverlist); // setting effective string optionsRepository.set(String.class, DRIVERLIST, P6Util.joinNullSafe(optionsRepository.getSet(String.class, DRIVER_NAMES), ",")); } @Override public boolean getReloadProperties() { return optionsRepository.get(Boolean.class, RELOADPROPERTIES); } @Override public void setReloadProperties(String reloadproperties) { optionsRepository.set(Boolean.class, RELOADPROPERTIES, reloadproperties); } @Override public void setReloadProperties(boolean reloadproperties) { optionsRepository.set(Boolean.class, RELOADPROPERTIES, reloadproperties); } @Override public long getReloadPropertiesInterval() { return optionsRepository.get(Long.class, RELOADPROPERTIESINTERVAL); } @Override public void setReloadPropertiesInterval(String reloadpropertiesinterval) { optionsRepository.set(Long.class, RELOADPROPERTIESINTERVAL, reloadpropertiesinterval); } @Override public void setReloadPropertiesInterval(long reloadpropertiesinterval) { optionsRepository.set(Long.class, RELOADPROPERTIESINTERVAL, reloadpropertiesinterval); } @Override public void setJNDIContextFactory(String jndicontextfactory) { optionsRepository.set(String.class, JNDICONTEXTFACTORY, jndicontextfactory); } @Override public void unSetJNDIContextFactory() { optionsRepository.setOrUnSet(String.class, JNDICONTEXTFACTORY, null, defaults.get(JNDICONTEXTFACTORY)); } @Override public String getJNDIContextFactory() { return optionsRepository.get(String.class, JNDICONTEXTFACTORY); } @Override public void unSetJNDIContextProviderURL() { optionsRepository.setOrUnSet(String.class, JNDICONTEXTPROVIDERURL, null, defaults.get(JNDICONTEXTPROVIDERURL)); } @Override public void setJNDIContextProviderURL(String jndicontextproviderurl) { optionsRepository.set(String.class, JNDICONTEXTPROVIDERURL, jndicontextproviderurl); } @Override public String getJNDIContextProviderURL() { return optionsRepository.get(String.class, JNDICONTEXTPROVIDERURL); } @Override public void setJNDIContextCustom(String jndicontextcustom) { optionsRepository.set(String.class, JNDICONTEXTCUSTOM, jndicontextcustom); } @Override public void unSetJNDIContextCustom() { optionsRepository.setOrUnSet(String.class, JNDICONTEXTCUSTOM, null, defaults.get(JNDICONTEXTCUSTOM)); } @Override public String getJNDIContextCustom() { return optionsRepository.get(String.class, JNDICONTEXTCUSTOM); } @Override public void setRealDataSource(String realdatasource) { optionsRepository.set(String.class, REALDATASOURCE, realdatasource); } @Override public void unSetRealDataSource() { optionsRepository.setOrUnSet(String.class, REALDATASOURCE, null, defaults.get(REALDATASOURCE)); } @Override public String getRealDataSource() { return optionsRepository.get(String.class, REALDATASOURCE); } @Override public void setRealDataSourceClass(String realdatasourceclass) { optionsRepository.set(String.class, REALDATASOURCECLASS, realdatasourceclass); } @Override public void unSetRealDataSourceClass() { optionsRepository.setOrUnSet(String.class, REALDATASOURCECLASS, null, defaults.get(REALDATASOURCECLASS)); } @Override public String getRealDataSourceClass() { return optionsRepository.get(String.class, REALDATASOURCECLASS); } @Override public void setRealDataSourceProperties(String realdatasourceproperties) { optionsRepository.set(String.class, REALDATASOURCEPROPERTIES, realdatasourceproperties); } @Override public void unSetRealDataSourceProperties() { optionsRepository.setOrUnSet(String.class, REALDATASOURCEPROPERTIES, null, defaults.get(REALDATASOURCEPROPERTIES)); } @Override public String getRealDataSourceProperties() { return optionsRepository.get(String.class, REALDATASOURCEPROPERTIES); } @Override public Set<String> getDriverNames() { return optionsRepository.getSet(String.class, DRIVER_NAMES); } /** * Returns the databaseDialectDateFormat. * * @return String */ @Override public String getDatabaseDialectDateFormat() { return optionsRepository.get(String.class, DATABASE_DIALECT_DATE_FORMAT); } /** * Sets the databaseDialectDateFormat. * * @param databaseDialectDateFormat The databaseDialectDateFormat to set */ @Override public void setDatabaseDialectDateFormat(String databaseDialectDateFormat) { optionsRepository.set(String.class, DATABASE_DIALECT_DATE_FORMAT, databaseDialectDateFormat); } @Override public String getModulelist() { // TODO handle getters for lists represented in csv strings correctly return optionsRepository.get(String.class, MODULELIST); } @Override public void setModulelist(String modulelist) { optionsRepository.setSet(String.class, MODULE_NAMES, modulelist); // setting effective string optionsRepository.set(String.class, MODULELIST, P6Util.joinNullSafe(optionsRepository.getSet(String.class, MODULE_NAMES), ",")); optionsRepository.setSet(P6Factory.class, MODULE_FACTORIES, modulelist); } @Override public Set<String> getModuleNames() { return optionsRepository.getSet(String.class, MODULE_NAMES); } @Override public void setAppend(boolean append) { optionsRepository.set(Boolean.class, APPEND, append); } @Override public boolean getAppend() { return optionsRepository.get(Boolean.class, APPEND); } @Override public String getAppender() { return optionsRepository.get(String.class, APPENDER); } @Override public P6Logger getAppenderInstance() { return optionsRepository.get(P6Logger.class, APPENDER_INSTANCE); } @Override public void setAppender(String className) { optionsRepository.set(String.class, APPENDER, className); optionsRepository.set(P6Logger.class, APPENDER_INSTANCE, className); } @Override public void setDateformat(String dateformat) { optionsRepository.set(String.class, DATEFORMAT, dateformat); } @Override public String getDateformat() { return optionsRepository.get(String.class, DATEFORMAT); } @Override public boolean getStackTrace() { return optionsRepository.get(Boolean.class, STACKTRACE); } @Override public void setStackTrace(boolean stacktrace) { optionsRepository.set(Boolean.class, STACKTRACE, stacktrace); } @Override public void setStackTrace(String stacktrace) { optionsRepository.set(Boolean.class, STACKTRACE, stacktrace); } @Override public String getStackTraceClass() { return optionsRepository.get(String.class, STACKTRACECLASS); } @Override public void setStackTraceClass(String stacktraceclass) { optionsRepository.set(String.class, STACKTRACECLASS, stacktraceclass); } @Override public void setLogfile(String logfile) { optionsRepository.set(String.class, LOGFILE, logfile); } @Override public String getLogfile() { return optionsRepository.get(String.class, LOGFILE); } @Override public void setAppend(String append) { optionsRepository.set(Boolean.class, APPEND, append); } @Override public String getLogMessageFormat() { return optionsRepository.get(String.class, LOG_MESSAGE_FORMAT); } @Override public void setLogMessageFormat(final String logMessageFormat) { optionsRepository.set(String.class, LOG_MESSAGE_FORMAT, logMessageFormat); optionsRepository.set(MessageFormattingStrategy.class, LOG_MESSAGE_FORMAT_INSTANCE, logMessageFormat); } @Override public MessageFormattingStrategy getLogMessageFormatInstance() { return optionsRepository.get(MessageFormattingStrategy.class, LOG_MESSAGE_FORMAT_INSTANCE); } @Override public Map<String, String> getDefaults() { return defaults; } @Override public boolean getJmx() { return optionsRepository.get(Boolean.class, JMX); } @Override public void setJmx(String string) { optionsRepository.set(Boolean.class, JMX, string); } @Override public void setJmx(boolean string) { optionsRepository.set(Boolean.class, JMX, string); } @Override public String getJmxPrefix() { return optionsRepository.get(String.class, JMX_PREFIX); } @Override public void setJmxPrefix(String jmxPrefix) { optionsRepository.set(String.class, JMX_PREFIX, jmxPrefix); } }