001: /*
002: * $Id: CommandContext.java,v 1.3 2002/04/04 06:38:47 skavish Exp $
003: *
004: * ==========================================================================
005: *
006: * The JGenerator Software License, Version 1.0
007: *
008: * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
009: *
010: * Redistribution and use in source and binary forms, with or without
011: * modification, are permitted provided that the following conditions are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution, if
022: * any, must include the following acknowlegement:
023: * "This product includes software developed by Dmitry Skavish
024: * (skavish@usa.net, http://www.flashgap.com/)."
025: * Alternately, this acknowlegement may appear in the software itself,
026: * if and wherever such third-party acknowlegements normally appear.
027: *
028: * 4. The name "The JGenerator" must not be used to endorse or promote
029: * products derived from this software without prior written permission.
030: * For written permission, please contact skavish@usa.net.
031: *
032: * 5. Products derived from this software may not be called "The JGenerator"
033: * nor may "The JGenerator" appear in their names without prior written
034: * permission of Dmitry Skavish.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: */
050:
051: package org.openlaszlo.iv.flash.context;
052:
053: import org.openlaszlo.iv.flash.util.CommandExecutor;
054: import java.util.*;
055:
056: /**
057: * Context which can execute commands as well as substitute variables.
058: *
059: * @author Dmitry Skavish
060: * @see org.openlaszlo.iv.flash.util.CommandExecutor
061: */
062: public class CommandContext extends StandardContext {
063:
064: private CommandExecutor executor;
065:
066: /**
067: * Creates command context without parent.
068: *
069: * @param executor command executor used to execute commands
070: */
071: public CommandContext(CommandExecutor executor) {
072: this (null, executor);
073: }
074:
075: /**
076: * Creates command context with parent.
077: *
078: * @param parent parent context
079: * @param executor command executor used to execute commands
080: */
081: public CommandContext(Context parent, CommandExecutor executor) {
082: setParent(parent);
083: this .executor = executor;
084: }
085:
086: public String getValue(String cmd) {
087: if (cmd.length() != 0 && cmd.charAt(0) == '$') {
088: String res = executeCommand(this , cmd);
089: if (res != null)
090: return res;
091: }
092:
093: return super .getValue(cmd);
094: }
095:
096: /**
097: * Executes specified command.<p>
098: * Supported the following syntax:<BR>
099: * <CODE>$command_name[([param1[,param2...]])]</CODE><br>
100: * parameters can be commands as well, for example:<br>
101: * <code>$command1($command2(p1,p2),p3)</code>
102: *
103: * @param context execution context (the context from which the command was invoked)
104: * @param cmd command with possible parameters
105: * @return result of command execution, never null
106: */
107: public String executeCommand(Context context, String cmd) {
108: //System.out.println( "execute command: '"+cmd+"'" );
109: int idx = cmd.indexOf('(');
110: String name;
111: Vector parms = null;
112: if (idx == -1) {
113: name = cmd.substring(1).trim();
114: } else {
115: name = cmd.substring(1, idx).trim();
116: int i = idx + 1;
117: parms = new Vector();
118: int l = cmd.length();
119: int cnt = 0;
120: int start = i;
121: while (i < l && cnt >= 0) {
122: char ch = cmd.charAt(i);
123: switch (ch) {
124: case '(':
125: cnt++;
126: break;
127: case ')':
128: cnt--;
129: break;
130: case ',':
131: if (cnt == 0) {
132: String s = cmd.substring(start, i).trim();
133: parms.addElement(s);
134: start = i + 1;
135: }
136: break;
137: }
138: i++;
139: }
140: i--;
141: String s = cmd.substring(start, i).trim();
142: if (parms.size() != 0 || s.length() != 0) {
143: parms.addElement(s);
144: } else {
145: parms = null;
146: }
147: }
148: if (parms != null) {
149: for (int i = 0; i < parms.size(); i++) {
150: String c = (String) parms.elementAt(i);
151: if (c.length() != 0 && c.charAt(0) == '$') {
152: String res = executeCommand(context, c);
153: if (res == null)
154: res = "";
155: parms.setElementAt(res, i);
156: }
157: }
158: }
159: return executor.execute(context, name, parms);
160: }
161:
162: }
|