001: /* ====================================================================
002: * The LateralNZ Software License, Version 1.0
003: *
004: * Copyright (c) 2003 LateralNZ. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by
021: * LateralNZ (http://www.lateralnz.org/) and other third parties."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. The names "LateralNZ" must not be used to endorse or promote
026: * products derived from this software without prior written
027: * permission. For written permission, please
028: * contact oss@lateralnz.org.
029: *
030: * 5. Products derived from this software may not be called "Panther",
031: * or "Lateral" or "LateralNZ", nor may "PANTHER" or "LATERAL" or
032: * "LATERALNZ" appear in their name, without prior written
033: * permission of LateralNZ.
034: *
035: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: *
049: * This software consists of voluntary contributions made by many
050: * individuals on behalf of LateralNZ. For more
051: * information on Lateral, please see http://www.lateralnz.com/ or
052: * http://www.lateralnz.org
053: *
054: */
055: package org.lateralnz.common.cli;
056:
057: import java.io.OutputStream;
058: import java.io.BufferedReader;
059: import java.util.Iterator;
060: import java.util.List;
061: import java.util.HashMap;
062: import java.util.Map;
063:
064: import org.w3c.dom.Node;
065:
066: import org.lateralnz.common.util.Constants;
067: import org.lateralnz.common.util.XMLUtils;
068: import org.lateralnz.common.wrapper.IntHolder;
069:
070: public class EInput extends CLElement implements Constants {
071:
072: private String name;
073: private String type;
074: private String text;
075: private Map messages = new HashMap();
076:
077: public EInput(String formName, String name, String type,
078: String text, List messageNodes) throws Exception {
079: this .name = formName + DOT + name;
080: this .type = type;
081: this .text = text;
082:
083: Iterator iter = messageNodes.iterator();
084: while (iter.hasNext()) {
085: Node n = (Node) iter.next();
086: String val = EMPTY;
087: if (n.getFirstChild() != null) {
088: val = n.getFirstChild().getNodeValue();
089: }
090: messages
091: .put(XMLUtils.getAttributeValue(n, "type", ""), val);
092: }
093: }
094:
095: public int process(BufferedReader in, OutputStream out, Map ctx,
096: CLIOHandler ioh, CLValidator validator, boolean prompt)
097: throws Exception {
098: // ioh.write(out, NEWLINE + text, false);
099: ioh.write(out, text, false);
100: if (type.equalsIgnoreCase("password")) {
101: ioh.setEcho(out, false);
102: }
103: String s = ioh.read(in);
104: ioh.setEcho(out, true);
105: if (type.equalsIgnoreCase("password")) {
106: ioh.write(out, NEWLINE, false);
107: }
108: int valid = 0;
109: if (validator != null) {
110: valid = validator.validate(ctx, name, s);
111: }
112:
113: String key = Integer.toString(valid);
114: if (messages.containsKey(key)) {
115: ioh
116: .write(out, (String) messages.get(key) + NEWLINE,
117: prompt);
118: }
119:
120: if (valid >= 100) {
121: IntHolder tmp = (IntHolder) ctx.get("##" + name
122: + ".error_counter");
123: if (tmp == null) {
124: tmp = new IntHolder(0);
125: ctx.put("##" + name + ".error_counter", tmp);
126: }
127:
128: if (tmp.value >= 2) {
129: // ioh.write(out, NEWLINE, true);
130: ioh.write(out, NEWLINE, true);
131: return -1;
132: } else {
133: tmp.value++;
134: return process(in, out, ctx, ioh, validator, prompt);
135: }
136: }
137:
138: ctx.remove("##" + name + ".error_counter");
139: if (valid == 0 || valid == Integer.MIN_VALUE) {
140: ctx.put(name, s);
141: return 0;
142: } else {
143: ioh.write(out, NEWLINE, true);
144: return -1;
145: }
146: }
147: }
|