1 52 53 package freemarker.core; 54 55 import freemarker.template.*; 56 import freemarker.template.utility.StringUtil; 57 import java.util.List ; 58 59 62 63 abstract class NodeBuiltins { 64 65 abstract static class NodeBuiltIn extends BuiltIn { 66 TemplateModel _getAsTemplateModel(Environment env) 67 throws TemplateException 68 { 69 TemplateModel model = target.getAsTemplateModel(env); 70 if (!(model instanceof TemplateNodeModel)) { 71 throw invalidTypeException(model, target, env, "node model"); 72 } 73 return calculateResult((TemplateNodeModel) model, env); 74 } 75 abstract TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) 76 throws TemplateModelException; 77 } 78 79 static class ancestorsBI extends NodeBuiltIn { 80 TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException { 81 AncestorSequence result = new AncestorSequence(env); 82 TemplateNodeModel parent = nodeModel.getParentNode(); 83 while (parent != null) { 84 result.add(parent); 85 parent = parent.getParentNode(); 86 } 87 return result; 88 } 89 } 90 91 static class childrenBI extends NodeBuiltIn { 92 TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException { 93 return nodeModel.getChildNodes(); 94 } 95 } 96 97 98 static class node_nameBI extends NodeBuiltIn { 99 TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException { 100 return new SimpleScalar(nodeModel.getNodeName()); 101 } 102 } 103 104 static class node_typeBI extends NodeBuiltIn { 105 TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException { 106 return new SimpleScalar(nodeModel.getNodeType()); 107 } 108 } 109 110 static class parentBI extends NodeBuiltIn { 111 TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException { 112 return nodeModel.getParentNode(); 113 } 114 } 115 116 static class rootBI extends NodeBuiltIn { 117 TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException { 118 TemplateNodeModel result = nodeModel; 119 TemplateNodeModel parent = nodeModel.getParentNode(); 120 while (parent != null) { 121 result = parent; 122 parent = result.getParentNode(); 123 } 124 return result; 125 } 126 } 127 128 static class node_namespaceBI extends NodeBuiltIn { 129 TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException { 130 String nsURI = nodeModel.getNodeNamespace(); 131 return nsURI == null ? null : new SimpleScalar(nsURI); 132 } 133 } 134 135 136 static class AncestorSequence extends SimpleSequence implements TemplateMethodModel { 137 138 private Environment env; 139 140 AncestorSequence(Environment env) { 141 this.env = env; 142 } 143 144 public Object exec(List names) throws TemplateModelException { 145 if (names == null || names.isEmpty()) { 146 return this; 147 } 148 AncestorSequence result = new AncestorSequence(env); 149 for (int i=0; i<size(); i++) { 150 TemplateNodeModel tnm = (TemplateNodeModel) get(i); 151 String nodeName = tnm.getNodeName(); 152 String nsURI = tnm.getNodeNamespace(); 153 if (nsURI == null) { 154 if (names.contains(nodeName)) { 155 result.add(tnm); 156 } 157 } else { 158 for (int j = 0; j<names.size(); j++) { 159 if (StringUtil.matchesName((String ) names.get(j), nodeName, nsURI, env)) { 160 result.add(tnm); 161 break; 162 } 163 } 164 } 165 } 166 return result; 167 } 168 } 169 } | Popular Tags |