/*******************************************************************************
* ALMA - Atacama Large Millimeter Array
* Copyright (c) ESO - European Southern Observatory, 2011
* (in the framework of the ALMA collaboration).
* All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*******************************************************************************/
package cl.utfsm.samplingSystemUI;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.HashSet;
import java.util.Vector;
import java.util.concurrent.ExecutionException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingWorker;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileFilter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Element;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import cl.utfsm.samplingSystemUI.core.SamplingManager;
import cl.utfsm.samplingSystemUI.core.SamplingManagerException;
/**
* Main Widget class, and starting point for the SSG Software. Controls the
* main flow of the software.
SamplingSystemGUI ask for a Sampling Manager,
* then tries to load a status file, and then presents a window with the
* Components and Properties available for sampling. If there was a status
* file, SamplingSystemGUI will load it, and open the Sampling Groups as
* recorded.
*
* @author Jorge Avarias
* @author Rodrigo Tobar
* @author Alejandro Baltra
* @author Arturo Hoffstadt
* @author Cristian Maureria
*/
public class SamplingSystemGUI extends JFrame {
private static final long serialVersionUID = 1L;
public String MAN_NAME = "";
public boolean correctManName = false;
private LinkedList> propList;
private String[] compList = null;
private ArrayList status;
private HashSet samplingGroups;
private ArrayList BeanGrouperList;
// Menu Widgets
private JMenuBar SSGMenuBar = null;
private JMenu FileMenu = null;
private JMenuItem FileMenuSelectSMButton = null;
private JMenuItem FileMenuLoadStatusButton = null;
private JMenuItem FileMenuSaveStatusButton = null;
private JMenuItem FileMenuExitButton = null;
private JMenu HelpMenu = null;
private JMenuItem HelpMenuAboutButton = null;
// Component and Property Selection and Adding
private JPanel PropertyAddPanel = null;
private JPanel ComponentPanel = null;
private JPanel PropertyPanel = null;
private JLabel componentLabel = null;
private JLabel filterComponentLabel = null;
private JTextField filterComponentTextField = null;
private JComboBox ComponentComboBox = null;
private JLabel propertyLabel = null;
private JComboBox PropertyComboBox = null;
private JLabel filterPropertyLabel = null;
private JTextField filterPropertyTextField = null;
private JLabel groupLabel = null;
private JTextField groupTextField = null;
private JButton addSampleButton = null;
private StatusIcon statusIcon;
private Vector property_sampled;
/**
* This is the default constructor. It starts the initialization of the
* window.
*/
public SamplingSystemGUI() {
super();
BeanGrouperList = new ArrayList();
property_sampled = new Vector();
initialize();
}
/**
* This method initializes this GUI
* @return void
*/
private void initialize() {
this.setLocation(0, 0);
this.setJMenuBar(getSSGMenuBar());
this.setLayout(new GridLayout(1, 1, 10, 10));
this.setContentPane(this.getPropertyAddPanel());
this.setTitle("Sampling System GUI");
this.setLocationRelativeTo(null);
this.pack();
}
/**
* Method to check if a component and a property was previously sampled. The
* argument comp_prop is equal to component:property
*/
public boolean isAlreadySampled(String comp_prop){
for(int i=0; i< property_sampled.size(); i++) {
if(((String)property_sampled.elementAt(i)).compareTo(comp_prop)==0) {
return true;
}
}
return false;
}
/** Add the component:property to the property_sampled vector */
public void addToSampled(String comp_prop) {
if(!isAlreadySampled(comp_prop)) {
property_sampled.add((Object)comp_prop);
}
}
/** removes the componente:property from the property_sampled vector */
public void delFromSampled(String comp_prop){
if(isAlreadySampled(comp_prop)){
property_sampled.remove((Object)comp_prop);
}
}
/**
* This method initializes SSGMenuBar
* @return javax.swing.JMenuBar
*/
private JMenuBar getSSGMenuBar() {
if (SSGMenuBar == null) {
SSGMenuBar = new JMenuBar();
SSGMenuBar.add(getFileMenu());
SSGMenuBar.add(getHelpMenu());
}
return SSGMenuBar;
}
/**
* This method initializes FileMenu
* @return javax.swing.JMenu
*/
private JMenu getFileMenu() {
if (FileMenu == null) {
FileMenu = new JMenu();
FileMenu.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
FileMenu.setName("FileMenu");
FileMenu.setText("File");
FileMenu.add(getFileMenuSelectSMButton());
FileMenu.add(getFileMenuLoadStatusButton());
FileMenu.add(getFileMenuSaveStatusButton());
FileMenu.add(getFileMenuExitButton());
}
return FileMenu;
}
/**
* This method initializes FileMenuSelectSMButton
* @return javax.swing.JMenuItem
*/
private JMenuItem getFileMenuSelectSMButton() {
if (FileMenuSelectSMButton == null) {
FileMenuSelectSMButton = new JMenuItem();
FileMenuSelectSMButton.setText("Choose Sampling Manager");
FileMenuSelectSMButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
String s = (String)JOptionPane.showInputDialog(SamplingSystemGUI.this,
"Please Select a Sampling Manager",
"Sampling Manager Selection",
JOptionPane.PLAIN_MESSAGE,
null,
(Object[])SampTool.getSamplingManagers(),
MAN_NAME);
if( s != null && !s.trim().equals("") )
SamplingSystemGUI.this.MAN_NAME = s;
checkSamplingManager();
}
});
}
return FileMenuSelectSMButton;
}
/**
* This method initializes FileMenuLoadStatusButton
* @return javax.swing.JMenuItem
*/
private JMenuItem getFileMenuLoadStatusButton() {
if (FileMenuLoadStatusButton == null) {
FileMenuLoadStatusButton = new JMenuItem();
FileMenuLoadStatusButton.setText("Load GUI Status");
FileMenuLoadStatusButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
JFileChooser chooser = new JFileChooser();
Filter filter = new Filter();
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(cl.utfsm.samplingSystemUI.SamplingSystemGUI.this);
if(returnVal == JFileChooser.APPROVE_OPTION) {
try {
readStatusFile(chooser.getSelectedFile().getAbsolutePath(),false);
} catch (ParserConfigurationException e1) {
e1.printStackTrace();
} catch (SAXException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
});
}
return FileMenuLoadStatusButton;
}
/**
* This method initializes FileMenuSaveStatusButton
* @return javax.swing.JMenuItem
*/
private JMenuItem getFileMenuSaveStatusButton() {
if (FileMenuSaveStatusButton == null) {
FileMenuSaveStatusButton = new JMenuItem();
FileMenuSaveStatusButton.setText("Save GUI status");
FileMenuSaveStatusButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showSaveDialog(cl.utfsm.samplingSystemUI.SamplingSystemGUI.this);
if(returnVal == JFileChooser.APPROVE_OPTION) {
try {
String file = chooser.getSelectedFile().getAbsolutePath();
if(file.endsWith(".ssgst")){
writeStatusFile(file);
}else{
writeStatusFile(file + ".ssgst");
}
} catch (ParserConfigurationException e1) {
e1.printStackTrace();
} catch (TransformerException e1) {
e1.printStackTrace();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
}
}
});
}
return FileMenuSaveStatusButton;
}
/**
* This method initializes FileMenuExitButton
* @return javax.swing.JMenuItem
*/
private JMenuItem getFileMenuExitButton() {
if (FileMenuExitButton == null) {
FileMenuExitButton = new JMenuItem();
FileMenuExitButton.setText("Exit");
FileMenuExitButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
askClose();
}
});
}
return FileMenuExitButton;
}
/**
* This method initializes HelpMenu
* @return javax.swing.JMenu
*/
private JMenu getHelpMenu() {
if (HelpMenu == null) {
HelpMenu = new JMenu();
FileMenu.setName("HelpMenu");
HelpMenu.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
HelpMenu.setText("Help");
HelpMenu.add(getHelpMenuAboutButton());
}
return HelpMenu;
}
/**
* This method initializes FileMenuSelectSMButton
* @return javax.swing.JMenuItem
*/
private JMenuItem getHelpMenuAboutButton() {
if (HelpMenuAboutButton == null) {
HelpMenuAboutButton = new JMenuItem();
HelpMenuAboutButton.setText("About...");
HelpMenuAboutButton.addActionListener(new java.awt.event.ActionListener() {
private JFrame aboutWindow;
private JFrame getAboutWindow() {
if( aboutWindow == null ) {
String url = "http://alma.inf.utfsm.cl/twiki4/bin/view/ACS/SamplingSystem";
String message = "Sampling System GUI Version 2.0 "
+ "This software is released under LGPL license. "
+ "SSG was developed by the ALMA-UTFSM Team.";
String messageUrl = "Please refer to " + url + " "
+ "for more information.";
aboutWindow = new JFrame("About");
JLabel aboutLabel = new JLabel(message);
JLabel urlLabel = new JLabel(messageUrl);
JLabel imageLabel = new JLabel(new ImageIcon(getClass().getClassLoader().getResource("cl/utfsm/samplingSystemUI/img/alma-utfsm.png")));
JButton closeButton = new JButton("Close");
closeButton.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e) {
aboutWindow.setVisible(false);
aboutWindow.dispose();
}
});
aboutWindow.getContentPane().setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.insets = new Insets(0, 10, 0, 10);
constraints.anchor = GridBagConstraints.WEST;
aboutWindow.getContentPane().add(aboutLabel,constraints);
constraints.anchor = GridBagConstraints.EAST;
aboutWindow.getContentPane().add(imageLabel,constraints);
constraints.gridwidth = 2;
constraints.gridy = 2;
constraints.insets.top = 10;
constraints.insets.bottom = 10;
aboutWindow.getContentPane().add(urlLabel,constraints);
constraints.gridy = 3;
constraints.anchor = GridBagConstraints.EAST;
constraints.insets.top = 0;
aboutWindow.getContentPane().add(closeButton,constraints);
}
return aboutWindow;
};
public void actionPerformed(java.awt.event.ActionEvent e) {
aboutWindow = getAboutWindow();
aboutWindow.setMinimumSize(new Dimension(550, 250));
aboutWindow.setSize(getContentPane().getSize());
aboutWindow.setLocationRelativeTo(null);
aboutWindow.setResizable(false);
aboutWindow.setVisible(true);
}
});
}
return HelpMenuAboutButton;
}
/**
* This method initializes PropertyAddPanel
* @return javax.swing.JPanel
*/
private JPanel getPropertyAddPanel() {
if (PropertyAddPanel == null) {
PropertyAddPanel = new JPanel();
PropertyAddPanel.setMinimumSize(new Dimension(450,350));
PropertyAddPanel.setLayout(new GridBagLayout());
PropertyAddPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
PropertyAddPanel.setPreferredSize(new Dimension(450,350));
ComponentPanel = new JPanel();
PropertyPanel = new JPanel();
ComponentPanel.setLayout(new GridBagLayout());
ComponentPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
ComponentPanel.setBorder(new javax.swing.border.TitledBorder("Components"));
PropertyPanel.setLayout(new GridBagLayout());
PropertyPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
PropertyPanel.setBorder(new javax.swing.border.TitledBorder("Properties"));
GridBagConstraints comp = new GridBagConstraints();
comp.gridheight = 1;
comp.gridwidth = 1;
comp.insets = new Insets(15, 5, 5, 5);
comp.anchor = GridBagConstraints.EAST;
comp.gridx = 0;
comp.gridy = 0;
ComponentPanel.add(getFilterComponentLabel(), comp);
comp.gridx = 1;
comp.gridy = 0;
comp.anchor = GridBagConstraints.WEST;
ComponentPanel.add(getFilterComponentTextField(), comp);
comp.anchor = GridBagConstraints.EAST;
comp.gridx = 0;
comp.gridy = 1;
ComponentPanel.add(getComponentLabel(), comp);
comp.gridx = 1;
comp.gridy = 1;
comp.anchor = GridBagConstraints.WEST;
ComponentPanel.add(getComponentComboBox(), comp);
comp.anchor = GridBagConstraints.EAST;
comp.gridx = 0;
comp.gridy = 0;
PropertyPanel.add(getFilterPropertyLabel(), comp);
comp.gridx = 1;
comp.gridy = 0;
comp.anchor = GridBagConstraints.WEST;
PropertyPanel.add(getFilterPropertyTextField(), comp);
comp.anchor = GridBagConstraints.EAST;
comp.gridx = 0;
comp.gridy = 1;
PropertyPanel.add(getPropertyLabel(), comp);
comp.gridx = 1;
comp.gridy = 1;
comp.anchor = GridBagConstraints.WEST;
PropertyPanel.add(getPropertyComboBox(), comp);
comp.gridx = 0;
GridBagConstraints c = new GridBagConstraints();
c.gridheight = 1;
c.gridwidth = 1;
c.insets = new Insets(15, 5, 5, 5);
c.anchor = GridBagConstraints.EAST;
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 2;
PropertyAddPanel.add(ComponentPanel, c);
c.anchor = GridBagConstraints.EAST;
c.gridy = 1;
c.gridx = 0;
c.gridwidth = 2;
PropertyAddPanel.add(PropertyPanel, c);
c.anchor = GridBagConstraints.EAST;
c.gridy = 2;
c.gridx = 0;
c.gridwidth = 1;
PropertyAddPanel.add(getGroupLabel(), c);
c.gridx = 1;
c.gridy = 2;
c.gridwidth = 1;
c.anchor = GridBagConstraints.WEST;
PropertyAddPanel.add(getGroupTextField(), c);
c.anchor = GridBagConstraints.EAST;
c.gridy = 3;
c.gridx = 0;
c.gridwidth = 2;
PropertyAddPanel.add(getAddSampleButton(), c);
PropertyAddPanel.validate();
// This is a new status icon that should reflect the status of the SSG
c.anchor = GridBagConstraints.WEST;
c.gridy = 3;
c.gridx = 0;
PropertyAddPanel.add(getStatusIcon(), c);
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
askClose();
}
});
}
return PropertyAddPanel;
}
/* This Method ask to the user, if really want to close a Sampling Group Window */
private void askClose(){
Object[] options = {"Yes","No"};
int n = JOptionPane.showOptionDialog(this, "Exit Sampling System GUI?", "Warning",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]);
if (n == JOptionPane.YES_OPTION) {
System.exit(0);
} else if (n == JOptionPane.NO_OPTION){
}
}
/**
* This method initializes statusIcon
*
* @return javax.swing.JLabel
*/
private StatusIcon getStatusIcon() {
if (statusIcon == null) {
statusIcon = new StatusIcon();
}
return statusIcon;
}
/**
* This method initializes ComponentComboBox
* @return javax.swing.JComboBox
*/
private JComboBox getComponentComboBox() {
if (ComponentComboBox == null) {
ComponentComboBox = new JComboBox();
ComponentComboBox.setPreferredSize(new Dimension(320, 24));
//ComponentComboBox.setSize(ComponentComboBox.getPreferredSize());
ComponentComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
if(e.getStateChange() == java.awt.event.ItemEvent.DESELECTED)
return;
PropertyComboBox.setEnabled(true);
String comp = e.getItem().toString();
PropertyComboBox.removeAllItems();
for(int i=0; i, Object> sw = new SwingWorker, Object>() {
public List doInBackground() {
ComponentComboBox.setEnabled(false);
PropertyComboBox.setEnabled(false);
List list_ = SampTool.getPropsForComponent(compList[k]);
return list_;
}
public void done(){
ComponentComboBox.setEnabled(true);
PropertyComboBox.setEnabled(true);
}
};
sw.execute();
try {
List list = sw.get();
if(list == null) {
PropertyComboBox.removeAllItems();
PropertyComboBox.setEnabled(false);
ComponentComboBox.hidePopup();
JOptionPane.showMessageDialog(PropertyComboBox.getParent().getParent(),
"The interface definition for the component '" + comp +
"' could not be found in the Interface Repository\n" +
"Please check that you have the Interface Repository running " +
"and that the interface is loaded into it",
"IR error",
JOptionPane.ERROR_MESSAGE);
} else {
propList.add(i, list);
}
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
try{
if(propList.get(i) != null) {
fillPropertyComboBox(propList.get(i));
}
}catch(IndexOutOfBoundsException ex){
PropertyComboBox.removeAllItems();
PropertyComboBox.setEnabled(false);
}catch(Exception e1){
System.out.println("Unknow exception " + e1);
}
}
}
if(PropertyComboBox.getItemCount()==0)addSampleButton.setEnabled(false);
else addSampleButton.setEnabled(true);
}
});
}
return ComponentComboBox;
}
/**
* This method initializes PropertyComboBox
* @return javax.swing.JComboBox
*/
private JComboBox getPropertyComboBox() {
if (PropertyComboBox == null) {
PropertyComboBox = new JComboBox();
PropertyComboBox.setPreferredSize(new Dimension(320, 24));
//PropertyComboBox.setSize(PropertyComboBox.getPreferredSize());
}
return PropertyComboBox;
}
/**
* This method initializes addSampleButton
* @return javax.swing.JButton
*/
private JButton getAddSampleButton() {
if (addSampleButton == null) {
addSampleButton = new JButton();
addSampleButton.setPreferredSize(new Dimension(120, 24));
addSampleButton.setText("Add Sample");
addSampleButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
if(groupTextField.getText().trim().equalsIgnoreCase("")) return;
String component = ComponentComboBox.getSelectedItem().toString();
String property = PropertyComboBox.getSelectedItem().toString();
String group = groupTextField.getText();
addToSampling(component, property, group);
}
});
}
return addSampleButton;
}
/**
* This method initializes groupLabel
* @return javax.swing.JLabel
*/
private JLabel getGroupLabel() {
if (groupLabel == null) {
groupLabel = new JLabel("Sampling group:");
}
return groupLabel;
}
/**
* This method initializes groupLabel
* @return javax.swing.JLabel
*/
private JLabel getComponentLabel() {
if (componentLabel == null) {
componentLabel = new JLabel("Component:");
}
return componentLabel;
}
/**
* This method initializes filterComponentLabel
* @return javax.swing.JLabel
*/
private JLabel getFilterComponentLabel() {
if (filterComponentLabel == null) {
filterComponentLabel = new JLabel("filter:");
}
return filterComponentLabel;
}
/**
* This method initializes filterComponentTextField
* @return javax.swing.JTextField
*/
private JTextField getFilterComponentTextField() {
if (filterComponentTextField == null) {
Dimension d = new Dimension(100, 19);
filterComponentTextField = new JTextField();
filterComponentTextField.setPreferredSize(d);
filterComponentTextField.setToolTipText("Write a word to find a particular component.");
//filterComponentTextField.setSize(d);
filterComponentTextField.setMinimumSize(d);
filterComponentTextField.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
filterComponentTextField.setHorizontalAlignment(JTextField.LEFT);
filterComponentTextField.getDocument().addDocumentListener(new DocumentListener(){
public void applyFilter(){
int total = compList.length;
String text = filterComponentTextField.getText();
if(!filterComponentTextField.getText().isEmpty()){
ComponentComboBox.removeAllItems();
for (int i = 0; i < total; i++) {
if(compList[i].contains(text)){
ComponentComboBox.addItem(compList[i]);
}
}
ComponentComboBox.hidePopup();
ComponentComboBox.showPopup();
}
else{
ComponentComboBox.hidePopup();
ComponentComboBox.removeAllItems();
for(int j = 0; j < total;j++){
ComponentComboBox.addItem(compList[j]);
}
}
if(ComponentComboBox.getItemCount() == 0){
PropertyComboBox.removeAllItems();
}
}
public void changedUpdate(DocumentEvent e) {
}
public void insertUpdate(DocumentEvent e) {
applyFilter();
}
public void removeUpdate(DocumentEvent e) {
applyFilter();
}
});
}
return filterComponentTextField;
}
/**
* This method initializes filterPropertyLabel
* @return javax.swing.JLabel
*/
private JLabel getFilterPropertyLabel() {
if (filterPropertyLabel == null) {
filterPropertyLabel = new JLabel("filter:");
}
return filterPropertyLabel;
}
/**
* This method initializes filterPropertyTextField
* @return javax.swing.JTextField
*/
private JTextField getFilterPropertyTextField() {
if (filterPropertyTextField == null) {
Dimension d = new Dimension(100, 19);
filterPropertyTextField = new JTextField();
filterPropertyTextField.setPreferredSize(d);
filterPropertyTextField.setToolTipText("Write a word to find a particular property.");
//filterPropertyTextField.setSize(d);
filterPropertyTextField.setMinimumSize(d);
filterPropertyTextField.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
filterPropertyTextField.setHorizontalAlignment(JTextField.LEFT);
filterPropertyTextField.getDocument().addDocumentListener(new DocumentListener(){
public void applyFilter(){
String item = (String)ComponentComboBox.getSelectedItem();
int i = -1;
for (int j =0; j < compList.length; j++ ) {
if(compList[j].compareTo(item) == 0) {
i = j;
break;
}
}
if (i == -1){
PropertyComboBox.removeAll();
return;
}
int total = propList.get(i).size();
String text = filterPropertyTextField.getText();
PropertyComboBox.removeAllItems();
for(int j = 0; j < total;j++){
PropertyComboBox.addItem(propList.get(i).get(j).toString());
}
PropertyComboBox.showPopup();
if(!filterPropertyTextField.getText().isEmpty()){
PropertyComboBox.removeAllItems();
for (int j = 0; j < total; j++) {
if(propList.get(i).get(j).toString().contains(text)){
PropertyComboBox.addItem(propList.get(i).get(j).toString());
}
}
}
else{
PropertyComboBox.hidePopup();
}
}
public void changedUpdate(DocumentEvent e) {
}
public void insertUpdate(DocumentEvent e) {
applyFilter();
}
public void removeUpdate(DocumentEvent e) {
applyFilter();
}
});
}
return filterPropertyTextField;
}
/**
* This method initializes groupLabel
* @return javax.swing.JLabel
*/
private JLabel getPropertyLabel() {
if (propertyLabel == null) {
propertyLabel = new JLabel(" Property:");
}
return propertyLabel;
}
/**
* This method initializes groupTextField
* @return javax.swing.JTextField
*/
private JTextField getGroupTextField() {
if (groupTextField == null) {
Dimension d = new Dimension(150, 19);
groupTextField = new JTextField();
groupTextField.setPreferredSize(d);
//groupTextField.setSize(d);
groupTextField.setMinimumSize(d);
groupTextField.setToolTipText("Sampling Group where to add the new Sample. Only alphanumeric and underscore characters.");
groupTextField.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
groupTextField.setHorizontalAlignment(JTextField.LEFT);
groupTextField.setText("SampGroup");
groupTextField.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
// Do nothing special :)
}
public void focusLost(FocusEvent e) {
if(!groupTextField.getText().matches("^([a-z]|[A-Z]|[0-9]|_)+$")) {
JOptionPane.showConfirmDialog(SamplingSystemGUI.this,
"Group name '" + groupTextField.getText() + "' is invalid.\nPlease use only alphanumeric characters and/or underscores.",
"Invalid group name",
JOptionPane.PLAIN_MESSAGE, JOptionPane.WARNING_MESSAGE);
groupTextField.setText("");
groupTextField.grabFocus();
}
}
});
}
return groupTextField;
}
/**
* Adds a Property to a SamplingGroup, creating its BeanGrouper
* @param component Component that contains the Property to be sampled.
* @param property Property to be sampled.
* @param group SamplingGroup at which the property is to be added.
* @return Whether or not the property was added to the sampling group.
*/
private boolean addToSampling(String component, String property, String group){
if(isAlreadySampled(component + ":" + property)){
JOptionPane.showMessageDialog(null, "Property Already Sampled in another Sampling Group", "Error", JOptionPane.ERROR_MESSAGE);
return false;
} else {
boolean added;
BeanGrouper bg = groupExists(group);
/* If there is no group with this name, we create it */
if (bg == null){
bg = new BeanGrouper(this, group, getStatusIcon().getStatus());
bg.setGroupName(group);
bg.addSamp(component, property);
BeanGrouperList.add(bg);
added = true;
bg.setVisible(true);
}
/* Else, we check if component/property is already added */
else {
if(bg.checkIfExists(component, property)) {
JOptionPane.showMessageDialog(this,
"Component '" + component + "' with property '" + property +
"'\nhas been already added to the sample list for group " + bg.getGroupName(),
"Already added",
JOptionPane.WARNING_MESSAGE);
added = false;
} else {
bg.addSamp(component, property);
added = true;
}
}
return added;
}
}
/**
* Checks if a BeanGrouper with the groupName exists
* @param groupName Name of the SamplingGroup to be searched.
* @return Whether or not the SamplingGroup exits.
*/
private BeanGrouper groupExists(String groupName){
if(BeanGrouperList.isEmpty())
return null;
else{
for(BeanGrouper bg : BeanGrouperList){
if(bg.getGroupName().toString().equalsIgnoreCase(groupName)){
return bg;
}
}
}
return null;
}
public void loadWindow(boolean check) throws ParserConfigurationException, SAXException, IOException{
if (!check){
/* Select the sampling manager */
String s = (String)JOptionPane.showInputDialog(this,
"Please Select a Sampling Manager", "Sampling Manager Selection",
JOptionPane.PLAIN_MESSAGE, null, (Object[])SampTool.getSamplingManagers(),
MAN_NAME);
if(s != null && !s.trim().equals(""))
this.MAN_NAME = s;
else
System.exit(0);
} else {
// Setear el MAN_NAME
// Verificar que es correcto
}
checkSamplingManager();
/* Show the main window */
this.setVisible(true);
this.setResizable(false);
}
private void checkSamplingManager() {
Thread t = new Thread(new Runnable(){
public void run() {
try {
SamplingManager man = SamplingManager.getInstance(MAN_NAME);
man.getSampReference();
} catch (SamplingManagerException e) {
statusIcon.setStatus(StatusIcon.CONNECTED_TO_MANAGER);
for (BeanGrouper bg: BeanGrouperList) {
bg.setStatus(StatusIcon.CONNECTED_TO_MANAGER);
}
JOptionPane.showMessageDialog(null, "Can't connect to Sampling Manager. Isn't posible start some sampling");
return;
}
statusIcon.setStatus(StatusIcon.CONNECTED_TO_SAMPMANAGER);
for (BeanGrouper bg: BeanGrouperList) {
bg.setStatus(StatusIcon.CONNECTED_TO_SAMPMANAGER);
}
}
});
t.start();
}
public void fillWidgets(String[] components, LinkedList> properties){
this.propList = properties;
this.compList = components;
fillComponentComboBox(components);
}
private void fillComponentComboBox(String[] components){
ComponentComboBox.removeAllItems();
for(int i=0;i prop){
PropertyComboBox.removeAllItems();
PropertyComboBox.setEnabled(true);
addSampleButton.setEnabled(true);
for(String s:prop)
PropertyComboBox.addItem(s);
}
private boolean validateStatusFile(String filename){
final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
final String SCHEMA_FILE = "status.xsd";
final String XML_FILE = filename;
boolean valid = false;
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
documentBuilderFactory.setValidating(true);
try {
documentBuilderFactory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
documentBuilderFactory.setAttribute(JAXP_SCHEMA_SOURCE, new File(SCHEMA_FILE));
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// documentBuilder.setErrorHandler(new ParserErrorHandler());
Document parse = documentBuilder.parse(new File(XML_FILE));
if (parse != null)
valid = true;
} catch (SAXException saxEx){
System.out.println("SAXException: XML bad syntax");
} catch (Exception ex) {
System.out.println("Exception: undiscovered exception");
}
return valid;
}
public void specialReadStatusFile(String filename) throws ParserConfigurationException, SAXException, IOException{
readStatusFile(filename, false);
}
private void readStatusFile(String filename, boolean startup) throws ParserConfigurationException, SAXException, IOException{
try {
if(startup){
int n = JOptionPane.showConfirmDialog(this,
"An old status file has been found\nWould you like to load it?",
"Old status file found", JOptionPane.YES_NO_OPTION,
JOptionPane.INFORMATION_MESSAGE);
if(n == JOptionPane.NO_OPTION){
return;
}
}
if(validateStatusFile(filename)){
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new File(filename));
doc.getDocumentElement().normalize();
NodeList listOfSamplingGroup = doc.getElementsByTagName("SamplingGroup");
for(int s=0; s();
samplingGroups = new HashSet();
// Nuevo XML
// BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String root = "SamplingStatus";
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element rootElement = document.createElement(root);
rootElement.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
rootElement.setAttribute("xsi:noNamespaceSchemaLocation", "status.xsd");
document.appendChild(rootElement);
int i = 0;
for(BeanGrouper bg: BeanGrouperList){
for(SerializableProperty sp: bg.getSerializableProperty()){
status.add(i, sp);
samplingGroups.add(sp.getSamplingGroup());
i++;
}
}
int index = 0;
for(int l=0; lsamplers for a given sampling
* group group
* @param samplers The given sampler list
* @param group The belonging sampling group for the given samplers
*/
public synchronized void deleteBeanGrouper(ArrayList samplers, String group) {
for(DataPrinter dp : samplers)
if(status != null){
for(SerializableProperty sp : status) {
if(sp.getComponent().equals(dp.component) &&
sp.getProperty().equals(dp.property) &&
sp.getSamplingGroup().equals(group)) {
status.remove(sp);
break;
}
}
}
for(BeanGrouper bg : BeanGrouperList){
if(bg.getGroupName().toString().equalsIgnoreCase(group)){
bg.setVisible(false);
BeanGrouperList.remove(bg);
bg.dispose();
break;
}
}
}
public void setStatus(int status) {
statusIcon.setStatus(status);
}
}
class Filter extends FileFilter {
@Override
public boolean accept(File f) {
if(f.isDirectory()) return true;
String name = f.getName();
if(name==null) return false;
int index = name.lastIndexOf(".");
if (index <0) return false;
String ext = name.substring(index);
if(ext.equalsIgnoreCase(".ssgst")) return true;
return false;
}
@Override
public String getDescription() {
return "Sample System GUI status File (*.ssgst)";
}
}
class ScriptFilter extends FileFilter {
@Override
public boolean accept(File f) {
if(f.isDirectory()) return true;
String name = f.getName();
if(name==null) return false;
int index = name.lastIndexOf(".");
if (index <0) return false;
String ext = name.substring(index);
if(ext.equalsIgnoreCase(".sh") || ext.equalsIgnoreCase(".py") || ext.equalsIgnoreCase(".pl") || ext.equalsIgnoreCase(".rb")) return true;
return false;
}
@Override
public String getDescription() {
return "Script file(*.sh, *.py, *.pl, *.rb)";
}
}