usr/src/lib/libslp/javalib/com/sun/slp/ServiceStoreFactory.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
//  ServiceStoreFactory.java: Factory for creating ServiceStore objects.
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 Apr 17 12:14:12 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: Mon Jan  4 15:26:34 1999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
//  Update Count:     34
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
import java.io.*;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
/**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 * The ServiceStoreFactory provides a way to obtain a ServiceStore
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * object. The exact implementation will depend on how the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * DA/slpd is configured. It could be an in-memory database,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * a connection to an LDAP server, or a persistent object
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * database.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * @author James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
class ServiceStoreFactory extends Object {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
    private static final String DEFAULT_SERVICE_STORE =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	"com.sun.slp.ServiceStoreInMemory";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
    private static final String SERVICE_STORE_PROPERTY =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	"sun.net.slp.serviceStoreClass";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
    // Comment characters for deserialization.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
    final private static char COMMENT_CHAR1 = '#';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
    final private static char COMMENT_CHAR2 = ';';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
    // Character for URL list separator.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
    final private static String URL_LIST_SEP = ", ";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
    // Identifies scopes pseudo-attribute.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
    final private static String SCOPES_ATTR_ID = "scopes";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
     * Return the ServiceStore for the SLP agent.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
     * @return An object supporting the ServiceStore interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
     * @exception ServiceLocationException Thrown
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
     *			if the ServiceStore object can't be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
     *			created or if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
     *			class implementing the ServiceStore required
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
     *			a network connnection (for example, an LDAP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
     *			server) and the connection couldn't be made.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
    static ServiceStore createServiceStore()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	return createServiceStoreFromProperty(SERVICE_STORE_PROPERTY);
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
    // Create the appropriate ServiceStore object from the property.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
    private static ServiceStore
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	createServiceStoreFromProperty(String property)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	Properties props = System.getProperties();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	String storeClassName =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	    props.getProperty(property,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
			      DEFAULT_SERVICE_STORE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	Class storeClass = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	    storeClass = Class.forName(storeClassName);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	} catch (ClassNotFoundException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
				ServiceLocationException.INTERNAL_SYSTEM_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
				"ssf_no_class",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
				new Object[] {storeClassName});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	ServiceStore store = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	    store = (ServiceStore)storeClass.newInstance();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	} catch (InstantiationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
				ServiceLocationException.INTERNAL_SYSTEM_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
				"ssf_inst_ex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
				new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
		    storeClassName,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
			ex.getMessage()});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	} catch (IllegalAccessException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
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.INTERNAL_SYSTEM_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
				"ssf_ill_ex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
				new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		    storeClassName,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
			ex.getMessage()});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	} catch (ClassCastException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
				ServiceLocationException.INTERNAL_SYSTEM_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
				"ssf_class_cast",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
				new Object[] {storeClassName});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	return store;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
     * Deserialize a service store from the open stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
     * @param is The object input stream for the service store.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
     * @return ServiceStore deserialized from the stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
     * @exception ServiceLocationException If anything goes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
     *				wrong with the deserialization.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
    static ServiceStore deserializeServiceStore(BufferedReader is)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	ServiceStore ss = new ServiceStoreInMemory();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	    deserialize(is, ss);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	} catch (IOException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
				"ssf_io_deser",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
				new Object[] {ex.getMessage()});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	return ss;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
    // Read the service store in the standard format from the input
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
    private static void deserialize(BufferedReader in, ServiceStore store)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	throws IOException, ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	SLPConfig conf = SLPConfig.getSLPConfig();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	int linecount = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	int scopeLinenum = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	// Parse input file until no bytes left.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	while (in.ready()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	    linecount++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	    String line = in.readLine().trim();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	    // Skip any empty lines at this level.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	    if (line.length() <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
		continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	    char cc = line.charAt(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	    // If initial character is "#" or ";", ignore the line.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	    //  It's a comment. Also if the line is empty.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	    if (cc == COMMENT_CHAR1 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
		cc == COMMENT_CHAR2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	    // At this level, the line must be a URL registration,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	    //  with format:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	    // service-url ", " language ", " lifetime [ ", " type ]
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
	    //  We allow arbitrary whitespace around commas.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	    StringTokenizer tk = new StringTokenizer(line, URL_LIST_SEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	    String surl = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	    String slang = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	    String slifetime = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	    String sType = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	    if (tk.hasMoreTokens()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		surl = tk.nextToken().trim();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
		if (tk.hasMoreTokens()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		    slang = tk.nextToken().trim();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
		    if (tk.hasMoreTokens()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
			slifetime = tk.nextToken().trim();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
			if (tk.hasMoreTokens()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
			    sType = tk.nextToken().trim();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
			    if (tk.hasMoreTokens()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
				slang = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
					// should be nothing more on the line.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
			    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
			}
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
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	    // Check for errors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	    if (surl == null || slifetime == null || slang == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
				"ssf_not_valid_url",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
				new Object[] {line});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	    // Create the service: URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	    Locale locale = SLPConfig.langTagToLocale(slang);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	    ServiceURL url = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	    try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
		int lifetime = Integer.parseInt(slifetime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		// If lifetime is maximum, then set to LIFETIME_PERMANENT.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		if (lifetime == ServiceURL.LIFETIME_MAXIMUM) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		    lifetime = ServiceURL.LIFETIME_PERMANENT;
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
		url = new ServiceURL(surl, lifetime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		if (sType != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		    // Check if it's OK for this service URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		    ServiceType utype = url.getServiceType();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		    if (utype.isServiceURL()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
			conf.writeLog("ssf_set_servc_err",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
				      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
			    surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
				utype});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
			ServiceType t = new ServiceType(sType);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
			if (!t.isServiceURL() &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
			    !t.equals(url.getServiceType())) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
			    url.setServiceType(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
			}
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	    } catch (NumberFormatException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
				"ssf_not_valid_lifetime",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
				new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
			slifetime, new Integer(linecount)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	    } catch (IllegalArgumentException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
				"ssf_syntax_err",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
				new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
			ex.getMessage(), new Integer(linecount)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	    // Get attributes. Format should be:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	    //      attr-line    = attr-assign | keyword
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	    //	attr-assign  = attr-id "=" attrval-list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	    //	keyword      = attr-id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	    //	attrval-list = attrval | attrval ", " attrval-list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	    Vector attrs = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	    Hashtable ht = new Hashtable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	    ServiceLocationAttribute scopeAttr = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	    boolean firstLine = true;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	    try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		while (in.ready()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		    linecount++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		    line = in.readLine();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
		    // Empty line indicates we're done with attributes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
		    if (line.length() <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		    // Format the line for creating. Check whether it's a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
		    // keyword or not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
		    if (line.indexOf("=") != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
			line = "(" + line + ")";
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
		    // Create the attribute from the string.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
		    ServiceLocationAttribute attr =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
			new ServiceLocationAttribute(line, false);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
		    // If this is the scope attribute, save until later.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
		    if (firstLine) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
			firstLine = false;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
			if (attr.getId().equalsIgnoreCase(SCOPES_ATTR_ID)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
			    scopeAttr = attr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
			    continue; // do NOT save as a regular attribute.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
		    ServiceLocationAttribute.mergeDuplicateAttributes(attr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
								      ht,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
								      attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
								      false);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	    } catch (ServiceLocationException e) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
		// tack on the line count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
		e.makeAddendum(" (line " + linecount + ")");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
		throw e;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	    Vector scopes = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	    // Use scopes we've been configured with if none.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	    if (scopeAttr == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
		scopes = conf.getSAConfiguredScopes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		scopes = (Vector)scopeAttr.getValues();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
		try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
		    // Unescape scope strings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		    SLPHeaderV2.unescapeScopeStrings(scopes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
		    // Validate, lower case scope names.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		    DATable.validateScopes(scopes, locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
		} catch (ServiceLocationException e) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
		    e.makeAddendum(" (line " + scopeLinenum + ")");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
		    throw e;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	    // We've got the attributes, the service URL, scope, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	    //  locale, so add a record. Note that any crypto is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	    //  added when the registration is actually done.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	    store.register(url, attrs, scopes, locale, null, null);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	    // Create a CSrvReg for forwarding
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	    CSrvReg creg = new CSrvReg(true, locale, url, scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
				       attrs, null, null);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	    ServerDATable daTable = ServerDATable.getServerDATable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	    daTable.forwardSAMessage(creg, conf.getLoopback());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
    // Write the service store in the standard format to the output
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
    // stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
    static void serialize(BufferedWriter out, ServiceStore store)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	throws IOException, ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
	Enumeration recs = store.getServiceRecordsByScope(null);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	while (recs.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	    ServiceStore.ServiceRecord rec =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
		(ServiceStore.ServiceRecord)recs.nextElement();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	    ServiceURL url = rec.getServiceURL();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	    String surl = url.toString();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	    Vector attrs = (Vector)rec.getAttrList().clone();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	    Locale locale = rec.getLocale();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	    Vector scopes = rec.getScopes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	    StringBuffer line = new StringBuffer();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	    // Compose the registration line.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	    line.append(surl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	    line.append(", ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	    line.append(SLPConfig.localeToLangTag(locale));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	    line.append(", ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
	    line.append(Integer.toString(url.getLifetime()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	    // Put out the service type and naming authority if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	    //  URL is not a service URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	    if (!surl.startsWith(Defaults.SERVICE_PREFIX)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		ServiceType type = url.getServiceType();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
		line.append(", ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		line.append(type.toString());
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	    // Write out line.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	    out.write(line.toString(), 0, line.length());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	    out.newLine();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	    // Zero line buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	    line.setLength(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	    // Insert a scope attribute, if the scope isn't simply "DEFAULT".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	    if (scopes.size() > 1 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
		!Defaults.DEFAULT_SCOPE.equals((String)scopes.elementAt(0))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
		attrs.insertElementAt(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
				new ServiceLocationAttribute(SCOPES_ATTR_ID,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
							     scopes),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
				0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	    // Write out the attributes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	    int i, n = attrs.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
	    for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		ServiceLocationAttribute attr =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
		    (ServiceLocationAttribute)attrs.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
		Vector vals = attr.getValues();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		line.append(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
		ServiceLocationAttribute.escapeAttributeString(attr.getId(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
							       false));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
		// Add the escaped values.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
		if (vals != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
		    line.append("=");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
		    int j, m = vals.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
		    for (j = 0; j < m; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
			Object v = vals.elementAt(j);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			if (j > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
			    line.append(", ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
			line.append(ServiceLocationAttribute.escapeValue(v));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
		out.write(line.toString(), 0, line.length());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
		out.newLine();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
		// Zero out string buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
		line.setLength(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	    // End of registration.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	    out.newLine();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	out.flush();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
}