/** * Copyright 2005-2012 Akiban Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.persistit.ui; import java.awt.FlowLayout; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; /** * @author Peter Beaman * @version 1.0 */ public class TaskSetupPanel extends Box { private final AdminUI _adminUI; private final String _commandName; private final String _taskName; private final List<ParameterComponent> _generalParameterDescriptors = new ArrayList<ParameterComponent>(); private final List<ParameterComponent> _taskSpecificParameterDescriptors = new ArrayList<ParameterComponent>(); private final String _yesMessage; private final String _noMessage; public TaskSetupPanel(final AdminUI ui, final String taskSpecification) throws Exception { super(BoxLayout.Y_AXIS); _adminUI = ui; _yesMessage = ui.getProperty("YesMessage"); _noMessage = ui.getProperty("NoMessage"); final String generalParameters = ui.getProperty("TaskDescriptor.General"); StringTokenizer st; st = new StringTokenizer(generalParameters, ","); while (st.hasMoreTokens()) { final String parameterSpec = st.nextToken(); final ParameterComponent pd = taskParameterDescription(parameterSpec); _generalParameterDescriptors.add(pd); } st = new StringTokenizer(taskSpecification, ","); _taskName = st.nextToken(); _commandName = st.nextToken(); while (st.hasMoreTokens()) { final String parameterSpec = st.nextToken(); final ParameterComponent pd = taskParameterDescription(parameterSpec); _taskSpecificParameterDescriptors.add(pd); } setDescriptionString(_taskName); setOwnerString(_adminUI.getHostName()); } ParameterComponent taskParameterDescription(final String parameterSpec) { final StringTokenizer st2 = new StringTokenizer(parameterSpec, ":"); final String name = st2.nextToken(); final String type = st2.nextToken(); final String caption = st2.nextToken(); final JLabel label = new JLabel(caption); label.setFont(_adminUI.getBoldFont()); label.setForeground(_adminUI.getPersistitAccentColor()); final JPanel labelPanel = offsetPanel(0); labelPanel.add(label); labelPanel.add(Box.createHorizontalGlue()); add(labelPanel); final JPanel panel = offsetPanel(10); if ("STRING".equals(type) || "LINE".equals(type)) { int columns = 50; if (st2.hasMoreTokens()) { columns = Integer.parseInt(st2.nextToken()); } String dflt = ""; if (st2.hasMoreElements()) { dflt = st2.nextToken(); } final JTextField textField = new JTextField(dflt, columns); panel.add(textField); panel.add(Box.createHorizontalGlue()); add(panel); return new ParameterComponent(name, type, textField); } if ("TREES".equals(type)) { final TreeAndVolumeSelector tavSelector = new TreeAndVolumeSelector(); tavSelector.setup(_adminUI); panel.add(tavSelector); add(panel); panel.add(Box.createHorizontalGlue()); return new ParameterComponent(name, type, tavSelector); } if ("BOOLEAN".equals(type)) { final JRadioButton yesButton = new JRadioButton(_yesMessage); final JRadioButton noButton = new JRadioButton(_noMessage); final ButtonGroup group = new ButtonGroup(); group.add(yesButton); group.add(noButton); String dflt = "false"; if (st2.hasMoreTokens()) { dflt = st2.nextToken(); } if ("true".equals(dflt)) yesButton.setSelected(true); else noButton.setSelected(true); panel.add(yesButton); panel.add(noButton); panel.add(Box.createHorizontalGlue()); add(panel); return new ParameterComponent(name, type, yesButton); } if ("INTEGER".equals(type)) { String dflt = ""; if (st2.hasMoreTokens()) { dflt = st2.nextToken(); } final JTextField textField = new JTextField(10); textField.setDocument(new PlainDocument() { @Override public void insertString(final int offs, final String str, final AttributeSet a) throws BadLocationException { boolean okay = true; for (int index = 0; index < str.length() && okay; index++) { if (!Character.isDigit(str.charAt(index))) okay = false; } if (okay) super.insertString(offs, str, a); } }); textField.setText(dflt); panel.add(textField); panel.add(Box.createHorizontalGlue()); add(panel); return new ParameterComponent(name, type, textField); } throw new RuntimeException("Misconfigured admin properties: no such task parameter type " + type); } JPanel offsetPanel(final int size) { final JPanel panel = new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2)); if (size > 0) panel.add(Box.createHorizontalStrut(size)); return panel; } private static class ParameterComponent { String _name; String _type; JComponent _component; ParameterComponent(final String name, final String type, final JComponent component) { _name = name; _type = type; _component = component; } void setStringValue(final String s) { if ("STRING".equals(_type) || "INTEGER".equals(_type) || "LINE".equals(_type)) { ((JTextField) _component).setText(s); } } String getStringValue() { if ("STRING".equals(_type) || "INTEGER".equals(_type) || "LINE".equals(_type)) { return ((JTextField) _component).getText(); } if ("BOOLEAN".equals(_type)) { return (((JRadioButton) _component).isSelected()) ? Boolean.TRUE.toString() : Boolean.FALSE.toString(); } if ("TREES".equals(_type)) { return ((TreeAndVolumeSelector) _component).getTreeListString(); } throw new RuntimeException(); } boolean getBooleanValue() { if ("BOOLEAN".equals(_type)) { return ((JRadioButton) _component).isSelected(); } throw new RuntimeException(); } int getIntValue() { if ("INTEGER".equals(_type)) { return Integer.parseInt(((JTextField) _component).getText()); } throw new RuntimeException(); } } void refresh(final boolean reset) throws RemoteException { for (int index = 0; index < _taskSpecificParameterDescriptors.size(); index++) { final ParameterComponent pc = _taskSpecificParameterDescriptors.get(index); if (pc._component instanceof AdminPanel) { ((AdminPanel) pc._component).refresh(reset); } } } String getTaskName() { return _taskName; } String getCommandName() { return _commandName; } String getCommandLine() { final StringBuilder sb = new StringBuilder(_commandName); for (final ParameterComponent pc : _taskSpecificParameterDescriptors) { sb.append(' '); if ("BOOLEAN".equals(pc._type)) { final String flag = pc._name; final boolean invert = flag.endsWith("~"); if (invert ^ pc.getBooleanValue()) { sb.append("-"); sb.append(flag.charAt(0)); } } else if ("LINE".equals(pc._type)) { sb.setLength(0); sb.append(pc.getStringValue()); } else { sb.append(pc._name); sb.append('='); if ("INTEGER".equals(pc._type)) { sb.append(pc.getIntValue()); } else { sb.append(pc.getStringValue()); } } } return sb.toString(); } String[] argStrings() { final String[] results = new String[_taskSpecificParameterDescriptors.size()]; for (int index = 0; index < results.length; index++) { final ParameterComponent pc = _taskSpecificParameterDescriptors.get(index); results[index] = pc.getStringValue(); } return results; } String getDescriptionString() { final ParameterComponent pc = _generalParameterDescriptors.get(0); return pc.getStringValue(); } void setDescriptionString(final String description) { final ParameterComponent pc = _generalParameterDescriptors.get(0); pc.setStringValue(description); } String getOwnerString() { final ParameterComponent pc = _generalParameterDescriptors.get(1); return pc.getStringValue(); } void setOwnerString(final String owner) { final ParameterComponent pc = _generalParameterDescriptors.get(1); pc.setStringValue(owner); } boolean isVerboseEnabled() { final ParameterComponent pc = _generalParameterDescriptors.get(2); return pc.getBooleanValue(); } long getExpirationTime() { final ParameterComponent pc = _generalParameterDescriptors.get(3); return pc.getIntValue() * 1000L; } }