1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.pgm;
45
46 import java.lang.reflect.Constructor;
47 import java.lang.reflect.InvocationTargetException;
48 import java.text.MessageFormat;
49
50 import org.eclipse.jgit.pgm.internal.CLIText;
51
52
53
54
55
56
57
58
59 public class CommandRef {
60 private final Class<? extends TextBuiltin> impl;
61
62 private final String name;
63
64 private String usage;
65
66 boolean common;
67
68 CommandRef(final Class<? extends TextBuiltin> clazz) {
69 this(clazz, guessName(clazz));
70 }
71
72 CommandRef(final Class<? extends TextBuiltin> clazz, final Command cmd) {
73 this(clazz, cmd.name().length() > 0 ? cmd.name() : guessName(clazz));
74 usage = cmd.usage();
75 common = cmd.common();
76 }
77
78 private CommandRef(final Class<? extends TextBuiltin> clazz, final String cn) {
79 impl = clazz;
80 name = cn;
81 usage = "";
82 }
83
84 private static String guessName(final Class<? extends TextBuiltin> clazz) {
85 final StringBuilder s = new StringBuilder();
86 if (clazz.getName().startsWith("org.eclipse.jgit.pgm.debug."))
87 s.append("debug-");
88
89 boolean lastWasDash = true;
90 for (final char c : clazz.getSimpleName().toCharArray()) {
91 if (Character.isUpperCase(c)) {
92 if (!lastWasDash)
93 s.append('-');
94 lastWasDash = !lastWasDash;
95 s.append(Character.toLowerCase(c));
96 } else {
97 s.append(c);
98 lastWasDash = false;
99 }
100 }
101 return s.toString();
102 }
103
104
105
106
107 public String getName() {
108 return name;
109 }
110
111
112
113
114 public String getUsage() {
115 return usage;
116 }
117
118
119
120
121 public boolean isCommon() {
122 return common;
123 }
124
125
126
127
128 public String getImplementationClassName() {
129 return impl.getName();
130 }
131
132
133
134
135 public ClassLoader getImplementationClassLoader() {
136 return impl.getClassLoader();
137 }
138
139
140
141
142 public TextBuiltin create() {
143 final Constructor<? extends TextBuiltin> c;
144 try {
145 c = impl.getDeclaredConstructor();
146 } catch (SecurityException e) {
147 throw new RuntimeException(MessageFormat.format(CLIText.get().cannotCreateCommand, getName(), e));
148 } catch (NoSuchMethodException e) {
149 throw new RuntimeException(MessageFormat.format(CLIText.get().cannotCreateCommand, getName(), e));
150 }
151 c.setAccessible(true);
152
153 final TextBuiltin r;
154 try {
155 r = c.newInstance();
156 } catch (InstantiationException e) {
157 throw new RuntimeException(MessageFormat.format(CLIText.get().cannotCreateCommand, getName(), e));
158 } catch (IllegalAccessException e) {
159 throw new RuntimeException(MessageFormat.format(CLIText.get().cannotCreateCommand, getName(), e));
160 } catch (IllegalArgumentException e) {
161 throw new RuntimeException(MessageFormat.format(CLIText.get().cannotCreateCommand, getName(), e));
162 } catch (InvocationTargetException e) {
163 throw new RuntimeException(MessageFormat.format(CLIText.get().cannotCreateCommand, getName(), e));
164 }
165 r.setCommandName(getName());
166 return r;
167 }
168
169 @SuppressWarnings("nls")
170 @Override
171 public String toString() {
172 return "CommandRef [impl=" + impl + ", name=" + name + ", usage="
173 + CLIText.get().resourceBundle().getString(usage) + ", common="
174 + common + "]";
175 }
176 }