proyal 2002/07/31 13:47:05 Added: phyre/src/java/org/apache/avalon/phyre/phoenix/panels ModifyConfigurationPanel.java phyre/src/java/org/apache/avalon/phyre/phoenix app.xconf logkit.xconf main.xconf Log: * Custom panel for Phoenix to modify configs * Config files for Phoenix Revision Changes Path 1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/phoenix/panels/ModifyConfigurationPanel.java Index: ModifyConfigurationPanel.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.phyre.phoenix.panels; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.StringReader; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; import org.apache.avalon.framework.configuration.DefaultConfigurationSerializer; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.Serviceable; import org.apache.avalon.phyre.PhyreRuntimeException; import org.apache.avalon.phyre.mbean.MBeanAccessor; import org.apache.avalon.phyre.panels.EventContextualizable; import org.apache.avalon.phyre.panels.LogEnabledJPanel; import org.xml.sax.InputSource; /** * @author <a href="mailto:[EMAIL PROTECTED]">Peter Royal</a> */ public class ModifyConfigurationPanel extends LogEnabledJPanel implements Serviceable, Configurable, EventContextualizable, Initializable { private static final String[] CONFIG_METHOD_TYPES = new String[]{String.class.getName(), String.class.getName(), Configuration.class.getName()}; private Configuration m_config; private ServiceManager m_manager; private MBeanAccessor m_configManager; private MBeanAccessor m_configValidator; private String m_app; private String m_block; private final JTextArea m_textArea; public ModifyConfigurationPanel() throws Exception { super( new BorderLayout() ); add( new JScrollPane( m_textArea = new JTextArea() ), BorderLayout.CENTER ); addButtons(); } public void service( ServiceManager manager ) throws ServiceException { m_manager = manager; } public void configure( Configuration configuration ) throws ConfigurationException { m_config = configuration; } public void initialize() throws Exception { m_configManager = ( MBeanAccessor ) m_manager.lookup( m_config.getChild( "repository-object-name" ).getValue() ); m_configValidator = ( MBeanAccessor ) m_manager.lookup( m_config.getChild( "validator-object-name" ).getValue() ); } public void eventContext( Context context ) throws ContextException { m_block = ( String ) context.get( "row-key" ); m_app = ( String ) context.get( "name" ); try { loadConfiguration(); } catch( Exception e ) { throw new PhyreRuntimeException( "Unable to load configuration", e ); } } private void loadConfiguration() throws Exception { final Boolean b = ( Boolean ) m_configManager.invoke( "hasConfiguration", new Object[]{m_app, m_block} ); if( b.booleanValue() ) { final Configuration c = ( Configuration ) m_configManager.invoke( "getConfiguration", new Object[]{m_app, m_block} ); final DefaultConfigurationSerializer serializer = new DefaultConfigurationSerializer(); serializer.setIndent( true ); m_textArea.setText( serializer.serialize( c ) ); } } private Configuration createConfiguration() throws ConfigurationException { final DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); try { return builder.build( new InputSource( new StringReader( m_textArea.getText() ) ) ); } catch( ConfigurationException e ) { throw e; } catch( Exception e ) { throw new ConfigurationException( "Unable to create configuration: " + e.getMessage(), e ); } } private boolean isConfigurationValid( final Configuration c ) { try { final Boolean b = ( Boolean ) m_configValidator.invoke( "isValid", new Object[]{m_app, m_block, c}, CONFIG_METHOD_TYPES ); return b.booleanValue(); } catch( Exception e ) { getLogger().error( "Exception validation configuration", e ); } return false; } private void showValidationResult() { try { final boolean valid = isConfigurationValid( createConfiguration() ); showValidationResultsDialog( valid ); } catch( ConfigurationException e ) { showConfigurationExceptionDialog( e ); } } private void showValidationResultsDialog( final boolean valid ) { JOptionPane.showMessageDialog( this, valid ? "Valid" : "Invalid", "Validation Results", JOptionPane.INFORMATION_MESSAGE, null ); } private void showConfigurationExceptionDialog( ConfigurationException e ) { JOptionPane.showMessageDialog( this, "Error in configuration: " + e.getMessage(), "Invalid Configuration", JOptionPane.ERROR_MESSAGE, null ); } private void storeConfiguration() { Configuration c = null; try { c = createConfiguration(); } catch( ConfigurationException e ) { showConfigurationExceptionDialog( e ); return; } if( isConfigurationValid( c ) ) { try { m_configManager.invoke( "storeConfiguration", new Object[]{m_app, m_block, c}, CONFIG_METHOD_TYPES ); JOptionPane.showMessageDialog( this, "Configuration Updated!" ); } catch( Exception e ) { throw new PhyreRuntimeException( "Unable to store configuration", e ); } } else { showValidationResultsDialog( false ); } } private void addButtons() { final JPanel buttons = new JPanel( new GridLayout( 1, 0 ) ); final JButton validateButton = new JButton( "Validate" ); validateButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { if( ActionEvent.ACTION_PERFORMED == e.getID() ) { showValidationResult(); } } } ); buttons.add( validateButton ); final JButton updateButton = new JButton( "Update" ); updateButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { if( ActionEvent.ACTION_PERFORMED == e.getID() ) { storeConfiguration(); } } } ); buttons.add( updateButton ); add( buttons, BorderLayout.SOUTH ); } } 1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/phoenix/app.xconf Index: app.xconf =================================================================== <?xml version="1.0"?> <phyre-container> <action-factory id="af"/> <context-navigation id="nav"> <context> <caption>${displayName}</caption> <action type="switch-content-panel" panel="default"/> </context> <navigation> <button> <caption>Configuration</caption> <action type="switch-content-panel" panel="config-blocks"/> </button> <button> <caption>Logging</caption> </button> <button> <caption>Manageable Services</caption> </button> <button> <caption>Permissions</caption> </button> </navigation> </context-navigation> <mbean-panel id="default" activation="request"> <object-name>Phoenix:application=${name},topic=Application</object-name> <operation name="start"> <caption>Start ${displayName}</caption> </operation> <operation name="stop"> <caption>Stop ${displayName}</caption> </operation> <operation name="restart"> <caption>Restart ${displayName}</caption> </operation> </mbean-panel> <grid-panel id="config-blocks" logger="config-blocks" activation="request"> <title>Components</title> <action type="switch-content-panel" panel="configure-block"/> <grid> <source> <object-name>Phoenix:application=${name},topic=ApplicationMBean</object-name> <attribute>blockNames</attribute> </source> <column> <caption>Component Name</caption> <value>${row-key}</value> </column> <column> <caption>Has Configuration?</caption> <value> <source> <object-name>Phoenix:component=ConfigurationManager,topic=ConfigurationRepository</object-name> <operation name="hasConfiguration"> <datatype>java.lang.Boolean</datatype> <parameter>${name}</parameter> <parameter>${row-key}</parameter> </operation> </source> </value> </column> </grid> </grid-panel> <panel id="configure-block" class="org.apache.avalon.phyre.phoenix.panels.ModifyConfigurationPanel" activation="request"> <repository-object-name>Phoenix:component=ConfigurationManager,topic=ConfigurationRepository</repository-object-name> <validator-object-name>Phoenix:component=ConfigurationValidator,topic=ConfigurationValidator</validator-object-name> </panel> </phyre-container> 1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/phoenix/logkit.xconf Index: logkit.xconf =================================================================== <?xml version="1.0"?> <logs> <!--+ FACTORIES + Factories define various types of output targets for log messages +--> <factories> <factory type="stream" class="org.apache.avalon.excalibur.logger.factory.StreamTargetFactory"/> </factories> <!--+ TARGETS + Targets are named destinations of log events. Tag names for child + elements, such as 'file' or 'screen', correspond to factory types above. +--> <targets> <!-- Outputs events to the screen. --> <stream id="sout"> <stream>System.out</stream> <format type="avalon"/> </stream> </targets> <!--+ CATEGORIES + Categories are named sinks for the application to output events to. + First level category names correspond to block names in assembly.xml. + + Each category has an attribute named log-level that controls the severity + of messages to records. Valid severities are: + DEBUG, INFO, WARN, ERROR, FATAL_ERROR + + Each category can have children of other categories, and log-target elements + log-target elements have an id-ref attribute that references the id of a target + in the targets section. +--> <categories> <category name="" log-level="INFO"> <log-target id-ref="sout"/> </category> </categories> </logs> 1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/phoenix/main.xconf Index: main.xconf =================================================================== <?xml version="1.0"?> <phyre-container> <action-factory id="af"/> <context-navigation id="nav"> <context> <caption>Phoenix Management Console</caption> <action type="switch-content-panel" panel="default"/> </context> <navigation> <label>Hosted Components</label> <button> <caption>Hosted Applications</caption> <action type="switch-content-panel" panel="hosted-apps"/> </button> <button> <caption>Extension Libraries</caption> </button> <button> <caption>Loggers</caption> </button> <label>Container Components</label> <button> <caption>Configuration Repository</caption> </button> <button> <caption>Deployer</caption> </button> <button> <caption>Log Manager</caption> </button> <button> <caption>System Manager</caption> </button> </navigation> </context-navigation> <mbean-panel id="default" activation="request"> <object-name>Phoenix:component=Embeddor,topic=EmbeddorMBean</object-name> <operation name="shutdown"> <caption>Shutdown Phoenix</caption> </operation> <operation name="restart"> <caption>Restart Phoenix</caption> </operation> </mbean-panel> <grid-panel id="hosted-apps" activation="request"> <title>Applications</title> <button> <caption>Deploy an Application</caption> </button> <button> <caption>Query Applications</caption> </button> <action type="load-subcontext" id="apps"> <context-object-name>Phoenix:application=${row-key},topic=Application</context-object-name> </action> <grid> <source> <object-name>Phoenix:component=Kernel,topic=KernelMBean</object-name> <attribute>applicationNames</attribute> </source> <column> <caption>Name</caption> <value> <source> <object-name>Phoenix:application=${row-key},topic=Application</object-name> <attribute>displayName</attribute> </source> </value> </column> <column> <caption>Description</caption> <value> <source> <object-name>Phoenix:application=${row-key},topic=Application</object-name> <attribute>description</attribute> </source> </value> </column> <column> <caption>Running?</caption> <value> <source> <object-name>Phoenix:application=${row-key},topic=Application</object-name> <attribute>running</attribute> </source> </value> </column> </grid> </grid-panel> <subcontext id="apps" logger="apps" activation="request"> <config>resource://org/apache/avalon/phyre/phoenix/app.xconf</config> </subcontext> <subcontext id="default"> <config>resource://org/apache/avalon/phyre/phoenix/app.xconf</config> </subcontext> </phyre-container>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>