1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package net.sf.json.util;
18
19 import net.sf.json.JSONException;
20
21 import org.apache.commons.lang.StringUtils;
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 public abstract class JavaIdentifierTransformer {
39
40 public static final JavaIdentifierTransformer CAMEL_CASE = new CamelCaseJavaIdentifierTransformer();
41
42 public static final JavaIdentifierTransformer NOOP = new NoopJavaIdentifierTransformer();
43
44 public static final JavaIdentifierTransformer STRICT = new StrictJavaIdentifierTransformer();
45
46 public static final JavaIdentifierTransformer UNDERSCORE = new UnderscoreJavaIdentifierTransformer();
47
48 public static final JavaIdentifierTransformer WHITESPACE = new WhiteSpaceJavaIdentifierTransformer();
49
50 public abstract String transformToJavaIdentifier( String str );
51
52
53
54
55
56
57 protected final String shaveOffNonJavaIdentifierStartChars( String str ) {
58 String str2 = str;
59
60 boolean ready = false;
61 while( !ready ){
62 if( !Character.isJavaIdentifierStart( str2.charAt( 0 ) ) ){
63 str2 = str2.substring( 1 );
64 if( str2.length() == 0 ){
65 throw new JSONException( "Can't convert '" + str + "' to a valid Java identifier" );
66 }
67 }else{
68 ready = true;
69 }
70 }
71 return str2;
72 }
73
74 private static final class CamelCaseJavaIdentifierTransformer extends JavaIdentifierTransformer {
75 public String transformToJavaIdentifier( String str ) {
76 if( str == null ){
77 return null;
78 }
79
80 String str2 = shaveOffNonJavaIdentifierStartChars( str );
81
82 char[] chars = str2.toCharArray();
83 int pos = 0;
84 StringBuffer buf = new StringBuffer();
85 boolean toUpperCaseNextChar = false;
86 while( pos < chars.length ){
87 if( !Character.isJavaIdentifierPart( chars[pos] )
88 || Character.isWhitespace( chars[pos] ) ){
89 toUpperCaseNextChar = true;
90 }else{
91 if( toUpperCaseNextChar ){
92 buf.append( Character.toUpperCase( chars[pos] ) );
93 toUpperCaseNextChar = false;
94 }else{
95 buf.append( chars[pos] );
96 }
97 }
98 pos++;
99 }
100 return buf.toString();
101 }
102 }
103
104 private static final class NoopJavaIdentifierTransformer extends JavaIdentifierTransformer {
105 public String transformToJavaIdentifier( String str ) {
106 return str;
107 }
108 }
109
110 private static final class StrictJavaIdentifierTransformer extends JavaIdentifierTransformer {
111 public String transformToJavaIdentifier( String str ) {
112 throw new JSONException( "'" + str + "' is not a valid Java identifier." );
113 }
114 }
115 private static final class UnderscoreJavaIdentifierTransformer extends JavaIdentifierTransformer {
116 public String transformToJavaIdentifier( String str ) {
117 if( str == null ){
118 return null;
119 }
120 String str2 = shaveOffNonJavaIdentifierStartChars( str );
121
122 char[] chars = str2.toCharArray();
123 int pos = 0;
124 StringBuffer buf = new StringBuffer();
125 boolean toUnderScorePreviousChar = false;
126 while( pos < chars.length ){
127 if( !Character.isJavaIdentifierPart( chars[pos] )
128 || Character.isWhitespace( chars[pos] ) ){
129 toUnderScorePreviousChar = true;
130 }else{
131 if( toUnderScorePreviousChar ){
132 buf.append( "_" );
133 toUnderScorePreviousChar = false;
134 }
135 buf.append( chars[pos] );
136 }
137 pos++;
138 }
139 if( buf.charAt( buf.length() - 1 ) == '_' ){
140 buf.deleteCharAt( buf.length() - 1 );
141 }
142 return buf.toString();
143 }
144 }
145 private static final class WhiteSpaceJavaIdentifierTransformer extends JavaIdentifierTransformer {
146 public String transformToJavaIdentifier( String str ) {
147 if( str == null ){
148 return null;
149 }
150 String str2 = shaveOffNonJavaIdentifierStartChars( str );
151 str2 = StringUtils.deleteWhitespace( str2 );
152 char[] chars = str2.toCharArray();
153 int pos = 0;
154 StringBuffer buf = new StringBuffer();
155 while( pos < chars.length ){
156 if( Character.isJavaIdentifierPart( chars[pos] ) ){
157 buf.append( chars[pos] );
158 }
159 pos++;
160 }
161 return buf.toString();
162 }
163 }
164 }