1 /* 2 * The Apache Software License, Version 1.1 3 * 4 * Copyright (c) 2003 The Apache Software Foundation. All rights 5 * reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in 16 * the documentation and/or other materials provided with the 17 * distribution. 18 * 19 * 3. The end-user documentation included with the redistribution, if 20 * any, must include the following acknowlegement: 21 * "This product includes software developed by the 22 * Apache Software Foundation (http://www.apache.org/)." 23 * Alternately, this acknowlegement may appear in the software itself, 24 * if and wherever such third-party acknowlegements normally appear. 25 * 26 * 4. The names "The Jakarta Project", "Velocity", and "Apache Software 27 * Foundation" must not be used to endorse or promote products derived 28 * from this software without prior written permission. For written 29 * permission, please contact apache@apache.org. 30 * 31 * 5. Products derived from this software may not be called "Apache" 32 * nor may "Apache" appear in their names without prior written 33 * permission of the Apache Group. 34 * 35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 46 * SUCH DAMAGE. 47 * ==================================================================== 48 * 49 * This software consists of voluntary contributions made by many 50 * individuals on behalf of the Apache Software Foundation. For more 51 * information on the Apache Software Foundation, please see 52 * <http://www.apache.org/>. 53 */ 54 55 package net.sf.navigator.displayer; 56 57 import org.apache.velocity.context.InternalContextAdapter; 58 import org.apache.velocity.runtime.parser.node.Node; 59 import org.apache.velocity.runtime.parser.node.SimpleNode; 60 import org.apache.velocity.runtime.directive.Directive; 61 import org.apache.velocity.runtime.parser.ParserTreeConstants; 62 import org.apache.velocity.exception.MethodInvocationException; 63 import org.apache.velocity.exception.ResourceNotFoundException; 64 import org.apache.velocity.exception.ParseErrorException; 65 66 import org.apache.velocity.runtime.parser.node.ASTReference; 67 68 import java.io.Writer; 69 import java.io.IOException; 70 import java.util.Map; 71 import java.util.HashMap; 72 import java.util.Iterator; 73 74 75 /** 76 * Simple directive to provide ability to trap a local value for 77 * iteration. 78 * 79 * Ex : 80 * 81 * #set($foo = 1) 82 * $foo 83 * #local($foo) 84 * #set($foo = 2) 85 * $foo 86 * #end 87 * $foo 88 * 89 * should output 90 * 91 * 1 92 * 2 93 * 1 94 * 95 * @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a> 96 * @version $Id: LocalDirective.java,v 1.1 2003/10/31 05:59:06 mraible Exp $ 97 */ 98 public class LocalDirective extends Directive 99 { 100 public String getName() 101 { 102 return "local"; 103 } 104 105 public int getType() 106 { 107 return BLOCK; 108 } 109 110 public boolean render(InternalContextAdapter context, 111 Writer writer, Node node) 112 throws IOException, MethodInvocationException, ResourceNotFoundException, 113 ParseErrorException 114 { 115 Map data = new HashMap(); 116 117 int num = node.jjtGetNumChildren(); 118 119 /* 120 * get the references 121 */ 122 123 for (int i=0; i < num; i++) 124 { 125 SimpleNode child = (SimpleNode) node.jjtGetChild(i); 126 127 /* 128 * if a block, just execute 129 */ 130 131 if (child.getType() == ParserTreeConstants.JJTBLOCK) 132 { 133 child.render(context, writer); 134 break; 135 } 136 else 137 { 138 /* save the values - for now, just w/ ref to test */ 139 140 if (child.getType() == ParserTreeConstants.JJTREFERENCE) 141 { 142 data.put(child, child.execute(null, context)); 143 } 144 else 145 { 146 System.out.println("unhandled type"); 147 } 148 } 149 } 150 151 Iterator it = data.keySet().iterator(); 152 153 while(it.hasNext()) 154 { 155 ASTReference ref = (ASTReference) it.next(); 156 157 ref.setValue(context, data.get(ref)); 158 } 159 160 return true; 161 } 162 }