001    package railo.transformer.library.tag;
002    
003    import java.io.IOException;
004    import java.lang.reflect.Method;
005    import java.util.Date;
006    
007    import railo.commons.lang.ClassUtil;
008    import railo.commons.lang.Md5;
009    import railo.commons.lang.StringUtil;
010    
011    
012    /**
013     * Die Klasse TagLibTagAttr repr�sentiert ein einzelnes Attribute eines Tag 
014     * und h�lt s�mtliche Informationen zu diesem Attribut.
015     */
016    public final class TagLibTagAttr {
017    
018            public static final short SCRIPT_SUPPORT_NONE = 0;
019            public static final short SCRIPT_SUPPORT_OPTIONAL = 1;
020            public static final short SCRIPT_SUPPORT_REQUIRED = 2;
021            
022            private String name="noname";
023            private String type;
024            private String description="";
025            private boolean required;
026            private boolean rtexpr=true;
027            private Object defaultValue;
028        private TagLibTag tag;
029            private boolean hidden;
030            private boolean _default;
031            private short status=TagLib.STATUS_IMPLEMENTED;
032            private short scriptSupport=SCRIPT_SUPPORT_NONE;
033    
034            
035            public TagLibTagAttr duplicate(TagLibTag tag) {
036                    TagLibTagAttr tlta=new TagLibTagAttr(tag);
037                    tlta.name=name;
038                    tlta.type=type;
039                    tlta.description=description;
040                    tlta.required=required;
041                    tlta.rtexpr=rtexpr;
042                    tlta.defaultValue=defaultValue;
043                    tlta.hidden=hidden;
044                    tlta._default=_default;
045                    tlta.status=status;
046                    
047                    
048                    return tlta;
049            }
050            
051            
052            /**
053             * @return the status (TagLib.,TagLib.STATUS_IMPLEMENTED,TagLib.STATUS_DEPRECATED,TagLib.STATUS_UNIMPLEMENTED)
054             */
055            public short getStatus() {
056                    return status;
057            }
058    
059    
060            /**
061             * @param status the status to set (TagLib.,TagLib.STATUS_IMPLEMENTED,TagLib.STATUS_DEPRECATED,TagLib.STATUS_UNIMPLEMENTED)
062             */
063            public void setStatus(short status) {
064                    this.status = status;
065            }
066    
067            /**
068             * Gesch�tzer Konstruktor ohne Argumente.
069             */
070            public TagLibTagAttr(TagLibTag tag) {
071                this.tag=tag;
072            }
073    
074            /**
075             * Gibt den Namen des Attribut zur�ck.
076             * @return Name des Attribut.
077             */
078            public String getName() {
079                    return name;
080            }
081    
082            /**
083             * Gibt zur�ck, ob das Attribut Pflicht ist oder nicht.
084             * @return Ist das Attribut Pflicht.
085             */
086            public boolean isRequired() {
087                    return required;
088            }
089    
090            /**
091             * Gibt den Typ des Attribut zur�ck (query, struct, string usw.)
092             * @return Typ des Attribut
093             */
094            public String getType() {
095                if(this.type==null) {
096                    try {
097                    String methodName=  "set"+
098                            (name.length()>0?""+Character.toUpperCase(name.charAt(0)):"")+
099                            (name.length()>1?name.substring(1):"");
100                    
101                    Class clazz= ClassUtil.loadClass(tag.getTagClassName(),(Class)null);//Class.orName(tag.getTagClassName());
102                if(clazz!=null) {
103                    Method[] methods = clazz.getMethods();
104                    for(int i=0;i<methods.length;i++) {
105                        Method method = methods[i];
106                        if(method.getName().equalsIgnoreCase(methodName)) {
107                            Class[] types = method.getParameterTypes();
108                            if(types.length==1) {
109                                    Class type=types[0];
110                                if(type==String.class)this.type="string";
111                                else if(type==double.class)this.type="number";
112                                else if(type==Date.class)this.type="datetime";
113                                else this.type=type.getName();
114                            }
115                        }
116                    }
117                }
118                    }
119                    catch(Throwable t) {
120                            
121                            return "string";
122                    }
123                }
124                    return this.type;
125            }
126    
127            /**
128             * Gibt zur�ck ob das Attribute eines Tag, mithilfe des ExprTransformer, �bersetzt werden soll oder nicht.
129             * @return Soll das Attribut �bbersetzt werden
130             */
131            public boolean getRtexpr() {
132                    return rtexpr;
133            }
134    
135            /**
136             * Setzt den Namen des Attribut.
137             * @param name Name des Attribut.
138             */
139            public void setName(String name) {
140                    this.name = name.toLowerCase();
141            }
142    
143            /**
144             * Setzt, ob das Argument Pflicht ist oder nicht.
145             * @param required Ist das Attribut Pflicht.
146             */
147            public void setRequired(boolean required) {
148                    this.required = required;
149            }
150    
151            /**
152             * Setzt, ob das Attribute eines Tag, mithilfe des ExprTransformer, �bersetzt werden soll oder nicht.
153             * @param rtexpr Soll das Attribut �bbersetzt werden
154             */
155            public void setRtexpr(boolean rtexpr) {
156                    this.rtexpr = rtexpr;
157            }
158    
159            /**
160             * Setzt, den Typ des Attribut (query, struct, string usw.)
161             * @param type Typ des Attribut.
162             */
163            public void setType(String type) {
164                    this.type = type;
165            }
166    
167            /**
168             * @return Returns the description.
169             */
170            public String getDescription() {
171                    return description;
172            }
173    
174            /**
175             * @param description The description to set.
176             */
177            public void setDescription(String description) {
178                    this.description = description;
179            }
180    
181        /**
182         * @param defaultValue
183         */
184        public void setDefaultValue(Object defaultValue) {
185            this.defaultValue=defaultValue;
186            tag.setHasDefaultValue(true);
187        }
188    
189        /**
190         * @return Returns the defaultValue.
191         */
192        public Object getDefaultValue() {
193            return defaultValue;
194        }
195    
196        /**
197         * @return
198         */
199        public boolean hasDefaultValue() {
200            return defaultValue!=null;
201        }
202    
203            public void setHidden(boolean hidden) {
204                    this.hidden=hidden;
205            }
206            public boolean getHidden() {
207                    return hidden;
208            }
209    
210            public String getHash() {
211                    StringBuffer sb=new StringBuffer();
212                    sb.append(this.getDefaultValue());
213                    sb.append(this.getName());
214                    sb.append(this.getRtexpr());
215                    sb.append(this.getType());
216                    
217                    try {
218                            return Md5.getDigestAsString(sb.toString());
219                    } catch (IOException e) {
220                            return "";
221                    }
222            }
223    
224            public void isDefault(boolean _default) {
225                    if(_default)
226                            tag.setDefaultAttribute(this);
227                    this._default=_default;
228            }
229    
230            public boolean isDefault() {
231                    return _default;
232            }
233    
234    
235            public void setScriptSupport(String str) {
236                    if(!StringUtil.isEmpty(str))  {
237                            str=str.trim().toLowerCase();
238                            if("optional".equals(str)) this.scriptSupport=SCRIPT_SUPPORT_OPTIONAL;
239                            else if("opt".equals(str)) this.scriptSupport=SCRIPT_SUPPORT_OPTIONAL;
240                            else if("required".equals(str)) this.scriptSupport=SCRIPT_SUPPORT_REQUIRED;
241                            else if("req".equals(str)) this.scriptSupport=SCRIPT_SUPPORT_REQUIRED;
242                    }
243            }
244    
245    
246            /**
247             * @return the scriptSupport
248             */
249            public short getScriptSupport() {
250                    return scriptSupport;
251            }
252    
253    
254            public Object getScriptSupportAsString() {
255                    if(scriptSupport==SCRIPT_SUPPORT_OPTIONAL) return "optional";
256                    if(scriptSupport==SCRIPT_SUPPORT_REQUIRED) return "required";
257                    return "none";
258            }
259    
260    }