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 }