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