You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by pr...@apache.org on 2002/07/26 22:16:38 UTC
cvs commit: jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/navigation AbstractNavigationPanel.java ApplicationNavigationPanel.java PrimaryNavigationPanel.java
proyal 2002/07/26 13:16:37
Added: phyre .cvsignore build.xml default.properties readme.txt
phyre/lib LICENSE.mx4j.txt avalon-framework-20020725.jar
mx4j-jmx.jar mx4j-tools.jar xalan-2.3.1.jar
xerces-2.0.1.jar xml-apis.jar
phyre/src/java/org/apache/avalon/phyre Main.java
MenuBar.java PhyreFrame.java
phyre/src/java/org/apache/avalon/phyre/actions
MBeanInvokeAction.java
MBeanSwitchContentPanelAction.java
SwitchContentPanelAction.java
phyre/src/java/org/apache/avalon/phyre/dialogs
AbstractOptionDialog.java
AbstractTabularOptionDialog.java ConnectDialog.java
phyre/src/java/org/apache/avalon/phyre/mbean
MBeanAccessor.java MBeanManager.java
phyre/src/java/org/apache/avalon/phyre/panels
AbstractContentPanel.java AbstractMBeanPanel.java
ApplicationPanel.java HomePanel.java
ModifyConfigurationPanel.java
phyre/src/java/org/apache/avalon/phyre/panels/applist
ApplicationListPanel.java
ApplicationTableModel.java
ApplicationTableMouseListener.java
phyre/src/java/org/apache/avalon/phyre/panels/blocklist
BlockListPanel.java BlockTableModel.java
BlockTableMouseListener.java
phyre/src/java/org/apache/avalon/phyre/panels/navigation
AbstractNavigationPanel.java
ApplicationNavigationPanel.java
PrimaryNavigationPanel.java
Log:
First cut at phoenix mgmt console
THIS IS VERY RAW AND WILL BE CHANGING THIS IS A PROOF
OF CONCEPT FIRST CHECKIN
*phew* there will be a more detailed followup
msg on avalon-phoenix-dev
Revision Changes Path
1.1 jakarta-avalon-apps/phyre/.cvsignore
Index: .cvsignore
===================================================================
build
dist
local.properties
pss
ins.ior
.cvsignore
1.1 jakarta-avalon-apps/phyre/build.xml
Index: build.xml
===================================================================
<?xml version="1.0"?>
<!--
==============================================================================
Avalon Applications Phyre build file
Type 'ant' to build. The flag '-projecthelp' will list normal targets. If
combined with '-verbose', all targets are printed.
This buildfile delegates all of the actual functionality to the main
avalon-apps buildfile using the <ant/> task, calling targets that are named
module:{xxx}.
Authors:
Peter Royal <pr...@apache.org>
Legal:
Copyright (c) 2002 The Apache Software Foundation. All Rights Reserved.
==============================================================================
-->
<project name="Phyre" default="main" basedir=".">
<!-- ==========================================================================================
DEFAULT TARGETS
========================================================================================== -->
<target name="main" depends="jar" description="Default target to generate build products minus docs"/>
<target name="all" depends="main,docs" description="Generate build products including docs"/>
<target name="docs" depends="html-docs,javadocs" description="generates all the Avalon documentation"/>
<!-- ==========================================================================================
COMPILE TARGETS
========================================================================================== -->
<target name="compile">
<ant antfile="${basedir}/../build.xml" target="module:compiler"/>
</target>
<target name="test" description="Run unit tests to verify the application works corretly.">
<ant antfile="${basedir}/../build.xml" target="module:test"/>
</target>
<!-- ==========================================================================================
DISTRIBUTION TARGETS
========================================================================================== -->
<target name="jar">
<ant antfile="${basedir}/../build.xml" target="module:jar"/>
</target>
<target name="dist">
<ant antfile="${basedir}/../build.xml" target="module:dist"/>
</target>
<target name="bin-dist">
<ant antfile="${basedir}/../build.xml" target="module:bin-dist"/>
</target>
<target name="src-dist">
<ant antfile="${basedir}/../build.xml" target="module:src-dist"/>
</target>
<target name="install" description="Installs into Phoenix">
<ant antfile="${basedir}/../build.xml" target="module:install"/>
</target>
<target name="uninstall" description="Uninstalls from Phoenix">
<ant antfile="${basedir}/../build.xml" target="module:uninstall"/>
</target>
<target name="clean" description="Cleans up artifacts from build process">
<ant antfile="${basedir}/../build.xml" target="module:clean"/>
</target>
<target name="distclean">
<echo message="-------------------------------------------------------------" />
<echo message="WARNING: Deprecated. Use the real-clean target instead" />
<echo message="-------------------------------------------------------------" />
<ant antfile="${basedir}/../build.xml" target="module:real-clean"/>
</target>
<target name="real-clean" description="Cleans up all generated files and directories">
<ant antfile="${basedir}/../build.xml" target="module:real-clean"/>
</target>
<!-- ==========================================================================================
DOCUMENTATION GENERATION
========================================================================================== -->
<!-- copy docs to site dir -->
<target name="site" depends="docs" description=" Places Docs ready for hosting on website">
<ant antfile="${basedir}/../build.xml" target="module:site"/>
</target>
<!-- Creates javadocs -->
<target name="javadocs" depends="compile" description="Generates the javadocs" unless="skip.javadocs">
<ant antfile="${basedir}/../build.xml" target="module:javadocs"/>
</target>
<target name="html-docs" description="generates the xdocs-based documentation">
<ant antfile="${basedir}/../build.xml" target="module:html-docs"/>
</target>
</project>
1.1 jakarta-avalon-apps/phyre/default.properties
Index: default.properties
===================================================================
# ============================================================================
# Standard Build Properties for XCommander
# ============================================================================
# Overrides the incorrect values in ../default.properties.
# ----------------------------------------------------------------------------
# DOC GENERATION CONFIGURATION
# ----------------------------------------------------------------------------
name = phyre
Name = Avalon Apps Phyre
dir-name = phyre
version = 0.1
package-version = 1.0
year = 2002
1.1 jakarta-avalon-apps/phyre/readme.txt
Index: readme.txt
===================================================================
Avalons Applications Phyre
--------------------------
What is Phyre?
-------------------
Extensible swing GUI for controlling phoenix
How do I use it?
----------------
<fill in here...>
What are the plans for Phyre?
----------------------------------
<fill in here...>
Who wrote it?
-------------
That'd be me, Peter Royal <pr...@apache.org>. primarily on time paid for
by the pace systems group, inc. <http://pace2020.com>
Can I get support?
------------------
If you have trouble getting it running, try the avalon-user list and
we'll try and help you out.
Isn't there any more documentation?
-----------------------------------
Not yet. Feel free to help!
1.1 jakarta-avalon-apps/phyre/lib/LICENSE.mx4j.txt
Index: LICENSE.mx4j.txt
===================================================================
/* ====================================================================
* The MX4J License, Version 1.0
*
* Copyright (c) 2001 MX4J. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* MX4J project (http://mx4j.sourceforge.net)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "MX4J" and "mx4j" must not be used to endorse or promote
* products derived from this software without prior written
* permission. For written permission, please contact biorn_steedom@users.sourceforge.net
*
* 5. Products derived from this software may not be called "MX4J",
* nor may "MX4J" appear in their name, without prior written
* permission of Simone Bordet.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL CARLOS QUIROZ OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of MX4J. For more information on
* MX4J, please see
* <http://mx4j.sourceforge.net>.
*/
1.1 jakarta-avalon-apps/phyre/lib/avalon-framework-20020725.jar
<<Binary file>>
1.1 jakarta-avalon-apps/phyre/lib/mx4j-jmx.jar
<<Binary file>>
1.1 jakarta-avalon-apps/phyre/lib/mx4j-tools.jar
<<Binary file>>
1.1 jakarta-avalon-apps/phyre/lib/xalan-2.3.1.jar
<<Binary file>>
1.1 jakarta-avalon-apps/phyre/lib/xerces-2.0.1.jar
<<Binary file>>
1.1 jakarta-avalon-apps/phyre/lib/xml-apis.jar
<<Binary file>>
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/Main.java
Index: Main.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;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class Main
{
public static void main( String args[] )
{
final PhyreFrame frame = new PhyreFrame( "phyre" );
frame.show();
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/MenuBar.java
Index: MenuBar.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;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.Event;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
/**
*
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class MenuBar extends JMenuBar
{
private PhyreFrame m_frame;
private JMenu m_menuFile;
private JMenu m_menuOptions;
private JMenu m_menuWindow;
/*---------------------------------------------------------------
* Constructors
*-------------------------------------------------------------*/
MenuBar( PhyreFrame frame/*, ProfilerManager profilerManager*/ )
{
m_frame = frame;
add( buildFileMenu() );
}
/*---------------------------------------------------------------
* Methods
*-------------------------------------------------------------*/
private JMenu buildFileMenu()
{
m_menuFile = new JMenu( "File" );
m_menuFile.setMnemonic( KeyEvent.VK_F );
// Clear
Action connectAction = new AbstractAction( "Connect" )
{
public void actionPerformed( ActionEvent event )
{
m_frame.connect();
}
};
JMenuItem connectItem = new JMenuItem( connectAction );
connectItem.setMnemonic( 'C' );
m_menuFile.add( connectItem );
// Seperator
m_menuFile.addSeparator();
// Exit
Action exitAction = new AbstractAction( "Exit" )
{
public void actionPerformed( ActionEvent event )
{
m_frame.fileExit();
}
};
JMenuItem exit = new JMenuItem( exitAction );
exit.setMnemonic( 'X' );
exit.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK) );
m_menuFile.add( exit );
return m_menuFile;
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/PhyreFrame.java
Index: PhyreFrame.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;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.apache.avalon.phyre.actions.SwitchContentPanelAction;
import org.apache.avalon.phyre.dialogs.ConnectDialog;
import org.apache.avalon.phyre.mbean.MBeanManager;
import org.apache.avalon.phyre.panels.HomePanel;
import org.apache.avalon.phyre.panels.navigation.PrimaryNavigationPanel;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class PhyreFrame extends JFrame
{
private final String m_title;
private MenuBar m_menuBar;
private JPanel m_lhsPanel;
private Component m_content;
private Component m_nav;
private MBeanManager m_beanManager;
public PhyreFrame( String title )
{
super();
m_title = title;
init();
}
private void init()
{
setTitle( m_title );
getContentPane().setLayout( new BorderLayout() );
this.m_lhsPanel = new JPanel( new BorderLayout() );
getContentPane().add( m_lhsPanel, BorderLayout.WEST );
final JButton button = new JButton( new SwitchContentPanelAction( "Phoenix Management Console", HomePanel.class, this ) );
button.addActionListener( new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
if( e.getID() == ActionEvent.ACTION_PERFORMED )
{
setNavigationPanel( new PrimaryNavigationPanel( PhyreFrame.this ) );
}
}
} );
m_lhsPanel.add( button, BorderLayout.NORTH );
setNavigationPanel( new PrimaryNavigationPanel( this ) );
setContentPanel( new JLabel( "not connected" ) );
// Create a Menu Bar
m_menuBar = new MenuBar( this );
setJMenuBar( m_menuBar );
setLocation( 50, 50 );
setSize( 800, 600 );
addWindowListener( new WindowAdapter()
{
public void windowClosing( WindowEvent e )
{
shutdown();
}
} );
//just for testing, immediately connect
try
{
this.m_beanManager = new MBeanManager( "localhost", 1099 );
setContentPanel( new HomePanel( this ) );
}
catch( Exception e )
{
e.printStackTrace();
}
}
public void setContentPanel( JComponent component )
{
if( null != this.m_content )
{
getContentPane().remove( this.m_content );
}
getContentPane().add( component, BorderLayout.CENTER );
getContentPane().validate();
this.m_content = component;
}
public void setNavigationPanel( Component component )
{
if( null != this.m_nav )
{
this.m_lhsPanel.remove( m_nav );
}
this.m_lhsPanel.add( component, BorderLayout.CENTER );
this.m_lhsPanel.validate();
this.m_nav = component;
}
private void shutdown()
{
// Kill the JVM.
System.exit( 1 );
}
public MBeanManager getMBeanManager()
{
return m_beanManager;
}
void fileExit()
{
SwingUtilities.invokeLater( new Runnable()
{
public void run()
{
shutdown();
}
} );
}
void connect()
{
final ConnectDialog dialog = new ConnectDialog( this );
dialog.show();
if( dialog.getAction() == ConnectDialog.BUTTON_OK )
{
try
{
this.m_beanManager = new MBeanManager( dialog.getHost(), dialog.getPort() );
setContentPanel( new HomePanel( this ) );
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/actions/MBeanInvokeAction.java
Index: MBeanInvokeAction.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.actions;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import org.apache.avalon.phyre.mbean.MBeanAccessor;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class MBeanInvokeAction extends AbstractAction
{
private final MBeanAccessor m_mBeanAccessor;
private final String m_invokeName;
public MBeanInvokeAction( final String caption,
final String invokeName,
final MBeanAccessor mBeanAccessor )
{
super( caption );
m_mBeanAccessor = mBeanAccessor;
m_invokeName = invokeName;
}
public void actionPerformed( ActionEvent event )
{
if( event.getID() == ActionEvent.ACTION_PERFORMED )
{
try
{
m_mBeanAccessor.invoke( m_invokeName );
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/actions/MBeanSwitchContentPanelAction.java
Index: MBeanSwitchContentPanelAction.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.actions;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.mbean.MBeanAccessor;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class MBeanSwitchContentPanelAction extends SwitchContentPanelAction
{
private final MBeanAccessor m_mbean;
public MBeanSwitchContentPanelAction( final String caption,
final MBeanAccessor mbean,
final Class panelClass,
final PhyreFrame frame )
{
super( caption, panelClass, frame );
m_mbean = mbean;
}
protected Object[] getParameters()
{
return new Object[]{m_mbean, getFrame()};
}
protected Class[] getParameterTypes()
{
return new Class[]{MBeanAccessor.class, PhyreFrame.class};
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/actions/SwitchContentPanelAction.java
Index: SwitchContentPanelAction.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.actions;
import java.awt.event.ActionEvent;
import java.lang.reflect.Constructor;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import org.apache.avalon.phyre.PhyreFrame;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class SwitchContentPanelAction extends AbstractAction
{
private final Constructor m_panelConstructor;
private final PhyreFrame m_frame;
public SwitchContentPanelAction( final String caption,
final Class panelClass,
final PhyreFrame frame )
{
super( caption );
m_frame = frame;
try
{
m_panelConstructor = panelClass.getConstructor( getParameterTypes() );
}
catch( Exception e )
{
e.printStackTrace();
throw new RuntimeException( "invalid class: " + e.getMessage() );
}
}
protected Class[] getParameterTypes()
{
return new Class[]{PhyreFrame.class};
}
public void actionPerformed( ActionEvent e )
{
if( ActionEvent.ACTION_PERFORMED == e.getID() )
{
try
{
final JComponent pane =
( JComponent ) m_panelConstructor.newInstance( getParameters() );
getFrame().setContentPanel( pane );
}
catch( Exception e1 )
{
e1.printStackTrace();
}
}
}
protected Object[] getParameters()
{
return new Object[]{getFrame()};
}
protected PhyreFrame getFrame()
{
return m_frame;
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/dialogs/AbstractOptionDialog.java
Index: AbstractOptionDialog.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.dialogs;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;
/**
*
* @author <a href="mailto:leif@tanukisoftware.com">Leif Mortenson</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/07/26 20:16:36 $
* @since 4.1
*/
public abstract class AbstractOptionDialog
extends JDialog
{
public static final int BUTTON_OK = 1;
public static final int BUTTON_CANCEL = 2;
private int m_action = BUTTON_CANCEL;
/*---------------------------------------------------------------
* Constructors
*-------------------------------------------------------------*/
/**
* Creates a new AbstractOptionDialog.
*
* @param frame Frame which owns the dialog.
* @param title Title for the dialog.
* @param buttons List of buttons to display.
*/
protected AbstractOptionDialog( JFrame frame, String title, int buttons )
{
super( frame, title, true );
JPanel contentPane = ( JPanel ) getContentPane();
contentPane.setLayout( new BorderLayout() );
contentPane.setBorder( new EmptyBorder( 5, 5, 5, 5 ) );
JPanel backPane = new JPanel();
backPane.setLayout( new BorderLayout() );
backPane.setBorder(
new CompoundBorder(
new EmptyBorder( 0, 0, 5, 0 ),
new CompoundBorder(
new EtchedBorder( EtchedBorder.LOWERED ),
new EmptyBorder( 5, 5, 5, 5 )
)
)
);
contentPane.add( backPane, BorderLayout.CENTER );
// Build the message
backPane.add( new JLabel( getMessage(), SwingConstants.LEFT ), BorderLayout.NORTH );
// Build the main panel
JPanel mainPanel = getMainPanel();
mainPanel.setBorder( new EmptyBorder( 5, 0, 0, 0 ) );
backPane.add( mainPanel, BorderLayout.CENTER );
// Build the button panel
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout( new FlowLayout( FlowLayout.CENTER ) );
Box buttonBox = Box.createHorizontalBox();
if( ( buttons & BUTTON_OK ) != 0 )
{
Action action = new AbstractAction( "OK" )
{
public void actionPerformed( ActionEvent event )
{
if( validateFields() )
{
m_action = BUTTON_OK;
AbstractOptionDialog.this.hide();
}
}
};
JButton button = new JButton( action );
buttonBox.add( button );
buttonBox.add( Box.createHorizontalStrut( 5 ) );
}
if( ( buttons & BUTTON_CANCEL ) != 0 )
{
Action action = new AbstractAction( "Cancel" )
{
public void actionPerformed( ActionEvent event )
{
m_action = BUTTON_CANCEL;
AbstractOptionDialog.this.hide();
}
};
JButton button = new JButton( action );
buttonBox.add( button );
buttonBox.add( Box.createHorizontalStrut( 5 ) );
}
buttonPanel.add( buttonBox );
contentPane.add( buttonPanel, BorderLayout.SOUTH );
pack();
// Position the dialog.
Point frameLocation = frame.getLocation();
Dimension frameSize = frame.getSize();
Dimension size = getSize();
setLocation(
( int ) ( frameLocation.getX() + ( frameSize.getWidth() - size.getWidth() ) / 2 ),
( int ) ( frameLocation.getY() + ( frameSize.getHeight() - size.getHeight() ) / 2 ) );
// Make the dialog a fixed size.
setResizable( false );
}
/*---------------------------------------------------------------
* Methods
*-------------------------------------------------------------*/
/**
* Returns the message to show at the top of the dialog.
*
* @return The text of the message.
*/
protected abstract String getMessage();
/**
* Returns the main panel which makes up the guts of the dialog.
*
* @return The main panel.
*/
protected abstract JPanel getMainPanel();
/**
* Goes through and validates the fields in the dialog.
*
* @return True if the fields were Ok.
*/
protected boolean validateFields()
{
return true;
}
/**
* Returns the button which the user selected.
*/
public int getAction()
{
return m_action;
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/dialogs/AbstractTabularOptionDialog.java
Index: AbstractTabularOptionDialog.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.dialogs;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* Creates a dialog which displays a table of labeled components to the user.
*
* @author <a href="mailto:leif@silveregg.co.jp">Leif Mortenson</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/07/26 20:16:36 $
* @since 4.1
*/
public abstract class AbstractTabularOptionDialog
extends AbstractOptionDialog
{
/*---------------------------------------------------------------
* Constructors
*-------------------------------------------------------------*/
/**
* Creates a new AbstractTabularOptionDialog.
*
* @param frame Frame which owns the dialog.
* @param title Title for the dialog.
* @param buttons List of buttons to display.
*/
protected AbstractTabularOptionDialog( JFrame frame, String title, int buttons )
{
super( frame, title, buttons );
}
/*---------------------------------------------------------------
* AbstractOptionDialog Methods
*-------------------------------------------------------------*/
/**
* Returns the main panel which makes up the guts of the dialog.
* This implementaton builds a table of labeled components using
* arrays returned by getMainPanelLabels() and getMainPanelComponents();
*
* @return The main panel.
*/
protected JPanel getMainPanel()
{
String[] labels = getMainPanelLabels();
Component[] components = getMainPanelComponents();
JPanel panel = new JPanel();
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
panel.setLayout( gbl );
for( int i = 0; i < labels.length; i++ )
{
addRow( panel, labels[i], components[i], gbl, gbc );
}
return panel;
}
/*---------------------------------------------------------------
* Methods
*-------------------------------------------------------------*/
/**
* Returns an array of labels to use for the components returned from
* getMainPanelComponents().
*
* @returns An array of labels.
*/
protected abstract String[] getMainPanelLabels();
/**
* Returns an array of components to show in the main panel of the dialog.
*
* @returns An array of components.
*/
protected abstract Component[] getMainPanelComponents();
/**
* Adds a row to the panel consisting of a label and component, separated by
* a 5 pixel spacer and followed by a 5 pixel high row between this and the
* next row.
*
* @param panel Panel to which the row will be added.
* @param label Text of the label for the component.
* @param component Component which makes up the row.
* @param gbl GridBagLayout which must have been set as the layour of the
* panel.
* @param gbc GridBagConstraints to use when laying out the row.
*/
private void addRow( JPanel panel,
String label,
Component component,
GridBagLayout gbl,
GridBagConstraints gbc )
{
JLabel jLabel = new JLabel( label );
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.EAST;
gbl.setConstraints( jLabel, gbc );
panel.add( jLabel );
// Add a 5 pixel high spacer
Component spacer = Box.createRigidArea( new Dimension( 5, 5 ) );
gbc.gridwidth = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.WEST;
gbl.setConstraints( spacer, gbc );
panel.add( spacer );
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.WEST;
gbl.setConstraints( component, gbc );
panel.add( component );
// Add a 5 pixel high spacer
spacer = Box.createRigidArea( new Dimension( 5, 5 ) );
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.WEST;
gbl.setConstraints( spacer, gbc );
panel.add( spacer );
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/dialogs/ConnectDialog.java
Index: ConnectDialog.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.dialogs;
import java.awt.Component;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import org.apache.avalon.phyre.PhyreFrame;
/**
*
* @author <a href="mailto:leif@tanukisoftware.com">Leif Mortenson</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/07/26 20:16:36 $
* @since 4.1
*/
public class ConnectDialog
extends AbstractTabularOptionDialog
{
private JTextField m_hostField;
private String m_host;
private JTextField m_portField;
private int m_port;
/*---------------------------------------------------------------
* Constructors
*-------------------------------------------------------------*/
/**
* Creates a new ConnectDialog.
*
* @param frame Frame which owns the dialog.
*/
public ConnectDialog( PhyreFrame frame )
{
super( frame, "Connect to Remote Instrument Manager",
AbstractOptionDialog.BUTTON_OK | AbstractOptionDialog.BUTTON_CANCEL );
}
/*---------------------------------------------------------------
* AbstractOptionDialog Methods
*-------------------------------------------------------------*/
/**
* Returns the message to show at the top of the dialog.
*
* @return The text of the message.
*/
protected String getMessage()
{
return "Please enter the host and port of the InstrumentManager to connect to.";
}
/**
* Goes through and validates the fields in the dialog.
*
* @return True if the fields were Ok.
*/
protected boolean validateFields()
{
// Check the host.
String host = m_hostField.getText().trim();
if( host.length() == 0 )
{
JOptionPane.showMessageDialog( this, "Please enter a valid host name or IP address.",
"Invalid host", JOptionPane.ERROR_MESSAGE );
return false;
}
m_host = host;
// Check the port.
boolean portOk = true;
int port = 0;
try
{
port = Integer.parseInt( m_portField.getText().trim() );
}
catch( NumberFormatException e )
{
portOk = false;
}
if( ( port < 0 ) || ( port > 65535 ) )
{
portOk = false;
}
if( !portOk )
{
JOptionPane.showMessageDialog( this, "Please enter a valid port. (1-65535)",
"Invalid port", JOptionPane.ERROR_MESSAGE );
return false;
}
m_port = port;
return true;
}
/*---------------------------------------------------------------
* AbstractTabularOptionDialog Methods
*-------------------------------------------------------------*/
/**
* Returns an array of labels to use for the components returned from
* getMainPanelComponents().
*
* @returns An array of labels.
*/
protected String[] getMainPanelLabels()
{
return new String[]
{
"Host:",
"Port:"
};
}
/**
* Returns an array of components to show in the main panel of the dialog.
*
* @returns An array of components.
*/
protected Component[] getMainPanelComponents()
{
m_hostField = new JTextField();
m_hostField.setColumns( 20 );
m_hostField.setText( "localhost " );
m_portField = new JTextField();
m_portField.setColumns( 6 );
m_portField.setText( "1099" );
return new Component[]
{
m_hostField,
m_portField
};
}
/*---------------------------------------------------------------
* Methods
*-------------------------------------------------------------*/
/**
* Sets the initial host to be shown in the host TextField.
*
* @param host The initial host.
*/
void setHost( String host )
{
m_host = host;
m_hostField.setText( host );
}
/**
* Returns the host set in the dialog.
*
* @return The host.
*/
public String getHost()
{
return m_host;
}
/**
* Sets the initial port to be shown in the port TextField.
*
* @param port The initial port.
*/
void setPort( int port )
{
m_port = port;
m_portField.setText( Integer.toString( port ) );
}
/**
* Returns the port set in the dialog.
*
* @return The port.
*/
public int getPort()
{
return m_port;
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/mbean/MBeanAccessor.java
Index: MBeanAccessor.java
===================================================================
package org.apache.avalon.phyre.mbean;
import java.util.ArrayList;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import mx4j.connector.RemoteMBeanServer;
/**
* This is a small utility class to allow easy access to mbean attributes.
*
* @author <a href="mailto:peter@apache.org">Peter Donald</a>
*/
public class MBeanAccessor
{
private final RemoteMBeanServer m_mBeanServer;
private final ObjectName m_objectName;
private MBeanInfo m_mBeanInfo;
private ObjectInstance m_objectInstance;
/** Hold the attribute objects by attribute name */
private ArrayList m_attributes = new ArrayList();
/**
* Create an accessor that treats, mBean attributes as normal attributes.
* It also adds a special attribute "meta" via which you can get the
* MBeanInfo.
*
* @param mBeanInfo the MBeanInfo to wrap
*/
public MBeanAccessor( final ObjectName objectName, final RemoteMBeanServer mBeanServer )
{
m_objectName = objectName;
m_mBeanServer = mBeanServer;
}
public String className()
throws Exception
{
return getObjectInstance().getClassName();
}
public MBeanInfo info()
throws Exception
{
return getMBeanInfo();
}
public ObjectName name()
{
return m_objectName;
}
/**
* Accessor method to get the fields by name.
*
* @param fieldName Name of static field to retrieve
*
* @return The value of the given field.
*/
public Object get( String fieldName )
throws Exception
{
//We need to force load the MBeanInfo
//If it hasn't yet been loaded
getMBeanInfo();
if( m_attributes.contains( fieldName ) )
{
return m_mBeanServer.getAttribute( m_objectName, fieldName );
}
else
{
return null;
}
}
private MBeanInfo getMBeanInfo()
throws Exception
{
if( null == m_mBeanInfo )
{
m_mBeanInfo = m_mBeanServer.getMBeanInfo( m_objectName );
final MBeanAttributeInfo[] attributes = m_mBeanInfo.getAttributes();
if( null != attributes )
{
for( int i = 0; i < attributes.length; i++ )
{
final MBeanAttributeInfo attribute = attributes[i];
m_attributes.add( attribute.getName() );
}
}
}
return m_mBeanInfo;
}
private ObjectInstance getObjectInstance()
throws Exception
{
if( null == m_objectInstance )
{
m_objectInstance = m_mBeanServer.getObjectInstance( m_objectName );
}
return m_objectInstance;
}
public Object invoke( final String name ) throws Exception
{
return invoke( name, new Object[0], new String[0] );
}
private String[] getParameterTypes( final Object[] params )
{
final String[] types = new String[params.length];
for( int i = 0; i < params.length; i++ )
{
types[i] = params[i].getClass().getName();
}
return types;
}
public Object invoke( final String name, final Object[] params ) throws Exception
{
return invoke( name, params, getParameterTypes( params ) );
}
public Object invoke( final String name,
final Object[] params,
final String[] paramTypes )
throws Exception
{
try
{
return m_mBeanServer.invoke( m_objectName, name, params, paramTypes );
}
catch( InstanceNotFoundException e )
{
throw new RuntimeException( "Unable to locate MBean: " + e.getMessage() );
}
catch( MBeanException e )
{
e.printStackTrace();
throw new RuntimeException( "Exception invoking method: " + e.getMessage() );
}
catch( ReflectionException e )
{
throw e.getTargetException();
}
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/mbean/MBeanManager.java
Index: MBeanManager.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.mbean;
import java.util.Hashtable;
import javax.management.ObjectName;
import mx4j.connector.RemoteMBeanServer;
import mx4j.connector.rmi.RMIConnector;
import mx4j.connector.rmi.jrmp.JRMPConnector;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class MBeanManager
{
private final RMIConnector m_connector;
private final RemoteMBeanServer m_server;
private final String m_host;
private final int m_port;
public MBeanManager( String host, int port ) throws Exception
{
this.m_host = host;
this.m_port = port;
this.m_connector = new JRMPConnector();
this.m_connector.connect( "jrmp", createProperties( host, port ) );
this.m_server = this.m_connector.getRemoteMBeanServer();
}
private Hashtable createProperties( String host, int port )
{
Hashtable h = new Hashtable( 2 );
h.put( "java.naming.provider.url", "rmi://" + host + ":" + port );
h.put( "java.naming.factory.initial", "com.sun.jndi.rmi.registry.RegistryContextFactory" );
return h;
}
public MBeanAccessor getObject( final String name )
throws Exception
{
return new MBeanAccessor( getObjectName( name ), m_server );
}
private ObjectName getObjectName( final String name )
throws Exception
{
//Deal with domains et al here
return new ObjectName( name );
}
public void close()
{
this.m_connector.close();
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/AbstractContentPanel.java
Index: AbstractContentPanel.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.panels;
import java.awt.LayoutManager;
import javax.swing.JPanel;
import org.apache.avalon.phyre.PhyreFrame;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class AbstractContentPanel extends JPanel
{
protected final PhyreFrame m_phyreFrame;
public AbstractContentPanel( PhyreFrame phyreFrame, LayoutManager layout )
{
super( layout );
this.m_phyreFrame = phyreFrame;
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/AbstractMBeanPanel.java
Index: AbstractMBeanPanel.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.panels;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.mbean.MBeanAccessor;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public abstract class AbstractMBeanPanel extends AbstractContentPanel
{
private MBeanAccessor m_mbean;
public AbstractMBeanPanel( PhyreFrame phyreFrame )
{
super( phyreFrame, new BorderLayout() );
}
protected void initialize() throws Exception
{
final JPanel panel = new JPanel( new GridLayout( 0, 2 ) );
add( panel, BorderLayout.CENTER );
addAttributes( panel );
addOperations();
}
protected void setMBean( MBeanAccessor mbean )
{
m_mbean = mbean;
}
protected void addAttributes( JPanel panel ) throws Exception
{
final MBeanInfo info = this.getMBean().info();
final MBeanAttributeInfo[] attributeInfos = info.getAttributes();
for( int i = 0; i < attributeInfos.length; i++ )
{
panel.add( new JLabel( attributeInfos[i].getName() ) );
panel.add( new JLabel( this.getMBean().get( attributeInfos[i].getName() ).toString() ) );
}
}
protected abstract void addOperations();
protected MBeanAccessor getMBean()
{
return m_mbean;
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/ApplicationPanel.java
Index: ApplicationPanel.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.panels;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.actions.MBeanInvokeAction;
import org.apache.avalon.phyre.mbean.MBeanAccessor;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class ApplicationPanel extends AbstractMBeanPanel
{
private static final String OBJECT_NAME = "Phoenix:application=";
public ApplicationPanel( MBeanAccessor mbean, PhyreFrame phyreFrame ) throws Exception
{
super( phyreFrame );
setMBean( mbean );
initialize();
}
protected void addOperations()
{
try
{
final JPanel panel = new JPanel();
final String name = ( String ) getMBean().get( "displayName" );
panel.add( new JButton( new MBeanInvokeAction( "Stop " + name, "stop", getMBean() ) ) );
panel.add( new JButton( new MBeanInvokeAction( "Restart " + name, "restart", getMBean() ) ) );
panel.add( new JButton( "Undeploy " + name ) );
this.add( panel, BorderLayout.SOUTH );
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/HomePanel.java
Index: HomePanel.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.panels;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.actions.MBeanInvokeAction;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class HomePanel extends AbstractMBeanPanel
{
private static final String OBJECT_NAME = "Phoenix:component=Embeddor";
public HomePanel( PhyreFrame phyreFrame ) throws Exception
{
super( phyreFrame );
setMBean( this.m_phyreFrame.getMBeanManager().getObject( OBJECT_NAME ) );
initialize();
}
protected void addOperations()
{
final JPanel panel = new JPanel();
//TODO: Probably want to close the app or otherwise halt the console if they shutdown
//phoenix okay :)
panel.add( new JButton( new MBeanInvokeAction( "Shutdown Phoenix", "shutdown", getMBean() ) ) );
panel.add( new JButton( new MBeanInvokeAction( "Restart Phoenix", "restart", getMBean() ) ) );
// panel.add( new JButton( "Restart Phoenix in new JVM" ) );
this.add( panel, BorderLayout.SOUTH );
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/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.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.xml.sax.InputSource;
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.phyre.PhyreFrame;
import org.apache.avalon.phyre.mbean.MBeanAccessor;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class ModifyConfigurationPanel extends AbstractContentPanel
{
private static final String VALIDATOR = "Phoenix:component=ConfigurationValidator";
private static final String[] CONFIG_METHOD_TYPES =
new String[]{String.class.getName(), String.class.getName(), Configuration.class.getName()};
private final MBeanAccessor m_configManager;
private final MBeanAccessor m_configValidator;
private final String m_app;
private final String m_block;
private final JTextArea m_textArea;
public ModifyConfigurationPanel( final String app,
final String block,
final MBeanAccessor configManager,
final PhyreFrame phyreFrame )
throws Exception
{
super( phyreFrame, new BorderLayout() );
m_configValidator = phyreFrame.getMBeanManager().getObject( VALIDATOR );
m_configManager = configManager;
m_block = block;
m_app = app;
m_textArea = new JTextArea();
add( new JScrollPane( m_textArea ), BorderLayout.CENTER );
addButtons();
loadConfiguration();
}
private void loadConfiguration() throws Exception
{
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 )
{
e.printStackTrace();
throw new RuntimeException( "unable to create configuration: " + e.getMessage() );
}
}
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 )
{
e.printStackTrace();
}
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 )
{
e.printStackTrace();
}
}
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/panels/applist/ApplicationListPanel.java
Index: ApplicationListPanel.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.panels.applist;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.panels.AbstractContentPanel;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class ApplicationListPanel extends AbstractContentPanel
{
public ApplicationListPanel( PhyreFrame phyreFrame ) throws Exception
{
super( phyreFrame, new GridBagLayout() );
final GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 2.0;
constraints.gridwidth = GridBagConstraints.REMAINDER;
add( new JLabel( "Applications", JLabel.CENTER ), constraints );
constraints.weightx = 1.0;
constraints.gridwidth = 1;
add( new JButton( "Deploy an Application" ), constraints );
constraints.gridwidth = GridBagConstraints.REMAINDER;
add( new JButton( "Query Applications" ), constraints );
constraints.weightx = 2.0;
constraints.weighty = 1.0;
final JTable table = new JTable( new ApplicationTableModel( m_phyreFrame ) );
table.addMouseListener( new ApplicationTableMouseListener( m_phyreFrame ) );
add( new JScrollPane( table ), constraints );
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/applist/ApplicationTableModel.java
Index: ApplicationTableModel.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.panels.applist;
import javax.swing.table.AbstractTableModel;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.mbean.MBeanAccessor;
import org.apache.avalon.phyre.mbean.MBeanManager;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class ApplicationTableModel extends AbstractTableModel
{
private static final String KERNEL = "Phoenix:component=Kernel";
private static final String APP = "Phoenix:application=";
private static final String[] COLUMNS = new String[]{"Name", "Description", "Status"};
private final String[] m_applications;
private final MBeanAccessor[] m_mbeans;
public ApplicationTableModel( final PhyreFrame phyreFrame ) throws Exception
{
final MBeanManager manager = phyreFrame.getMBeanManager();
final MBeanAccessor object = manager.getObject( KERNEL );
this.m_applications = ( String[] ) object.get( "applicationNames" );
this.m_mbeans = new MBeanAccessor[this.m_applications.length];
for( int i = 0; i < m_applications.length; i++ )
{
this.m_mbeans[i] = manager.getObject( APP + m_applications[i] );
}
}
public int getColumnCount()
{
return COLUMNS.length;
}
public int getRowCount()
{
return this.m_applications.length;
}
public Object getValueAt( int rowIndex, int columnIndex )
{
try
{
switch( columnIndex )
{
case 0:
return this.m_mbeans[rowIndex].get( "displayName" );
case 1:
return this.m_mbeans[rowIndex].get( "description" );
case 2:
final boolean b = ( ( Boolean ) this.m_mbeans[rowIndex].get( "running" ) ).booleanValue();
return b ? "Running" : "Stopped";
default:
return null;
}
}
catch( Exception e )
{
e.printStackTrace();
throw new RuntimeException( e.getMessage() );
}
}
public String getColumnName( int column )
{
return COLUMNS[column];
}
public MBeanAccessor getMBean( int rowIndex )
{
return this.m_mbeans[rowIndex];
}
public String getApplication( int rowIndex )
{
return this.m_applications[rowIndex];
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/applist/ApplicationTableMouseListener.java
Index: ApplicationTableMouseListener.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.panels.applist;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTable;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.mbean.MBeanAccessor;
import org.apache.avalon.phyre.panels.navigation.ApplicationNavigationPanel;
import org.apache.avalon.phyre.panels.ApplicationPanel;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class ApplicationTableMouseListener extends MouseAdapter
{
private final PhyreFrame m_phyreFrame;
public ApplicationTableMouseListener( PhyreFrame phyreFrame )
{
m_phyreFrame = phyreFrame;
}
public void mouseClicked( MouseEvent e )
{
if( e.getClickCount() > 1 )
{
final JTable table = ( JTable ) e.getSource();
final ApplicationTableModel model = ( ApplicationTableModel ) table.getModel();
try
{
final MBeanAccessor bean = model.getMBean( table.getSelectedRow() );
m_phyreFrame.setContentPanel( new ApplicationPanel( bean, m_phyreFrame ) );
m_phyreFrame.setNavigationPanel( new ApplicationNavigationPanel( bean, m_phyreFrame ) );
}
catch( Exception e1 )
{
e1.printStackTrace();
}
}
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/blocklist/BlockListPanel.java
Index: BlockListPanel.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.panels.blocklist;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.mbean.MBeanAccessor;
import org.apache.avalon.phyre.panels.AbstractContentPanel;
import org.apache.avalon.phyre.panels.applist.ApplicationTableMouseListener;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class BlockListPanel extends AbstractContentPanel
{
public BlockListPanel( MBeanAccessor mbean, PhyreFrame phyreFrame ) throws Exception
{
super( phyreFrame, new GridBagLayout() );
final GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 2.0;
constraints.gridwidth = GridBagConstraints.REMAINDER;
add( new JLabel( "Components", JLabel.CENTER ), constraints );
constraints.weighty = 1.0;
final JTable table = new JTable( new BlockTableModel( mbean, m_phyreFrame ) );
table.addMouseListener( new BlockTableMouseListener( m_phyreFrame ) );
add( new JScrollPane( table ), constraints );
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/blocklist/BlockTableModel.java
Index: BlockTableModel.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.panels.blocklist;
import javax.swing.table.AbstractTableModel;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.mbean.MBeanAccessor;
import org.apache.avalon.phyre.mbean.MBeanManager;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class BlockTableModel extends AbstractTableModel
{
private static final String CONFIG_MANAGER = "Phoenix:component=ConfigurationManager";
private static final String[] COLUMNS = new String[]{"Component Name", "Has Configuration"};
private final String m_name;
private final MBeanAccessor m_mbean;
private final MBeanAccessor m_configManager;
private final String[] m_blocks;
public BlockTableModel( MBeanAccessor mbean, final PhyreFrame phyreFrame ) throws Exception
{
final MBeanManager manager = phyreFrame.getMBeanManager();
this.m_configManager = manager.getObject( CONFIG_MANAGER );
this.m_mbean = mbean;
this.m_blocks = ( String[] ) mbean.get( "blockNames" );
this.m_name = ( String ) mbean.get( "name" );
}
public int getColumnCount()
{
return COLUMNS.length;
}
public int getRowCount()
{
return this.m_blocks.length;
}
public Object getValueAt( int rowIndex, int columnIndex )
{
try
{
switch( columnIndex )
{
case 0:
return getBlockName(rowIndex);
case 1:
return this.m_configManager.invoke( "hasConfiguration", new Object[]{m_name, getBlockName(rowIndex)} );
default:
throw new IllegalArgumentException("invalid column: " + columnIndex);
}
}
catch( Exception e )
{
e.printStackTrace();
throw new RuntimeException( e.getMessage() );
}
}
public String getColumnName( int column )
{
return COLUMNS[column];
}
public Class getColumnClass( int columnIndex )
{
switch( columnIndex )
{
case 0:
return String.class;
case 1:
return Boolean.class;
default:
throw new IllegalArgumentException("invalid column: " + columnIndex);
}
}
public MBeanAccessor getConfigManager()
{
return m_configManager;
}
public String getBlockName( int rowIndex )
{
return m_blocks[ rowIndex ];
}
public String getName()
{
return m_name;
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/blocklist/BlockTableMouseListener.java
Index: BlockTableMouseListener.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.panels.blocklist;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTable;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.panels.ModifyConfigurationPanel;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class BlockTableMouseListener extends MouseAdapter
{
private final PhyreFrame m_phyreFrame;
public BlockTableMouseListener( PhyreFrame phyreFrame )
{
m_phyreFrame = phyreFrame;
}
public void mouseClicked( MouseEvent e )
{
if( e.getClickCount() > 1 )
{
final JTable table = ( JTable ) e.getSource();
final BlockTableModel model = ( BlockTableModel ) table.getModel();
try
{
m_phyreFrame.setContentPanel(
new ModifyConfigurationPanel( model.getName(),
model.getBlockName( table.getSelectedRow() ),
model.getConfigManager(),
m_phyreFrame ) );
}
catch( Exception e1 )
{
e1.printStackTrace();
}
}
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/navigation/AbstractNavigationPanel.java
Index: AbstractNavigationPanel.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.panels.navigation;
import java.awt.GridLayout;
import javax.swing.JPanel;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class AbstractNavigationPanel extends JPanel
{
public AbstractNavigationPanel()
{
super( new GridLayout( 0, 1 ) );
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/navigation/ApplicationNavigationPanel.java
Index: ApplicationNavigationPanel.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.panels.navigation;
import javax.swing.JButton;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.panels.blocklist.BlockListPanel;
import org.apache.avalon.phyre.panels.ApplicationPanel;
import org.apache.avalon.phyre.actions.MBeanSwitchContentPanelAction;
import org.apache.avalon.phyre.mbean.MBeanAccessor;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class ApplicationNavigationPanel extends AbstractNavigationPanel
{
public ApplicationNavigationPanel( final MBeanAccessor appMBean,
final PhyreFrame phyreFrame )
{
try
{
add( new JButton(
new MBeanSwitchContentPanelAction( ( String ) appMBean.get( "displayName" ),
appMBean,
ApplicationPanel.class,
phyreFrame )
) );
add( new JButton( new MBeanSwitchContentPanelAction( "Configuration",
appMBean,
BlockListPanel.class,
phyreFrame )
) );
add( new JButton( "Logging" ) );
add( new JButton( "Manageable Services" ) );
add( new JButton( "Permissions" ) );
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/navigation/PrimaryNavigationPanel.java
Index: PrimaryNavigationPanel.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.panels.navigation;
import javax.swing.JButton;
import javax.swing.JLabel;
import org.apache.avalon.phyre.PhyreFrame;
import org.apache.avalon.phyre.actions.SwitchContentPanelAction;
import org.apache.avalon.phyre.panels.applist.ApplicationListPanel;
/**
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
*/
public class PrimaryNavigationPanel extends AbstractNavigationPanel
{
public PrimaryNavigationPanel( PhyreFrame phyreFrame )
{
add( new JLabel( "Hosted Components" ) );
add( new JButton( new SwitchContentPanelAction( "Hosted Applications", ApplicationListPanel.class, phyreFrame ) ) );
add( new JButton( "Extension Libraries" ) );
add( new JButton( "Loggers" ) );
add( new JLabel( "Container Components" ) );
add( new JButton( "Configuration Repository" ) );
add( new JButton( "Deployer" ) );
add( new JButton( "Log Manager" ) );
add( new JButton( "System Manager" ) );
}
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>