1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2001 by Sun Microsystems, Inc.
23  * All rights reserved.
24  *
25  */
26 
27 //  ClientMsgManager.java:Manages versioned client message creation in server
28 //  Author:           James Kempf
29 //  Created On:       Thu Sep 17 10:16:33 1998
30 //  Last Modified By: James Kempf
31 //  Last Modified On: Tue Oct 13 15:26:16 1998
32 //  Update Count:     8
33 //
34 
35 package com.sun.slp;
36 
37 import java.util.*;
38 
39 /**
40  * The ClientMsgManager class manages creation of client messages in the
41  * slpd server. Client messages are needed for active DA advertisement
42  * solicitation, and for forwarding of registrations and deregistrations
43  * from the SA server to DAs. This class creates the appropriately
44  * versioned message instance, based on the arguments. It also
45  * sets the header variables. It is up to the caller to set the
46  * instance variables in the object itself.
47  *
48  * @author James Kempf
49  */
50 
51 abstract class ClientMsgManager extends Object {
52 
53     // The class table contains classes registered for particular versions
54     //  and message types.
55 
56     private static Hashtable classTable = new Hashtable();
57 
58     // Register a new message type class and version.
59 
addClientMsgClass(String className, int version, String keyName)60     static void addClientMsgClass(String className,
61 				  int version,
62 				  String keyName) {
63 
64 	// Create the key.
65 
66 	String key = makeClassKey(keyName, version);
67 
68 	try {
69 
70 	    Class headerClass = Class.forName(className);
71 
72 	    classTable.put(headerClass, key);
73 
74 	} catch (ClassNotFoundException ex) {
75 
76 	    Assert.slpassert(false,
77 			  "no_class",
78 			  new Object[] {className});
79 
80 	}
81     }
82 
83     // Return the appropriately versioned object, with instance variables
84     //  set in the header.
85 
86     static SrvLocMsg
newInstance(String keyName, int version, boolean isTCP)87 	newInstance(String keyName,
88 		    int version,
89 		    boolean isTCP)
90 	throws ServiceLocationException {
91 
92 	try {
93 
94 	    // Get header class.
95 
96 	    Class msgClass =
97 		(Class)classTable.get(makeClassKey(keyName, version));
98 
99 	    if (msgClass == null) {
100 		throw
101 		    new ServiceLocationException(
102 				ServiceLocationException.INTERNAL_ERROR,
103 				"cmm_creation_error",
104 				new Object[] { keyName,
105 						   new Integer(version)});
106 
107 	    }
108 
109 	    SrvLocMsg msg = (SrvLocMsg)msgClass.newInstance();
110 
111 	    // Set the packet length. If we've come via TCP, we don't
112 	    //  need to set it.
113 
114 	    SrvLocHeader hdr = msg.getHeader();
115 
116 	    if (!isTCP) {
117 		hdr.packetLength = SLPConfig.getSLPConfig().getMTU();
118 
119 	    }
120 
121 	    return msg;
122 
123 	} catch (Exception ex) {
124 	    throw
125 		new ServiceLocationException(
126 				ServiceLocationException.INTERNAL_ERROR,
127 				"cmm_creation_exception",
128 				new Object[] { ex,
129 						   keyName,
130 						   new Integer(version),
131 						   ex.getMessage()});
132 	}
133     }
134 
135     // Create the key for the hashtable.
136 
makeClassKey(String className, int version)137     private static String makeClassKey(String className, int version) {
138 
139 	return className + version;
140     }
141 
142 }
143