// **********************************************************************
//
// Copyright (c) 2003-2006 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
package IceGrid.TreeNode;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import IceGrid.AdapterDescriptor;
import IceGrid.Model;
import IceGrid.ObjectDescriptor;
import IceGrid.TableDialog;
import IceGrid.Utils;
class AdapterEditor extends ListElementEditor
{
public JComponent getCurrentStatus(Ice.StringHolder title)
{
JComponent panel = super.getCurrentStatus(title);
if(panel != null)
{
Adapter adapter = getAdapter();
if(adapter == null || adapter.getResolver() == null)
{
panel = null;
}
}
return panel;
}
AdapterEditor(JFrame parentFrame)
{
super(true);
_objects.setEditable(false);
_currentStatus.setEditable(false);
_currentEndpoints.setEditable(false);
_currentEndpoints.setToolTipText(
"Endpoints registered with the IceGrid Registry during the activation of this adapter");
//
// Create buttons
//
//
// _replicaGroupButton
//
Action gotoReplicaGroup = new AbstractAction(
"", Utils.getIcon("/icons/16x16/goto.png"))
{
public void actionPerformed(ActionEvent e)
{
Object obj = _replicaGroupId.getSelectedItem();
Adapter adapter = getAdapter();
ReplicaGroup rg = null;
if(obj instanceof ReplicaGroup)
{
rg = (ReplicaGroup)obj;
}
else
{
String replicaGroupId =
Utils.substitute(obj.toString(), adapter.getResolver());
rg = adapter.getApplication().
findReplicaGroup(replicaGroupId);
}
//
// The button is enabled therefore rg should be != null
//
if(rg != null)
{
adapter.getModel().setSelectionPath(rg.getPath());
}
}
};
gotoReplicaGroup.putValue(Action.SHORT_DESCRIPTION,
"Goto the definition of this replica group");
_replicaGroupButton = new JButton(gotoReplicaGroup);
//
// _objectsButton
//
_objectsDialog = new TableDialog(parentFrame,
"Registered Objects",
"Object Identity",
"Type", true);
Action openObjectsDialog = new AbstractAction("...")
{
public void actionPerformed(ActionEvent e)
{
java.util.Map result = _objectsDialog.show(_objectsMap,
getProperties());
if(result != null)
{
updated();
_objectsMap = result;
setObjectsField();
}
}
};
openObjectsDialog.putValue(Action.SHORT_DESCRIPTION,
"Edit registered objects");
_objectsButton = new JButton(openObjectsDialog);
Action checkRegisterProcess = new AbstractAction("Register Process")
{
public void actionPerformed(ActionEvent e)
{
updated();
}
};
_registerProcess = new JCheckBox(checkRegisterProcess);
_registerProcess.setToolTipText(
"During activation, create a Process object
"
+ "in this adapter and register it with IceGrid
"
+ "to enable clean shutdown; you should register
"
+ "exactly one Process object per server.");
Action checkWaitForActivation =
new AbstractAction("Wait for Activation")
{
public void actionPerformed(ActionEvent e)
{
updated();
}
};
_waitForActivation = new JCheckBox(checkWaitForActivation);
_waitForActivation.setToolTipText(
"When starting the enclosing server, "
+ "does IceGrid
wait for this adapter to become active?");
//
// Associate updateListener with various fields
//
_name.getDocument().addDocumentListener(
new DocumentListener()
{
public void changedUpdate(DocumentEvent e)
{
update();
}
public void insertUpdate(DocumentEvent e)
{
update();
}
public void removeUpdate(DocumentEvent e)
{
update();
}
private void update()
{
updated();
//
// Recompute default id
//
_defaultAdapterId = getAdapter().getDefaultAdapterId(_name.getText());
refreshId();
}
});
_name.setToolTipText(
"Identifies this object adapter within an Ice communicator");
_endpoints.getDocument().addDocumentListener(_updateListener);
_endpoints.setToolTipText(
"The network interfaces on which this adapter receives requests;
"
+ "for example:
"
+ " tcp (listen on all local interfaces using a random port)
"
+ " tcp -h venus.foo.com (listen on just one interface)
"
+ " tcp -t 10000 (sets a timeout of 10,000 milliseconds)
"
+ " ssl -h venus.foo.com (accepts SSL connections instead of plain TCP)"
+ "");
_description.getDocument().addDocumentListener(_updateListener);
_description.setToolTipText(
"An optional description for this object adapter");
JTextField idTextField = (JTextField)
_id.getEditor().getEditorComponent();
idTextField.getDocument().addDocumentListener(_updateListener);
_id.setToolTipText("If set, must be unique within this IceGrid deployment");
JTextField replicaGroupIdTextField = (JTextField)
_replicaGroupId.getEditor().getEditorComponent();
replicaGroupIdTextField.getDocument().addDocumentListener(_updateListener);
_replicaGroupId.setToolTipText("Select a replica group");
JTextField publishedEndpointsTextField = (JTextField)
_publishedEndpoints.getEditor().getEditorComponent();
publishedEndpointsTextField.getDocument().addDocumentListener(_updateListener);
_publishedEndpoints.setToolTipText(
"Direct adapter: endpoints included in proxies created using this adapter.
"
+ "Indirect adapter: endpoints registered with the IceGrid Registry during the activation of this adapter."
+ "");
}
//
// From Editor:
//
void writeDescriptor()
{
AdapterDescriptor descriptor =
(AdapterDescriptor)getAdapter().getDescriptor();
descriptor.name = _name.getText();
descriptor.description = _description.getText();
descriptor.id = getIdAsString();
descriptor.replicaGroupId = getReplicaGroupIdAsString();
descriptor.registerProcess = _registerProcess.isSelected();
descriptor.waitForActivation = _waitForActivation.isSelected();
descriptor.objects = mapToObjectDescriptorSeq(_objectsMap);
}
boolean isSimpleUpdate()
{
AdapterDescriptor descriptor =
(AdapterDescriptor)getAdapter().getDescriptor();
//
// When id change, we need to re-register for updates
//
return descriptor.name.equals(_name.getText())
&& descriptor.id.equals(getIdAsString());
}
void appendCurrentStatus(DefaultFormBuilder builder)
{
builder.append("Status" );
builder.append(_currentStatus, 3);
builder.nextLine();
builder.append("Published Endpoints" );
builder.append(_currentEndpoints, 3);
builder.nextLine();
}
void appendProperties(DefaultFormBuilder builder)
{
builder.append("Adapter Name" );
builder.append(_name, 3);
builder.nextLine();
builder.append("Description");
builder.nextLine();
builder.append("");
builder.nextRow(-2);
CellConstraints cc = new CellConstraints();
JScrollPane scrollPane = new JScrollPane(_description);
builder.add(scrollPane,
cc.xywh(builder.getColumn(), builder.getRow(), 3, 3));
builder.nextRow(2);
builder.nextLine();
builder.append("Adapter ID");
builder.append(_id, 3);
builder.nextLine();
builder.append("Replica Group", _replicaGroupId);
builder.append(_replicaGroupButton);
builder.nextLine();
builder.append("Registered Objects");
builder.append(_objects, _objectsButton);
builder.nextLine();
builder.append("", _registerProcess);
builder.nextLine();
builder.append("", _waitForActivation);
builder.nextLine();
builder.append("Endpoints" );
builder.append(_endpoints, 3);
builder.nextLine();
builder.append("Published Endpoints" );
builder.append(_publishedEndpoints, 3);
builder.nextLine();
}
void postUpdate()
{
//
// Change enclosing properties after successful update
//
String name = _name.getText();
Adapter adapter = getAdapter();
if(!name.equals(_oldName))
{
adapter.removeProperty(_oldName, "Endpoints");
adapter.removeProperty(_oldName, "PublishedEndpoints");
}
adapter.setProperty(name, "Endpoints", _endpoints.getText());
Object published = _publishedEndpoints.getSelectedItem();
if(published == PUBLISH_ACTUAL)
{
adapter.removeProperty(name, "PublishedEndpoints");
}
else
{
adapter.setProperty(name, "PublishedEndpoints",
published.toString());
}
}
private void setObjectsField()
{
Adapter adapter = getAdapter();
final Utils.Resolver resolver = adapter.getModel().substitute() ?
adapter.getResolver() : null;
Ice.StringHolder toolTipHolder = new Ice.StringHolder();
Utils.Stringifier stringifier = new Utils.Stringifier()
{
public String toString(Object obj)
{
java.util.Map.Entry entry = (java.util.Map.Entry)obj;
return Utils.substitute((String)entry.getKey(), resolver)
+ " as '"
+ Utils.substitute((String)entry.getValue(), resolver)
+ "'";
}
};
_objects.setText(
Utils.stringify(_objectsMap.entrySet(), stringifier,
", ", toolTipHolder));
_objects.setToolTipText(toolTipHolder.value);
}
private void setId(String id)
{
if(id.equals(""))
{
_id.setSelectedItem(DIRECT_ADAPTER);
}
else if(id.equals(_defaultAdapterId))
{
_id.setSelectedItem(DEFAULT_ADAPTER_ID);
}
else
{
_id.setSelectedItem(id);
}
}
private void refreshId()
{
Object id = _id.getSelectedItem();
_id.setModel(new DefaultComboBoxModel(new Object[]
{DIRECT_ADAPTER, DEFAULT_ADAPTER_ID}));
_id.setSelectedItem(id);
}
private String getIdAsString()
{
Object obj = _id.getSelectedItem();
if(obj == DIRECT_ADAPTER)
{
return "";
}
else
{
return obj.toString();
}
}
private void setReplicaGroupId(String replicaGroupId)
{
if(replicaGroupId.equals(""))
{
_replicaGroupId.setSelectedItem(NOT_REPLICATED);
}
else
{
ReplicaGroups replicaGroups =
getAdapter().getApplication().getReplicaGroups();
ReplicaGroup replicaGroup =
(ReplicaGroup)replicaGroups.findChild(replicaGroupId);
if(replicaGroup != null)
{
_replicaGroupId.setSelectedItem(replicaGroup);
}
else
{
_replicaGroupId.setSelectedItem(replicaGroupId);
}
}
}
private String getReplicaGroupIdAsString()
{
Object obj = _replicaGroupId.getSelectedItem();
if(obj == NOT_REPLICATED)
{
return "";
}
else
{
return obj.toString();
}
}
void show(Adapter adapter)
{
detectUpdates(false);
setTarget(adapter);
AdapterDescriptor descriptor = (AdapterDescriptor)adapter.getDescriptor();
final Utils.Resolver resolver = adapter.getModel().substitute() ?
adapter.getResolver() : null;
boolean isEditable = adapter.isEditable() && resolver == null;
boolean inIceBox = adapter.inIceBox();
_oldName = descriptor.name;
_name.setText(Utils.substitute(descriptor.name, resolver));
_name.setEditable(isEditable && !inIceBox);
_description.setText(
Utils.substitute(descriptor.description, resolver));
_description.setEditable(isEditable);
_description.setOpaque(isEditable);
//
// Need to make control editable & enabled before changing it
//
_id.setEnabled(true);
_id.setEditable(true);
_defaultAdapterId = adapter.getDefaultAdapterId();
refreshId();
if(descriptor.id == null)
{
descriptor.id = _defaultAdapterId;
}
setId(Utils.substitute(descriptor.id, resolver));
_id.setEnabled(isEditable);
_id.setEditable(isEditable);
_replicaGroupId.setEnabled(true);
_replicaGroupId.setEditable(true);
final ReplicaGroups replicaGroups =
adapter.getApplication().getReplicaGroups();
_replicaGroupId.setModel(replicaGroups.createComboBoxModel(NOT_REPLICATED));
_replicaGroupId.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if(e.getStateChange() == ItemEvent.SELECTED)
{
Object item = e.getItem();
boolean enabled = (item instanceof ReplicaGroup);
if(!enabled && item != NOT_REPLICATED)
{
if(resolver != null)
{
String replicaGroupId =
resolver.substitute(item.toString());
enabled = (replicaGroups.findChild(replicaGroupId) != null);
}
}
_replicaGroupButton.setEnabled(enabled);
}
}
});
setReplicaGroupId(Utils.substitute(descriptor.replicaGroupId, resolver));
_replicaGroupId.setEnabled(isEditable);
_replicaGroupId.setEditable(isEditable);
_endpoints.setText(
Utils.substitute(adapter.getProperty("Endpoints"), resolver));
_endpoints.setEditable(isEditable);
_publishedEndpoints.setEnabled(true);
_publishedEndpoints.setEditable(true);
String published =
Utils.substitute(adapter.getProperty("PublishedEndpoints"), resolver);
if(published == null || published.equals(""))
{
_publishedEndpoints.setSelectedItem(PUBLISH_ACTUAL);
}
else
{
_publishedEndpoints.setSelectedItem(published);
}
_publishedEndpoints.setEnabled(isEditable);
_publishedEndpoints.setEditable(isEditable);
//
// Objects
//
_objectsMap = objectDescriptorSeqToMap(descriptor.objects);
setObjectsField();
_objectsButton.setEnabled(isEditable);
_registerProcess.setSelected(descriptor.registerProcess);
_registerProcess.setEnabled(isEditable);
_waitForActivation.setSelected(descriptor.waitForActivation);
_waitForActivation.setEnabled(isEditable);
refreshCurrentStatus();
_applyButton.setEnabled(adapter.isEphemeral());
_discardButton.setEnabled(adapter.isEphemeral());
detectUpdates(true);
}
public void refreshCurrentStatus()
{
Adapter adapter = getAdapter();
//
// Only when not in a template
//
if(adapter.getResolver() != null)
{
String currentEndpoints = adapter.getCurrentEndpoints();
boolean active = (currentEndpoints != null);
if(currentEndpoints == null)
{
_currentStatus.setText("Inactive");
_currentEndpoints.setText("");
}
else
{
_currentStatus.setText("Active");
_currentEndpoints.setText(currentEndpoints);
}
}
}
Adapter getAdapter()
{
return (Adapter)_target;
}
static java.util.Map objectDescriptorSeqToMap(java.util.List objects)
{
java.util.Map result = new java.util.HashMap(objects.size());
java.util.Iterator p = objects.iterator();
while(p.hasNext())
{
ObjectDescriptor od = (ObjectDescriptor)p.next();
result.put(Ice.Util.identityToString(od.id), od.type);
}
return result;
}
static java.util.LinkedList mapToObjectDescriptorSeq(java.util.Map map)
{
java.util.LinkedList result = new java.util.LinkedList();
java.util.Iterator p = map.entrySet().iterator();
while(p.hasNext())
{
java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
Ice.Identity id =
Ice.Util.stringToIdentity((String)entry.getKey());
String type = (String)entry.getValue();
result.add(new ObjectDescriptor(id, type));
}
return result;
}
private String _defaultAdapterId = "";
private final Object DEFAULT_ADAPTER_ID = new Object()
{
public String toString()
{
return _defaultAdapterId;
}
};
private String _oldName;
private JTextField _name = new JTextField(20);
private JTextArea _description = new JTextArea(3, 20);
private JComboBox _id = new JComboBox(new Object[]
{DIRECT_ADAPTER, DEFAULT_ADAPTER_ID});
private JComboBox _replicaGroupId = new JComboBox();
private JButton _replicaGroupButton;
private JTextField _endpoints = new JTextField(20);
private JComboBox _publishedEndpoints = new JComboBox(
new Object[]{PUBLISH_ACTUAL});
private JTextField _currentStatus = new JTextField(20);
private JTextField _currentEndpoints = new JTextField(20);
private JCheckBox _registerProcess;
private JCheckBox _waitForActivation;
private JTextField _objects = new JTextField(20);
private java.util.Map _objectsMap;
private TableDialog _objectsDialog;
private JButton _objectsButton;
static private final Object PUBLISH_ACTUAL = new Object()
{
public String toString()
{
return "Actual endpoints";
}
};
static private final Object DIRECT_ADAPTER = new Object()
{
public String toString()
{
return "No ID (a direct adapter)";
}
};
static private final Object NOT_REPLICATED = new Object()
{
public String toString()
{
return "Does not belong to a replica group";
}
};
}