17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*9a70fc3bSMark J. Nelson  * Common Development and Distribution License (the "License").
6*9a70fc3bSMark J. Nelson  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
227c478bd9Sstevel@tonic-gate  * Copyright (c) 1999 by Sun Microsystems, Inc.
237c478bd9Sstevel@tonic-gate  * All rights reserved.
247c478bd9Sstevel@tonic-gate  *
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate //  SLPV1SAttrMsg.java: SLPv1 Attribute request for server.
287c478bd9Sstevel@tonic-gate //  Author:           James Kempf
297c478bd9Sstevel@tonic-gate //  Created On:       Fri Sep 11 13:23:28 1998
307c478bd9Sstevel@tonic-gate //  Last Modified By: James Kempf
317c478bd9Sstevel@tonic-gate //  Last Modified On: Tue Oct 27 10:57:39 1998
327c478bd9Sstevel@tonic-gate //  Update Count:     19
337c478bd9Sstevel@tonic-gate //
347c478bd9Sstevel@tonic-gate 
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate package com.sun.slp;
387c478bd9Sstevel@tonic-gate 
397c478bd9Sstevel@tonic-gate import java.util.*;
407c478bd9Sstevel@tonic-gate import java.io.*;
417c478bd9Sstevel@tonic-gate 
427c478bd9Sstevel@tonic-gate 
437c478bd9Sstevel@tonic-gate /**
447c478bd9Sstevel@tonic-gate  * The SLPV1SAttrMsg class models the SLP server side attribute message.
457c478bd9Sstevel@tonic-gate  *
467c478bd9Sstevel@tonic-gate  * @author James Kempf
477c478bd9Sstevel@tonic-gate  */
487c478bd9Sstevel@tonic-gate 
497c478bd9Sstevel@tonic-gate class SLPV1SAttrMsg extends SAttrMsg {
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate     // For creating null reply.
527c478bd9Sstevel@tonic-gate 
SLPV1SAttrMsg()537c478bd9Sstevel@tonic-gate     SLPV1SAttrMsg() {}
547c478bd9Sstevel@tonic-gate 
557c478bd9Sstevel@tonic-gate     // Construct a SLPV1SAttrMsg from the byte input stream. This will
567c478bd9Sstevel@tonic-gate 
SLPV1SAttrMsg(SrvLocHeader hdr, DataInputStream dis)577c478bd9Sstevel@tonic-gate     SLPV1SAttrMsg(SrvLocHeader hdr, DataInputStream dis)
587c478bd9Sstevel@tonic-gate 	throws ServiceLocationException, IOException {
597c478bd9Sstevel@tonic-gate 
607c478bd9Sstevel@tonic-gate 	super(hdr, dis);
617c478bd9Sstevel@tonic-gate 
627c478bd9Sstevel@tonic-gate     }
637c478bd9Sstevel@tonic-gate 
647c478bd9Sstevel@tonic-gate     // Construct an empty SLPV1SSrvMsg, for monolingual off.
657c478bd9Sstevel@tonic-gate 
makeEmptyReply(SLPHeaderV1 hdr)667c478bd9Sstevel@tonic-gate     static SrvLocMsg makeEmptyReply(SLPHeaderV1 hdr)
677c478bd9Sstevel@tonic-gate 	throws ServiceLocationException {
687c478bd9Sstevel@tonic-gate 
697c478bd9Sstevel@tonic-gate 	SLPV1SAttrMsg msg = new SLPV1SAttrMsg();
707c478bd9Sstevel@tonic-gate 	msg.hdr = hdr;
717c478bd9Sstevel@tonic-gate 
727c478bd9Sstevel@tonic-gate 	msg.makeReply(new Vector(), null);
737c478bd9Sstevel@tonic-gate 
747c478bd9Sstevel@tonic-gate 	return msg;
757c478bd9Sstevel@tonic-gate 
767c478bd9Sstevel@tonic-gate     }
777c478bd9Sstevel@tonic-gate 
initialize(DataInputStream dis)787c478bd9Sstevel@tonic-gate     void initialize(DataInputStream dis)
797c478bd9Sstevel@tonic-gate 	throws ServiceLocationException, IOException {
807c478bd9Sstevel@tonic-gate 
817c478bd9Sstevel@tonic-gate 	SLPHeaderV1 hdr = (SLPHeaderV1)getHeader();
827c478bd9Sstevel@tonic-gate 	StringBuffer buf = new StringBuffer();
837c478bd9Sstevel@tonic-gate 
847c478bd9Sstevel@tonic-gate 	// Parse in the previous responder's list.
857c478bd9Sstevel@tonic-gate 
867c478bd9Sstevel@tonic-gate 	hdr.parsePreviousRespondersIn(dis);
877c478bd9Sstevel@tonic-gate 
887c478bd9Sstevel@tonic-gate 	// Parse in the URL or service type.
897c478bd9Sstevel@tonic-gate 
907c478bd9Sstevel@tonic-gate 	hdr.getString(buf, dis);
917c478bd9Sstevel@tonic-gate 
927c478bd9Sstevel@tonic-gate 	String urlOrServiceType = buf.toString().trim();
937c478bd9Sstevel@tonic-gate 
947c478bd9Sstevel@tonic-gate 	// Decide whether this is a service type or service URL
957c478bd9Sstevel@tonic-gate 
967c478bd9Sstevel@tonic-gate 	try {
977c478bd9Sstevel@tonic-gate 
987c478bd9Sstevel@tonic-gate 	    URL = new ServiceURLV1(urlOrServiceType,
997c478bd9Sstevel@tonic-gate 				   ServiceURL.LIFETIME_DEFAULT);
1007c478bd9Sstevel@tonic-gate 
1017c478bd9Sstevel@tonic-gate 	    serviceType = null;
1027c478bd9Sstevel@tonic-gate 
1037c478bd9Sstevel@tonic-gate 	} catch (IllegalArgumentException ex) {
1047c478bd9Sstevel@tonic-gate 
1057c478bd9Sstevel@tonic-gate 	    // Check to make sure service type is right.
1067c478bd9Sstevel@tonic-gate 
1077c478bd9Sstevel@tonic-gate 	    serviceType =
1087c478bd9Sstevel@tonic-gate 		hdr.checkServiceType(urlOrServiceType.toLowerCase());
1097c478bd9Sstevel@tonic-gate 
1107c478bd9Sstevel@tonic-gate 	    URL = null;
1117c478bd9Sstevel@tonic-gate 	}
1127c478bd9Sstevel@tonic-gate 
1137c478bd9Sstevel@tonic-gate 	// Parse in the scope and validate it.
1147c478bd9Sstevel@tonic-gate 
1157c478bd9Sstevel@tonic-gate 	hdr.getString(buf, dis);
1167c478bd9Sstevel@tonic-gate 
1177c478bd9Sstevel@tonic-gate 	String scope = buf.toString().toLowerCase().trim();
1187c478bd9Sstevel@tonic-gate 
1197c478bd9Sstevel@tonic-gate 	hdr.validateScope(scope);
1207c478bd9Sstevel@tonic-gate 
1217c478bd9Sstevel@tonic-gate 	// Change unscoped to default.
1227c478bd9Sstevel@tonic-gate 
1237c478bd9Sstevel@tonic-gate 	if (scope.length() <= 0) {
1247c478bd9Sstevel@tonic-gate 	    scope = Defaults.DEFAULT_SCOPE;
1257c478bd9Sstevel@tonic-gate 
1267c478bd9Sstevel@tonic-gate 	}
1277c478bd9Sstevel@tonic-gate 
1287c478bd9Sstevel@tonic-gate 	hdr.scopes = new Vector();
1297c478bd9Sstevel@tonic-gate 	hdr.scopes.addElement(scope);
1307c478bd9Sstevel@tonic-gate 
1317c478bd9Sstevel@tonic-gate 	// Parse in the attribute tags.
1327c478bd9Sstevel@tonic-gate 
1337c478bd9Sstevel@tonic-gate 	hdr.getString(buf, dis);
1347c478bd9Sstevel@tonic-gate 
1357c478bd9Sstevel@tonic-gate 	tags =
1367c478bd9Sstevel@tonic-gate 	    hdr.parseCommaSeparatedListIn(buf.toString().trim(), true);
1377c478bd9Sstevel@tonic-gate 
1387c478bd9Sstevel@tonic-gate 	// Unescape tags.
1397c478bd9Sstevel@tonic-gate 
1407c478bd9Sstevel@tonic-gate 	int i, n = tags.size();
1417c478bd9Sstevel@tonic-gate 
1427c478bd9Sstevel@tonic-gate 	for (i = 0; i < n; i++) {
1437c478bd9Sstevel@tonic-gate 	    String tag = (String)tags.elementAt(i);
1447c478bd9Sstevel@tonic-gate 
1457c478bd9Sstevel@tonic-gate 	    // Check for starting and ending wildcards.
1467c478bd9Sstevel@tonic-gate 
1477c478bd9Sstevel@tonic-gate 	    boolean wildcardStart = false;
1487c478bd9Sstevel@tonic-gate 	    boolean wildcardEnd = false;
1497c478bd9Sstevel@tonic-gate 
1507c478bd9Sstevel@tonic-gate 	    if (tag.startsWith("*")) {
1517c478bd9Sstevel@tonic-gate 		wildcardStart = true;
1527c478bd9Sstevel@tonic-gate 		tag = tag.substring(1, tag.length());
1537c478bd9Sstevel@tonic-gate 	    }
1547c478bd9Sstevel@tonic-gate 
1557c478bd9Sstevel@tonic-gate 	    if (tag.endsWith("*")) {
1567c478bd9Sstevel@tonic-gate 		wildcardEnd = true;
1577c478bd9Sstevel@tonic-gate 		tag = tag.substring(0, tag.length()-1);
1587c478bd9Sstevel@tonic-gate 	    }
1597c478bd9Sstevel@tonic-gate 
1607c478bd9Sstevel@tonic-gate 	    tag =
1617c478bd9Sstevel@tonic-gate 		ServiceLocationAttributeV1.unescapeAttributeString(tag,
1627c478bd9Sstevel@tonic-gate 								hdr.charCode);
1637c478bd9Sstevel@tonic-gate 
1647c478bd9Sstevel@tonic-gate 	    if (wildcardStart) {
1657c478bd9Sstevel@tonic-gate 		tag = "*" + tag;
1667c478bd9Sstevel@tonic-gate 	    }
1677c478bd9Sstevel@tonic-gate 
1687c478bd9Sstevel@tonic-gate 	    if (wildcardEnd) {
1697c478bd9Sstevel@tonic-gate 		tag = tag + "*";
1707c478bd9Sstevel@tonic-gate 	    }
1717c478bd9Sstevel@tonic-gate 
1727c478bd9Sstevel@tonic-gate 	    tags.setElementAt(tag.trim(), i);
1737c478bd9Sstevel@tonic-gate 	}
1747c478bd9Sstevel@tonic-gate 
1757c478bd9Sstevel@tonic-gate 	hdr.constructDescription("AttrRqst",
1767c478bd9Sstevel@tonic-gate 				 "         " +
1777c478bd9Sstevel@tonic-gate 				 (URL != null ? ("URL=``" + URL):
1787c478bd9Sstevel@tonic-gate 				  ("service type=``" + serviceType)) +
1797c478bd9Sstevel@tonic-gate 				 "''\n" +
1807c478bd9Sstevel@tonic-gate 				 "         tags=``" + tags + "''");
1817c478bd9Sstevel@tonic-gate     }
1827c478bd9Sstevel@tonic-gate 
1837c478bd9Sstevel@tonic-gate     // Construct an SAttrMsg payload for reply to client.
1847c478bd9Sstevel@tonic-gate 
makeReply(Vector attrs, Hashtable auth)1857c478bd9Sstevel@tonic-gate     SrvLocMsg makeReply(Vector attrs, Hashtable auth)
1867c478bd9Sstevel@tonic-gate 	throws ServiceLocationException {
1877c478bd9Sstevel@tonic-gate 
1887c478bd9Sstevel@tonic-gate 	SLPHeaderV1 hdr = ((SLPHeaderV1)getHeader()).makeReplyHeader();
1897c478bd9Sstevel@tonic-gate 
1907c478bd9Sstevel@tonic-gate 	// We need to check whether this is an AttrRqst by type and
1917c478bd9Sstevel@tonic-gate 	//  if the type was an abstract type. If so, we simply return
1927c478bd9Sstevel@tonic-gate 	//  an empty reply, but we print a message to the log so the problem
1937c478bd9Sstevel@tonic-gate 	//  can be fixed.
1947c478bd9Sstevel@tonic-gate 
1957c478bd9Sstevel@tonic-gate 	if (serviceType != null) {
1967c478bd9Sstevel@tonic-gate 	    ServiceType type = new ServiceType(serviceType);
1977c478bd9Sstevel@tonic-gate 	    ServiceStore store = ServiceTable.getServiceTable().store;
1987c478bd9Sstevel@tonic-gate 	    Vector types = store.findServiceTypes(type.getNamingAuthority(),
1997c478bd9Sstevel@tonic-gate 						  this.hdr.scopes);
2007c478bd9Sstevel@tonic-gate 
2017c478bd9Sstevel@tonic-gate 	    int i, n = types.size();
2027c478bd9Sstevel@tonic-gate 
2037c478bd9Sstevel@tonic-gate 	    for (i = 0; i < n; i++) {
2047c478bd9Sstevel@tonic-gate 		String stype = (String)types.elementAt(i);
2057c478bd9Sstevel@tonic-gate 		ServiceType ttype = new ServiceType(stype);
2067c478bd9Sstevel@tonic-gate 
2077c478bd9Sstevel@tonic-gate 		if (ttype.isAbstractType() &&
2087c478bd9Sstevel@tonic-gate 		    type.equals(ttype.getAbstractTypeName())) {
2097c478bd9Sstevel@tonic-gate 
2107c478bd9Sstevel@tonic-gate 		    // We are out of luck!
2117c478bd9Sstevel@tonic-gate 
2127c478bd9Sstevel@tonic-gate 		    SLPConfig config = SLPConfig.getSLPConfig();
2137c478bd9Sstevel@tonic-gate 
2147c478bd9Sstevel@tonic-gate 		    config.writeLog("v1_abstract_type_conflict",
2157c478bd9Sstevel@tonic-gate 				    new Object[] {serviceType,
2167c478bd9Sstevel@tonic-gate 						      ttype});
2177c478bd9Sstevel@tonic-gate 		    attrs.removeAllElements();
2187c478bd9Sstevel@tonic-gate 		}
2197c478bd9Sstevel@tonic-gate 	    }
2207c478bd9Sstevel@tonic-gate 	}
2217c478bd9Sstevel@tonic-gate 
2227c478bd9Sstevel@tonic-gate 	hdr.iNumReplies = attrs.size();
2237c478bd9Sstevel@tonic-gate 
2247c478bd9Sstevel@tonic-gate 	ByteArrayOutputStream baos = new ByteArrayOutputStream();
2257c478bd9Sstevel@tonic-gate 
2267c478bd9Sstevel@tonic-gate 	hdr.parseAttributeVectorOut(attrs, baos); // attributes
2277c478bd9Sstevel@tonic-gate 
2287c478bd9Sstevel@tonic-gate 	hdr.payload = baos.toByteArray();
2297c478bd9Sstevel@tonic-gate 
2307c478bd9Sstevel@tonic-gate 	hdr.constructDescription("AttrRply",
2317c478bd9Sstevel@tonic-gate 				 "        attributes=``" + attrs + "''\n");
2327c478bd9Sstevel@tonic-gate 
2337c478bd9Sstevel@tonic-gate 	return hdr;
2347c478bd9Sstevel@tonic-gate     }
2357c478bd9Sstevel@tonic-gate }
236