001: /*
002: * @(#)PropertyExpander.java 1.3 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package sun.security.util;
029:
030: // Note that there are two versions of this class, a subsetted
031: // version for CDC (which does not support the java.net.URI class)
032: // and this version in FP. Be sure you're editting the right one!
033: import java.net.URI;
034: import java.net.URISyntaxException;
035: import java.security.GeneralSecurityException;
036:
037: /**
038: * A utility class to expand properties embedded in a string.
039: * Strings of the form ${some.property.name} are expanded to
040: * be the value of the property. Also, the special ${/} property
041: * is expanded to be the same as file.separator. If a property
042: * is not set, a GeneralSecurityException will be thrown.
043: *
044: * @version 1.4
045: * @author Roland Schemers
046: */
047: public class PropertyExpander {
048:
049: public static class ExpandException extends
050: GeneralSecurityException {
051: public ExpandException(String msg) {
052: super (msg);
053: }
054: }
055:
056: public static String expand(String value) throws ExpandException {
057: return expand(value, false);
058: }
059:
060: public static String expand(String value, boolean encodeURL)
061: throws ExpandException {
062: if (value == null)
063: return null;
064:
065: int p = value.indexOf("${", 0);
066:
067: // no special characters
068: if (p == -1)
069: return value;
070:
071: StringBuffer sb = new StringBuffer(value.length());
072: int max = value.length();
073: int i = 0; // index of last character we copied
074:
075: scanner: while (p < max) {
076: if (p > i) {
077: // copy in anything before the special stuff
078: sb.append(value.substring(i, p));
079: i = p;
080: }
081: int pe = p + 2;
082:
083: // do not expand ${{ ... }}
084: if (pe < max && value.charAt(pe) == '{') {
085: pe = value.indexOf("}}", pe);
086: if (pe == -1 || pe + 2 == max) {
087: // append remaining chars
088: sb.append(value.substring(p));
089: break scanner;
090: } else {
091: // append as normal text
092: pe++;
093: sb.append(value.substring(p, pe + 1));
094: }
095: } else {
096: while ((pe < max) && (value.charAt(pe) != '}')) {
097: pe++;
098: }
099: if (pe == max) {
100: // no matching '}' found, just add in as normal text
101: sb.append(value.substring(p, pe));
102: break scanner;
103: }
104: String prop = value.substring(p + 2, pe);
105: if (prop.equals("/")) {
106: sb.append(java.io.File.separatorChar);
107: } else {
108: String val = System.getProperty(prop);
109: if (val != null) {
110: if (encodeURL) {
111: // encode 'val' unless it's an absolute URI
112: // at the beginning of the string buffer
113: try {
114: if (sb.length() > 0
115: || !(new URI(val)).isAbsolute()) {
116: val = sun.net.www.ParseUtil
117: .encodePath(val);
118: }
119: } catch (URISyntaxException use) {
120: val = sun.net.www.ParseUtil
121: .encodePath(val);
122: }
123: }
124: sb.append(val);
125: } else {
126: throw new ExpandException(
127: "unable to expand property " + prop);
128: }
129: }
130: }
131: i = pe + 1;
132: p = value.indexOf("${", i);
133: if (p == -1) {
134: // no more to expand. copy in any extra
135: if (i < max) {
136: sb.append(value.substring(i, max));
137: }
138: // break out of loop
139: break scanner;
140: }
141: }
142: return sb.toString();
143: }
144:
145: public static void main(String args[]) throws Exception {
146: System.out.println(expand(args[0]));
147: }
148: }
|