001: package org.objectweb.celtix.jaxb;
002:
003: import java.lang.reflect.Field;
004: import java.lang.reflect.InvocationTargetException;
005: import java.lang.reflect.Method;
006: import java.util.Collection;
007: import java.util.List;
008:
009: import javax.xml.bind.annotation.XmlElement;
010:
011: public final class WrapperHelper {
012:
013: private WrapperHelper() {
014: //complete
015: }
016:
017: public static void setWrappedPart(String partName,
018: Object wrapperType, Object part)
019: throws IllegalAccessException, NoSuchMethodException,
020: InvocationTargetException {
021:
022: if (part instanceof List) {
023: setWrappedListProperty(partName, wrapperType, part);
024: } else {
025: String fieldName = partName;
026: if (JAXBUtils.isJavaKeyword(partName)) {
027: fieldName = JAXBUtils.nameToIdentifier(partName,
028: JAXBUtils.IdentifierType.VARIABLE);
029: }
030:
031: XmlElement el = null;
032: for (Field field : wrapperType.getClass()
033: .getDeclaredFields()) {
034: if (field.getName().equals(fieldName)) {
035: //JAXB Type get XmlElement Annotation
036: el = field.getAnnotation(XmlElement.class);
037: assert el != null;
038: }
039: }
040:
041: if (part == null) {
042: if (!el.nillable()) {
043: throw new IllegalArgumentException(
044: "null value for field not permitted.");
045: }
046: return;
047: }
048:
049: String modifier = JAXBUtils.nameToIdentifier(partName,
050: JAXBUtils.IdentifierType.SETTER);
051:
052: boolean setInvoked = false;
053: for (Method method : wrapperType.getClass().getMethods()) {
054: if (method.getParameterTypes() != null
055: && method.getParameterTypes().length == 1
056: && modifier.equals(method.getName())) {
057:
058: Class<?> clazz = method.getParameterTypes()[0];
059: if (method.getParameterTypes()[0].isPrimitive()) {
060: clazz = el.type();
061: }
062:
063: if (clazz.isAssignableFrom(part.getClass())) {
064: method.invoke(wrapperType, part);
065: setInvoked = true;
066: break;
067: }
068: }
069: }
070:
071: if (!setInvoked) {
072: throw new IllegalArgumentException(
073: "Could not find a modifier method on Wrapper Type");
074: }
075: }
076: }
077:
078: private static void setWrappedListProperty(String partName,
079: Object wrapperType, Object part)
080: throws IllegalAccessException, NoSuchMethodException,
081: InvocationTargetException {
082:
083: String accessorName = JAXBUtils.nameToIdentifier(partName,
084: JAXBUtils.IdentifierType.GETTER);
085: for (Method method : wrapperType.getClass().getMethods()) {
086: if (accessorName.equals(method.getName())
087: && List.class.isAssignableFrom(method
088: .getReturnType())) {
089:
090: Object ret = method.invoke(wrapperType);
091: Method addAll = ret.getClass().getMethod("addAll",
092: Collection.class);
093: addAll.invoke(ret, part);
094: break;
095: }
096: }
097: }
098:
099: public static Object getWrappedPart(String partName,
100: Object wrapperType, Class<?> partClazz)
101: throws IllegalAccessException, NoSuchMethodException,
102: InvocationTargetException {
103:
104: String accessor = JAXBUtils.nameToIdentifier(partName,
105: JAXBUtils.IdentifierType.GETTER);
106:
107: if (partClazz.equals(boolean.class)
108: || partClazz.equals(Boolean.class)) {
109: //JAXB Exception to get the Boolean property
110: accessor = accessor.replaceFirst("get", "is");
111: }
112:
113: for (Method method : wrapperType.getClass().getMethods()) {
114: if (method.getParameterTypes().length == 0
115: && accessor.equals(method.getName())) {
116:
117: Class<?> clazz = method.getReturnType();
118:
119: if (clazz.isPrimitive() && !partClazz.isPrimitive()) {
120: for (Field field : wrapperType.getClass()
121: .getDeclaredFields()) {
122: if (JAXBUtils.isJavaKeyword(partName)) {
123: partName = JAXBUtils.nameToIdentifier(
124: partName,
125: JAXBUtils.IdentifierType.VARIABLE);
126: }
127: if (field.getName().equals(partName)) {
128: //JAXB Type get XmlElement Annotation
129: clazz = field.getAnnotation(
130: XmlElement.class).type();
131: }
132: }
133: }
134: //TODO Support For Nillable Attribute
135: if (clazz.isAssignableFrom(partClazz)) {
136: return method.invoke(wrapperType);
137: }
138: }
139: }
140: return null;
141: }
142: }
|