usr/src/lib/libslp/javalib/com/sun/slp/ClientMsgManager.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

/*
 * 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) 2001 by Sun Microsystems, Inc.
 * All rights reserved.
 *
 */

//  ClientMsgManager.java:Manages versioned client message creation in server
//  Author:           James Kempf
//  Created On:       Thu Sep 17 10:16:33 1998
//  Last Modified By: James Kempf
//  Last Modified On: Tue Oct 13 15:26:16 1998
//  Update Count:     8
//

package com.sun.slp;

import java.util.*;

/**
 * The ClientMsgManager class manages creation of client messages in the
 * slpd server. Client messages are needed for active DA advertisement
 * solicitation, and for forwarding of registrations and deregistrations
 * from the SA server to DAs. This class creates the appropriately
 * versioned message instance, based on the arguments. It also
 * sets the header variables. It is up to the caller to set the 
 * instance variables in the object itself.
 *
 * @author James Kempf
 */

abstract class ClientMsgManager extends Object {

    // The class table contains classes registered for particular versions
    //  and message types. 

    private static Hashtable classTable = new Hashtable();

    // Register a new message type class and version.

    static void addClientMsgClass(String className,
				  int version,
				  String keyName) {

	// Create the key.

	String key = makeClassKey(keyName, version);

	try {

	    Class headerClass = Class.forName(className);

	    classTable.put(headerClass, key);

	} catch (ClassNotFoundException ex) {

	    Assert.slpassert(false,
			  "no_class",
			  new Object[] {className});

	}
    }

    // Return the appropriately versioned object, with instance variables
    //  set in the header.

    static SrvLocMsg 
	newInstance(String keyName,
		    int version,
		    boolean isTCP) 
	throws ServiceLocationException {

	try {

	    // Get header class.

	    Class msgClass = 
		(Class)classTable.get(makeClassKey(keyName, version));

	    if (msgClass == null) {
		throw 
		    new ServiceLocationException(
				ServiceLocationException.INTERNAL_ERROR,
				"cmm_creation_error",
				new Object[] { keyName,
						   new Integer(version)});

	    }

	    SrvLocMsg msg = (SrvLocMsg)msgClass.newInstance();

	    // Set the packet length. If we've come via TCP, we don't
	    //  need to set it.

	    SrvLocHeader hdr = msg.getHeader();

	    if (!isTCP) {
		hdr.packetLength = SLPConfig.getSLPConfig().getMTU();

	    }

	    return msg;

	} catch (Exception ex) {
	    throw 
		new ServiceLocationException(
				ServiceLocationException.INTERNAL_ERROR,
				"cmm_creation_exception",
				new Object[] { ex, 
						   keyName, 
						   new Integer(version), 
						   ex.getMessage()});
	}
    }

    // Create the key for the hashtable.

    private static String makeClassKey(String className, int version) {

	return className + version;
    }

}