blob: 148b754687703e3e2a95949f7d8e37308b6e1466 [file] [log] [blame]
/*
* Copyright (c) 2013, 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.spi.server;
import org.eclipse.emf.cdo.internal.server.bundle.CDOServerApplication;
import org.eclipse.emf.cdo.server.IStoreAccessor;
import org.eclipse.emf.cdo.server.StoreThreadLocal;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.factory.ProductCreationException;
import org.eclipse.osgi.framework.console.CommandInterpreter;
import org.osgi.framework.Bundle;
import java.util.Dictionary;
/**
* @author Eike Stepper
* @since 4.3
*/
public abstract class CDOCommand extends org.eclipse.net4j.util.factory.Factory
{
public static final String PRODUCT_GROUP = "org.eclipse.emf.cdo.server.commands";
public static final String INDENT = " "; //$NON-NLS-1$
private static final CommandParameter[] NO_PARAMETERS = new CommandParameter[0];
private final String description;
private final CommandParameter[] parameters;
private CommandInterpreter interpreter;
public CDOCommand(String name, String description, CommandParameter... parameters)
{
super(PRODUCT_GROUP, name);
this.description = description;
this.parameters = parameters == null ? NO_PARAMETERS : parameters;
}
public CDOCommand(String name, String description)
{
this(name, description, NO_PARAMETERS);
}
public final CDOCommand create(String description) throws ProductCreationException
{
return this;
}
public final CommandInterpreter getInterpreter()
{
return interpreter;
}
public final void setInterpreter(CommandInterpreter interpreter)
{
this.interpreter = interpreter;
}
public final String getName()
{
return getType();
}
public final String getDescription()
{
return description;
}
public final CommandParameter[] getParameters()
{
return parameters;
}
public final String getSyntax()
{
StringBuilder builder = new StringBuilder();
builder.append("cdo ");
builder.append(getName());
for (CommandParameter parameter : parameters)
{
builder.append(" ");
if (parameter.isOptional())
{
builder.append("[");
}
builder.append("<");
builder.append(parameter.getName());
builder.append(">");
if (parameter.isOptional())
{
builder.append("]");
}
}
return builder.toString();
}
public final Object executeCommand(String cmd)
{
return interpreter.execute(cmd);
}
public final void print(Object o)
{
interpreter.print(o);
}
public final void println()
{
interpreter.println();
}
public final void println(Object o)
{
interpreter.println(o);
}
public final void printStackTrace(Throwable t)
{
interpreter.printStackTrace(t);
}
public final void printDictionary(Dictionary<?, ?> dic, String title)
{
interpreter.printDictionary(dic, title);
}
public final void printBundleResource(Bundle bundle, String resource)
{
interpreter.printBundleResource(bundle, resource);
}
public final void execute() throws Exception
{
int length = parameters.length;
String[] args = new String[length];
for (int i = 0; i < parameters.length; i++)
{
String arg;
CommandParameter parameter = parameters[i];
if (parameter.isOptional())
{
arg = nextArgumentOptional();
}
else
{
arg = nextArgument();
}
args[i] = arg;
}
execute(args);
}
public abstract void execute(String[] args) throws Exception;
private String nextArgument()
{
String argument = interpreter.nextArgument();
if (argument == null && parameters != null)
{
throw new CommandException("Syntax: " + getSyntax());
}
return argument;
}
private String nextArgumentOptional()
{
return interpreter.nextArgument();
}
public static CommandParameter[] parameters(CommandParameter parameter, CommandParameter[] parameters)
{
if (parameters == null || parameters.length == 0)
{
return new CommandParameter[] { parameter };
}
CommandParameter[] result = new CommandParameter[1 + parameters.length];
result[0] = parameter;
System.arraycopy(parameters, 0, result, 1, parameters.length);
return result;
}
public static CommandParameter parameter(String name, boolean optional)
{
return new CommandParameter(name, optional);
}
public static CommandParameter parameter(String name)
{
return parameter(name, false);
}
public static CommandParameter optional(String name)
{
return parameter(name, true);
}
protected static String[] trimFirstArgument(String[] args)
{
int length = args.length - 1;
String[] result = new String[length];
System.arraycopy(args, 1, result, 0, length);
return result;
}
/**
* @author Eike Stepper
*/
public static abstract class WithRepository extends CDOCommand
{
public WithRepository(String name, String description, CommandParameter... parameters)
{
super(name, description, parameters(parameter("repository-name"), parameters));
}
public WithRepository(String name, String description)
{
this(name, description, NO_PARAMETERS);
}
@Override
public final void execute(String[] args) throws Exception
{
String repositoryName = args[0];
InternalRepository repository = getRepository(repositoryName);
if (repository == null)
{
throw new CommandException("Repository not found: " + repositoryName);
}
execute(repository, trimFirstArgument(args));
}
public abstract void execute(InternalRepository repository, String[] args) throws Exception;
private InternalRepository getRepository(String name)
{
IManagedContainer container = CDOServerApplication.getContainer();
for (Object element : container.getElements(RepositoryFactory.PRODUCT_GROUP))
{
if (element instanceof InternalRepository)
{
InternalRepository repository = (InternalRepository)element;
if (repository.getName().equals(name))
{
return repository;
}
}
}
return null;
}
}
/**
* @author Eike Stepper
*/
public static abstract class WithAccessor extends CDOCommand.WithRepository
{
public WithAccessor(String name, String description, CommandParameter... parameters)
{
super(name, description, parameters);
}
public WithAccessor(String name, String description)
{
this(name, description, NO_PARAMETERS);
}
@Override
public final void execute(InternalRepository repository, String[] args) throws Exception
{
IStoreAccessor accessor = repository.getStore().getReader(null);
StoreThreadLocal.setAccessor(accessor);
try
{
execute(repository, accessor, args);
}
finally
{
StoreThreadLocal.release();
}
}
public abstract void execute(InternalRepository repository, IStoreAccessor accessor, String[] args)
throws Exception;
}
/**
* @author Eike Stepper
*/
public static final class CommandParameter
{
private final String name;
private final boolean optional;
public CommandParameter(String name, boolean optional)
{
this.name = name;
this.optional = optional;
}
public String getName()
{
return name;
}
public boolean isOptional()
{
return optional;
}
}
/**
* @author Eike Stepper
*/
public static final class CommandException extends RuntimeException
{
private static final long serialVersionUID = 1L;
public CommandException(String message)
{
super(message);
}
}
// /**
// * @author Eike Stepper
// */
// public static abstract class Factory extends org.eclipse.net4j.util.factory.Factory
// {
// public Factory(String type)
// {
// super(CDOCommand.PRODUCT_GROUP, type);
// }
//
// public abstract CDOCommand create(String description) throws ProductCreationException;
// }
}