usr/src/lib/libslp/javalib/com/sun/slp/ServiceLocationAttributeV1.java
author Mark J. Nelson <Mark.J.Nelson@Sun.COM>
Wed, 06 Aug 2008 16:29:39 -0600
changeset 7298 b69e27387f74
parent 0 68f95e015346
permissions -rw-r--r--
6733918 Teamware has retired, please welcome your new manager, Mercurial 4758439 some files use "current date" sccs keywords 6560843 asm sources should not rely on .file "%M%" for naming STT_FILE symbols 6560958 Solaris:: perl modules should not use SCCS keywords in version information 6729074 webrev doesn't deal well with remote ssh hg parents
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
7298
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
 * Copyright (c) 1999 by Sun Microsystems, Inc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
//  ServiceLocationAttributeV1.java: SLPv1 character encoding and decoding
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
//  Author:           James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
//  Created On:       Fri Oct  9 19:18:17 1998
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
//  Last Modified By: James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
//  Last Modified On: Sat Oct 24 13:17:58 1998
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
//  Update Count:     15
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
//
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
package com.sun.slp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
import java.util.*;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
/**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 * Handles attribute string encoding and decoding for SLPv1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * @author James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
class ServiceLocationAttributeV1 extends ServiceLocationAttribute {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
    String charCode = IANACharCode.UTF8;  // how to encode the attribute.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
    // Characters to escape.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
    final private static String UNESCAPABLE_CHARS = ",=!></*()";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
    final private static String ESCAPABLE_CHARS =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	UNESCAPABLE_CHARS + "&#;";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
     * Handles radix64 string encoding and decoding for SLPv1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
     * @author James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
    static class Radix64 extends Object {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	/**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	 * Translates the 6 bit value to the corresponding radix 64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	 * representation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	private static char LUT(char cin) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	    int i = (int)(cin & (char)0x00FF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	    char result = ' ';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	    if (i < 26) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
		result = (char)((char)i + 'A');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	    } else if (i < 52) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
		result = (char)((char)(i - 26) + 'a');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	    } else if (i < 62) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
		result = (char)((char)(i - 52) + '0');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	    } else if (i == 62) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
		result = '+';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	    } else if (i == 63) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
		result = '/';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	    return result;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	/**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	 * Translates a radix 64 representation to the 64 bit value which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	 * corresponds to it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	private static char LUT2(char cin, String s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	    throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	    int i = (int)(cin & 0x00ff);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	    char c = (char) 0xffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	    if (((char)i >= 'A') && ((char)i <= 'Z')) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		c = (char)((char)i - 'A');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	    if (((char)i >= 'a') && ((char)i <= 'z')) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		c = (char)((char)i - 'a' +(char) 26);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	    if (((char)i >= '0') && ((char)i <= '9')) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		c = (char)((char)i - '0' +(char) 52);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	    if ((char)i == '+') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		c = (char)62;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	    if ((char)i == '/') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
		c = (char)63;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	    if ((char)i == '=') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
		c = (char)0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	    if (c == 0xffff) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
				"v1_radix64_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
				new Object[] {s});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	    return c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	// format of the encoding is "(###:encoding)" where ### is the length
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	// convert a string in the encoding to the buffer format
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	static Opaque radix64ToOpaque(String s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	    throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	    if (s == null || s.trim().length() == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
		return new Opaque(new byte[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	    int oplen = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	    int scan = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	    while (scan < s.length()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		if (s.charAt(scan) == '(') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		    break;  // scan till begins
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		scan++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	    scan++; // past the '('
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	    while (scan < s.length()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		if (Character.isWhitespace(s.charAt(scan)) == false) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
		scan++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	    while (scan < s.length()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
		if (Character.isDigit(s.charAt(scan))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
		    oplen *= 10;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
		    oplen += (s.charAt(scan) - '0');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
		    scan++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	    if (scan >= s.length()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
				"v1_radix64_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
				new Object[] {s});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	    if (s.charAt(scan) != ':') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
				"v1_radix64_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
				new Object[] {s});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	    scan++; // past the ':'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	    byte b[] = new byte[oplen];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	    int pos = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	    int timesthrough = (oplen/3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	    if ((oplen %3) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
		timesthrough++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	    for (int i = 0; i < timesthrough; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
		// get 4 bytes to make 3 with, skipping blanks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		char v[] = new char[4];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		for (int x = 0; x < 4; x++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		    while ((scan < s.length()) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
			   Character.isWhitespace(s.charAt(scan))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
			scan++; // eat white
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
		    if (scan >= s.length()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
			throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
			    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
				"v1_radix64_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
				new Object[] {s});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
		    v[x] = LUT2(s.charAt(scan), s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
		    scan++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		b[pos++] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		    (byte) (((0x3F & v[0]) << 2) + ((0x30 & v[1]) >> 4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		if (pos >= oplen) break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		b[pos++] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		    (byte) (((0x0F & v[1]) << 4) + ((0x3C & v[2]) >> 2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
		if (pos >= oplen) break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
		b[pos++] = (byte) (((0x03 & v[2]) << 6) + (0x3F & v[3]));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	    } // end of conversion loop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	    if (scan >= s.length()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
				"v1_radix64_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
				new Object[] {s});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	    if (s.charAt(scan) != ')') {// check for too many chars.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
				"v1_radix64_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
				new Object[] {s});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	    return new Opaque(b);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	// convert an Opaque to the encoding
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	static String opaqueToRadix64(Opaque oq) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	    byte[] b = oq.bytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	    if (b == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		return new String("");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	    StringBuffer sb = new StringBuffer("("+b.length+":");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	    int datalen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	    int fill = b.length%3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	    if (fill == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
		datalen = (b.length / 3) * 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
		datalen = ((b.length / 3) + 1) * 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	    int dataoffset = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	    int more = (b.length%3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	    if (more != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
		more = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	    int a[] = new int[4];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	    for (int i = 0; i < ((b.length/3)+more-1); i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
		a[0] =   (int)(0xFC & (char)b[ dataoffset    ]) >> 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		a[1] =  ((int)(0x03 & (char)b[ dataoffset    ]) << 4) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		    ((int)(0xF0 & (char)b[ dataoffset + 1]) >> 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
		a[2] =  ((int)(0x0F & (char)b[ dataoffset + 1]) << 2) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		    ((int)(0xC0 & (char)b[ dataoffset + 2]) >> 6);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
		a[3] =   (int)(0x3F & (char)b[ dataoffset + 2]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
		for (int j = 0; j < 4; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
		    sb.append(LUT((char)a[j]));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		dataoffset += 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	    byte f1 = 0, f2 = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	    if (fill == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		f1 = b[ dataoffset + 1 ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
		f2 = b[ dataoffset + 2 ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	    } else if (fill == 2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		f1 = b[ dataoffset + 1 ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	    a[0] = (int) (0xFC & (char)b[ dataoffset ]) >> 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	    a[1] = ((int) (0x03 & (char)b[ dataoffset ]) << 4) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
		((int) (0xF0 & (char)f1) >> 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	    a[2] = ((int) (0x0F & (char)f1) << 2) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		((int) (0xC0 & (char)f2) >> 6);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	    a[3] = (int) (0x3F & (char)f2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	    for (int j = 0; j < 4; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
		sb.append(LUT((char) a[j]));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	    sb.append(")");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	    return sb.toString();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
    // Create an SLPv1 attribute from a general attribute.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
    ServiceLocationAttributeV1(ServiceLocationAttribute attr) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	id = attr.id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	values = attr.values;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
    // Create an SLPv1 attribute from the parenthesized expression, using
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
    //  charCode to decode any encodings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
    ServiceLocationAttributeV1(String exp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
			       String charCode,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
			       boolean allowMultiValuedBooleans)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	this.charCode = charCode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	// If start and end paren, then parse out assignment.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	if (exp.startsWith("(") && exp.endsWith(")")) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	    StringTokenizer tk =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
		new StringTokenizer(exp.substring(1, exp.length() - 1),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
				    "=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
				    true);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	    try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
		// Get the tag.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
		id =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
		    unescapeAttributeString(tk.nextToken(), charCode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		if (id.length() <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
				"null_id",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
				new Object[] {exp});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
		tk.nextToken();  // get rid of "="
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
		// Gather the rest.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
		String rest = tk.nextToken("");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
		// Parse the comma separated list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
		values = SrvLocHeader.parseCommaSeparatedListIn(rest, true);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
		// Convert to objects.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
		int i, n = values.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
		Class vecClass = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
		for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		    String value = (String)values.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		    // Need to determine which type to use.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
		    Object o = evaluate(value, charCode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
		    // Convert Opaque to byte array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		    if (o instanceof Opaque) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
			o = ((Opaque)o).bytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
		    values.setElementAt(o, i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	    } catch (NoSuchElementException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
				"assignment_syntax_err",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
				new Object[] {exp});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	    verifyValueTypes(values, allowMultiValuedBooleans);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	    // Check to make sure there's no parens.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	    if (exp.indexOf('(') != -1 || exp.indexOf(')') != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
				"assignment_syntax_err",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
				new Object[] {exp});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	    // Unescape the keyword.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	    id = unescapeAttributeString(exp, charCode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
    // Duplicate of the one in ServiceLocatioAttribute, except we use our
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
    //  unescapeAttributeString.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
    static Object evaluate(String value, String charCode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	Object o = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	// If it can be converted into an integer, then convert it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	    o = Integer.valueOf(value);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	} catch (NumberFormatException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	    // Wasn't an integer. Try boolean.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	    if (value.equalsIgnoreCase(TRUE) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
		value.equalsIgnoreCase(FALSE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
		o = Boolean.valueOf(value);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
		// Process the string to remove escapes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
		String val = (String)value;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
		// If it begins with the opaque prefix, treat it as an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		//  opaque. Use radix64 parser to convert.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
		if (val.startsWith("(")) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
		    o = Radix64.radix64ToOpaque(val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
		    o = unescapeAttributeString(val, charCode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
	return o;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
    // Externalize the attribute, using its charCode to encode any reserved
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
    //  characters.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
    String externalize()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	if (values == null) {	// keyword attribute...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
	    return escapeAttributeString(id, charCode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
	Vector v = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	for (Enumeration e = values.elements(); e.hasMoreElements(); ) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	    Object o = e.nextElement();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	    String s = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	    s = escapeValueInternal(o, charCode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	    v.addElement(s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	StringBuffer buf =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	    new StringBuffer("(" +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
			     escapeAttributeString(id, charCode) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
			     "=");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	buf.append(SrvLocHeader.vectorToCommaSeparatedList(v));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	buf.append(")");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
	return buf.toString();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
    // Exactly like the one in ServiceLocationAttribute, but use our
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
    //  escapeAttributeString.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
    private static String escapeValueInternal(Object val, String charCode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
	String s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	// Escape any characters needing it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	if (val instanceof String) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
	    try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
		s = escapeAttributeString((String)val, charCode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	    } catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
		    new IllegalArgumentException(ex.getMessage());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	} else if (val instanceof Opaque) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	    // Convert to radix 64.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	    s = Radix64.opaqueToRadix64((Opaque)val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	    s = val.toString();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
	return s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
    // Escape an attribute string with the char code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
    static String escapeAttributeString(String string,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
					String charCode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	StringBuffer buf = new StringBuffer();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
	int i, n = string.length();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	boolean is8bit =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
	    (charCode.equals(IANACharCode.ASCII) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	    charCode.equals(IANACharCode.LATIN1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
	    char c = string.charAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
	    if (ESCAPABLE_CHARS.indexOf(c) != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		buf.append("&#");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		buf.append(IANACharCode.escapeChar(c, charCode));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		buf.append(";");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
		// Need to check ASCII and LATIN1 to make sure that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
		//  the character is not outside their range of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
		//  representation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		if (is8bit && (short)c > 255) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
				"v1_8bit_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
				new Object[] {new Character(c)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
		buf.append(c);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	return buf.toString();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
    // Unescape attribute string, using charCode for reserved characters.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
    static String unescapeAttributeString(String string,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
					  String charCode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
	// Process escapes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	int i, n = string.length();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	StringBuffer buf = new StringBuffer(n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	    char c = string.charAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
	    // Check for invalids.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	    int idx = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
	    if ((idx = UNESCAPABLE_CHARS.indexOf(c)) != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
				"v1_escape_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
				new Object[] {string});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
	    // Check for escapes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
	    if (c != '&') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
		buf.append(c);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
		// Check to be sure we've got enough characters left. We need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
		// at least 3.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
		if ((i + 1) >= n) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
				"v1_escape_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
				new Object[] {string});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
		c = string.charAt(++i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
		if (c != '#') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
				"v1_escape_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
				new Object[] {string});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
		// Iterate through numbers, collecting.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
		StringBuffer num = new StringBuffer(n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
		for (i++; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
		    c = string.charAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
		    if (!Character.isDigit(c)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
		    num.append(c);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
		// If the buffer is empty, then throw exception
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
		if (num.length() <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
				"v1_escape_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
				new Object[] {string});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		// If the last one isn't ";", we've got a problem.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
		if (c != ';') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
				"v1_escape_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
				new Object[] {string});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
		// OK, now convert to a character and add to buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
		try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
		    buf.append(IANACharCode.unescapeChar(num.toString(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
							 charCode));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
		} catch (NumberFormatException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
				"v1_escape_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
				new Object[] {string});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
	return buf.toString();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
}