1 37 package org.webharvest.definition; 38 39 import java.util.*; 40 41 import org.webharvest.exception.ConfigurationException; 42 import org.webharvest.exception.ErrMsg; 43 44 public class DefinitionResolver { 45 46 public static IElementDef createElementDefinition(XmlNode node) { 47 IElementDef result; 48 49 String nodeName = node.getName(); 50 51 if (nodeName.equalsIgnoreCase("empty")) { 52 validate(node, null, "id"); 53 result = new EmptyDef(node); 54 } else if (nodeName.equalsIgnoreCase("text")) { 55 validate(node, null, "id"); 56 result = new TextDef(node); 57 } else if (nodeName.equalsIgnoreCase("file")) { 58 validate(node, null, "id,!path,action,type,charset"); 59 result = new FileDef(node); 60 } else if (nodeName.equalsIgnoreCase("var-def")) { 61 validate(node, null, "id,!name"); 62 result = new VarDefDef(node); 63 } else if (nodeName.equalsIgnoreCase("var")) { 64 validate(node, "", "id,!name"); 65 result = new VarDef(node); 66 } else if (nodeName.equalsIgnoreCase("http")) { 67 validate(node, null, "id,!url,method,charset,username,password"); 68 result = new HttpDef(node); 69 } else if (nodeName.equalsIgnoreCase("http-param")) { 70 validate(node, null, "id,!name"); 71 result = new HttpParamDef(node); 72 } else if (nodeName.equalsIgnoreCase("http-header")) { 73 validate(node, null, "id,!name"); 74 result = new HttpHeaderDef(node); 75 } else if (nodeName.equalsIgnoreCase("html-to-xml")) { 76 validate(node, null, "id"); 77 result = new HtmlToXmlDef(node); 78 } else if (nodeName.equalsIgnoreCase("regexp")) { 79 validate(node, "!regexp-pattern,!regexp-source,regexp-result", "id,replace,max"); 80 result = new RegexpDef(node); 81 } else if (nodeName.equalsIgnoreCase("xpath")) { 82 validate(node, null, "id,!expression"); 83 result = new XPathDef(node); 84 } else if (nodeName.equalsIgnoreCase("xquery")) { 85 validate(node, "xq-param,!xq-expression", "id"); 86 result = new XQueryDef(node); 87 } else if (nodeName.equalsIgnoreCase("xslt")) { 88 validate(node, "!xml,!stylesheet", "id"); 89 result = new XsltDef(node); 90 } else if (nodeName.equalsIgnoreCase("template")) { 91 validate(node, null, "id"); 92 result = new TemplateDef(node); 93 } else if (nodeName.equalsIgnoreCase("case")) { 94 validate(node, "!if,else", "id"); 95 result = new CaseDef(node); 96 } else if (nodeName.equalsIgnoreCase("loop")) { 97 validate(node, "!list,!body", "id,item,index,maxloops,filter"); 98 result = new LoopDef(node); 99 } else if (nodeName.equalsIgnoreCase("while")) { 100 validate(node, null, "id,!condition,index,maxloops"); 101 result = new WhileDef(node); 102 } else if (nodeName.equalsIgnoreCase("function")) { 103 validate(node, null, "id,!name"); 104 result = new FunctionDef(node); 105 } else if (nodeName.equalsIgnoreCase("return")) { 106 validate(node, null, "id"); 107 result = new ReturnDef(node); 108 } else if (nodeName.equalsIgnoreCase("call")) { 109 validate(node, null, "id,!name"); 110 result = new CallDef(node); 111 } else if (nodeName.equalsIgnoreCase("call-param")) { 112 validate(node, null, "id,!name"); 113 result = new CallParamDef(node); 114 } else if (nodeName.equalsIgnoreCase("include")) { 115 validate(node, "", "id,!path"); 116 result = new IncludeDef(node); 117 } else if (nodeName.equalsIgnoreCase("try")) { 118 validate(node, "!body,!catch", "id"); 119 result = new TryDef(node); 120 } else if (nodeName.equalsIgnoreCase("script")) { 121 validate(node, null, "id"); 122 result = new ScriptDef(node); 123 } else { 124 throw new ConfigurationException("Unexpected configuration element: " + nodeName + "!"); 125 } 126 127 return result; 128 } 129 130 public static void validate(XmlNode node, String validTags, String validAtts) { 131 if (node == null) { 132 return; 133 } 134 135 if (validTags != null) { 137 Set validTagsSet = new HashSet(); 138 139 StringTokenizer tokenizer = new StringTokenizer(validTags, ","); 141 while (tokenizer.hasMoreTokens()) { 142 String token = tokenizer.nextToken().toLowerCase(); 143 if (token.startsWith("!")) { 144 String tagName = token.substring(1); 145 if ( node.getElement(tagName) == null ) { 146 throw new ConfigurationException( ErrMsg.missingTag(node.getName(), tagName) ); 147 } 148 validTagsSet.add(tagName); 149 } else { 150 validTagsSet.add(token); 151 } 152 } 153 154 Iterator it = node.keySet().iterator(); 156 while (it.hasNext()) { 157 String tagName = ((String ) it.next()).toLowerCase(); 158 if (!validTagsSet.contains(tagName)) { 159 throw new ConfigurationException( ErrMsg.invalidTag(node.getName(), tagName) ); 160 } 161 } 162 } 163 164 if (validAtts != null) { 166 Set validAttsSet = new HashSet(); 167 168 StringTokenizer tokenizer = new StringTokenizer(validAtts, ","); 170 while (tokenizer.hasMoreTokens()) { 171 String token = tokenizer.nextToken().toLowerCase(); 172 if (token.startsWith("!")) { 173 String attName = token.substring(1); 174 if ( node.getAttribute(attName) == null ) { 175 throw new ConfigurationException( ErrMsg.missingAttribute(node.getName(), attName) ); 176 } 177 validAttsSet.add(attName); 178 } else { 179 validAttsSet.add(token); 180 } 181 } 182 183 Map attributes = node.getAttributes(); 185 if (attributes != null) { 186 Iterator it = attributes.keySet().iterator(); 187 while (it.hasNext()) { 188 String attName = ((String ) it.next()).toLowerCase(); 189 if (!validAttsSet.contains(attName)) { 190 throw new ConfigurationException( ErrMsg.invalidAttribute(node.getName(), attName) ); 191 } 192 } 193 } 194 } 195 } 196 197 } | Popular Tags |