KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jfun > yan > xml > nuts > DeserializerNut


1 package jfun.yan.xml.nuts;
2
3
4 import java.beans.PropertyEditor JavaDoc;
5
6 import jfun.yan.Container;
7 import jfun.yan.Creator;
8 import jfun.yan.TypeMismatchException;
9 import jfun.yan.containers.DefaultContainer;
10 import jfun.yan.util.ReflectionUtil;
11 import jfun.yan.util.deserializer.Deserializer;
12 import jfun.yan.util.deserializer.PropertyEditorDeserializer;
13 import jfun.yan.xml.ConfigurationException;
14
15 import jfun.yan.xml.nut.Nut;
16
17 /**
18  * For example,
19  * <pre>
20  * &lt;deserializer target-type="SoapVersion" class="MySoapVersionPropertyEditor"/&gt;
21  * </pre>
22  * <br>
23  * or,
24  * <pre>
25  * &lt;deserializer target-type="SoapVersion" deserializer="$mydeserializer"/&gt;
26  * </pre>
27  * or,
28  * <pre>
29  * &lt;deserializer target-type="SoapVersion"&gt;
30  * &lt;bean .../&gt;
31  * &lt;/deserializer&gt;
32  * </pre>
33  * <p>
34  * Default value for "overriding" and "mandatory" is false.
35  * </p>
36  * <p>
37  * @author Ben Yu
38  * Feb 1, 2006 1:29:23 AM
39  */

40 public class DeserializerNut extends Nut {
41   private Class JavaDoc target_type;
42   private Deserializer deserializer;
43   private boolean overriding = false;
44   private boolean mandatory = false;
45   private Class JavaDoc clazz;
46   public boolean isMandatory() {
47     return mandatory;
48   }
49   public void setMandatory(boolean mandatory) {
50     this.mandatory = mandatory;
51   }
52   public boolean isOverriding() {
53     return overriding;
54   }
55   public void setOverriding(boolean overriding) {
56     this.overriding = overriding;
57   }
58
59   public void setClass(Class JavaDoc clazz)
60   throws IllegalAccessException JavaDoc, InstantiationException JavaDoc{
61     checkDuplicate("deserializer", this.deserializer);
62     this.clazz = clazz;
63     this.deserializer = getStatelessDeserializer(clazz);
64   }
65   public Class JavaDoc getTargetType() {
66     return target_type;
67   }
68   public void setTarget_type(Class JavaDoc target_type) {
69     this.target_type = target_type;
70   }
71   public void eval()
72   throws IllegalAccessException JavaDoc, InstantiationException JavaDoc{
73     checkMandatory("target-type", target_type);
74     checkMandatory("class or deserializer", deserializer);
75     this.getNutEnvironment()
76     .registerDeserializer(target_type, deserializer,
77         overriding, mandatory);
78   }
79
80   public void setDeserializer(Object JavaDoc ds) {
81     if(ds==null)
82       raise("cannot set deserializer to null");
83     checkDuplicate("class", this.clazz);
84     delegateTo(toDeserializer(ds));
85   }
86
87   public void add(Object JavaDoc sub){
88     checkDuplicate("class", this.clazz);
89     checkDuplicate("deserializer", this.deserializer);
90     delegateTo(toDeserializer(sub));
91   }
92   private Deserializer getStatelessDeserializer(Class JavaDoc type)
93   throws IllegalAccessException JavaDoc, InstantiationException JavaDoc{
94     if(Deserializer.class.isAssignableFrom(type)){
95       return (Deserializer)type.newInstance();
96     }
97     else if(PropertyEditor JavaDoc.class.isAssignableFrom(type)){
98       return new PropertyEditorDeserializer(type);
99     }
100     else{
101       throw mismatchType(type);
102     }
103   }
104   protected void delegateTo(Deserializer deserializer){
105     this.deserializer = deserializer;
106   }
107   private Deserializer toDeserializer(Object JavaDoc obj){
108     if(obj instanceof Deserializer){
109       return (Deserializer)obj;
110     }
111     else if(obj instanceof Creator){
112       return instantiateDeserializer((Creator)obj);
113     }
114     else{
115       return (Deserializer)this.convert(Deserializer.class, obj);
116     }
117   }
118   private ConfigurationException mismatchType(Class JavaDoc type){
119     return raise(new TypeMismatchException(Deserializer.class, type));
120   }
121   private ConfigurationException mismatch(Object JavaDoc obj){
122     return mismatchType(obj==null?null:obj.getClass());
123   }
124   private Deserializer instantiateDeserializer(Creator c){
125     final Class JavaDoc type = c.getType();
126     if(type!=null && !ReflectionUtil.isCompatible(Deserializer.class, type)){
127       throw mismatchType(type);
128     }
129     final Object JavaDoc r = empty.instantiateComponent(c);
130     if(r instanceof Deserializer){
131       return (Deserializer)r;
132     }
133     else{
134       throw mismatch(r);
135     }
136   }
137   private static Container empty = new DefaultContainer();
138 }
139
Popular Tags