@@ -121,8 +121,7 @@ private static String getJavaOuterClassname(
121121 }
122122
123123 filename = makeInvalidCharactersUnderscores (filename );
124- filename = CaseFormat .LOWER_UNDERSCORE .to (CaseFormat .UPPER_CAMEL , filename );
125- filename = upcaseAfterNumber (filename );
124+ filename = convertToCamelCase (filename );
126125 filename = appendOuterClassSuffix (filename , fileDescriptor );
127126 return filename ;
128127 }
@@ -157,15 +156,32 @@ private static String makeInvalidCharactersUnderscores(String filename) {
157156 }
158157
159158 /**
160- * Upper case characters after numbers, like {@code Weyland9Yutani}.
159+ * Adjust a class name to follow the JavaBean spec.
160+ * - capitalize the first letter
161+ * - remove embedded underscores & capitalize the following letter
162+ * - capitalize letter after a number
163+ *
164+ * @param name method name
165+ * @return lower name
161166 */
162- private static String upcaseAfterNumber (String filename ) {
163- char [] filechars = filename .toCharArray ();
164- for (int i = 1 ; i < filechars .length ; i ++) {
165- if (CharMatcher .inRange ('0' , '9' ).matches (filechars [i - 1 ])) {
166- filechars [i ] = Character .toUpperCase (filechars [i ]);
167+ private static String convertToCamelCase (String name ) {
168+ StringBuilder sb = new StringBuilder ();
169+ sb .append (Character .toUpperCase (name .charAt (0 )));
170+
171+ for (int i = 1 ; i < name .length (); i ++) {
172+ char c = name .charAt (i );
173+ char prev = name .charAt (i - 1 );
174+
175+ if (c != '_' ) {
176+ if (prev == '_' || CharMatcher .inRange ('0' , '9' ).matches (prev )) {
177+ sb .append (Character .toUpperCase (c ));
178+ } else {
179+ sb .append (c );
180+ }
167181 }
168182 }
169- return new String (filechars );
183+
184+ return sb .toString ();
170185 }
186+
171187}
0 commit comments