| /* | |
| * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others | |
| * | |
| * This program and the accompanying materials are made available under the | |
| * terms of the Eclipse Distribution License v. 1.0 which is available at | |
| * https://www.eclipse.org/org/documents/edl-v10.php. | |
| * | |
| * SPDX-License-Identifier: BSD-3-Clause | |
| */ | |
| package org.eclipse.jgit.pgm; | |
| import java.lang.reflect.Constructor; | |
| import java.lang.reflect.InvocationTargetException; | |
| import java.text.MessageFormat; | |
| import org.eclipse.jgit.pgm.internal.CLIText; | |
| /** | |
| * Description of a command (a {@link org.eclipse.jgit.pgm.TextBuiltin} | |
| * subclass). | |
| * <p> | |
| * These descriptions are lightweight compared to creating a command instance | |
| * and are therefore suitable for catalogs of "known" commands without linking | |
| * the command's implementation and creating a dummy instance of the command. | |
| */ | |
| public class CommandRef { | |
| private final Class<? extends TextBuiltin> impl; | |
| private final String name; | |
| private String usage; | |
| boolean common; | |
| CommandRef(Class<? extends TextBuiltin> clazz) { | |
| this(clazz, guessName(clazz)); | |
| } | |
| CommandRef(Class<? extends TextBuiltin> clazz, Command cmd) { | |
| this(clazz, cmd.name().length() > 0 ? cmd.name() : guessName(clazz)); | |
| usage = cmd.usage(); | |
| common = cmd.common(); | |
| } | |
| private CommandRef(Class<? extends TextBuiltin> clazz, String cn) { | |
| impl = clazz; | |
| name = cn; | |
| usage = ""; //$NON-NLS-1$ | |
| } | |
| private static String guessName(Class<? extends TextBuiltin> clazz) { | |
| final StringBuilder s = new StringBuilder(); | |
| if (clazz.getName().startsWith("org.eclipse.jgit.pgm.debug.")) //$NON-NLS-1$ | |
| s.append("debug-"); //$NON-NLS-1$ | |
| boolean lastWasDash = true; | |
| for (char c : clazz.getSimpleName().toCharArray()) { | |
| if (Character.isUpperCase(c)) { | |
| if (!lastWasDash) | |
| s.append('-'); | |
| lastWasDash = !lastWasDash; | |
| s.append(Character.toLowerCase(c)); | |
| } else { | |
| s.append(c); | |
| lastWasDash = false; | |
| } | |
| } | |
| return s.toString(); | |
| } | |
| /** | |
| * Get the <code>name</code>. | |
| * | |
| * @return name the command is invoked as from the command line. | |
| */ | |
| public String getName() { | |
| return name; | |
| } | |
| /** | |
| * Get <code>usage</code>. | |
| * | |
| * @return one line description of the command's feature set. | |
| */ | |
| public String getUsage() { | |
| return usage; | |
| } | |
| /** | |
| * Is this command commonly used | |
| * | |
| * @return true if this command is considered to be commonly used. | |
| */ | |
| public boolean isCommon() { | |
| return common; | |
| } | |
| /** | |
| * Get implementation class name | |
| * | |
| * @return name of the Java class which implements this command. | |
| */ | |
| public String getImplementationClassName() { | |
| return impl.getName(); | |
| } | |
| /** | |
| * Get implementation class loader | |
| * | |
| * @return loader for {@link #getImplementationClassName()}. | |
| */ | |
| public ClassLoader getImplementationClassLoader() { | |
| return impl.getClassLoader(); | |
| } | |
| /** | |
| * Create an instance of the command implementation | |
| * | |
| * @return a new instance of the command implementation. | |
| */ | |
| public TextBuiltin create() { | |
| final Constructor<? extends TextBuiltin> c; | |
| try { | |
| c = impl.getDeclaredConstructor(); | |
| } catch (SecurityException | NoSuchMethodException e) { | |
| throw new RuntimeException(MessageFormat | |
| .format(CLIText.get().cannotCreateCommand, getName(), e)); | |
| } | |
| c.setAccessible(true); | |
| final TextBuiltin r; | |
| try { | |
| r = c.newInstance(); | |
| } catch (InstantiationException | IllegalAccessException | |
| | IllegalArgumentException | InvocationTargetException e) { | |
| throw new RuntimeException(MessageFormat | |
| .format(CLIText.get().cannotCreateCommand, getName(), e)); | |
| } | |
| r.setCommandName(getName()); | |
| return r; | |
| } | |
| @SuppressWarnings("nls") | |
| @Override | |
| public String toString() { | |
| return "CommandRef [impl=" + impl + ", name=" + name + ", usage=" | |
| + CLIText.get().resourceBundle().getString(usage) + ", common=" | |
| + common + "]"; | |
| } | |
| } |