/**
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* 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.kevoree.library.defaultNodeTypes.osgi.deploy.runtime.shell;
import org.apache.felix.shell.Command;
import org.apache.felix.shell.impl.*;
import org.osgi.framework.*;
import java.io.PrintStream;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.*;
/**
* Created by IntelliJ IDEA.
* User: duke
* Date: 27/09/11
* Time: 20:03
* To change this template use File | Settings | File Templates.
*/
public class ShellActivator implements BundleActivator
{
private transient BundleContext m_context = null;
private transient ShellServiceImpl m_shell = null;
public void start(BundleContext context)
{
m_context = context;
// Register impl service implementation.
String[] classes = {
org.apache.felix.shell.ShellService.class.getName(),
org.ungoverned.osgi.service.shell.ShellService.class.getName()
};
context.registerService(classes, m_shell = new ShellServiceImpl(), null);
// Listen for registering/unregistering of impl command
// services so that we can automatically add/remove them
// from our list of available commands.
ServiceListener sl = new ServiceListener() {
public void serviceChanged(ServiceEvent event)
{
if (event.getType() == ServiceEvent.REGISTERED)
{
m_shell.addCommand(event.getServiceReference());
}
else if (event.getType() == ServiceEvent.UNREGISTERING)
{
m_shell.removeCommand(event.getServiceReference());
}
else
{
}
}
};
try
{
m_context.addServiceListener(sl,
"(|(objectClass="
+ Command.class.getName()
+ ")(objectClass="
+ org.ungoverned.osgi.service.shell.Command.class.getName()
+ "))");
}
catch (InvalidSyntaxException ex)
{
System.err.println("Activator: Cannot register service listener.");
System.err.println("Activator: " + ex);
}
// Now manually try to find any commands that have already
// been registered (i.e., we didn't see their service events).
initializeCommands();
// Register "bundlelevel" command service.
context.registerService(
Command.class.getName(),
new BundleLevelCommandImpl(m_context), null);
// Register "cd" command service.
classes = new String[2];
classes[0] = Command.class.getName();
classes[1] = org.apache.felix.shell.CdCommand.class.getName();
context.registerService(
classes, new CdCommandImpl(m_context), null);
// Register "find" command service.
context.registerService(
Command.class.getName(),
new FindCommandImpl(m_context), null);
// Register "headers" command service.
context.registerService(
Command.class.getName(),
new HeadersCommandImpl(m_context), null);
// Register "help" command service.
context.registerService(
Command.class.getName(),
new HelpCommandImpl(m_context), null);
// Register "inspect" command service.
context.registerService(
Command.class.getName(),
new InspectCommandImpl(m_context), null);
// Register "install" command service.
context.registerService(
Command.class.getName(),
new InstallCommandImpl(m_context), null);
// Register "log" command service.
context.registerService(
Command.class.getName(),
new LogCommandImpl(m_context), null);
// Register "ps" command service.
context.registerService(
Command.class.getName(),
new PsCommandImpl(m_context), null);
// Register "refresh" command service.
context.registerService(
Command.class.getName(),
new RefreshCommandImpl(m_context), null);
// Register "resolve" command service.
context.registerService(
Command.class.getName(),
new ResolveCommandImpl(m_context), null);
// Register "startlevel" command service.
context.registerService(
Command.class.getName(),
new StartLevelCommandImpl(m_context), null);
// Register "shutdown" command service.
context.registerService(
Command.class.getName(),
new ShutdownCommandOverride(m_context), null);
// Register "start" command service.
context.registerService(
Command.class.getName(),
new StartCommandImpl(m_context), null);
// Register "stop" command service.
context.registerService(
Command.class.getName(),
new StopCommandImpl(m_context), null);
// Register "sysprop" command service.
context.registerService(
Command.class.getName(),
new SystemPropertiesCommandImpl(), null);
// Register "uninstall" command service.
context.registerService(
Command.class.getName(),
new UninstallCommandImpl(m_context), null);
// Register "update" command service.
context.registerService(
Command.class.getName(),
new UpdateCommandImpl(m_context), null);
// Register "version" command service.
context.registerService(
Command.class.getName(),
new VersionCommandImpl(m_context), null);
}
public void stop(BundleContext context)
{
m_shell.clearCommands();
}
private void initializeCommands()
{
synchronized (m_shell)
{
try
{
ServiceReference[] refs = m_context.getServiceReferences(
Command.class.getName(), null);
if (refs != null)
{
for (int i = 0; i < refs.length; i++)
{
m_shell.addCommand(refs[i]);
}
}
}
catch (Exception ex)
{
System.err.println("Activator: " + ex);
}
}
}
private class ShellServiceImpl implements
org.apache.felix.shell.ShellService,
org.ungoverned.osgi.service.shell.ShellService
{
private HashMap m_commandRefMap = new HashMap();
private TreeMap m_commandNameMap = new TreeMap();
public synchronized String[] getCommands()
{
Set ks = m_commandNameMap.keySet();
String[] cmds = (ks == null)
? new String[0] : (String[]) ks.toArray(new String[ks.size()]);
return cmds;
}
public synchronized String getCommandUsage(String name)
{
Command command = (Command) m_commandNameMap.get(name);
return (command == null) ? null : command.getUsage();
}
public synchronized String getCommandDescription(String name)
{
Command command = (Command) m_commandNameMap.get(name);
return (command == null) ? null : command.getShortDescription();
}
public synchronized ServiceReference getCommandReference(String name)
{
ServiceReference ref = null;
Iterator itr = m_commandRefMap.entrySet().iterator();
while (itr.hasNext())
{
Map.Entry entry = (Map.Entry) itr.next();
if (((Command) entry.getValue()).getName().equals(name))
{
ref = (ServiceReference) entry.getKey();
break;
}
}
return ref;
}
public synchronized void removeCommand(ServiceReference ref)
{
Command command = (Command) m_commandRefMap.remove(ref);
if (command != null)
{
m_commandNameMap.remove(command.getName());
}
}
public synchronized void executeCommand(
String commandLine, PrintStream out, PrintStream err) throws Exception
{
commandLine = commandLine.trim();
String commandName = (commandLine.indexOf(' ') >= 0)
? commandLine.substring(0, commandLine.indexOf(' ')) : commandLine;
Command command = getCommand(commandName);
if (command != null)
{
if (System.getSecurityManager() != null)
{
try
{
AccessController.doPrivileged(
new ExecutePrivileged(command, commandLine, out, err));
}
catch (PrivilegedActionException ex)
{
throw ex.getException();
}
}
else
{
try
{
command.execute(commandLine, out, err);
}
catch (Throwable ex)
{
err.println("Unable to execute command: " + ex);
ex.printStackTrace(err);
}
}
}
else
{
err.println("Command not found.");
}
}
protected synchronized Command getCommand(String name)
{
Command command = (Command) m_commandNameMap.get(name);
return (command == null) ? null : command;
}
protected synchronized void addCommand(ServiceReference ref)
{
Object cmdObj = m_context.getService(ref);
Command command =
(cmdObj instanceof org.ungoverned.osgi.service.shell.Command)
? new OldCommandWrapper((org.ungoverned.osgi.service.shell.Command) cmdObj)
: (Command) cmdObj;
m_commandRefMap.put(ref, command);
m_commandNameMap.put(command.getName(), command);
}
protected synchronized void clearCommands()
{
m_commandRefMap.clear();
m_commandNameMap.clear();
}
}
private static class OldCommandWrapper implements Command
{
private org.ungoverned.osgi.service.shell.Command m_oldCommand = null;
public OldCommandWrapper(org.ungoverned.osgi.service.shell.Command oldCommand)
{
m_oldCommand = oldCommand;
}
public String getName()
{
return m_oldCommand.getName();
}
public String getUsage()
{
return m_oldCommand.getUsage();
}
public String getShortDescription()
{
return m_oldCommand.getShortDescription();
}
public void execute(String line, PrintStream out, PrintStream err)
{
m_oldCommand.execute(line, out, err);
}
}
public static class ExecutePrivileged implements PrivilegedExceptionAction
{
private Command m_command = null;
private String m_commandLine = null;
private PrintStream m_out = null;
private PrintStream m_err = null;
public ExecutePrivileged(
Command command, String commandLine,
PrintStream out, PrintStream err)
throws Exception
{
m_command = command;
m_commandLine = commandLine;
m_out = out;
m_err = err;
}
public Object run() throws Exception
{
m_command.execute(m_commandLine, m_out, m_err);
return null;
}
}
}