use of org.apache.cxf.common.jaxb.JAXBUtils.Mapping in project cxf by apache.
the class TypeClassInitializer method begin.
@Override
public void begin(MessagePartInfo part) {
OperationInfo op = part.getMessageInfo().getOperation();
if (!isFault && !allowWrapperOperations && op.isUnwrappedCapable() && !op.isUnwrapped()) {
return;
}
QName name;
if (part.isElement()) {
name = part.getElementQName();
} else {
name = part.getTypeQName();
}
Mapping mapping = model.get(name);
// String clsName = null;
JType jType = null;
if (mapping != null) {
jType = mapping.getType().getTypeClass();
}
if (jType == null) {
TypeAndAnnotation typeAndAnnotation = model.getJavaType(part.getTypeQName());
if (typeAndAnnotation != null) {
jType = typeAndAnnotation.getTypeClass();
}
}
if (jType == null && part.isElement() && part.getXmlSchema() instanceof XmlSchemaElement && ((XmlSchemaElement) part.getXmlSchema()).getSchemaTypeName() == null) {
// anonymous inner thing.....
UnwrappedOperationInfo oInfo = (UnwrappedOperationInfo) op;
op = oInfo.getWrappedOperation();
if (part.getMessageInfo() == oInfo.getInput()) {
mapping = model.get(op.getInput().getFirstMessagePart().getElementQName());
} else {
mapping = model.get(op.getOutput().getFirstMessagePart().getElementQName());
}
if (mapping != null) {
jType = mapping.getType().getTypeClass();
try {
Iterator<JType> i = jType.classes();
while (i.hasNext()) {
JType jt = i.next();
if (jt.name().equalsIgnoreCase(part.getElementQName().getLocalPart())) {
jType = jt;
}
}
} catch (Throwable t) {
// ignore, JType is a type that doesn't have a classes method
}
}
}
if (jType == null) {
throw new ServiceConstructionException(new Message("NO_JAXB_CLASSMapping", LOG, name));
}
Class<?> cls;
try {
int arrayCount = 0;
JType rootType = jType;
while (rootType.isArray()) {
rootType = rootType.elementType();
arrayCount++;
}
if (arrayCount == 0 && part.isElement() && part.getXmlSchema() instanceof XmlSchemaElement && ((XmlSchemaElement) part.getXmlSchema()).getMaxOccurs() > 1) {
arrayCount = 1;
}
cls = getClassByName(rootType);
// an array object on the way.
if (arrayCount > 0) {
int[] dimensions = new int[arrayCount];
while (arrayCount > 0) {
arrayCount--;
dimensions[arrayCount] = 0;
}
Object emptyArray = Array.newInstance(cls, dimensions);
cls = emptyArray.getClass();
}
} catch (ClassNotFoundException e) {
throw new ServiceConstructionException(e);
}
part.setTypeClass(cls);
if (isFault) {
// need to create an Exception class for this
try {
part.getMessageInfo().setProperty(Class.class.getName(), createFaultClass(cls));
} catch (Throwable t) {
// ignore - probably no asm
}
}
super.begin(part);
}
Aggregations