usr/src/lib/libslp/javalib/com/sun/slp/ServiceTable.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
//  ServiceTable.java: Storage of all services.
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 10 14:23:25 1997
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: Thu Apr  1 10:33:46 1999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
//  Update Count:     461
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
import java.security.*;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
import java.net.*;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
/**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * The ServiceTable object records all service registrations. Note
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * that any exceptions internal to the service table are processed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * and either returned as SrvRply objects or are reported.
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 ServiceTable extends Object {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
    // Key for SDAAdvert class.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
    static final String SDAADVERT = "com.sun.slp.SDAAdvert";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
    private static final String locationMsg = "Service table";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
    // Instance variables.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
    // The service store.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
    protected ServiceStore store = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
    // Class variables.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
    // System properties.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
    static protected SLPConfig conf = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
    // Singleton objects for the service tables.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
    static protected ServiceTable table = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
    // The ager thread.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
    static protected AgerThread thrAger = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
    // Time to sleep. Adjusted depending on incoming URLs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
    private static long sleepyTime = Defaults.lMaxSleepTime;	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
    // Creation of singleton.
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
    // Protected constructor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
    protected ServiceTable() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	if (thrAger != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	// Create the ager thread.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	thrAger = new AgerThread();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	// Set the priority low, so other things (like active discovery)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	//  take priority.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	thrAger.setPriority(Thread.MIN_PRIORITY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	thrAger.start();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
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
     * Return an SA service store.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
     * @return The distinguished table object.
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
    static ServiceTable getServiceTable()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	if (conf == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	    conf = SLPConfig.getSLPConfig();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	if (table == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	    table = createServiceTable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
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
	return table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
     * Return a service table object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
     * @return The service table object.
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
    private static ServiceTable createServiceTable()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	ServiceTable table = new ServiceTable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	table.store = ServiceStoreFactory.createServiceStore();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	return table;
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
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
    // Support for serializated registrations.
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
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
     * If any serialized registrations are pending, then unserialize
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
     * and register.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
    public void deserializeTable() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	// If there are any serialized registrations, then get
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	//  them and perform registrations.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	String serializedURL = conf.getSerializedRegURL();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	if (serializedURL != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	    ServiceStore serStore = getStoreFromURL(serializedURL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	    if (serStore != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		registerStore(serStore);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	    }
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
     * Serialize the table to the URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
     * @param URL String giving the URL to which the store should be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
     * serialized.
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
    void serializeServiceStore(String URL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	// Open an object output stream for the URL, serialize through
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	//  the factory.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	    URL url = new URL(URL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	    URLConnection urlConn = url.openConnection();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	    OutputStream os = urlConn.getOutputStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	    BufferedWriter di =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
		new BufferedWriter(new OutputStreamWriter(os));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	    // Serialize the store.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	    ServiceStoreFactory.serialize(di, store);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	} catch (MalformedURLException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	    conf.writeLog("st_serialized_malform",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
			  new Object[] {URL});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	} catch (UnsupportedEncodingException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	    conf.writeLog("st_unsupported_encoding",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
			  new Object[] {URL});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	} catch (IOException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	    conf.writeLog("st_serialized_ioexception",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
			  new Object[] {URL, ex});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	    conf.writeLog("st_serialized_sle",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
			  new Object[] {URL, ex.getMessage()});
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
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
    // Read proxy registrations from the URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
    private ServiceStore getStoreFromURL(String serializedURL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	ServiceStore serStore = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	// Open an object input stream for the URL, deserialize through
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	//  the factory.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	    URL url = new URL(serializedURL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	    InputStream is = url.openStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	    BufferedReader di = new BufferedReader(new InputStreamReader(is));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	    // Deserialize the objects.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	    serStore =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
		ServiceStoreFactory.deserializeServiceStore(di);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	} catch (MalformedURLException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	    conf.writeLog("st_serialized_malform",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
			  new Object[] {serializedURL});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	} catch (UnsupportedEncodingException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	    conf.writeLog("st_unsupported_encoding",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
			  new Object[] {serializedURL});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	} catch (IOException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	    conf.writeLog("st_serialized_ioexception",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
			  new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
		serializedURL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
		    ex.getMessage()});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	    conf.writeLog("st_serialized_sle",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
			  new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		serializedURL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		    ex.getMessage()});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	return serStore;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
    // Walk the table, performing actual registrations on all records.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
    private void registerStore(ServiceStore serStore) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	// Walk the table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	Enumeration en = serStore.getServiceRecordsByScope(null);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	boolean hasURLSig = conf.getHasSecurity();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	boolean hasAttrSig = conf.getHasSecurity();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	PermSARegTable pregTable = 	SARequester.getPermSARegTable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	while (en.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	    ServiceStore.ServiceRecord rec =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		(ServiceStore.ServiceRecord)en.nextElement();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	    ServiceURL surl = rec.getServiceURL();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	    Vector scopes = rec.getScopes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	    Vector attrs = rec.getAttrList();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	    Locale locale = rec.getLocale();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	    Hashtable urlSig = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	    Hashtable attrSig = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	    // Note that we can't use the Advertiser to register here,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	    //  because we may not be listening yet for registrations.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	    //  We need to do this all by hand.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	    try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
		// Create a registration message for refreshing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
		CSrvReg creg = new CSrvReg(false,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
					   locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
					   surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
					   scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
					   attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
					   null,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
					   null);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
		// We externalize to a server side message if authentication
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
		//  is needed. This creates the auth blocks for the scopes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		//  Doing this in any other way is alot more complicated,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
		//  although doing it this way seems kludgy.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		if (hasURLSig || hasAttrSig) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		    ByteArrayOutputStream baos = new ByteArrayOutputStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		    creg.getHeader().externalize(baos, false, true);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
		    ByteArrayInputStream bais =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
			new ByteArrayInputStream(baos.toByteArray());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
		    bais.read();	// pop off version and function code...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
		    bais.read();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
		    DataInputStream dis = new DataInputStream(bais);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		    SLPHeaderV2 hdr = new SLPHeaderV2();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		    hdr.parseHeader(SrvLocHeader.SrvReg, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		    SSrvReg sreg = new SSrvReg(hdr, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		    // Now we've got it, after much effort. Get the auths.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		    urlSig = sreg.URLSignature;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		    attrSig = sreg.attrSignature;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		store.register(surl, attrs, scopes, locale, urlSig, attrSig);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
		// Now we've got to put the registration into the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
		//  PermSARegTable. Again, we do everything by hand
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
		//  because we can't use Advertiser.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
		if (surl.getIsPermanent()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
		    pregTable.reg(surl, creg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
		// Report registration.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
		if (conf.regTest()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
		    conf.writeLog("st_reg_add",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
				  new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
			locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
			    locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
			    surl.getServiceType(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
			    surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
			    attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
			    scopes});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	    } catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
		String msg = ex.getMessage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
		conf.writeLog("st_serialized_seex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		    new Integer(ex.getErrorCode()),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
			surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
			(msg == null ? "<no message>":msg)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	    } catch (Exception ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		String msg = ex.getMessage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		conf.writeLog("st_serialized_seex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
		    surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
			(msg == null ? "<no message>":msg)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	    }
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
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
    // Record aging.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
    // Run the thread that ages out records.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
    private class AgerThread extends Thread {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	public void run() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	    setName("SLP Service Table Age-out");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	    long alarmTime = sleepyTime;  // when to wake up next
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	    long wentToSleep = 0;	    // what time we went to bed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	    while (true) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
		    // Record when we went to sleep.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
		    wentToSleep = System.currentTimeMillis();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
		    // Sleep for the minimum amount of time needed before we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
		    //  must wake up and check.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
		    sleep(alarmTime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
		} catch (InterruptedException ie) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
		    // A new registration came in. Calculate how much time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
		    //  remains until we would have woken up. If this is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		    //  less than the new sleepyTime, then we set the alarm
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
		    //  for this time. If it is more, then we set the alarm
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		    //  for the new sleepyTime.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
		    long remainingSleepTime =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
			(wentToSleep + alarmTime) - System.currentTimeMillis();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
		    remainingSleepTime =		// just in case...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
			((remainingSleepTime <= 0) ? 0 : remainingSleepTime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		    alarmTime = sleepyTime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
		    if (remainingSleepTime < alarmTime) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
			alarmTime = remainingSleepTime;
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
		    continue;  // we don't have to walk yet...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
		// Walk the table, get the new alarm and sleepy times.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
		if (table != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
		    table.ageStore();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
		    alarmTime = sleepyTime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
     * Age the service store.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
    // this method cannot be private... due to compiler weakness
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
    void ageStore() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	    // We synchronize in case somebody registers and tries to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	    //  change sleepy time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	    synchronized (store) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
		Vector deleted = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		sleepyTime = store.ageOut(deleted);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		// Track unregistered services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
		int i, n = deleted.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
		    ServiceStore.ServiceRecord rec =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
			(ServiceStore.ServiceRecord)deleted.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
		    ServiceURL surl = rec.getServiceURL();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
		    trackRegisteredServiceTypes(); // it's deleted...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
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
	} catch (RuntimeException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	    reportNonfatalException(ex, new Vector(), store);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	    reportNonfatalException(ex, new Vector(), store);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
    // SLP Service Table operations (register, deregister, etc.)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
     * Process the registration and record if no errors found.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
     * @param req Service registration request message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
     * @return SrvLocMsg A service registration acknowledgement.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
    SrvLocMsg register(SSrvReg req) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
	SrvLocHeader hdr = req.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	Locale locale = hdr.locale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
	boolean fresh = hdr.fresh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	Vector scopes = hdr.scopes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	ServiceURL surl = req.URL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	String serviceType = req.serviceType;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	Vector attrList = req.attrList;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
	Hashtable urlSig = req.URLSignature;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	Hashtable attrSig = req.attrSignature;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	short errorCode =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
	    (fresh ? ServiceLocationException.INVALID_REGISTRATION :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	    ServiceLocationException.INVALID_UPDATE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	    // If a sig block came in, verify it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	    if (urlSig != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
		AuthBlock.verifyAll(urlSig);
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
	    if (attrSig != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
		AuthBlock.verifyAll(attrSig);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	    // Check whether the URL has a zero lifetime. If so, it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	    // isn't cached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
	    if (surl.getLifetime() <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
		    new ServiceLocationException(errorCode,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
						 "st_zero",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
						 new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	    // Check if the service type is restricted. If so, nobody outside
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	    //  this process is allowed to register it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	    checkForRestrictedType(surl.getServiceType());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
	    // Check that attribute signature bit on implies URL signature
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
	    //  bit on.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	    if (attrSig != null && urlSig == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
		    new ServiceLocationException(errorCode,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
						 "st_attr_sig",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
						 new Object[0]);
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	    // If a signature and the fresh bit was not set, error since signed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	    //  registrations don't allow updating.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	    if (urlSig != null && !fresh) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
				ServiceLocationException.INVALID_UPDATE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
				"st_prot_update",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
	    // Check if scopes are supported.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	    if (!areSupportedScopes(scopes)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
				ServiceLocationException.SCOPE_NOT_SUPPORTED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
				"st_scope_unsup",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	    // Check if the reg is signed and auth is off or vice versa.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
	    //  Check is really simple. If security is on, then all regs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	    //  to this DA/SA server must be signed, so toss out any regs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	    //  that aren't, and vice versa.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
	    if (conf.getHasSecurity() && (urlSig == null || attrSig == null)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
				ServiceLocationException.AUTHENTICATION_FAILED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
				"st_unprot_non_reg",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
	    } else if (!conf.getHasSecurity() &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
		       (urlSig != null || attrSig != null)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
				ServiceLocationException.INVALID_REGISTRATION,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
				"st_prot_non_reg",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
	    // Merge any duplicates.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	    Vector attrs = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
	    Hashtable attrHash = new Hashtable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	    int i, n = attrList.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
	    for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
		ServiceLocationAttribute attr =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
		    (ServiceLocationAttribute)attrList.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
		ServiceLocationAttribute.mergeDuplicateAttributes(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
								  attr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
								  attrHash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
								  attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
								  false);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
	    // Store register or update.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
	    boolean existing = false;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	    if (fresh) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
		existing = store.register(surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
					  attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
					  scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
					  locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
					  urlSig,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
					  attrSig);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
		// Track registred service types in case we get a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
		// SAAdvert solicatation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
		trackRegisteredServiceTypes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		store.updateRegistration(surl, attrs, scopes, locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
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
	    // Create the reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
	    SrvLocMsg ack = req.makeReply(existing);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
	    if (conf.regTest()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
		conf.writeLog((fresh ? "st_reg_add":"st_reg_update"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
		    locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
			locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
			serviceType,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
			surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
			attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
			scopes});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
	    if (conf.traceAll()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
		conf.writeLog("st_dump", new Object[] {locationMsg});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
		store.dumpServiceStore();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	    // Calculate time increment until next update. This is used
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	    //  to adjust the sleep interval in the ager thread.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	    long sTime = getSleepIncrement(surl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
	    // We synchronize in case the ager thread is in the middle
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	    //  of trying to set the time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
	    synchronized (store) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
		// If we need to wake up sooner, adjust the sleep time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
		if (sTime < sleepyTime) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
		    sleepyTime = sTime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
		    // Interrupt the thread so we go back to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
		    //  sleep for the right amount of time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
		    thrAger.interrupt();
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	    return ack;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	    if (conf.traceDrop()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
		conf.writeLog("st_reg_drop",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
		    locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
			ex.getMessage()+"("+ex.getErrorCode()+")",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
			locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
			serviceType,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
			surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
			attrList,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
			scopes});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	} catch (RuntimeException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	    // These exceptions are not declared in throws but can occur
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
	    //  anywhere.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
	    Vector args = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
	    args.addElement(req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
	    reportNonfatalException(ex, args, store);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
	}
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
     * Process the deregistration and return the result in a reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
     * @param req Service deregistration request message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
     * @return SrvLocMsg A service registration acknowledgement.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
    SrvLocMsg deregister(SSrvDereg req) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
	// We need to determine whether this is an attribute deregistration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
	//  or a deregistration of the entire URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	SrvLocHeader hdr = req.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
	Locale locale = hdr.locale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
	Vector scopes = hdr.scopes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
	ServiceURL surl = req.URL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
	Hashtable urlSig = req.URLSignature;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
	Vector tags = req.tags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
	short errorCode = ServiceLocationException.OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
	    // Verify if signature is nonnull.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
	    if (urlSig != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
		AuthBlock.verifyAll(urlSig);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
	    // Check if the service type is restricted. If so, nobody outside
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
	    //  this process is allowed to register it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
	    checkForRestrictedType(surl.getServiceType());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
	    // Error if there's a signature and attempt at deleting attributes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
	    if ((urlSig != null) && (tags != null)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
				ServiceLocationException.AUTHENTICATION_FAILED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
				"st_prot_attr_dereg",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
	    // Check if scope is protected and auth is off or vice versa.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
	    //  Check is really simple. If security is on, then all scopes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
	    //  in this DA/SA server are protected, so toss out any regs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
	    //  that aren't, and vice versa.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
	    if (conf.getHasSecurity() && urlSig == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
				ServiceLocationException.AUTHENTICATION_FAILED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
				"st_unprot_non_dereg",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
	    } else if (!conf.getHasSecurity() && urlSig != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
				ServiceLocationException.INVALID_REGISTRATION,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
				"st_prot_non_dereg",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
	    // If it's a service URL, then deregister the URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
	    if (tags == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
		store.deregister(surl, scopes, urlSig);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
		// Track registred service types in case we get a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
		// SAAdvert solicatation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
		trackRegisteredServiceTypes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
		// Just delete the attributes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
		store.deleteAttributes(surl, scopes, tags, locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	    // Create the reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	    SrvLocMsg ack = req.makeReply();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
	    if (conf.regTest()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
		conf.writeLog((tags == null ? "st_dereg":"st_delattr"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
		    locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
	                locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
			surl.getServiceType(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
			surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
			tags});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	    if (conf.traceAll()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
		conf.writeLog("st_dump",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
			      new Object[] {locationMsg});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
		store.dumpServiceStore();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
	    return ack;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	    if (conf.traceDrop()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
		conf.writeLog((tags == null ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
			       "st_dereg_drop" : "st_dereg_attr_drop"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
		    locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
			ex.getMessage()+"("+ex.getErrorCode()+")",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
			locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
			surl.getServiceType(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
			surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
			tags});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
	} catch (RuntimeException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
	    // These exceptions are not declared in throws but can occur
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
	    //  anywhere.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
	    Vector args = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
	    args.addElement(req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
	    reportNonfatalException(ex, args, store);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
     * Process the service type request and return the result in a reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
     * @param req Service type request message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
     * @return SrvTypeRply A service type reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
    SrvLocMsg findServiceTypes(SSrvTypeMsg req) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
	SrvLocHeader hdr = req.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
	Vector scopes = hdr.scopes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
	String namingAuthority = req.namingAuthority;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
	short errorCode = ServiceLocationException.OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
	    // Check whether the scope is supported.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
	    if (!areSupportedScopes(scopes)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
				ServiceLocationException.SCOPE_NOT_SUPPORTED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
				"st_scope_unsup",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
	    // Get the vector of service types in the store, independent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	    //  of language.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
	    Vector types = store.findServiceTypes(namingAuthority, scopes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
	    // Create the reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
	    SrvLocMsg ack = req.makeReply(types);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
	    if (conf.traceAll()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
		conf.writeLog("st_stypes",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
		    locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
			namingAuthority,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
			scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
			types});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	    return ack;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
	    if (conf.traceDrop()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
		conf.writeLog("st_stypes_drop",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
		    locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
			ex.getMessage()+"("+ex.getErrorCode()+")",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
			namingAuthority,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
			scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
			hdr.locale});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
	} catch (RuntimeException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
	    // These exceptions are not declared in throws but can occur
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
	    //  anywhere.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
	    Vector args = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
	    args.addElement(req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
	    reportNonfatalException(ex, args, store);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
     * Process the service request and return the result in a reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
     * @param req Service request message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
     * @return SrvRply A service reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
    SrvLocMsg findServices(SSrvMsg req) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
	SrvLocHeader hdr = req.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
	Locale locale = hdr.locale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
	Vector scopes = hdr.scopes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
	String serviceType = req.serviceType;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
	String query = req.query;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
	short errorCode = ServiceLocationException.OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
	    // Check whether the scope is supported.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
	    if (!areSupportedScopes(scopes)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
				ServiceLocationException.SCOPE_NOT_SUPPORTED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
				"st_scope_unsup",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
	    // Get the hashtable of returns.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
	    Hashtable returns =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
		store.findServices(serviceType,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
				   scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
				   query,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
				   locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
	    // Get the hashtable of services v.s. scopes, and signatures, if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
	    //  any.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
	    Hashtable services =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
		(Hashtable)returns.get(ServiceStore.FS_SERVICES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
	    Hashtable signatures =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
		(Hashtable)returns.get(ServiceStore.FS_SIGTABLE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
	    boolean hasSignatures = (signatures != null);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
	    // for each candidate URL, make sure it has the requested SPI
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
	    // (if any)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
	    if (hasSignatures && !req.spi.equals("")) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
		Enumeration allSurls = services.keys();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
		while (allSurls.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
		    Object aSurl = allSurls.nextElement();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
		    Hashtable auths = (Hashtable) signatures.get(aSurl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
		    AuthBlock auth =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
			AuthBlock.getEquivalentAuth(req.spi, auths);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
		    if (auth == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
			// doesn't have the requested SPI
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
			services.remove(aSurl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	    // Create return message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
	    SrvLocMsg ack = req.makeReply(services, signatures);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
	    if (conf.traceAll()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
		conf.writeLog("st_sreq",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
		    locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
			serviceType,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
			scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
			query,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
			locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
			services,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
			signatures});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
	    return ack;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
	    if (conf.traceDrop()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
		conf.writeLog("st_sreq_drop",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
		    locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
			ex.getMessage()+"("+ex.getErrorCode()+")",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
			serviceType,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
			scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
			query,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
			locale});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
	} catch (RuntimeException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
	    // These exceptions are not declared in throws but can occur
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
	    //  anywhere.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
	    Vector args = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
	    args.addElement(req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
	    reportNonfatalException(ex, args, store);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
     * Process the attribute request and return the result in a reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
     * @param req Attribute request message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
     * @return AttrRply An attribute reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
    SrvLocMsg findAttributes(SAttrMsg req) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
	// We need to determine whether this is a request for attributes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
	//  on a specific URL or for an entire service type.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
	SrvLocHeader hdr = req.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
	Vector scopes = hdr.scopes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
	Locale locale = hdr.locale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
	ServiceURL surl = req.URL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
	String serviceType = req.serviceType;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
	Vector tags = req.tags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
	short errorCode = ServiceLocationException.OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
	    // Check whether the scope is supported.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
	    if (!areSupportedScopes(scopes)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
	throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
	    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
				ServiceLocationException.SCOPE_NOT_SUPPORTED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
				"st_scope_unsup",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
	    Vector attributes = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
	    Hashtable sig = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
	    // If it's a service URL, then get the attributes just for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
	    // that URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
	    if (serviceType == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
		// If the attrs are signed, then error if any tags, since
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
		//  we must ask for *all* attributes in for a signed reg
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
		if (!req.spi.equals("") && tags.size() > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
				ServiceLocationException.AUTHENTICATION_FAILED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
				"st_par_attr",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
		Hashtable ht =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
		    store.findAttributes(surl, scopes, tags, locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
		// Get the attributes and signatures.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
		attributes = (Vector)ht.get(ServiceStore.FA_ATTRIBUTES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
		sig = (Hashtable)ht.get(ServiceStore.FA_SIG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
		// make sure the attr has the requested SPI (if any)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
		if (sig != null && !req.spi.equals("")) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
		    AuthBlock auth = AuthBlock.getEquivalentAuth(req.spi, sig);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
		    if (auth == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
			// return empty
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
			attributes = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
		if (!req.spi.equals("")) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
				ServiceLocationException.AUTHENTICATION_FAILED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
				"st_par_attr",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
		// Otherwise find the attributes for all service types.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
		attributes =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
		    store.findAttributes(serviceType, scopes, tags, locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
	    ServiceType type =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
		(serviceType == null ? surl.getServiceType():
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
		 new ServiceType(serviceType));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
	    // Create the reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
	    SrvLocMsg ack = req.makeReply(attributes, sig);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
	    if (conf.traceAll()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
		conf.writeLog((serviceType != null ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
			       "st_st_attr" : "st_url_attr"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
		    locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
			(serviceType != null ? serviceType.toString() :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
			 surl.toString()),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
		      	scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
			tags,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
			locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
			attributes});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
	    return ack;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
	    if (conf.traceDrop()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
		conf.writeLog((serviceType != null ? "st_st_attr_drop":
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
			       "st_url_attr_drop"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
			      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
		    locationMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
			ex.getMessage()+"("+ex.getErrorCode()+")",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
		        (serviceType != null ? serviceType.toString() :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
			 surl.toString()),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
		        scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
			tags,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
			locale});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
	} catch (RuntimeException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
	    // These exceptions are not declared in throws but can occur
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
	    //  anywhere.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
	    Vector args = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
	    args.addElement(req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
	    reportNonfatalException(ex, args, store);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
    // Return the service record corresponding to the URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
    ServiceStore.ServiceRecord getServiceRecord(ServiceURL URL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
						Locale locale) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
	return store.getServiceRecord(URL, locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
    // Utility methods.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
    //  Protected/private methods.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
    // Check whether the type is restricted, through an exception if so.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
    private void checkForRestrictedType(ServiceType type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
	if (Defaults.restrictedTypes.contains(type)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
				ServiceLocationException.INVALID_REGISTRATION,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
				"st_restricted_type",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
				new Object[] {type});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
    // Insert a record for type "service-agent" with attributes having
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
    //  the types currently supported, if the new URL is not on the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
    //  list of supported types. This allows us to perform queries
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
    //  for supported service types.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
    private void trackRegisteredServiceTypes()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
	// First find the types.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
	Vector types = store.findServiceTypes(Defaults.ALL_AUTHORITIES,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
					      conf.getSAConfiguredScopes());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
	// Get preconfigured attributes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
	Vector attrs = conf.getSAAttributes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
	// Make an attribute with the service types.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
	ServiceLocationAttribute attr =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
	    new ServiceLocationAttribute(Defaults.SERVICE_TYPE_ATTR_ID,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
					 types);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
	attrs.addElement(attr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
	// Construct URL to use on all interfaces.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
	Vector interfaces = conf.getInterfaces();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
	int i, n = interfaces.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
	    InetAddress addr = (InetAddress)interfaces.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
	    ServiceURL url =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
		new ServiceURL(Defaults.SUN_SA_SERVICE_TYPE + "://" +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
			       addr.getHostAddress(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
			       ServiceURL.LIFETIME_MAXIMUM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
	    Vector scopes = conf.getSAOnlyScopes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
	    Locale locale = Defaults.locale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
	    // Make a new registration for this SA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
	    store.register(url,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
			   attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
			   scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
			   locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
			   null,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
			   null);  // we could sign, but we do that later...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
	// Note that we don't need a refresh on the URLs because they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
	//  will get refreshed when the service URLs that they track
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
	//  are refreshed. If the tracked URLs aren't refreshed, then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
	//  these will get updated when the tracked URLs age out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
    // Return true if the scopes in the vector are supported by the DA
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
    //  or SA server.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
    final private boolean areSupportedScopes(Vector scopes) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
	Vector configuredScopes = conf.getSAConfiguredScopes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
	Vector saOnlyScopes = conf.getSAOnlyScopes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
	int i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
	while (i < scopes.size()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
	    Object o = scopes.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
	    // Remove it if we don't support it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
	    if (!configuredScopes.contains(o) && !saOnlyScopes.contains(o)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
		// This will shift the Vector's elements down one, so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
		// don't increment i
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
		scopes.removeElementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
		i++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
	if (scopes.size() <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
	    return false;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
	return true;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
     * Return the sleep increment from the URL lifetime. Used by the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
     * ServiceStore to calculate the new sleep interval in addition
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
     * to this class, when a new URL comes in. The algorithm
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
     * subtracts x% of the lifetime from the lifetime and schedules the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
     * timeout at that time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
     * @param url The URL to use for calculation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
     * @return The sleep interval.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
    private long getSleepIncrement(ServiceURL url) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
	long urlLifetime = (long)(url.getLifetime() * 1000);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
	long increment =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
	    (long)((float)urlLifetime * Defaults.fRefreshGranularity);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
	long sTime = urlLifetime - increment;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
	// If URL lives only one second, update every half second.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
	if (sTime <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
	    sTime = 500;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
	return sTime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
    // Make a DAADvert for the DA service request. This only applies
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
    //  to DAs, not to SA servers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
    SrvLocMsg
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
	makeDAAdvert(SSrvMsg rqst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
		     InetAddress daAddr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
		     SLPConfig conf) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
	SrvLocHeader hdr = rqst.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
	Vector scopes = hdr.scopes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
	short xid = hdr.xid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
	String query = rqst.query;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
	    // If security is on, proceed only if we can sign as rqst.spi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
	    if (conf.getHasSecurity() && !AuthBlock.canSignAs(rqst.spi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
		throw new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
			ServiceLocationException.AUTHENTICATION_UNKNOWN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
			"st_cant_sign_as",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
			new Object[] {rqst.spi});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
	    // Get the hashtable of service URLs v.s. scopes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
	    Hashtable services =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
		ServerDATable.getServerDATable().returnMatchingDAs(query);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	    // Go through the table checking whether the IP address came back.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
	    Enumeration urls = services.keys();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
	    boolean foundIt = false;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
	    String strDAAddr = daAddr.getHostAddress();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
	    while (urls.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
		ServiceURL url = (ServiceURL)urls.nextElement();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
		if (url.getHost().equals(strDAAddr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
		    foundIt = true;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
		    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
	    // If we didn't find anything, make a null service reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
	    if (!foundIt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
		return rqst.makeReply(new Hashtable(), new Hashtable());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
	    return makeDAAdvert(hdr, daAddr, xid, scopes, conf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
	} catch (ServiceLocationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
	    return hdr.makeErrorReply(ex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
    // Make a DAAdvert from the input arguments.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
    SrvLocMsg
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
	makeDAAdvert(SrvLocHeader hdr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
		     InetAddress daAddr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
		     short xid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
		     Vector scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
		     SLPConfig config)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
	// If this is a request for a V1 Advert, truncate the scopes vector
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
	//  since DA solicitations in V1 are always unscoped
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
	if (hdr.version == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
	    scopes = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
	// Check if we support scopes first. If not, return an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
	//  error reply unless the scope vector is zero. Upper layers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
	//  must sort out whether this is a unicast or multicast.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
	if (scopes.size() > 0 && !areSupportedScopes(scopes)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
				ServiceLocationException.SCOPE_NOT_SUPPORTED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
				"st_scope_unsup",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
	// Get the service store's timestamp. This must be the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
	//  time since last stateless reboot for a stateful store,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
	//  or the current time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
	long timestamp = store.getStateTimestamp();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
	ServiceURL url =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
	    new ServiceURL(Defaults.DA_SERVICE_TYPE + "://" +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
			   daAddr.getHostAddress(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
			   ServiceURL.LIFETIME_DEFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
	SDAAdvert advert =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
	    hdr.getDAAdvert(xid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
			    timestamp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
			    url,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
			    scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
			    conf.getDAAttributes());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
	return advert;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
    // Make a SAADvert for the SA service request. This only applies
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
    //  to SA servers, not DA's. Note that we only advertise the "public"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
    //  scopes, not the private ones.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
    SSAAdvert
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
	makeSAAdvert(SSrvMsg rqst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
		     InetAddress interfac,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
		     SLPConfig conf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
	SrvLocHeader hdr = rqst.getHeader();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
	int version = hdr.version;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
	short xid = hdr.xid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
	Locale locale = hdr.locale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
	Vector scopes = hdr.scopes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	String query = rqst.query;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
	String serviceType = rqst.serviceType;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
	Vector saOnlyScopes = conf.getSAOnlyScopes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
	// If security is on, proceed only if we can sign as rqst.spi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
	if (conf.getHasSecurity() && !AuthBlock.canSignAs(rqst.spi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
	    throw new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
			ServiceLocationException.AUTHENTICATION_UNKNOWN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
			"st_cant_sign_as",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
			new Object[] {rqst.spi});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
	// Check if we support scopes first. Note that this may allow
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
	//  someone to get at the SA only scopes off machine, but that's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
	//  OK. Since the SAAdvert is only ever multicast, this is OK.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
	if (!areSupportedScopes(scopes) && !(scopes.size() <= 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
	    return null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
	// If the scopes vector is null, then use all configured scopes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
	if (scopes.size() <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
	    scopes = (Vector)conf.getSAConfiguredScopes().clone();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
	// Check to be sure the query matches.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
	//  If it doesn't, we don't need to return anything.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
	Hashtable returns =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
	    store.findServices(Defaults.SUN_SA_SERVICE_TYPE.toString(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
			       saOnlyScopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
			       query,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
			       Defaults.locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
	Hashtable services =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
	    (Hashtable)returns.get(ServiceStore.FS_SERVICES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
	Enumeration en = services.keys();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
	// Indicates we don't support the service type.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
	if (!en.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
	    return null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
	// Find the URL to use. The interface on which the message came in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
	//  needs to match one of the registered URLs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
	ServiceURL url = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
	ServiceURL surl = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
	String addr = interfac.getHostAddress();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
	while (en.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
	    surl = (ServiceURL)en.nextElement();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
	    if (addr.equals(surl.getHost())) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
		url = new ServiceURL(Defaults.SA_SERVICE_TYPE + "://" +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
				     addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
				     ServiceURL.LIFETIME_DEFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
	// If none of the URLs matched this interface, then return null.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
	if (url == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
	    return null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
	// Find the SA's attributes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
	Hashtable ht =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
	    store.findAttributes(surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
				 saOnlyScopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
				 new Vector(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
				 Defaults.locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
	Vector attrs = (Vector)ht.get(ServiceStore.FA_ATTRIBUTES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
	// Construct return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
	return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
	    new SSAAdvert(version,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
			  xid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
			  locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
			  url,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
			  conf.getSAConfiguredScopes(), // report all scopes...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
			  attrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
     * Report a fatal exception to the log.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
     * @param ex The exception to report.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
    protected static void reportFatalException(Exception ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
	reportException(true, ex, new Vector());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
	if (table != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
	    table.store.dumpServiceStore();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
	conf.writeLog("exiting_msg", new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
	System.exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
     * Report a nonfatal exception to the log.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
     * @param ex The exception to report.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
     * @param args The method arguments.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
     * @param store The service store being processed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
    protected static void reportNonfatalException(Exception ex,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
						  Vector args,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
						  ServiceStore store) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
	reportException(false, ex, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
	if (conf.traceAll()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
	    store.dumpServiceStore();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
    /**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
     * Report an exception to the log.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
     *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
     * @param isFatal Indicates whether the exception is fatal or not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
     * @param ex The exception to report.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
     * @param args A potentially null vector of arguments to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
     * 			method where the exception was caught.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
    private static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
	reportException(boolean isFatal, Exception ex, Vector args) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
	StringWriter sw = new StringWriter();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
	PrintWriter writer = new PrintWriter(sw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
	// Get the backtrace.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
	ex.printStackTrace(writer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
	String severity = (isFatal ? "fatal_error":"nonfatal_error");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
	String msg = ex.getMessage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
	if (msg == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
	    msg = conf.formatMessage("no_message", new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
	} else if (ex instanceof ServiceLocationException) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
	    msg = msg +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
		"(" + ((ServiceLocationException)ex).getErrorCode() + ")";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
	StringBuffer argMsg = new StringBuffer();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
	int i, n = args.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
	    argMsg.append("\n        (" + Integer.toString(i) + "):" +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
			  args.elementAt(i).toString());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
	conf.writeLog(severity,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
		      new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
	    ex.getClass().getName(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
		msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
		argMsg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
		sw.toString()});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
}