ESBCOMP-63 Add support for application variable

master
David BRASSELY 2013-09-03 14:04:55 +02:00
parent 2436f2263b
commit ab8d285968
8 changed files with 459 additions and 10 deletions

View File

@ -227,4 +227,6 @@ public interface Context {
* @return FaultMessage
*/
public FaultMessage createFaultMessage(Source payload, QName faultMsgType);
public String getApplicationVariable(String applicationVariableName);
}

View File

@ -30,6 +30,7 @@
package org.glassfish.openesb.pojose.res.impl;
import com.sun.jbi.common.qos.messaging.MessagingChannel;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jbi.JBIException;
@ -59,12 +60,15 @@ public class ContextImpl implements Context{
private MessagingChannel dc = null;
private ComponentContext cc = null;
private CallTracker ct = null;
private Map applicationVariables;
private static final String LoggerName = "org.glassfish.openesb.pojose.jbi.nmr.BasePojoExecutor" ; //NOI18N
public ContextImpl(ComponentContext ncc, MessagingChannel ndc, CallTracker callt) {
public ContextImpl(ComponentContext ncc, MessagingChannel ndc, CallTracker callt, Map applicationVariables) {
this.cc = ncc;
this.dc = ndc;
this.ct = callt;
this.applicationVariables = applicationVariables;
}
public void setMessageExchange(MessageExchange me) {
@ -229,6 +233,16 @@ public class ContextImpl implements Context{
return fm;
}
public String getApplicationVariable(String applicationVariableName) {
String [] metadatas = (String []) this.applicationVariables.get(applicationVariableName);
if (metadatas != null) {
// IDX 0 = value & IDX 1 = type
return metadatas[0];
}
return null;
}
// *** End of Context Interface methods...
}

View File

@ -32,16 +32,38 @@ package org.glassfish.openesb.pojose.jbi;
import com.sun.jbi.common.qos.config.AbstractConfigMBean;
import com.sun.jbi.common.qos.config.ComponentConfig;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jbi.component.ComponentContext;
import javax.jbi.management.DeploymentException;
import javax.management.AttributeChangeNotification;
import javax.management.InvalidAttributeValueException;
import javax.management.ListenerNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.OpenDataException;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.SimpleType;
import javax.management.openmbean.TabularData;
import javax.management.openmbean.TabularDataSupport;
import javax.management.openmbean.TabularType;
/**
*
@ -50,11 +72,43 @@ import javax.management.NotificationListener;
public class PojoSEConfiguration extends AbstractConfigMBean
implements PojoSEConfigurationMBean {
/*
* 201-230
*/
private static final Logger logger = Logger.getLogger(PojoSEConfiguration.class.getName());
private ComponentContext ctx;
private NotificationBroadcasterSupport broadcasterSupport = new NotificationBroadcasterSupport();
// Configuration file name for environment variables
private static final String PERSIST_APPLICATION_VARIABLE_CONFIG_FILE_NAME = "ApplicationVariables.properties";
// Application variables row fields
private static final String APPLICATION_VARIABLES_ROW_KEY = "name";
private static final String APPLICATION_VARIABLES_VALUE_FIELD = "value";
private static final String APPLICATION_VARIABLES_TYPE_FIELD = "type";
// Global application configurations
private Map mAppVarMap;
private CompositeType mAppVarRowType = null;
private TabularType mAppVarTabularType = null;
public PojoSEConfiguration(ComponentContext ctx, ComponentConfig config)
throws DeploymentException {
super(ctx, config);
this.ctx = ctx;
try {
mAppVarMap = loadApplicationVariablesConfig(ctx.getWorkspaceRoot());
mAppVarRowType = createApplicationVariableCompositeType();
mAppVarTabularType = createApplicationVariableTabularType();
} catch (Exception e) {
String msg = I18n.loc("POJOSE-7523: Failed during mbean initialization {0}", e);
logger.severe(msg);
throw new DeploymentException(msg, e);
}
}
public Integer getCoreThreadPoolSize() {
@ -166,6 +220,262 @@ public class PojoSEConfiguration extends AbstractConfigMBean
public void removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws ListenerNotFoundException{
broadcasterSupport.removeNotificationListener(listener, filter, handback);
}
}
private Map loadApplicationVariablesConfig(String workspaceRoot) throws MBeanException {
Properties persistedConfig = new Properties();
Map appVarMap = new HashMap();
File appVarPersistFileName = new File(workspaceRoot, PERSIST_APPLICATION_VARIABLE_CONFIG_FILE_NAME);
if (!appVarPersistFileName.exists()) {
return appVarMap;
}
try {
InputStream is = new FileInputStream(appVarPersistFileName);
persistedConfig.load(is);
is.close();
// load the persisted environment variable configurations in the map
for (Enumeration e = persistedConfig.propertyNames(); e.hasMoreElements(); ) {
String name = (String) e.nextElement();
String metadata = persistedConfig.getProperty(name);
int startIndex = metadata.indexOf("{");
String value = (startIndex == 0)? null : metadata.substring(0, startIndex);
String type = metadata.substring(startIndex + 1, metadata.length() -1);
appVarMap.put(name, new String[] {value, type});
}
} catch (Exception ex) {
String msg = I18n.loc("POJOSE-7539: Failed to load application variables {0} {1}", PERSIST_APPLICATION_VARIABLE_CONFIG_FILE_NAME, ex);
logger.severe(msg);
throw new MBeanException(ex, msg);
}
return appVarMap;
}
private CompositeType createApplicationVariableCompositeType() throws OpenDataException {
if (mAppVarRowType != null) {
return mAppVarRowType;
}
String[] appVarRowAttrNames = { APPLICATION_VARIABLES_ROW_KEY, APPLICATION_VARIABLES_VALUE_FIELD, APPLICATION_VARIABLES_TYPE_FIELD };
String[] appVarRowAttrDesc = { "Application Variable Name", "Application Variable Value", "Application Variable Type" };
OpenType[] appVarRowAttrTypes = { SimpleType.STRING, SimpleType.STRING, SimpleType.STRING };
mAppVarRowType = new CompositeType("ApplicationVariables",
"Application Variable Composite Data",
appVarRowAttrNames,
appVarRowAttrDesc,
appVarRowAttrTypes);
return mAppVarRowType;
}
private TabularType createApplicationVariableTabularType() throws OpenDataException {
if (mAppVarTabularType != null) {
return mAppVarTabularType;
}
if (mAppVarRowType == null) {
mAppVarRowType = createApplicationVariableCompositeType();
}
mAppVarTabularType = new TabularType("ApplicationVariableList",
"List of Application Variables",
mAppVarRowType,
new String[] { APPLICATION_VARIABLES_ROW_KEY } );
return mAppVarTabularType;
}
/**
* This operation adds a new application variable. If a variable with the same name
* already exists, the operation fails.
*
* @param name - name of the application variable
* @param appVar - this is the application variable compoiste
* @throws MBeanException if an error occurs in adding the application variable to the
* component.
*/
public void addApplicationVariable(String name, CompositeData appVar) throws InvalidAttributeValueException, MBeanException {
if (mAppVarMap.containsKey(name)) {
String msg = I18n.loc("POJOSE-7524: Application variable name already exists {0}", name);
logger.severe(msg);
throw new MBeanException(new Exception(msg));
}
CompositeType rowType = appVar.getCompositeType();
if (rowType.keySet().size() != 3) {
String msg = I18n.loc("POJOSE-7525: Invalid item size for app variable {0}", rowType.keySet().size());
logger.severe(msg);
throw new InvalidAttributeValueException(msg);
}
if (!appVar.containsKey(APPLICATION_VARIABLES_ROW_KEY)) {
String msg = I18n.loc("POJOSE-7526: Invalid key for composite data for app variable {0}", name);
logger.severe(msg);
throw new InvalidAttributeValueException(msg);
}
String appVarValue = (String)appVar.get(APPLICATION_VARIABLES_VALUE_FIELD);
String appVarType = (String)appVar.get(APPLICATION_VARIABLES_TYPE_FIELD);
if (appVarValue == null) {
String msg = I18n.loc("POJOSE-7527: Invalid app variable composite data no value field {0}", name);
logger.severe(msg);
throw new InvalidAttributeValueException(msg);
}
if (appVarType == null) {
String msg = I18n.loc("POJOSE-7528: Invalid app variable composite data no type field", name);
logger.severe(msg);
throw new InvalidAttributeValueException(msg);
}
mAppVarMap.put(name, new String[] { appVarValue, appVarType });
if (logger.isLoggable(Level.FINEST)) {
String msg = I18n.loc("POJOSE-7529: New application variable added {0} {1}", name, appVarValue);
logger.finest(msg);
}
persistApplicationVariablesConfig();
}
/**
* This operation sets an application variable. If a variable does not exist with
* the same name, its an error.
*
* @param name - name of the application variable
* @param appVar - this is the application variable compoiste to be updated.
* @throws MBeanException if one or more application variables cannot be deleted
*/
public void setApplicationVariable(String name, CompositeData appVar) throws InvalidAttributeValueException, MBeanException {
if (!mAppVarMap.containsKey(name)) {
String msg = I18n.loc("POJOSE-7530: Application variable does not exist for set {0}", name);
logger.severe(msg);
throw new MBeanException(new Exception(msg));
}
CompositeType rowType = appVar.getCompositeType();
if (rowType.keySet().size() != 3) {
String msg = I18n.loc("POJOSE-7531: Invalid item size for app variable", rowType.keySet().size());
logger.severe(msg);
throw new InvalidAttributeValueException(msg);
}
if (!appVar.containsKey(APPLICATION_VARIABLES_ROW_KEY)) {
String msg = I18n.loc("POJOSE-7526: Invalid key for composite data for app variable {0}", name);
logger.severe(msg);
throw new InvalidAttributeValueException(msg);
}
String appVarValue = (String)appVar.get(APPLICATION_VARIABLES_VALUE_FIELD);
String appVarType = (String)appVar.get(APPLICATION_VARIABLES_TYPE_FIELD);
if (appVarValue == null) {
String msg = I18n.loc("POJOSE-7527: Invalid app variable composite data no value field {0}", name);
logger.severe(msg);
throw new InvalidAttributeValueException(msg);
}
if (appVarType == null) {
String msg = I18n.loc("POJOSE-7534: Invalid app variable composite data no type field {0}", name);
logger.severe(msg);
throw new InvalidAttributeValueException(msg);
}
mAppVarMap.put(name, new String[] { appVarValue, appVarType });
if (logger.isLoggable(Level.FINEST)) {
String msg = I18n.loc("POJOSE-7535: Application variable updated {0} {1}", name, appVarValue );
logger.finest(msg);
}
// persist the application variable properties
persistApplicationVariablesConfig();
}
/**
* This operation deletes an application variable, if a variable with the specified name does
* not exist, it's an error.
*
* @param name - name of the application variable
* @throws MBeanException on errors.
*/
public void deleteApplicationVariable(String name) throws MBeanException {
if (!mAppVarMap.containsKey(name)) {
String msg = I18n.loc("POJOSE-7536: Application variable does not exist for delete {0}", name);
logger.severe(msg);
throw new MBeanException(new Exception(msg));
}
mAppVarMap.remove(name);
if (logger.isLoggable(Level.FINEST)) {
String msg = I18n.loc("POJOSE-7537: Application variable deleted {0}", name);
logger.finest(msg);
}
persistApplicationVariablesConfig();
}
public TabularData getApplicationVariables() {
TabularData tabularData = new TabularDataSupport(mAppVarTabularType);
for (Iterator iter = mAppVarMap.keySet().iterator(); iter.hasNext(); ) {
String name = (String) iter.next();
String[] metadata = (String[]) mAppVarMap.get(name);
String value = metadata [0];
String type = metadata [1];
Object[] data = ("PASSWORD".equalsIgnoreCase(type) && value != null && !"".equals(value))?
new Object[] { name, "*******", type } : new Object[] {name, value, type};
try {
CompositeData rowData = new CompositeDataSupport(mAppVarRowType,
new String[] { APPLICATION_VARIABLES_ROW_KEY ,
APPLICATION_VARIABLES_VALUE_FIELD ,
APPLICATION_VARIABLES_TYPE_FIELD },
data);
tabularData.put(rowData);
} catch (OpenDataException e) {
String msg = I18n.loc("POJOSE-7538: Unable to construct composite data for app variable", e);
logger.severe(msg);
throw new RuntimeException(msg);
}
}
return tabularData;
}
public Map retrieveApplicationVariablesMap() {
return mAppVarMap;
}
public void updateApplicationVariablesMap(Map appVarMap) throws MBeanException {
mAppVarMap = appVarMap;
persistApplicationVariablesConfig();
}
private void persistApplicationVariablesConfig() throws MBeanException {
// Persist the changed configuration
try {
File appVarPersistFileName = new File(ctx.getWorkspaceRoot(), PERSIST_APPLICATION_VARIABLE_CONFIG_FILE_NAME);
OutputStream os = new FileOutputStream(appVarPersistFileName);
for (Iterator iter = mAppVarMap.keySet().iterator(); iter.hasNext(); ) {
String key = (String) iter.next();
String[] metadata = (String[]) mAppVarMap.get(key);
String value = metadata[0];
String type = metadata[1];
String prop = (value != null)? key + "=" + value + "{" + type + "}\n" : key + "={" + type + "}\n";
os.write(prop.getBytes());
}
os.close();
} catch (Exception ex) {
String msg = I18n.loc("POJOSE-7540: Failed to persist application variables {0} {1}", PERSIST_APPLICATION_VARIABLE_CONFIG_FILE_NAME, ex);
logger.severe(msg);
throw new MBeanException(ex, msg);
}
}
}

View File

@ -30,7 +30,12 @@
package org.glassfish.openesb.pojose.jbi;
import java.util.Map;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanException;
import javax.management.NotificationEmitter;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.TabularData;
/**
@ -38,7 +43,7 @@ import javax.management.NotificationEmitter;
*
* @author Girish Patil
*/
public interface PojoSEConfigurationMBean extends NotificationEmitter{
public interface PojoSEConfigurationMBean extends NotificationEmitter {
public static final String CORE_THREAD_POOL_SIZE = "CoreThreadPoolSize"; //NOI18N
public static final String MAX_THREAD_POOL_SIZE = "MaxThreadPoolSize"; //NOI18N
public static final String THREAD_POOL_BLOCKING_QUEUE_SIZE = "ThreadPoolBlockingQueueSize"; //NOI18N
@ -62,4 +67,59 @@ public interface PojoSEConfigurationMBean extends NotificationEmitter{
*/
public Integer getThreadPoolBlockingQueueSize();
public void setThreadPoolBlockingQueueSize(Integer cz);
/**
* This operation adds a new application variable. If a variable with the same name
* already exists, the operation fails.
*
* @param name - name of the application variable
* @param appVar - this is the application variable compoiste
* @throws MBeanException if an error occurs in adding the application variable to the
* component.
*/
public void addApplicationVariable(String name, CompositeData appVar) throws InvalidAttributeValueException, MBeanException;
/**
* This operation sets an application variable. If a variable does not exist with
* the same name, its an error.
*
* @param name - name of the application variable
* @param appVar - this is the application variable compoiste to be updated.
* @throws MBeanException if one or more application variables cannot be deleted
*/
public void setApplicationVariable(String name, CompositeData appVar) throws InvalidAttributeValueException, MBeanException;
/**
* This operation deletes an application variable, if a variable with the specified name does
* not exist, it's an error.
*
* @param name - name of the application variable
* @throws MBeanException on errors.
*/
public void deleteApplicationVariable(String name) throws MBeanException;
/**
* Get the Application Variable set for a component.
*
* @return a TabularData which has all the applicationvariables set on the component.
*/
public TabularData getApplicationVariables();
/** Retrieves the application variables map. The map key is the application
* variable name, the value is a String[] containing detailed information
* about the application variable. This method is used to communicate
* application variable data with in the component and is not intended
* for MBean clients
*
* @return a Map containing application variable information
*/
public Map retrieveApplicationVariablesMap();
/** Updates the application variable map.
* This method is used to communicate application configuration data within the component, and
* not intended for MBean clients
*
* @param a Map containing application variable information
*/
public void updateApplicationVariablesMap(Map val) throws MBeanException;
}

View File

@ -34,11 +34,13 @@ import com.sun.jbi.common.qos.config.ConfigPersistence;
import com.sun.jbi.common.qos.config.RuntimeConfigurationMBean;
import com.sun.jbi.common.util.MBeanHelper;
import com.sun.jbi.common.util.Util;
import com.sun.jbi.configuration.RuntimeConfigurationHelper;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jbi.JBIException;
import javax.jbi.component.ComponentContext;
import javax.jbi.component.ComponentLifeCycle;
import javax.jbi.management.MBeanNames;
import javax.jbi.messaging.DeliveryChannel;
import javax.management.ObjectName;
@ -50,7 +52,8 @@ public class PojoSELifeCycle implements ComponentLifeCycle {
private POJOComponentContext pojoCompCtx;
private Logger compLifeCycleLogger;
private ComponentConfig compCfg;
private MBeanHelper mbeanHelper;
//private MBeanHelper mbeanHelper;
private RuntimeConfigurationHelper mRuntimeConfigHelper;
public PojoSELifeCycle(POJOComponentContext pc){
assert pc != null;
@ -67,9 +70,15 @@ public class PojoSELifeCycle implements ComponentLifeCycle {
ConfigPersistence.loadConfig(compCfg, ctx.getWorkspaceRoot());
PojoSEConfigurationMBean cfgMbean = new PojoSEConfiguration(ctx, compCfg);
mbeanHelper = new MBeanHelper(ctx);
mbeanHelper.registerMBean(RuntimeConfigurationMBean.CONFIGURATION_EXTENSION, cfgMbean);
try {
MBeanNames mbeanNames = ctx.getMBeanNames();
ObjectName runtimeConfigMBeanObjName = mbeanNames.createCustomComponentMBeanName("Configuration");
mRuntimeConfigHelper = new RuntimeConfigurationHelper(runtimeConfigMBeanObjName, ctx.getMBeanServer());
mRuntimeConfigHelper.registerMBean(cfgMbean);
} catch (Exception e) {
throw new JBIException(e);
}
pojoCompCtx.setConfigMbean(cfgMbean);
// send alert

View File

@ -218,3 +218,51 @@ POJOSE-7521 = Exception while persisting configuration changes. {0}
# org.glassfish.openesb.pojose.jbi.thread.InboundProcessor
POJOSE-7522 = Exception while executing for ME {0}. {1}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7523 = Failed during mbean initialization {0}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7524 = Application variable name already exists {0}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7525 = Invalid item size for app variable {0}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7526 = Invalid key for composite data for app variable {0}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7527 = Invalid app variable composite data no value field {0}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7528 = Invalid app variable composite data no type field
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7529 = New application variable added {0} {1}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7530 = Application variable does not exist for set {0}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7531 = Invalid item size for app variable
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7534 = Invalid app variable composite data no type field {0}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7535 = Application variable updated {0} {1}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7536 = Application variable does not exist for delete {0}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7537 = Application variable deleted {0}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7538 = Unable to construct composite data for app variable
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7539 = Failed to load application variables {0} {1}
# org.glassfish.openesb.pojose.jbi.PojoSEConfiguration
POJOSE-7540 = Failed to persist application variables {0} {1}

View File

@ -234,13 +234,13 @@ public class InMsgTask extends BaseTask {
if (exp == null){
if (pojoMeta.getProvider() != null){
// Using current @Provider annotation.
ContextImpl ctximpl = new ContextImpl(ctx.getJBIComponentContext(), ctx.getDC(), (CallTracker)this.pt);
ContextImpl ctximpl = new ContextImpl(ctx.getJBIComponentContext(), ctx.getDC(), (CallTracker)this.pt, ctx.getConfigMbean().retrieveApplicationVariablesMap());
ctximpl.setMessageExchange(me);
POJOAnnotationProcessor.injectFields(pojoMeta, pojoObj, ctximpl, (CallTracker)this.pt);
} else {
// Using old @POJO annotation.
ContextImpl ctximpl = new ContextImpl(ctx.getJBIComponentContext(), ctx.getDC(), (CallTracker)this.pt);
ContextImpl ctximpl = new ContextImpl(ctx.getJBIComponentContext(), ctx.getDC(), (CallTracker)this.pt, ctx.getConfigMbean().retrieveApplicationVariablesMap());
ctximpl.setMessageExchange(me);
POJOContextImpl pjctx = new POJOContextImpl(ctx.getJBIComponentContext(), ctx.getDC());

View File

@ -74,6 +74,12 @@
<cfg:Constraint facet="maxInclusive" value="50000"/>
</cfg:Property>
</cfg:PropertyGroup>
<cfg:ApplicationVariable isApplicationRestartRequired="true">
<cfg:name/>
<cfg:type/>
<cfg:value/>
</cfg:ApplicationVariable>
</cfg:Configuration>
<logging:Logging root="org.glassfish.openesb.pojose">
<!-- QoS