001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.lib.ddl.util;
043:
044: import java.text.ParseException;
045: import java.util.Enumeration;
046: import java.util.Map;
047: import java.util.StringTokenizer;
048: import java.util.Vector;
049:
050: import org.openide.util.MapFormat;
051:
052: /**
053: * The message formatter, It handles [] brackets as optional keys.
054: *
055: * @author Slavek Psenicka
056: */
057:
058: public class CommandFormatter {
059: /** Parsed items */
060: Vector items;
061:
062: /** Formats pattern using arguments map
063: * Returns formatted string.
064: * @param pattern String to be formatted
065: * @param arguments Argument map
066: */
067: public static String format(String pattern, Map arguments)
068: throws ParseException, IllegalArgumentException {
069: CommandFormatter temp = new CommandFormatter(pattern);
070: return temp.format(arguments);
071: }
072:
073: /** Constructor
074: * @param pattern String to be formatted
075: */
076: public CommandFormatter(String pattern) throws ParseException {
077: this (new StringTokenizer(pattern, "[]", true));
078: }
079:
080: /** Constructor
081: * @param tok Used tokenizer
082: */
083: private CommandFormatter(StringTokenizer tok) throws ParseException {
084: items = scan(tok);
085: }
086:
087: /** Scans data for [] brackets and prepares data for formatting
088: * using MapFormat utility
089: */
090: private Vector scan(StringTokenizer tok) throws ParseException {
091: Vector objvec = new Vector();
092: while (tok.hasMoreTokens()) {
093: String token = (String) tok.nextElement();
094: Object obj = token;
095: if (token.equals("["))
096: obj = (Object) scan(tok);
097: else if (token.equals("]"))
098: break;
099: objvec.add(obj);
100: }
101:
102: return objvec;
103: }
104:
105: /** Formats parsed string using given argument map
106: * @param arguments Argument map
107: */
108: public String format(Map arguments) throws IllegalArgumentException {
109: return format(items, arguments);
110: }
111:
112: /** Formats given string vector using given argument map.
113: * Used internally only.
114: * @param arguments Argument map
115: */
116: private String format(Vector itemvec, Map arguments)
117: throws IllegalArgumentException {
118: String retstr = "";
119: Enumeration items_e = itemvec.elements();
120: while (items_e.hasMoreElements()) {
121: Object e_item = items_e.nextElement();
122: if (e_item instanceof Vector) {
123: try {
124: e_item = format((Vector) e_item, arguments);
125: } catch (Exception e) {
126: //PENDING
127: }
128: }
129:
130: if (e_item instanceof String) {
131: MapFormat fmt = new MapFormat(arguments);
132: fmt.setThrowExceptionIfKeyWasNotFound(true);
133: String e_msg = fmt.format((String) e_item);
134: if (e_msg != null)
135: retstr = retstr + e_msg;
136: else
137: throw new IllegalArgumentException();
138: }
139: }
140:
141: return retstr;
142: }
143: }
|