/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1999 by Sun Microsystems, Inc.
* All rights reserved.
*
*/
// SARequester.java: Requester operations for SA.
// Author: James Kempf
// Created On: Thu Jan 8 14:59:41 1998
// Last Modified By: James Kempf
// Last Modified On: Thu Jan 28 15:33:33 1999
// Update Count: 58
//
package com.sun.slp;
import java.io.*;
import java.util.*;
/**
* The SARequester class implements the Advertiser interface.
* It handles the request for the API. Registration is done
* by calling into the loopback I/O so the SA server does
* the registration.
*
* @author Erik Guttman, James Kempf
*/
class SARequester extends Object implements Advertiser {
// For maintaining registrations that are LIFETIME_PERMANENT.
private static PermSARegTable pregtable = null;
private static SLPConfig config = null;
private Locale locale;
SARequester(Locale nlocale) {
Assert.nonNullParameter(nlocale, "locale");
// Initialize...
getPermSARegTable();
locale = nlocale;
}
// Initialize config, PermSARegTable.
static PermSARegTable getPermSARegTable() {
if (config == null) {
config = SLPConfig.getSLPConfig();
}
if (pregtable == null) {
pregtable = new PermSARegTable(config);
}
return pregtable;
}
//
// Advertiser Interface implementation.
//
/**
* Return the Locator's locale object. All requests are made in
* this locale.
*
* @return The Locale object.
*/
public Locale getLocale() {
return locale;
}
/**
* Register a new service with the service location protocol in
* the Advertiser's locale.
*
* @param URL The service URL for the service.
* @param serviceLocationAttributes A vector of ServiceLocationAttribute
* objects describing the service.
* @exception ServiceLocationException An exception is thrown if the
* registration fails.
* @exception IllegalArgumentException A parameter is null or
* otherwise invalid.
*
*/
public void register(ServiceURL URL,
Vector serviceLocationAttributes)
throws ServiceLocationException {
registerInternal(URL, serviceLocationAttributes, true);
}
/**
* Deregister a service with the service location protocol.
* This has the effect of deregistering the service from every
* Locale and scope under which it was registered.
*
* @param URL The service URL for the service.
* @exception ServiceLocationException An exception is thrown if the
* deregistration fails.
*/
public void deregister(ServiceURL URL)
throws ServiceLocationException {
deregisterInternal(URL, null);
}
/**
* Add attributes to a service URL in the locale of the Advertiser.
*
* Note that due to SLP v1 update semantics, the URL will be registered
* if it is not already.
*
*
* @param URL The service URL for the service.
* @param serviceLocationAttributes A vector of ServiceLocationAttribute
* objects to add.
* @exception ServiceLocationException An exception is thrown if the
* operation fails.
*/
public void addAttributes(ServiceURL URL,
Vector serviceLocationAttributes)
throws ServiceLocationException {
registerInternal(URL, serviceLocationAttributes, false);
}
/**
* Delete the attributes from a service URL in the locale of
* the Advertiser. The deletions are made for all scopes in
* which the URL is registered.
*
*
* @param URL The service URL for the service.
* @param attributeIds A vector of Strings indicating
* the attributes to remove.
* @exception ServiceLocationException An exception is thrown if the
* operation fails.
*/
public void deleteAttributes(ServiceURL URL,
Vector attributeIds)
throws ServiceLocationException {
if (attributeIds == null || attributeIds.size() <= 0) {
throw
new IllegalArgumentException(
config.formatMessage("null_or_empty_vector",
new Object[] {
"attributeIds"}));
}
deregisterInternal(URL, attributeIds);
}
//
// Internal methods to do actual work.
//
/**
* Takes care of registering a service.
* @param URL The service URL to register.
* @param vAttrs A vector of ServiceLocationAttributes.
* @param bFresh Informs whether this is to be a fresh registration or
* a reregistration.
* @exception ServiceLocationException
If any errors occur during
* parsing out or on the remote agent.
*/
private void registerInternal(ServiceURL URL,
Vector vAttrs,
boolean bFresh)
throws ServiceLocationException {
// Check parameters.
Assert.nonNullParameter(URL, "URL");
Assert.nonNullParameter(vAttrs,
"serviceLocationAttributes");
// Service agents are required to register in all the
// scopes they know.
Vector vScopes = config.getSAConfiguredScopes();
// Create registration message.
CSrvReg srvreg =
new CSrvReg(bFresh,
locale,
URL,
vScopes,
vAttrs,
null,
null);
// Register down the loopback.
SrvLocMsg reply =
Transact.transactTCPMsg(config.getLoopback(), srvreg, true);
// Handle any errors.
handleError(reply);
// Add registration for updating.
// Create a reg to use for refreshing if the URL was permanently
// registered.
if (URL.getIsPermanent()) {
CSrvReg srvReg =
new CSrvReg(false,
locale,
URL,
vScopes,
new Vector(),
null,
null);
pregtable.reg(URL, srvReg);
} else {
pregtable.dereg(URL); // in case somebody registered permanent...
}
}
/**
* Takes care of deregistering a service or service attributes.
*
* @param URL The URL to deregister.
* @param vAttrs The attribute tags, if any, to deregister.
*/
private void deregisterInternal(ServiceURL URL,
Vector vAttrs)
throws ServiceLocationException {
Assert.nonNullParameter(URL, "URL");
// Service agents are required to register in all the
// scopes they know.
Vector vScopes = config.getSAConfiguredScopes();
// If there are no attributes listed in the dereg, it removes the
// whole service. In this case, purge it from the Permanent SA
// registration table.
//
if (vAttrs == null) {
pregtable.dereg(URL);
}
// Create deregistration message.
CSrvDereg sdr =
new CSrvDereg(locale,
URL,
vScopes,
vAttrs,
null);
// Register down the loopback.
SrvLocMsg reply =
Transact.transactTCPMsg(config.getLoopback(), sdr, true);
// Handle any errors.
handleError(reply);
}
// Handle error returns.
private void handleError(SrvLocMsg msg) throws ServiceLocationException {
if (msg == null ||
((msg.getHeader().functionCode == SrvLocHeader.SrvAck) == false)) {
throw new ServiceLocationException(
ServiceLocationException.NETWORK_ERROR,
"unexpected_ipc",
new Object[0]);
} else {
short ex =
msg.getErrorCode();
if (ex != ServiceLocationException.OK) {
throw new ServiceLocationException(ex,
"remote_error",
new Object[0]);
}
}
}
}