123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- /*
- * 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;
- }
-
- /** {@inheritDoc} */
- @SuppressWarnings("nls")
- @Override
- public String toString() {
- return "CommandRef [impl=" + impl + ", name=" + name + ", usage="
- + CLIText.get().resourceBundle().getString(usage) + ", common="
- + common + "]";
- }
- }
|