/******************************************************************************* * Copyright (c) 2009 Composent, Inc. and others. All rights reserved. This * program and the accompanying materials are made available under the terms of * the Eclipse Public License v1.0 which accompanies this distribution, and is * available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Composent, Inc. - initial API and implementation ******************************************************************************/ package org.eclipse.ecf.internal.console; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.eclipse.ecf.core.ContainerTypeDescription; import org.eclipse.ecf.core.IContainer; import org.eclipse.ecf.core.IContainerFactory; import org.eclipse.ecf.core.IContainerManager; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.identity.IDFactory; import org.eclipse.ecf.core.identity.Namespace; import org.eclipse.osgi.framework.console.CommandInterpreter; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; public class ECFCommandProvider implements org.eclipse.osgi.framework.console.CommandProvider { public static final String NEW_LINE = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ private BundleContext context; private ServiceTracker containerManagerTracker; public ECFCommandProvider(BundleContext context) { this.context = context; } private IContainerManager getContainerManager() { if (containerManagerTracker == null) { containerManagerTracker = new ServiceTracker(this.context,IContainerManager.class.getName(),null); containerManagerTracker.open(); } return (IContainerManager) containerManagerTracker.getService(); } private IContainerFactory getContainerFactory() { return getContainerManager().getContainerFactory(); } public void dispose() { if (containerManagerTracker != null) { containerManagerTracker.close(); containerManagerTracker = null; } this.context = null; } private IContainer createContainer(CommandInterpreter interpreter, String containerTypeDescriptionName, String[] args) { IContainerFactory containerFactory = getContainerFactory(); try { if (containerTypeDescriptionName == null) return containerFactory.createContainer(); else if (args == null) return containerFactory.createContainer(containerTypeDescriptionName); else return containerFactory.createContainer(containerTypeDescriptionName,args); } catch (Exception e) { printException(interpreter,"Could not create container with type="+containerTypeDescriptionName,e); return null; } } private void printException(CommandInterpreter interpreter, String message, Throwable t) { interpreter.println("--Exception--"); if (message != null) interpreter.println(message); if (t != null) interpreter.printStackTrace(t); interpreter.println("--End Exception--"); } private String[] getArgs(CommandInterpreter interpreter) { List result = new ArrayList(); String arg = null; while ((arg = interpreter.nextArgument()) != null) result.add(arg); return (String[]) result.toArray(new String[] {}); } private String[] getRemainingArgs(String[] args, int startPosition) { int targetLength = args.length-startPosition; String[] result = new String[targetLength]; System.arraycopy(args, startPosition, result, 0, targetLength); return result; } public void _createcontainer(CommandInterpreter interpreter) { String[] args = getArgs(interpreter); String factoryName = (args.length==0)?null:args[0]; String[] targetArgs = (args.length==0)?null:getRemainingArgs(args,1); IContainer c = createContainer(interpreter, factoryName, targetArgs); if (c != null) { interpreter.print("container created. "); printID(interpreter, c.getID()); } } private void printContainer(CommandInterpreter interpreter, IContainer container, boolean verbose) { interpreter.println("--Container--"); printID(interpreter, container.getID()); if (verbose) { interpreter.print("\tclass="); interpreter.println(container.getClass().getName()); ID connectedID = container.getConnectedID(); if (connectedID != null) { interpreter.print("\tConnected to: "); printID(interpreter, connectedID); } else interpreter.println("\tNot connected."); Namespace ns = container.getConnectNamespace(); if (ns != null) { interpreter.print("\tConnect namespace: "); interpreter.println(ns.getName()); } else interpreter.println("\tNo connect namespace."); ContainerTypeDescription desc = getContainerManager().getContainerTypeDescription(container.getID()); if (desc != null) printDescription(interpreter, desc); } interpreter.println("--End Container--"); } private void printDescription(CommandInterpreter interpreter, ContainerTypeDescription desc) { interpreter.print("\tFactory name="); interpreter.println(desc.getName()); interpreter.print("\tFactory description="); interpreter.println(desc.getDescription()); String[] arr = desc.getSupportedIntents(); if (arr != null) { interpreter.print("\tSupported intents="); interpreter.println(Arrays.asList(arr)); } arr = desc.getSupportedConfigs(); if (arr != null) { interpreter.print("\tSupported configs="); interpreter.println(Arrays.asList(arr)); } arr = desc.getSupportedAdapterTypes(); if (arr != null) { interpreter.print("\tSupported adapters="); interpreter.println(Arrays.asList(arr)); } interpreter.println("\tHidden="+desc.isHidden()); interpreter.println("\tServer="+desc.isServer()); } public void _listcontainers(CommandInterpreter interpreter) { String[] args = getArgs(interpreter); boolean verbose = (args.length < 1)?false:new Boolean(args[0]).booleanValue(); IContainer[] containers = getContainerManager().getAllContainers(); if (containers == null || containers.length == 0) interpreter.println("No containers found."); for(int i=0; i < containers.length; i++) { printContainer(interpreter, containers[i], verbose); } } public void _listfactories(CommandInterpreter interpreter) { List descs = getContainerManager().getContainerFactory().getDescriptions(); if (descs == null || descs.size() == 0) interpreter.println("No factories."); for(Iterator i=descs.iterator(); i.hasNext(); ) { ContainerTypeDescription desc = (ContainerTypeDescription) i.next(); printDescription(interpreter, desc); } } private void printID(CommandInterpreter interpreter, ID id) { interpreter.print("\tID:"); if (id == null) { interpreter.println("null"); return; } interpreter.print("ns="+id.getNamespace().getName()); interpreter.print(";name="); interpreter.print(id.getName()); interpreter.println(); } public void _destroycontainer(CommandInterpreter interpreter) { String[] args = getArgs(interpreter); if (args == null || args.length != 2) { interpreter.println("Incorrect number of arguments for container destroy"); return; } ID id = createID(interpreter, args[0],args[1]); if (id == null) return; IContainer container = getContainerManager().removeContainer(id); if (container == null) { interpreter.println("Container not found to remove"); return; } // Dispose the container instance container.dispose(); interpreter.println("Container destroyed."); } private ID createID(CommandInterpreter interpreter, String namespace, String val) { try { return IDFactory.getDefault().createID(namespace, val); } catch (Exception e) { interpreter.printStackTrace(e); return null; } } public String getHelp() { StringBuffer help = new StringBuffer(); help.append(NEW_LINE); help.append("---"); help.append("Eclipse Communication Framework (ECF) Commands"); help.append("---"); help.append(NEW_LINE); help.append("\tlistfactories -- List all container factories."); help.append(NEW_LINE); help.append("\tlistcontainers [verbose] -- List all existing containers."); help.append(NEW_LINE); help.append("\tcreatecontainer [<containerFactoryName> [<arg0> <arg1>...]] -- Create new container."); help.append(NEW_LINE); help.append("\tdestroycontainer <namespace> <id> -- Remove and dispose container specified by namespace/id combination."); help.append(NEW_LINE); return help.toString(); } }