/**
* Copyright 2005 Open Cloud Ltd.
*
* 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 org.mobicents.eclipslee.servicecreation.ui;
import java.io.FileDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.net.URL;
import java.rmi.RMISecurityManager;
import java.security.AllPermission;
import java.security.CodeSource;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Policy;
import java.security.ProtectionDomain;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.NoSuchElementException;
import java.util.Properties;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.slee.management.DeployableUnitDescriptor;
import javax.slee.management.DeployableUnitID;
import javax.slee.management.SleeProvider;
import javax.slee.management.SleeProviderFactory;
import org.alcatel.jsce.servicecreation.ui.WaitDialog;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.IProgressService;
import org.jnp.interfaces.NamingContext;
import org.mobicents.eclipslee.servicecreation.ServiceCreationPlugin;
import org.mobicents.eclipslee.servicecreation.ui.table.DataStore;
import org.mobicents.eclipslee.servicecreation.ui.table.EditableTableViewer;
import org.mobicents.eclipslee.servicecreation.util.BaseFinder;
import org.mobicents.eclipslee.servicecreation.util.DUFinder;
import org.mobicents.eclipslee.servicecreation.wizards.sbb.SbbEventsPage;
import org.mobicents.eclipslee.util.slee.xml.DTDXML;
import org.mobicents.eclipslee.util.slee.xml.components.EventXML;
import org.mobicents.eclipslee.xml.DeployableUnitXML;
import org.mobicents.eclipslee.xml.EventJarXML;
/**
* @author Vladimir Ralev
*/
public class DeployPanel extends Composite implements SelectionListener {
private String projectName;
private static final String BUTTON_DEPLOY = "Deploy";
private static final String BUTTON_UNDEPLOY = "Undeploy";
private HashMap duToDUDescription = new HashMap();
private HashMap duToDUID = new HashMap();
private static final String[] COLUMN_NAMES = { "Name", "Status", "Action" };
private static final int[] COLUMN_EDITORS = {
EditableTableViewer.EDITOR_NONE,
EditableTableViewer.EDITOR_NONE,
EditableTableViewer.EDITOR_BUTTON
};
private Object[][] COLUMN_VALUES = {
{},
{},
{}
};
MBeanServerConnection mbeanServer;
ObjectName deploymentMBean;
public DeployPanel(Composite parent, int style, String projectName) {
super(parent, style);
this.projectName = projectName;
COLUMN_VALUES[2] = new Object[2];
COLUMN_VALUES[2][0] = BUTTON_DEPLOY;
COLUMN_VALUES[2][1] = this;
GridLayout layout = new GridLayout();
setLayout(layout);
GridData data = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
setLayoutData(data);
Label label = new Label(this, SWT.NONE);
label.setText("Available deployable units:");
data = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING);
label.setLayoutData(data);
// Available events table, placed above the button box.
availableDeployableUnits = new EditableTableViewer(this, SWT.V_SCROLL | SWT.BORDER | SWT.SINGLE,
COLUMN_NAMES,
COLUMN_EDITORS,
COLUMN_VALUES);
data = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL | GridData.GRAB_HORIZONTAL);
data.heightHint = availableDeployableUnits.getTable().getItemHeight() * 8 + 5;
data.widthHint = 500;
availableDeployableUnits.getTable().setLayoutData(data);
availableDeployableUnits.getTable().getColumn(0).setWidth(400);
availableDeployableUnits.getTable().getColumn(1).setWidth(100);
availableDeployableUnits.getTable().getColumn(2).setWidth(100);
init();
}
private void init()
{
IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
initMBeanServer();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
initDUs();
}
});
}
};
WaitDialog waitDialog = new WaitDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),"Connecting to Local SLEE Server..." );
waitDialog.open();
IProgressService progressService = PlatformUI.getWorkbench()
.getProgressService();
try {
progressService.busyCursorWhile(runnable);
} catch (InvocationTargetException ex) {
ex.printStackTrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
waitDialog.close();
}
public void pack() {
System.err.println("DeployPanel.pack() called");
}
public void repack() {
availableDeployableUnits.repack();
}
public void clearEvents() {
availableDeployableUnits.getStore().clear();
}
public void widgetDefaultSelected(SelectionEvent event) {
}
public void setBlockingError(String error)
{
wizardPage.setErrorMessage(error);
wizardPage.setPageComplete(false);
}
public void unsetBlockingError()
{
wizardPage.setErrorMessage(null);
wizardPage.setPageComplete(true);
}
public void widgetSelected(SelectionEvent event) {
Table table = availableDeployableUnits.getTable();
TableItem items[] = table.getItems();
for (int row = 0; row < items.length; row++) {
HashMap map = (HashMap) items[row].getData();
for (int column = 0; column < COLUMN_EDITORS.length; column++) {
Button button = (Button) map.get("Button_" + column);
if (button != null && button.equals(event.getSource()) && button.getText().equals(BUTTON_DEPLOY)) {
TableItem item = items[row];
String file = (String) map.get("Name");
deploy(file);
initDUs();
}
if (button != null && button.equals(event.getSource()) && button.getText().equals(BUTTON_UNDEPLOY)) {
TableItem item = items[row];
String file = (String) map.get("Name");
String key = getDUFileName(file);
Object value = duToDUID.get(key);
if(value != null)
{
undeploy((DeployableUnitID)value);
initDUs();
}
}
}
}
}
private MBeanServerConnection initMBeanServer()
{
try {
System.setSecurityManager(new DummySecurityManager());
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
props.put(Context.PROVIDER_URL, "jnp://localhost:1099");
props.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
props.put("jnp.disableDiscovery", "true");
InitialContext ctx;
ctx = new InitialContext(props);
mbeanServer = (MBeanServerConnection) ctx
.lookup("jmx/rmi/RMIAdaptor");
deploymentMBean = new ObjectName("slee:name=DeploymentMBean");
return mbeanServer;
} catch (final Exception e) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
MessageDialog.openError(new Shell(), "Connection failed", e.toString());
}
});
}
return null;
}
private void deploy(String file)
{
try {
if(mbeanServer == null) throw new Exception("Not connected to server.");
String url = file.startsWith("file:/") ? file : "file:///"+file;
Object result = (Object) mbeanServer.invoke(deploymentMBean,
"install", new Object[] { url },
new String[] { String.class.getName() });
} catch (Exception e) {
MessageDialog.openError(new Shell(), "Deployment failed", e.toString());
}
}
private void undeploy(DeployableUnitID id)
{
try {
if(mbeanServer == null) throw new Exception("Not connected to server.");
Object result = (Object) mbeanServer.invoke(deploymentMBean,
"uninstall", new Object[] { id },
new String[] { DeployableUnitID.class.getName() });
} catch (Exception e) {
MessageDialog.openError(new Shell(), "Undeployment failed", e.toString());
}
}
private void addRemoteDUs() throws Exception
{
DeployableUnitID[] duIDs = (DeployableUnitID[])
mbeanServer.getAttribute(deploymentMBean, "DeployableUnits");
DeployableUnitDescriptor[] descriptors= new DeployableUnitDescriptor[duIDs.length];
for(int q=0; q<duIDs.length; q++)
{
try
{
DeployableUnitDescriptor descriptor =
(DeployableUnitDescriptor) mbeanServer.invoke(deploymentMBean,
"getDescriptor", new Object[] {duIDs[q]},
new String[] {DeployableUnitID.class.getName()});
descriptors[q] = descriptor;
}
catch(Exception e){}// ID -1 causes exception so ignore it
}
for(int q=0; q<duIDs.length; q++)
{
if(descriptors[q] != null)
{
duToDUDescription.put(
getDUFileName(descriptors[q].getURL()), descriptors[q]);
duToDUID.put(getDUFileName(descriptors[q].getURL()), duIDs[q]);
addDURow(descriptors[q].getURL(), "Deployed", "Undeploy");
}
}
}
private void initDUs()
{
duToDUDescription.clear();
duToDUID.clear();
Object it;
do
{
it = availableDeployableUnits.getElementAt(0);
if( it != null)
availableDeployableUnits.remove(it);
}
while (it != null);
try {
if(mbeanServer != null)
addRemoteDUs();
addUndeployedItems();
update();
TableColumn[] cols = availableDeployableUnits.getTable().getColumns();
for(int q=0; q<cols.length; q++) cols[q].pack();
} catch (Exception e) {
MessageDialog.openWarning(new Shell(), "Connection error",
"Error retrieving the installed deployable units from the SLEE server."
+ e.toString());
}
}
private void addUndeployedItems()
{
DTDXML xml[] = DUFinder.getDefault().getComponents(BaseFinder.BINARY, projectName);
for (int i = 0; i < xml.length; i++) {
DeployableUnitXML du = (DeployableUnitXML) xml[i];
addDU(du.getJarLocation(), "Not deployed");
}
}
private static String getDUFileName(String duURL)
{
int idx = Math.max(duURL.lastIndexOf("/"), duURL.lastIndexOf("\\"));
String fileName = duURL.substring(idx + 1);
return fileName;
}
public void addDU(String duURL, String status) {
if(duToDUDescription.get(getDUFileName(duURL)) != null) return;
addDURow(duURL, status);
}
private void addDURow(String duURL, String status)
{
addDURow(duURL, status, null);
}
private void addDURow(String duURL, String status, String button)
{
HashMap map = new HashMap();
map.put("Name", duURL);
map.put("Status", status);
if(button != null) map.put("ButtonText_2", button);
availableDeployableUnits.addRow(map);
}
public void update() {
super.update();
if (wizardPage != null)
wizardPage.dialogChanged();
}
private EditableTableViewer availableDeployableUnits;
private Button selectButton;
private Button deselectButton;
private SbbEventsPage wizardPage;
}