Skip to content

Commit 61de524

Browse files
author
lexi
committed
1 parent 11741c0 commit 61de524

File tree

1 file changed

+149
-0
lines changed

1 file changed

+149
-0
lines changed

basics/trunk/tools/src/main/java/org/jvnet/jaxb2_commons/xjc/model/concrete/XJCCMInfoFactory.java

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@
1212
import org.jvnet.jaxb2_commons.xjc.model.concrete.origin.XJCCMPackageInfoOrigin;
1313
import org.jvnet.jaxb2_commons.xjc.model.concrete.origin.XJCCMPropertyInfoOrigin;
1414
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
15+
import org.jvnet.jaxb2_commons.xml.bind.model.MClassRef;
1516
import org.jvnet.jaxb2_commons.xml.bind.model.MContainer;
1617
import 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;
1720
import org.jvnet.jaxb2_commons.xml.bind.model.concrete.CMInfoFactory;
1821
import org.jvnet.jaxb2_commons.xml.bind.model.concrete.CMPackageInfo;
22+
import org.jvnet.jaxb2_commons.xml.bind.model.concrete.origin.CMPackageInfoOrigin;
1923
import org.jvnet.jaxb2_commons.xml.bind.model.origin.MClassInfoOrigin;
2024
import org.jvnet.jaxb2_commons.xml.bind.model.origin.MElementInfoOrigin;
2125
import org.jvnet.jaxb2_commons.xml.bind.model.origin.MEnumConstantInfoOrigin;
@@ -31,6 +35,7 @@
3135
import com.sun.tools.xjc.model.CClassInfo;
3236
import com.sun.tools.xjc.model.CClassInfoParent;
3337
import com.sun.tools.xjc.model.CClassInfoParent.Visitor;
38+
import com.sun.tools.xjc.model.CClassRef;
3439
import com.sun.tools.xjc.model.CElementInfo;
3540
import com.sun.tools.xjc.model.CElementPropertyInfo;
3641
import 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

Comments
 (0)