1 16 package org.apache.commons.jelly.impl; 17 18 import org.apache.commons.jelly.DynaTag; 19 import org.apache.commons.jelly.JellyContext; 20 import org.apache.commons.jelly.JellyException; 21 import org.apache.commons.jelly.JellyTagException; 22 import org.apache.commons.jelly.Tag; 23 import org.apache.commons.jelly.TagLibrary; 24 import org.apache.commons.jelly.XMLOutput; 25 import org.apache.commons.jelly.expression.Expression; 26 import org.xml.sax.SAXException ; 27 28 import java.net.URL ; 29 import java.util.Iterator ; 30 import java.util.Map ; 31 32 41 public class StaticTagScript extends TagScript { 42 43 public StaticTagScript() { 44 } 45 46 public StaticTagScript(TagFactory tagFactory) { 47 super(tagFactory); 48 } 49 50 51 public void run(JellyContext context, XMLOutput output) throws JellyTagException { 54 try { 55 startNamespacePrefixes(output); 56 } catch (SAXException e) { 57 throw new JellyTagException("could not start namespace prefixes",e); 58 } 59 60 Tag tag; 61 try { 62 tag = getTag(context); 63 64 if (tag instanceof StaticTag) { 66 tag = findDynamicTag(context, (StaticTag) tag); 67 } 68 69 setTag(tag,context); 70 } catch (JellyException e) { 71 throw new JellyTagException(e); 72 } 73 74 URL rootURL = context.getRootURL(); 75 URL currentURL = context.getCurrentURL(); 76 try { 77 if ( tag == null ) { 78 return; 79 } 80 tag.setContext(context); 81 setContextURLs(context); 82 83 DynaTag dynaTag = (DynaTag) tag; 84 85 for (Iterator iter = attributes.entrySet().iterator(); iter.hasNext();) { 87 Map.Entry entry = (Map.Entry ) iter.next(); 88 String name = (String ) entry.getKey(); 89 if(name.indexOf(':')!=-1) 90 name = name.substring(name.indexOf(':')+1); 91 ExpressionAttribute expat = (ExpressionAttribute) entry.getValue(); 92 Expression expression = expat.exp; 93 94 Object value; 95 96 if ( Expression.class.isAssignableFrom( dynaTag.getAttributeType(name) ) ) { 97 value = expression; 98 } else { 99 value = expression.evaluate(context); 100 } 101 102 if( expat.prefix != null && expat.prefix.length() > 0 && tag instanceof StaticTag ) 103 { 104 ((StaticTag) dynaTag).setAttribute(name,expat.prefix, expat.nsURI,value); 105 } 106 else 107 { 108 dynaTag.setAttribute(name, value); 109 } 110 } 111 112 tag.doTag(output); 113 } 114 catch (JellyTagException e) { 115 handleException(e); 116 } 117 catch (RuntimeException e) { 118 handleException(e); 119 } finally { 120 context.setCurrentURL(currentURL); 121 context.setRootURL(rootURL); 122 } 123 124 try { 125 endNamespacePrefixes(output); 126 } catch (SAXException e) { 127 throw new JellyTagException("could not end namespace prefixes",e); 128 } 129 } 130 131 135 protected Tag findDynamicTag(JellyContext context, StaticTag tag) throws JellyException { 136 TagLibrary taglib = context.getTagLibrary( tag.getUri() ); 138 if ( taglib != null ) { 139 Tag newTag = taglib.createTag( tag.getLocalName(), getSaxAttributes() ); 140 if ( newTag != null ) { 141 newTag.setParent( tag.getParent() ); 142 newTag.setBody( tag.getBody() ); 143 return newTag; 144 } 145 } 146 return tag; 147 } 148 } 149 | Popular Tags |