1212import org .jvnet .jaxb2_commons .xjc .model .concrete .origin .XJCCMPackageInfoOrigin ;
1313import org .jvnet .jaxb2_commons .xjc .model .concrete .origin .XJCCMPropertyInfoOrigin ;
1414import org .jvnet .jaxb2_commons .xml .bind .model .MClassInfo ;
15+ import org .jvnet .jaxb2_commons .xml .bind .model .MClassRef ;
1516import org .jvnet .jaxb2_commons .xml .bind .model .MContainer ;
1617import org .jvnet .jaxb2_commons .xml .bind .model .MPackageInfo ;
18+ import org .jvnet .jaxb2_commons .xml .bind .model .MTypeInfo ;
19+ import org .jvnet .jaxb2_commons .xml .bind .model .concrete .CMClassRef ;
1720import org .jvnet .jaxb2_commons .xml .bind .model .concrete .CMInfoFactory ;
1821import org .jvnet .jaxb2_commons .xml .bind .model .concrete .CMPackageInfo ;
22+ import org .jvnet .jaxb2_commons .xml .bind .model .concrete .origin .CMPackageInfoOrigin ;
1923import org .jvnet .jaxb2_commons .xml .bind .model .origin .MClassInfoOrigin ;
2024import org .jvnet .jaxb2_commons .xml .bind .model .origin .MElementInfoOrigin ;
2125import org .jvnet .jaxb2_commons .xml .bind .model .origin .MEnumConstantInfoOrigin ;
3135import com .sun .tools .xjc .model .CClassInfo ;
3236import com .sun .tools .xjc .model .CClassInfoParent ;
3337import com .sun .tools .xjc .model .CClassInfoParent .Visitor ;
38+ import com .sun .tools .xjc .model .CClassRef ;
3439import com .sun .tools .xjc .model .CElementInfo ;
3540import com .sun .tools .xjc .model .CElementPropertyInfo ;
3641import com .sun .tools .xjc .model .CEnumConstant ;
@@ -54,11 +59,110 @@ public XJCCMInfoFactory(Model model) {
5459 super (model );
5560 }
5661
62+ protected NClass getClazz (CClassRef info ) {
63+ return info ;
64+ }
65+
66+ protected NClass getClazz (final Class <?> _clas ) {
67+ return new NClass () {
68+
69+ @ Override
70+ public boolean isBoxedType () {
71+ return false ;
72+ }
73+
74+ @ Override
75+ public String fullName () {
76+ return _clas .getName ();
77+ }
78+
79+ @ Override
80+ public JClass toType (Outline o , Aspect aspect ) {
81+ return o .getCodeModel ().ref (_clas );
82+ }
83+
84+ @ Override
85+ public boolean isAbstract () {
86+ return false ;
87+ }
88+ };
89+ }
90+
91+ protected NClass getClazz (final String className ) {
92+ return new NClass () {
93+
94+ @ Override
95+ public boolean isBoxedType () {
96+ return false ;
97+ }
98+
99+ @ Override
100+ public String fullName () {
101+ return className ;
102+ }
103+
104+ @ Override
105+ public JClass toType (Outline o , Aspect aspect ) {
106+ return o .getCodeModel ().ref (className );
107+ }
108+
109+ @ Override
110+ public boolean isAbstract () {
111+ return false ;
112+ }
113+ };
114+ }
115+
116+ protected MClassRef <NType , NClass > createClassRef (Class <?> _class ) {
117+ return new CMClassRef <NType , NClass >(getClazz (_class ),
118+ getPackage (_class ), getContainer (_class ), getLocalName (_class ));
119+ }
120+
121+ protected MClassRef <NType , NClass > createClassRef (CClassRef info ) {
122+ return new CMClassRef <NType , NClass >(getClazz (info ), getPackage (info ),
123+ getContainer (info ), getLocalName (info ));
124+ }
125+
126+ @ Override
127+ protected MTypeInfo <NType , NClass > getTypeInfo (CTypeInfo typeInfo ) {
128+ if (typeInfo instanceof CClassRef ) {
129+ return createClassRef ((CClassRef ) typeInfo );
130+ } else {
131+ return super .getTypeInfo (typeInfo );
132+ }
133+ }
134+
57135 @ Override
58136 protected MPackageInfo getPackage (CClassInfo info ) {
59137 return getPackage (info .parent ());
60138 }
61139
140+ protected MPackageInfo getPackage (CClassRef info ) {
141+ final String fullName = info .fullName ();
142+ return getPackage (fullName );
143+ }
144+
145+ private MPackageInfo getPackage (final String fullName ) {
146+ try {
147+ final Class <?> _class = Class .forName (fullName );
148+ return getPackage (_class );
149+ } catch (ClassNotFoundException cnfex ) {
150+ final String packageName ;
151+ final int lastIndexOfDot = fullName .lastIndexOf ('.' );
152+ if (lastIndexOfDot != -1 ) {
153+ packageName = fullName .substring (0 , lastIndexOfDot );
154+ } else {
155+ packageName = "" ;
156+ }
157+ return new CMPackageInfo (new CMPackageInfoOrigin (), packageName );
158+ }
159+ }
160+
161+ private MPackageInfo getPackage (final Class _class ) {
162+ final Package _package = _class .getPackage ();
163+ return new CMPackageInfo (new CMPackageInfoOrigin (), _package .getName ());
164+ }
165+
62166 @ Override
63167 protected MPackageInfo getPackage (CEnumLeafInfo info ) {
64168 return getPackage (info .parent );
@@ -87,6 +191,25 @@ protected MContainer getContainer(CEnumLeafInfo info) {
87191 return parent == null ? null : getContainer (parent );
88192 }
89193
194+ protected MContainer getContainer (CClassRef info ) {
195+ final String fullName = info .fullName ();
196+ try {
197+ final Class <?> _class = Class .forName (fullName );
198+ return getContainer (_class );
199+ } catch (ClassNotFoundException cnfex ) {
200+ return getPackage (info );
201+ }
202+ }
203+
204+ private MContainer getContainer (final Class <?> _class ) {
205+ final Class <?> enclosingClass = _class .getEnclosingClass ();
206+ if (enclosingClass == null ) {
207+ return getPackage (_class );
208+ } else {
209+ return createClassRef (enclosingClass );
210+ }
211+ }
212+
90213 private final Map <String , MPackageInfo > packages = new HashMap <String , MPackageInfo >();
91214
92215 private MContainer getContainer (CClassInfoParent parent ) {
@@ -135,6 +258,32 @@ protected String getLocalName(CClassInfo info) {
135258 return info .shortName ;
136259 }
137260
261+ protected String getLocalName (CClassRef info ) {
262+ final String fullName = info .fullName ();
263+ try {
264+ final Class <?> _class = Class .forName (fullName );
265+ return getLocalName (_class );
266+ } catch (ClassNotFoundException cnfex ) {
267+ return getLocalName (fullName );
268+ }
269+ }
270+
271+ private String getLocalName (final String fullName ) {
272+ final int lastIndexOfDollar = fullName .lastIndexOf ('$' );
273+ if (lastIndexOfDollar != -1 ) {
274+ return fullName .substring (lastIndexOfDollar + 1 );
275+ }
276+ final int lastIndexOfDot = fullName .lastIndexOf ('.' );
277+ if (lastIndexOfDot != -1 ) {
278+ return fullName .substring (lastIndexOfDollar + 1 );
279+ }
280+ return fullName ;
281+ }
282+
283+ private String getLocalName (final Class <?> _class ) {
284+ return _class .getSimpleName ();
285+ }
286+
138287 @ Override
139288 protected String getLocalName (CEnumLeafInfo info ) {
140289 return info .shortName ;
0 commit comments