/*
* Copyright 2003,2004 Colin Crist
*
* 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 hermes.browser.dialog;
import hermes.Hermes;
import hermes.browser.HermesBrowser;
import hermes.config.HermesConfig;
import hermes.config.WatchConfig;
import java.awt.BorderLayout;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import org.apache.log4j.Logger;
import com.jidesoft.grid.Property;
import com.jidesoft.grid.PropertyPane;
import com.jidesoft.grid.PropertyTable;
import com.jidesoft.grid.PropertyTableModel;
/**
* @author colincrist@hermesjms.com
* @version $Id: GeneralConfigPanel.java,v 1.6 2004/07/30 17:25:15 colincrist
* Exp $
*/
public class GeneralConfigPanel extends JPanel
{
/**
*
*/
private static final long serialVersionUID = -9018285256630098833L;
private static final Logger log = Logger.getLogger(GeneralConfigPanel.class);
private static final String AUDIT_DIRECTORY = "AuditDirectory";
private static final String MESSAGES_DIRECTORY = "MessageDirectory";
private static final String THREADPOOL = "ThreadPoolSize";
private static final String MAX_CACHED_MESSAGES = "MaxCachedMessages";
private static final String WATCH = "Watches";
private static final String WATCH_ID = "Watch ";
private static final String WATCH_UPDATE_FREQUENCY = "UpdateFrequency";
private static final String WATCH_AGE_ALERT = "AlertWhenMessageOlderThan";
private static final String WATCH_DEPTH_ALERT = "AlertWhenDepthGreaterThan";
private static final String SHOW_AGE = "DisplayAgeOfOldestMessage";
private static final String COPY_JMSCORRELATIONID = "CopyJMSCorrelationID";
private static final String COPY_JMSTYPE = "CopyJMSType";
private static final String COPY_JMSEXPIRATION = "CopyJMSExpiration";
private static final String COPY_JMSREPLYTO = "CopyJMSReplyTo";
private static final String COPY_JMSPRIORITY = "CopyJMSPriority";
private static final String COPY_PROVIDER_PROPERTIES = "CopyProviderProperties";
private static final String AUTO_REFRESH_PERIOD = "AutoRefreshBrowseTimeout";
private static final String DISPLAY_ADMINFACTORY = "DisplayAdminFactory";
private static final String CORRECT_DND = "UseCorrectDropSemantics";
private static final String SELECTOR_IMPL = "MessageStoreSelector";
private static final String CONSUMER_TIMEOUT = "ConsumerTimeoutWhenQueueBrowsing";
private static final String QF_CACHE = "QuickFIXMessageCache";
private static final String QF_FILTER_SESSION = "QuickFIXFilterSessionMessages";
private static final String ENABLE_JYTHON = "EnableJython";
private static final String SCROLL_MESSAGES_IN_BROWSE = "ScrollMessagesDuringBrowse";
private static final String BASE64_ENCODE_MESSAGES = "Base64EncodeTextMessages";
private static final String MESSAGE_STORE_MESSAGE_FACTORY = "MessageStoreMessageFactory";
private static final String DISPLAY_DESTINATION_IN_MESSAGE_STORE = "DisplayDestinationInMessageStore";
private static final String AUDIT_DIRECTORY_INFO = "The directory where audit files are written whenever you interact with a queue/topic.";
private static final String MESSAGES_DIRECTORY_INFO = "The directory to hold your message repository files.";
private static final String THREADPOOL_INFO = "The maximum size of the thread pool allowing concurrent tasks to take place.";
private static final String MAX_CACHED_MESSAGES_INFO = "The maximum number of messages cached when you browse a queue/topic, when you've browsed more than this number the oldest messages are removed from view.";
private static final String WATCH_INFO = "Destination watch options.";
private static final String WATCH_AGE_ALERT_INFO = "If a message on the head of a queue/topic is more than this number of milliseconds old then alert. Set to 0 to disable.";
private static final String WATCH_DEPTH_ALERT_INFO = "If the depth of the queue/topic is greater than this then alert. Set to 0 to disable.";
private static final String SHOW_AGE_INFO = "Show the age rather than the put time of the oldest message.";
private static final String WATCH_UPDATE_FREQUENCY_INFO = "Polling frequency (in milliseconds) to collect statistics.";
private static final String COPY_JMSCORRELATIONID_INFO = "Copy JMSCorrelationID header property when drag and dropping messages.";
private static final String COPY_JMSTYPE_INFO = "Copy JMSType header property when drag and dropping messages.";
private static final String COPY_JMSEXPIRATION_INFO = "Copy JMSExpiration header property when drag and dropping messages.";
private static final String COPY_JMSREPLYTO_INFO = "Copy JMSReplyTo header property when drag and dropping messages.";
private static final String COPY_JMSPRIORITY_INFO = "Copy JMSPriority header property when drag and dropping messages.";
private static final String COPY_PROVIDER_PROPERTIES_INFO = "Copy provider properties when duplicating messages";
private static final String DISPLAY_ADMINFACTORY_INFO = "Display the admin factory configuration panel is the Preferences/Sessions dialog, set to false if you never use extensions to avoid screen clutter.";
private static final String AUTO_REFRESH_PERIOD_INFO = "The number of seconds between each poll of a queue when using automatic refresh";
private static final String CORRECT_DND_INFO = "When true, the default behavour when dropping messages on a queue is MOVE otherwise its COPY. When true you can use the control key to toggle between COPY and MOVE.";
private static final String SELECTOR_IMPL_INFO = "The selector implementation to use with message stores";
private static final String CONSUMER_TIMEOUT_INFO = "The timeout in milliseconds when using a consumer for browsing queues/topics to stop browsing. If 0 the default of 10s is used.";
private static final String QF_CACHE_INFO = "Message cache for QuickFIX/J to control memory use";
private static final String QF_FILTER_SESSION_INFO = "Filter out session level FIX messages";
private static final String ENABLE_JYTHON_INFO = "Enable Jython";
private static final String SCROLL_MESSAGES_IN_BROWSE_INFO = "Scroll to the newest message during a browse";
private static final String BASE64_ENCODE_MESSAGES_INFO = "Base64 encode text messages when stored in XML or in message stores";
private static final String MESSAGE_STORE_MESSAGE_FACTORY_INFO = "The JMS session to use when working with message stores";
private static final String DISPLAY_DESTINATION_IN_MESSAGE_STORE_INFO = "Under the message store node in the browser tree, display the original queue or topic the message came from." ;
private PreferencesDialog dialog;
private HermesConfig config;
private PropertyTable propertyTable;
private PropertyPane propertyPane;
private Property auditDirectoryProperty;
private Property messagesDirectoryProperty;
private Property threadPoolProperty;
private Property maxCachedMessagesProperty;
private Property watchProperty;
private Property copyJMSCorrelationIdProperty;
private Property copyJMSTypeProperty;
private Property copyJMSExpirationProperty;
private Property copyJMSReplyToProperty;
private Property copyJMSPriorityProperty;
private Property copyProviderPropertiesProperty;
private Property displayAdminFactoryProperty;
private Property autoRefreshPeriodProperty;
private Property correctDNDProperty;
private Property selectorImplProperty;
private Property consumerTimeoutProperty;
private Property quickFIXCacheProperty;
private Property quickFIXCacheFilterSessionProperty;
private Property enableJythonProperty;
private Property scrollMessagesInBrowseProperty;
private Property base64EncodeMessagesProperty;
private Property messageStoreMessageFactory;
private Property displayDestinationInMessageStoreProperty ;
private List<Runnable> watchSetters = new ArrayList<Runnable>();
public static class PropertyImpl extends Property
{
/**
*
*/
private static final long serialVersionUID = 7034262407063777751L;
public Object value;
/*
* (non-Javadoc)
*
* @see com.jidesoft.grid.Property#getValue()
*/
public Object getValue()
{
return value;
}
/*
* (non-Javadoc)
*
* @see com.jidesoft.grid.Property#hasValue()
*/
public boolean hasValue()
{
return value != null;
}
/*
* (non-Javadoc)
*
* @see com.jidesoft.grid.Property#setValue(java.lang.Object)
*/
public void setValue(Object value)
{
this.value = value;
}
public PropertyImpl(String name, String value)
{
super(name, value);
}
/**
* @param arg0
* @param arg1
* @param arg2
*/
public PropertyImpl(String name, Object value, String description, Class type)
{
super(name, description, type);
this.value = value;
}
}
public GeneralConfigPanel(PreferencesDialog dialog)
{
this.dialog = dialog;
init();
}
private void init()
{
Border border = BorderFactory.createBevelBorder(BevelBorder.RAISED);
setLayout(new BorderLayout());
setBorder(BorderFactory.createTitledBorder(border, "General Options"));
}
public void updateModel()
{
config.setCopyJMSCorrelationID(((Boolean) copyJMSCorrelationIdProperty.getValue()).booleanValue());
config.setCopyJMSType(((Boolean) copyJMSTypeProperty.getValue()).booleanValue());
config.setCopyJMSExpiration(((Boolean) copyJMSExpirationProperty.getValue()).booleanValue());
config.setCopyJMSReplyTo(((Boolean) copyJMSReplyToProperty.getValue()).booleanValue());
config.setCopyJMSPriority(((Boolean) copyJMSPriorityProperty.getValue()).booleanValue());
config.setCopyJMSProviderProperties(((Boolean) copyProviderPropertiesProperty.getValue()).booleanValue());
config.setDisplayFactoryAdmin(((Boolean) displayAdminFactoryProperty.getValue()).booleanValue());
config.setAutoBrowseRefreshRate((Integer) autoRefreshPeriodProperty.getValue());
config.setCorrectDropSemantics((Boolean) correctDNDProperty.getValue());
config.setSelectorImpl(((SelectorImpl) selectorImplProperty.getValue()).getClazz().getName());
config.getQuickFIX().setCacheSize(((Integer) quickFIXCacheProperty.getValue()).intValue());
config.getQuickFIX().setFilterSessionMsgTypes((Boolean) quickFIXCacheFilterSessionProperty.getValue());
config.setEnableJython((Boolean) enableJythonProperty.getValue());
config.setScrollMessagesDuringBrowse((Boolean) scrollMessagesInBrowseProperty.getValue());
config.setBase64EncodeMessages((Boolean) base64EncodeMessagesProperty.getValue());
config.setMessageStoreMessageFactory((String) messageStoreMessageFactory.getValue());
if (consumerTimeoutProperty.getValue() != null)
{
config.setQueueBrowseConsumerTimeout(((Long) consumerTimeoutProperty.getValue()));
}
if (threadPoolProperty.getValue() != null)
{
config.setMaxThreadPoolSize(((Integer) threadPoolProperty.getValue()).intValue());
}
if (auditDirectoryProperty.getValue() != null)
{
config.setAuditDirectory(((File) auditDirectoryProperty.getValue()).getAbsolutePath());
}
if (messagesDirectoryProperty.getValue() != null)
{
config.setMessageFilesDir(((File) messagesDirectoryProperty.getValue()).getAbsolutePath());
}
if (maxCachedMessagesProperty.getValue() != null)
{
config.setMaxMessagesInBrowserPane(((Integer) maxCachedMessagesProperty.getValue()).intValue());
}
if (displayDestinationInMessageStoreProperty.getValue() != null) {
config.setShowDestinationsInMessageStore((Boolean) displayDestinationInMessageStoreProperty.getValue() ) ;
}
HermesBrowser.getBrowser().getMessageRepository().setDirectory(config.getMessageFilesDir());
for (final Runnable r : watchSetters)
{
r.run();
}
}
@SuppressWarnings("unchecked")
public void setHermesConfig(HermesConfig config)
{
this.config = config;
List<Property> list = new ArrayList<Property>();
watchSetters.clear();
auditDirectoryProperty = new PropertyImpl(AUDIT_DIRECTORY, new File(config.getAuditDirectory() != null ? config.getAuditDirectory() : ""),
AUDIT_DIRECTORY_INFO, File.class);
messagesDirectoryProperty = new PropertyImpl(MESSAGES_DIRECTORY, new File(config.getMessageFilesDir() != null ? config.getMessageFilesDir() : ""),
MESSAGES_DIRECTORY_INFO, File.class);
threadPoolProperty = new PropertyImpl(THREADPOOL, new Integer(config.getMaxThreadPoolSize()), THREADPOOL_INFO, Integer.class);
maxCachedMessagesProperty = new PropertyImpl(MAX_CACHED_MESSAGES, new Integer(config.getMaxMessagesInBrowserPane()), MAX_CACHED_MESSAGES_INFO,
Integer.class);
copyJMSCorrelationIdProperty = new PropertyImpl(COPY_JMSCORRELATIONID, new Boolean(config.isCopyJMSCorrelationID()), COPY_JMSCORRELATIONID_INFO,
Boolean.class);
copyJMSTypeProperty = new PropertyImpl(COPY_JMSTYPE, new Boolean(config.isCopyJMSType()), COPY_JMSTYPE_INFO, Boolean.class);
copyJMSExpirationProperty = new PropertyImpl(COPY_JMSEXPIRATION, new Boolean(config.isCopyJMSExpiration()), COPY_JMSEXPIRATION_INFO, Boolean.class);
copyJMSReplyToProperty = new PropertyImpl(COPY_JMSREPLYTO, new Boolean(config.isCopyJMSReplyTo()), COPY_JMSREPLYTO_INFO, Boolean.class);
copyJMSPriorityProperty = new PropertyImpl(COPY_JMSPRIORITY, new Boolean(config.isCopyJMSPriority()), COPY_JMSPRIORITY_INFO, Boolean.class);
copyProviderPropertiesProperty = new PropertyImpl(COPY_PROVIDER_PROPERTIES, new Boolean(config.isCopyJMSProviderProperties()),
COPY_PROVIDER_PROPERTIES_INFO, Boolean.class);
displayAdminFactoryProperty = new PropertyImpl(DISPLAY_ADMINFACTORY, new Boolean(config.isDisplayFactoryAdmin()), DISPLAY_ADMINFACTORY_INFO,
Boolean.class);
autoRefreshPeriodProperty = new PropertyImpl(AUTO_REFRESH_PERIOD, new Integer(config.getAutoBrowseRefreshRate()), AUTO_REFRESH_PERIOD_INFO, Integer.class);
correctDNDProperty = new PropertyImpl(CORRECT_DND, new Boolean(config.isCorrectDropSemantics()), CORRECT_DND_INFO, Boolean.class);
selectorImplProperty = new PropertyImpl(SELECTOR_IMPL, SelectorImpl.getWithClassName(config.getSelectorImpl()), SELECTOR_IMPL_INFO, SelectorImpl.class);
consumerTimeoutProperty = new PropertyImpl(CONSUMER_TIMEOUT, new Long(config.getQueueBrowseConsumerTimeout() == null ? 0 : config
.getQueueBrowseConsumerTimeout()), CONSUMER_TIMEOUT_INFO, Long.class);
watchProperty = new PropertyImpl(WATCH, WATCH_INFO);
quickFIXCacheProperty = new PropertyImpl(QF_CACHE, new Integer(config.getQuickFIX().getCacheSize()), QF_CACHE_INFO, Integer.class);
quickFIXCacheFilterSessionProperty = new PropertyImpl(QF_FILTER_SESSION, new Boolean(config.getQuickFIX().isFilterSessionMsgTypes()), QF_FILTER_SESSION_INFO, Boolean.class);
enableJythonProperty = new PropertyImpl(ENABLE_JYTHON, new Boolean(config.isEnableJython()), ENABLE_JYTHON_INFO, Boolean.class);
scrollMessagesInBrowseProperty = new PropertyImpl(SCROLL_MESSAGES_IN_BROWSE, new Boolean(config.isScrollMessagesDuringBrowse()),
SCROLL_MESSAGES_IN_BROWSE_INFO, Boolean.class);
base64EncodeMessagesProperty = new PropertyImpl(BASE64_ENCODE_MESSAGES, new Boolean(config.isBase64EncodeMessages()), BASE64_ENCODE_MESSAGES_INFO,
Boolean.class);
displayDestinationInMessageStoreProperty = new PropertyImpl(DISPLAY_DESTINATION_IN_MESSAGE_STORE, new Boolean(config.isShowDestinationsInMessageStore()), DISPLAY_DESTINATION_IN_MESSAGE_STORE_INFO,
Boolean.class);
messageStoreMessageFactory = new PropertyImpl(MESSAGE_STORE_MESSAGE_FACTORY, config.getMessageStoreMessageFactory(), MESSAGE_STORE_MESSAGE_FACTORY_INFO,
Hermes.class);
for (Iterator iter = config.getWatch().iterator(); iter.hasNext();)
{
final WatchConfig wConfig = (WatchConfig) iter.next();
final Property watchIdProperty = new PropertyImpl(wConfig.getId(), WATCH_INFO + " for " + wConfig.getId());
final Property watchFrequenceProperty = new PropertyImpl(WATCH_UPDATE_FREQUENCY, new Long(wConfig.getUpdateFrequency()), WATCH_UPDATE_FREQUENCY_INFO,
Long.class);
final Property watchAgeAlertProperty = new PropertyImpl(WATCH_AGE_ALERT, new Long(wConfig.getDefaultAgeAlertThreshold()), WATCH_AGE_ALERT_INFO,
Long.class);
final Property watchDepthAlertProperty = new PropertyImpl(WATCH_DEPTH_ALERT, new Integer(wConfig.getDefaultDepthAlertThreshold()),
WATCH_DEPTH_ALERT_INFO, Integer.class);
final Property showAgeProperty = new PropertyImpl(SHOW_AGE, new Boolean(wConfig.isShowAge()), SHOW_AGE_INFO, Boolean.class);
watchIdProperty.addChild(watchFrequenceProperty);
watchIdProperty.addChild(watchAgeAlertProperty);
watchIdProperty.addChild(watchDepthAlertProperty);
watchIdProperty.addChild(showAgeProperty);
watchProperty.addChild(watchIdProperty);
//
// Much easier to create an object here to set the values into the
// model.
watchSetters.add(new Runnable()
{
public void run()
{
if (showAgeProperty.getValue() != null)
{
wConfig.setShowAge(((Boolean) showAgeProperty.getValue()).booleanValue());
}
if (watchAgeAlertProperty.getValue() != null)
{
if (watchAgeAlertProperty.getValue() instanceof Long)
{
wConfig.setDefaultAgeAlertThreshold(((Long) watchAgeAlertProperty.getValue()).longValue());
}
else
{
wConfig.setDefaultAgeAlertThreshold(((Long) watchAgeAlertProperty.getValue()).longValue());
}
}
if (watchDepthAlertProperty.getValue() != null)
{
wConfig.setDefaultDepthAlertThreshold(((Integer) watchDepthAlertProperty.getValue()).intValue());
}
if (watchFrequenceProperty.getValue() != null)
{
if (watchFrequenceProperty.getValue() instanceof Long)
{
wConfig.setUpdateFrequency(((Long) watchFrequenceProperty.getValue()).longValue());
}
else
{
wConfig.setUpdateFrequency(((Long) watchFrequenceProperty.getValue()).longValue());
}
}
HermesBrowser.getBrowser().getWatchFrame(wConfig.getId()).updateConfig();
}
});
}
auditDirectoryProperty.setEditorContext(DirectoryCellEditor.CONTEXT);
messagesDirectoryProperty.setEditorContext(DirectoryCellEditor.CONTEXT);
list.add(auditDirectoryProperty);
list.add(messagesDirectoryProperty);
list.add(threadPoolProperty);
list.add(maxCachedMessagesProperty);
list.add(copyJMSCorrelationIdProperty);
list.add(copyJMSExpirationProperty);
list.add(copyJMSPriorityProperty);
list.add(copyJMSReplyToProperty);
list.add(copyJMSTypeProperty);
list.add(copyProviderPropertiesProperty);
list.add(displayAdminFactoryProperty);
list.add(autoRefreshPeriodProperty);
list.add(correctDNDProperty);
list.add(selectorImplProperty);
list.add(consumerTimeoutProperty);
list.add(quickFIXCacheProperty);
list.add(quickFIXCacheFilterSessionProperty);
list.add(enableJythonProperty);
list.add(scrollMessagesInBrowseProperty);
list.add(base64EncodeMessagesProperty);
list.add(messageStoreMessageFactory);
list.add(displayDestinationInMessageStoreProperty) ;
list.add(watchProperty);
PropertyTableModel model = new PropertyTableModel(list);
propertyTable = new PropertyTable(model);
propertyTable.expandFirstLevel();
if (propertyPane != null)
{
remove(propertyPane);
}
propertyPane = new PropertyPane(propertyTable);
add(propertyPane, BorderLayout.CENTER);
}
}