About the Author xvii
Acknowledgments . xix
Introduction xxi
■CHAPTER 1 Overview of Jini . 1
■CHAPTER 2 Troubleshooting Jini . 21
■CHAPTER 3 Ant 27
■CHAPTER 4 Discovering a Lookup Service 35
■CHAPTER 5 Entry Objects 53
■CHAPTER 6 Service Registration . 59
■CHAPTER 7 Client Search 67
■CHAPTER 8 Leasing . 73
■CHAPTER 9 A Simple Example . 87
■CHAPTER 10 Jini Extensible Remote Invocation . 117
■CHAPTER 11 Choices for Service Architecture . 127
■CHAPTER 12 Discovery Management 161
■CHAPTER 13 Join Manager . 167
■CHAPTER 14 Security 171
■CHAPTER 15 More Complex Examples . 185
■CHAPTER 16 Remote Events 215
■CHAPTER 17 ServiceDiscoveryManager . 237
■CHAPTER 18 Example: Flashing Clocks 249
■CHAPTER 19 Configuration . 265
■CHAPTER 20 Logging 281
■CHAPTER 21 ServiceStarter . 285
■CHAPTER 22 Advanced Security . 303
■CHAPTER 23 Transactions 353
■CHAPTER 24 User Interfaces for Jini Services . 373
■CHAPTER 25 Activation 389
■CHAPTER 26 Introspection 431
■CHAPTER 27 Extended Example: Home Audio System . 437
■CHAPTER 28 Web Services and Jini . 465
■INDEX . 475
508 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 2237 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Foundations of Jini 2 Programming, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
as
// object from the file
serviceID = null;
try {
ObjectInputStream ois =
new ObjectInputStream(new FileInputStream(serviceIDFile));
serviceID = (ServiceID) ois.readObject();
System.out.println("Got dir service id " + serviceID);
} catch(Exception e) {
7168ch27.fm Page 460 Friday, September 1, 2006 11:00 AM
C H A P T E R 2 7 ■ E X T E N D E D E X A M P L E : H O M E A U D I O S Y S T E M 461
System.out.println("Couldn't get service IDs - generating new one");
try {
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream(serviceIDFile));
Uuid uuid = UuidFactory.generate();
serviceID = new ServiceID(uuid.getMostSignificantBits(),
uuid.getLeastSignificantBits());
oos.writeObject(serviceID);
oos.close();
} catch(Exception e2) {
System.out.println("Couldn't save ids");
e2.printStackTrace();
}
}
}
} // FileServer
The file source server requires the following classes:
• audio.httpsource.FileServer
• audio.httpsource.FileServer
• audio.http.HttpSourceImpl
• audio.http.HttpOggSourceImpl
• audio.http.HttpMP3SourceImpl
• audio.http.HttpWAVSourceImpl
• audio.presentation.MP3
• audio.presentation.WAV
• audio.presentation.Ogg
• audio.transport.HttpURL
• audio.transport.HttpSource
• All the classes in the audio.common package
These classes can be collected into a .jar file such as audio.httpsource.FileServer.jar
and run with a configuration such as the preceding one, as follows:
java -classpath audio.httpsource.FileServer.jar audio.httpsource.FileServer
sting.cfg
Playlists
Much music comes on CDs, LPs, tapes, and cassettes, or in some similarly structured format
(even a radio show has a structure). This structure often mirrors that of a directory, so a CD
7168ch27.fm Page 461 Friday, September 1, 2006 11:00 AM
462 C H A P T E R 2 7 ■ E X T E N D E D E X A M P L E : H O M E A U D I O S Y S T E M
might contain a directory of tracks, and so on. A directory can be a service in its own right, so
there is an interface to define it.
/**
* Directory.java
* A one-level directory of services. If the directory is also
* a service then it allows a directory tree hierarchy to be built
*/
package audio.common;
import java.rmi.Remote;
import java.rmi.RemoteException;
import net.jini.core.lookup.ServiceID;
public interface Directory extends Remote {
ServiceID[] getServiceIDs() throws RemoteException;
}// Directory
The directory defines the minimum about each of its services: their ServiceIDs. This
allows a directory to contain any type of service: individual songs, other directories, and even
image services or other services. For a directory like this to work, each service must have a
persistent service ID, but this is expected of a Jini service, anyway.
There isn’t room in this book to fully explore how directories like this can be used. They
can be used to build playlists and lists of playlists. The services are not restricted to a single
computer, and the playlists can be dynamically created. The web site for this book goes into
much more detail on this topic.
Basic Client
A client will locate sources and sinks and allow a user to make selections from them. Each sink
will be told about the selected sources, and each source will be told about the selected sinks.
The client may register itself as a listener for events (such as STOP) from the services. Then the
client will ask the sources to play() and the sinks to record(). I do not have space in this book
to provide an all-singing, all-dancing client with a graphical user interface that can handle
playlists; such a client is discussed on the web site for this book. Instead, I just discuss a
minimal client that just connects a single source to a single sink (the first one found of each).
The basic client will just find a sink and a source (any source, any sink), tell each about the
other, and then play/record to an audio stream. This can be done as follows:
package audio.client;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import net.jini.discovery.LookupDiscovery;
import net.jini.core.lookup.ServiceTemplate;
import net.jini.discovery.LookupDiscoveryManager;
import net.jini.lookup.ServiceDiscoveryManager;
import net.jini.core.lookup.ServiceItem;
import net.jini.lease.LeaseRenewalManager;
import audio.common.Sink;
import audio.common.Source;
7168ch27.fm Page 462 Friday, September 1, 2006 11:00 AM
C H A P T E R 2 7 ■ E X T E N D E D E X A M P L E : H O M E A U D I O S Y S T E M 463
/**
* BasicClient.java
*/
public class BasicClient {
private static final long WAITFOR = 100000L;
private ServiceDiscoveryManager clientMgr = null;
public static void main(String argv[]) {
new BasicClient();
// stay around long enough to receive replies
try {
Thread.currentThread().sleep(2*WAITFOR);
} catch(java.lang.InterruptedException e) {
// do nothing
}
}
public BasicClient() {
System.setSecurityManager(new RMISecurityManager());
try {
LookupDiscoveryManager mgr =
new LookupDiscoveryManager(LookupDiscovery.ALL_GROUPS,
null, // unicast locators
null); // DiscoveryListener
clientMgr = new ServiceDiscoveryManager(mgr,
new LeaseRenewalManager());
} catch(Exception e) {
e.printStackTrace();
System.exit(1);
}
// find a source and sink
Sink sink = (Sink) getService(Sink.class);
Source source = (Source) getService(Source.class);
// tell them about each other
try {
source.addSink(sink);
sink.addSource(source);
} catch(Exception e) {
System.err.println("Error setting source or sink " + e);
e.printStackTrace();
System.exit(1);
}
// play the audio
try {
System.out.println("Playing...");
source.play();
sink.record();
} catch(Exception e) {
System.out.println("Error in playing " + e);
7168ch27.fm Page 463 Friday, September 1, 2006 11:00 AM
464 C H A P T E R 2 7 ■ E X T E N D E D E X A M P L E : H O M E A U D I O S Y S T E M
System.exit(1);
}
}
private Object getService(Class cls) {
Class [] classes = new Class[] {cls};
ServiceTemplate template = new ServiceTemplate(null, classes,
null);
ServiceItem item = null;
// Try to find the service, blocking till timeout if necessary
try {
item = clientMgr.lookup(template,
null, // no filter
WAITFOR); // timeout
} catch(Exception e) {
e.printStackTrace();
System.exit(1);
}
if (item == null) {
// couldn't find a service in time
System.out.println("no service for class " + cls);
System.exit(1);
}
// Return the service
return item.service;
}
} // BasicClient
The basic client requires the following classes:
• audio.client.BasicClient
• All the classes in the audio.common package
These classes can be collected into a .jar file such as audio.client.BasicClient.jar and
run with a configuration such as the previous one, as follows:
java -classpath audio.client.BasicClient.jar audio.client.BasicClient
Summary
This chapter discussed a framework for distributed audio. Jini makes it fairly straightforward to
handle service advertisement and discovery, telling services about each other and generating
and handling remote events. The architecture is extensible and just consists of adding in more
interfaces and implementations. For example, although this chapter discussed only audio, the
same framework could be applied to visual content, either still images or movies.
7168ch27.fm Page 464 Friday, September 1, 2006 11:00 AM
465
■ ■ ■
C H A P T E R 2 8
Web Services and Jini
One of the middleware frameworks being heavily promoted at present is that of Web
Services. Web Services are built upon the Simple Object Access Protocol (SOAP) invocation
protocol, the Web Services Description Language (WSDL) specification language, and the
Universal Description, Discovery, and Integration (UDDI) discovery system. In this chapter,
we look at how clients and services from different frameworks can interoperate, with particular
reference to Web Services and Jini.
Integrating Web Services and Jini
While this book has been about Jini, other middleware systems are in use, such as CORBA, Web
Services, UPnP, and Salutation, among many others. While it would be very convenient for
software developers if all but their favorite middleware were to disappear, this is unlikely to
happen. There are technical and political reasons for many of these frameworks to survive, and
so software developers will just have to live in a world of multiple middleware systems.
Users, on the other hand, just want their different pieces of software to work together, no
matter what framework is used. It is up to software developers to figure out how to get a Web
Services client to work with, for example, a mixture of Jini and UPnP services.
The most common way of getting such mixtures to work is through a bridge. That is, to get
a Web Service client to talk to a Jini service, typically a bridge will be an application sitting
between them and acting as a Web Service service and a Jini client. In the middle, the bridge
translates from one framework to the other, in both directions, as shown in Figure 28-1.
Figure 28-1. Bridging between middleware systems
7168ch28.fm Page 465 Friday, September 8, 2006 1:10 PM
466 C H A P T E R 2 8 ■ W E B S E R V I C E S A N D J I N I
There are two aspects to a bridge: one is concerned with discovery and the other with
invocation.
• Discovery allows one middleware client to discover a different middleware service—for
example, a CORBA client discovering a Jini service. Typically this is done by the client
discovering the bridge and the bridge discovering the service. This may involve two
service cache managers (lookup services, name services, etc.).
• The bridge allows one middleware client to make calls on another middleware service—
for example, a CORBA client making calls on a Jini service. It will convert calls received
under one protocol into calls in the other. This will often involve conversion of data from
one format to another.
Web Services and Jini have special features that make this a simpler task than in general:
• Web Services are supposed to use the discovery system UDDI. However, UDDI was
designed independently as a global white/yellow/green/blue pages directory, and it
turns out to be poorly suited to Web Service discovery. In practice, it seems that most
Web Service developers rely on the URLs hard-coded into WSDL files, and don’t do any
discovery at all.
• In Chapter 1, the section “The End of Protocols” discussed how Jini doesn’t really care
about invocation protocols, but only about discovery. Of course, a lot of this book has
been about how to invoke a service, but much of that discussion is about the choices that
a service developer has. The client doesn’t care.
• The XML data types don’t map directly to Java data types and vice versa. However, there
are now standardized mappings with implementations from several vendors.
While building a bridge is in general a nontrivial process, the standardization of data
mappings, the indifference of Jini to invocation protocols, and the hard-coded addresses of
Web Services simplifies building a Web Services to Jini bridge in the following way:
• Web Services don’t need to be discovered; they just need to be looked up. Web clients
don’t need to do discovery since they have the services’ URLs hard-coded in the WSDL
document.
• Jini clients and services can talk SOAP (the Web Service protocol) just as easily as they
can talk any other invocation protocol. The client doesn’t even know what invocation
protocol is used, while the service programmer just has to SOAP-enable the services.
• Jini clients and services can make use of existing libraries to handle SOAP queries.
The case of a Jini client talking to a Web Service can lead to several models, as shown in the
following figures. In Figure 28-2, the proxy can be an ordinary (e.g., Jeri) proxy talking back to
its service. This service also acts as a Web Service client.
7168ch28.fm Page 466 Friday, September 1, 2006 11:01 AM
C H A P T E R 2 8 ■ W E B S E R V I C E S A N D J I N I 467
Figure 28-2. Bridging between a Jini client and a Web Service
Figure 28-3 shows a “smart” proxy that talks directly to the Web Service.
Figure 28-3. Smart proxy bridging between a Jini client and a Web Service
Simple Web Service
I’ll illustrate this example with a simple Web Service, for file classification again. To avoid the
complexities of Web Service types and with deployment of such services, let’s simplify the
service to one that takes a string as file name and returns the MIME type as a string major/
minor. The class is not in a package, allowing simple deployment under Apache Axis. The
implementation of this service is then straightforward:
/**
* FileClassifierService.java
*/
public class FileClassifierService {
public String getMIMEType(String fileName) {
if (fileName.endsWith(".gif")) {
return "image/gif";
} else if (fileName.endsWith(".jpeg")) {
return "image/jpeg";
7168ch28.fm Page 467 Friday, September 1, 2006 11:01 AM
468 C H A P T E R 2 8 ■ W E B S E R V I C E S A N D J I N I
} else if (fileName.endsWith(".mpg")) {
return "video/mpeg";
} else if (fileName.endsWith(".txt")) {
return "text/plain";
} else if (fileName.endsWith(".html")) {
return "text/html";
} else
// fill in lots of other types,
// but eventually give up and
return "";
}
public FileClassifierService() {
// empty
}
} // FileClassifierService
The Apache Axis server runs under Apache Tomcat and is a popular means of delivering
Web Services written in Java. It includes libraries for both the client side and service side. The
simplest way of deploying the service under Axis is to copy the implementation source code to
the axis/webapps directory, renaming the extension .jws instead of .java.
The service can, of course, be written in many different languages. This is usually done by
a horrible practice that has become common with Web Services: reverse engineer the imple-
mentation given previously to a WSDL specification, and then forward engineer this to your
favorite language. We will ignore all such issues here.
On the client side, a consumer of this service can then be written most simply as follows:
package ws;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import ws.MIMEType;
public class TestWSClient {
public static void main(String [] args) {
try {
String endpoint =
"";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName("",
"getMIMEType"));
String ret = (String) call.invoke( new Object[] { "file.txt" } );
7168ch28.fm Page 468 Friday, September 1, 2006 11:01 AM
C H A P T E R 2 8 ■ W E B S E R V I C E S A N D J I N I 469
System.out.println("Type of file 'file.txt' is " + ret);
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
There are other ways of achieving the same result, but this is good enough for the rest of
this chapter, which is intended to show how Jini and Web Services can interoperate rather than
delve into the arcanities of Web Services.
Bridging Between a Jini Client and Web Service,
Example 1
A bridge that acts as a Jini service implementing the common.FileClassifier specification used
throughout this book, and also as a client to the previous file classification Web Service, can be
written by essentially including the Web Service client code from earlier into the implementa-
tion of the Jini service methods. The bridge is a normal Jini server advertising the following Jini
service implementation:
package ws;
import common.MIMEType;
import common.FileClassifier;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
/**
* FileClassifierImpl.java
*/
public class FileClassifierImpl implements RemoteFileClassifier {
public MIMEType getMIMEType(String fileName)
throws java.rmi.RemoteException {
try {
String endpoint =
"";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName("",
"getMIMEType"));
String ret = (String) call.invoke( new Object[] { fileName } );
return new MIMEType(ret);
} catch (Exception e) {
7168ch28.fm Page 469 Friday, September 1, 2006 11:01 AM
470 C H A P T E R 2 8 ■ W E B S E R V I C E S A N D J I N I
throw new RemoteException("SOAP failure", e);
}
}
public FileClassifierImpl() throws java.rmi.RemoteException {
// empty constructor required by RMI
}
} // FileClassifierImpl
This service can export a Jeri or RMI proxy to a Jini client as we have seen before. Client
calls on the proxy are sent to this service, which acts as a Web Service client using the model of
Figure 28-2. When this implementation is built and run, it will need the Axis libraries on the Jini
service side.
Bridging Between a Jini Client and Web Service,
Example 2
A service can be written that follows the second pattern in Figure 28-3, simply by changing the
inheritance from RemoteFileClassifier to FileClassifier and Serializable. A client then gets
a copy of this service and all calls are made locally in the client.
package ws;
import common.MIMEType;
import common.FileClassifier;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
/**
* FileClassifierImpl.java
*/
public class FileClassifierSerializableImpl implements FileClassifier,
java.io.Serializable {
public MIMEType getMIMEType(String fileName)
throws java.rmi.RemoteException {
try {
String endpoint =
"";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName("",
"getMIMEType"));
7168ch28.fm Page 470 Friday, September 1, 2006 11:01 AM
C H A P T E R 2 8 ■ W E B S E R V I C E S A N D J I N I 471
String ret = (String) call.invoke( new Object[] { fileName } );
return new MIMEType(ret);
} catch (Exception e) {
throw new RemoteException(e);
}
}
public FileClassifierImpl() throws java.rmi.RemoteException {
// empty constructor required by RMI
}
} // FileClassifierImpl
This has major implications for the classes downloaded to the client! In order to run this
service on the client side, it needs access to the class files for the Axis classes Call, Service, and
QName. The client cannot be expected to have these, since it doesn’t need to know any details of
the implementation. So the Axis libraries have to be placed on an HTTP server and listed in the
Jini server’s codebase. The libraries are over 1MB in size, so needing to send these across the
network can result in a substantial download to the Jini client.
Bridging Between a Web Service Client and Jini
Service
Forming a bridge between Web Service clients and Jini services follows the same general struc-
ture, as shown in Figure 28-4.
Figure 28-4. Bridge between a Web Service client and a Jini service
In this case, we put the Jini client code into the Web Service implementation.
There are a couple of wrinkles in getting this to work properly with Apache Axis and the
Tomcat server:
• Jini class files
• Security policy
The Jini class files are not in the classpath for Tomcat. However, Tomcat and Apache allow
any extra .jar files required by a Web Service to be placed in special lib directories under the
7168ch28.fm Page 471 Friday, September 1, 2006 11:01 AM
472 C H A P T E R 2 8 ■ W E B S E R V I C E S A N D J I N I
service’s WEB-INF directory. Copying the Jini files jsk-lib.jar and jsk-platform.jar to this
directory will make them available to the Web Service. This will be part of the deployment
mechanisms for the Web Service.
The issue of a security policy is potentially more difficult. A server such as Tomcat can be
started either with or without a security manager. If it uses a security manager, then the default
security policy does not allow a new security manager to be put in place. This blocks a Jini
client from installing an RMISecurityManager, and so it cannot download a Jini registrar and
find Jini services. Negotiation would then be required with the Tomcat administrator to add in
sufficient permissions to the security policy to allow a Jini client to run.
If Tomcat is run without a security manager, then it is possible for the Web Service to
install one. But it will then need to use a security policy. Up to now we have specified such a
policy as a command-line argument, but the command line is not accessible to an Axis Web
Service. The workaround is to use System.setProperty() to set the security policy file before
installing a security manager.
All I/O to the console has to be cleaned up and put into remote exceptions. With these
factors, the Web Service to bridge to a Jini service looks like this:
/**
* FileClassifierJiniService.java
*/
import common.FileClassifier;
import common.MIMEType;
import java.rmi.RMISecurityManager;
import net.jini.discovery.LookupDiscovery;
import net.jini.core.lookup.ServiceTemplate;
import net.jini.discovery.LookupDiscoveryManager;
import net.jini.lookup.ServiceDiscoveryManager;
import net.jini.core.lookup.ServiceItem;
import net.jini.lease.LeaseRenewalManager;
import java.rmi.RemoteException;
public class FileClassifierJiniService {
private final static long WAITFOR = 10000;
public String getMIMEType(String fileName) throws RemoteException {
ServiceDiscoveryManager clientMgr = null;
// set a security policy file here since we don't have command-line access
System.setProperty("java.security.policy",
"/home/httpd/html/java/jini/tutorial/policy.all");
System.setSecurityManager(new RMISecurityManager());
try {
LookupDiscoveryManager mgr =
new LookupDiscoveryManager(LookupDiscovery.ALL_GROUPS,
null, // unicast locators
null); // DiscoveryListener
clientMgr = new ServiceDiscoveryManager(mgr,
new LeaseRenewalManager());
} catch(Exception e) {
7168ch28.fm Page 472 Friday, September 1, 2006 11:01 AM
C H A P T E R 2 8 ■ W E B S E R V I C E S A N D J I N I 473
throw new RemoteException("Lookup failed", e);
}
Class [] classes = new Class[] {FileClassifier.class};
ServiceTemplate template = new ServiceTemplate(null, classes,
null);
ServiceItem item = null;
// Try to find the service, blocking until timeout if necessary
try {
item = clientMgr.lookup(template,
null, // no filter
WAITFOR); // timeout
} catch(Exception e) {
throw new RemoteException("Discovery failed", e);
}
if (item == null) {
// couldn't find a service in time
return "";
}
// Get the service
FileClassifier classifier = (FileClassifier) item.service;
if (classifier == null) {
throw new RemoteException("Classifier null");
}
// Now we have a suitable service, use it
MIMEType type;
try {
type = classifier.getMIMEType(fileName);
return type.toString();
} catch(java.rmi.RemoteException e) {
throw e;
}
}
public FileClassifierJiniService() {
// empty
}
} // FileClassifierJiniService
The steps to get all this running are as follows:
1. Download and install Apache Tomcat and Axis.
2. Edit the FileClassifierJiniService.java file to point to a valid security policy file on
your system.
7168ch28.fm Page 473 Friday, September 1, 2006 11:01 AM
474 C H A P T E R 2 8 ■ W E B S E R V I C E S A N D J I N I
3. Copy the FileClassifierJiniService.java file to the Tomcat webapps/axis directory as
FileClassifierJiniService.jws, changing the file extension.
4. Copy the Jini libraries jsk-lib.jar and jsk-platform.jar to the Tomcat webapps/axis/
WEB-INF/lib directory.
5. Start Tomcat without a security manager (by default it starts without one).
6. Start a Jini lookup service and any Jini implementation of the FileClassifier interface
that has been given in this book.
7. Run the Web Service client ws.TestWS2JiniClient.
This procedure should run the Web Service, which finds the Jini service, makes a call on it,
and returns the result to the Web Service client.
Summary
Bridging between different types of services is not an easy matter, as there are many complex
issues to be considered. Nevertheless, it is possible to build upon work performed to build Java
Web Services and their Java clients, allowing you to use Jini services and clients in a relatively
simple manner.
7168ch28.fm Page 474 Friday, September 1, 2006 11:01 AM
475
Index
■A
A/V formats, 438
abstract leases, 76
access limitations, 175
ACID properties, 353
action listeners, 192
activation (extension to RMI), 389
activation server (phoenix), 390–391
activation, use of
configuration, 407–409
LookupDiscoveryService
interface, 419–430
maintaining state information, 401–407
renewing leases, 410–419
server, 393–398
service, 391–393
service, running, 398–401
services, lazy and nonlazy, 401
active references, 25
additive permissions, 174
Address class, 56
administration, zero, 21
alive, staying, 47
AllPermission, 172, 173
anonymous classes, 191
Ant
build.xml file, 27–29
description, 27
directory structure, 27–28
parameters, 27
project files, 30–32
targets, 28
antBuildFiles directory, 30
Apache Axis server, 468
Apache license, open-source, 1, 5
API (application programming
interface), 2
applications, partitioning, 16–18
Arnold, Ken, 91
attribute matching, 55
attributes registered, 65
audio stream, push/pull, 439
audio system example
audio-visual content
parameters, 438
basic client, 462–464
content interfaces, 441
content sinks, 447–450
description, 437, 438
file source servers, 457–461
HTTP sinks, 446
HTTP source, 443–445
linkages between layers, 442
Ogg Vorbis interface, 445
playlists, 461
sink implementation, 450–453
sink servers, 453–456
source and sink interfaces, 439–441
source servers, 456–457
transport interfaces, 442
authenticating servers, 338–343
authentication
of clients, 303, 304, 344–349
required by clients, 343–344
required by servers, 349–350
author’s Web site, 249
authorization, 303, 350
AWT events, 216
■B
banking system, 4
books
Design Patterns, 215
The Jini Specifications, Second Edition,
91
BrevilleExtraLiftToaster example, 68–69, 70
bridge, Web Service-Jini
discovery and invocation, 465–467
examples, 469–471, 472–474
security policy, 472
structure, 471
broadcast discovery, 43–51
broadcast range, 49
build directory, 27, 28
build.xml file, 27–29
7168IDX.fm Page 475 Friday, September 1, 2006 11:02 AM
476 ■I N D E X
■C
cache, monitoring, 246–248
CD databases, 456
certificates, signed, 178
changes in services, leasing. See service
changes, leasing
changes in services, monitoring, 230–235
class definitions
loading, 69
uploading, 177
class files variables, 30
classes
accessibility from CLASSPATH, 21
anonymous, 191
changes in Jini 2.0, 22
ConfigUtils, 274
convenience, 56
DiscoveryEvent, 45–47
DiscoveryListener, 44
file delivery to client, 23
FileClassifierImpl, 128, 133, 153
FileClassifierLandlord, 208–211
FileClassifierLeasedResource, 206–207
HttpmdUtil, 323
in .jar files, 23
Jeri, 136–140
JoinManager, 167–170
JRMP, 140–141
LandlordLease, 79
leased FileClassifier, 202–205
LeaseRenewalManager, 75
LeaseRenewalService, 410
lookup services, 50–51
LookupDiscovery, 43, 161
LookupDiscoveryManager, 164–166
LookupLocatorDiscovery, 163–164
MIMEType, 91–93
multiple class files, 192
non-RMI proxy implementation, 147
problem domain, 185–187
Reaper (cleanup), 207–208
ServiceItem, 60
ServiceMatches, 69
ServiceRegistrar, 50–51, 59, 67–69, 179
ServiceRegistration, 60, 64
ServiceType, 57
UIDescriptor, 376–379
UnicastRemoteObject, 83, 118
unknown, 435
See also LookupLocator class; Service-
Starter class
classifer, file, 222–230
classifying files, 87
CLASSPATH environment variable, 22, 189
clean directory, 28
client ignorance, 19
clients
audio system example, 462–464
authentication of, 344–349
confidentiality, 330
description, 94
exception handling, 104
lookup, 12–13
multicast, 99–104
proxy verification, 326
requiring authentication, 343–344
security requirements, 177–178
structure, 14–15
transactions example, 366–371
unicast, 94–99
client-side constraints, 312
ClockDevice package, 261–264
ClockFrame service, 252–259
clocks example. See flashing clocks example
code sources, 180
codebase, specifying, 271–274
command-line options, 265
Comment class, 56
commit protocol, two-phase, 353
competitors, 4
compile target, 28
compiler, rmic, 118, 119
complete service, uploading, 105–115
components, 9
ComputerTimer driver, 260
ComputerTimer service, 251
confidentiality
clients, 330
description, 303
invocation constraints, 304
SSL server, 331–332
configuration
codebase, 271–274
command-line options, 265
file classifier server, 315
7168IDX.fm Page 476 Friday, September 1, 2006 11:02 AM
477■I N D E X
Find it faster at
generic servers, 274–279
runtime configuration, 265
runtime information, 274–279
service ID, 268–271
specifying, 267
zero configuration, 23
ConfigurationFile language, 266
ConfigUtils class, 274
constraints
alternative, 344
client-side, 312
mandatory and preferred, 304
on invocation, 303
on methods, 305
convenience classes, 56
cookies, 77, 81
■D
debugging, 25
deploy directory, 28
Design Patterns book, 215
Deutsch, Peter, 3
device, finding on network, 196
diagrams
landlord classes, 78, 79, 80
UML, 39, 40, 45
DialogFactory, 375
digital signatures, creating, 181
directories
antBuildFiles, 30
build, 27, 28
clean, 28
deploy, 28
dist, 27, 28
httpd.classes, 27
lib, 23
resources, 27
src, 27, 30
directory structure, Ant, 27–28
discovery between middleware services, 466
DiscoveryEvent class, 45–47
DiscoveryGroupManagement interface, 162
DiscoveryListener class, 44
DiscoveryLocatorManagement interface, 162
DiscoveryManagement interface, 162
dist directory, 27, 28
distance service, 196
Djava.rmi.server.logCalls flag, 25
Djava.security.debug flag, 25
djinns, 171
Dnet.jini.discovery.debug flag, 25
■E
editors example, 53–55
Eight Fallacies, 3, 4
encumbered formats, 438
Entry class
attribute matching, 55
attributes registered, 65
convenience classes, 56
description, 54
restrictions, 55
uses of, 57
entry points, 373
environment variable CLASSPATH, 22, 189
ERI. See Jeri (Jini Extensible Remote Invoca-
tion)
errors
garbage collection-related, 24
HTTP server-related, 23
Java-related, 21
Jini-related, 22
localhost, 23
lookup-related, 24
network configuration, 23
preferred value, 24
proxy verification, 328–330
RMI stubs-related, 24
events
file classifer, 222–230
listener lists, 218–221
listener sources, 221
listeners, leasing, 230
models, 215
registration, 217
examples
BrevilleExtraLiftToaster, 68–69, 70
file editors, 53–55
FooLandlord, 83–86
InvalidLookupLocator, 36–39
matching, 196–202
MulticastRegister, 45–49
registering FileClassifierImpl, 168–170
security policy file, 176, 183
server side-specific action
listener, 192
unicast server, 61–64
UnicastRegister, 39–43
Web Service-Jini bridge, 469–471,
472–474
See also audio system example; FileClas-
sifier example; flashing clocks
example; transactions example
7168IDX.fm Page 477 Friday, September 1, 2006 11:02 AM
478 ■I N D E X
exceptions
clients, 104
security, 174
explicit proxy, 134, 218, 231
explicit references, 124
exporter for Jeri, 120
exporting for Java, 118
exporting in Jini 2.0, 119
exporting services, 23
Extensible Remote Invocation. See Jeri (Jini
Extensible Remote Invocation)
■F
factories
current set, 375
FileClassifier example, 380–382
implementation, 190
interfaces from, 374
landlord lease, 77, 79
marshalling, 375
failure modes of methods, 91
failure, transaction, 357
federations, 2
fiddler service, 421–422
file classifer, 222–230
file classifier server, 312–318
file editors example, 53–55
file source servers, 457–461
FileClassifier example
back-end service, 133
class definition, loading, 114
client, 132
client implementation, 112–114
code, 89, 93
factory, 380–382
interface, 93, 132, 379
location of class file, 114
mixed RMI and non-RMI proxies, 131,
151–159
non-RMI proxy, 142–151
non-RMI proxy classes, 147
non-RMI proxy, running, 148
overall implementation, 105
RemoteFileClassifier interface, 132, 134
RMI proxy, 132–142
running, 114–115
server implementation, 106–112, 124,
154–156
service specification, 90
FileClassifierImpl class, 128, 133, 153
FileClassifierLandlord class, 208–211
FileClassifierLeasedResource class, 206–207
files
classifying, 87
signing, 181
flags for debugging, 25
flashing clocks example
ClockDevice package, 261–264
ClockFrame service, 252–259
ComputerTimer driver, 260
ComputerTimer service, 251
description, 7–9, 249
downloading compiled classes, 7
multiple clocks, 260, 264
runtime behavior, 264
TickerTimer driver, 259
TickerTimer service, 250
Timer service, 249
UPnP solution, 249
FooLandlord example, 83–86
formats, A/V, 438
FrameFactory, 375
fully qualified path name, 21
■G
Gamma, Eric, 215
garbage collection, Jeri, 124–125
garbage collection-related errors, 24
getGroups() method, 51
getHost() method, 39
getLocator() method, 51
getPort() method, 39
getRegistrar() method, 39–41
getServiceID() method, 51
globally unique identifier (GUID), 60
Gosling, James, 3
groups of services, 43
GUID (globally unique identifier), 60
■H
handback data, 217
home audio system example. See audio sys-
tem example
hostile lookup services, 171, 172–173,
178–181
HTTP server errors, 23
httpd.classes directory, 27
HTTPMD (HTTP + Message Digest) protocol,
322–325
HttpmdUtil class, 323
7168IDX.fm Page 478 Friday, September 1, 2006 11:02 AM
479■I N D E X
Find it faster at
■I
icons, 387
identity management
authenticating servers, 338–343
clients requiring authentication,
343–344
clients, authentication of, 344–349
constraints, alternative, 344
description, 334
JAAS (Java Authentication and Authori-
zation Service), 335–336
keystores, 336–337
servers requiring authentication,
349–350
ignorance, client, 19
images, 387
implementation, 10
inexact service matching, 193–195
inheritance in project files, 30
installation process, 6
integrity of transport
client, 318
description, 303, 318
invocation constraints, 304
SSL or TLS server, 320–322
TCP server, 319
interfaces
as entry points, 373
configuration, 265
DiscoveryGroupManagement, 162
DiscoveryLocatorManagement, 162
DiscoveryManagement, 162
factory objects, 374
FileClassifier, 93
LeasedResource, 81–82
LeaseRenewalService, 412–419
LookupDiscoveryService, 419–430
MutableFileClassifier, 222, 401
NameEntry, 187–189, 191, 193
Ogg Vorbis, 445
ProxyAccessor, 223
ProxyPreparer, 307–312
remote, 121
RemoteEventListener, 218–221
RemoteFileClassifier, 132, 134
ServiceDescriptor, 285–287
ServiceDiscoveryManager, 237
ServiceItemFilter, 238, 241–242
source and sink, 439–441
introspection library, 434
InvalidLookupLocator example, 36–39
invocation constraints, 303
■J
JAAS (Java Authentication and Authorization
Service), 335–336
.jar files, 23
Java Media Framework (JMF), 377
Java Remote Method Protocol (JRMP), 117,
137, 140–141
Java security model, 181
Java virtual machine (JVM), 31, 60
java.lang.Object method, 50
Java-related errors, 21
JComponentFactory, 375
jdb debugger, 25
JDialogFactory, 375
JDK 1.2 security model, 171
Jeri (Jini Extensible Remote Invocation)
classes, 136–140
configuration, 122–124
exporter class, 119
garbage collection, 124–125
Java Remote Method Protocol (JRMP),
117, 137, 140–141
proxy accessor, 125
remote interfaces, 121
RMI, 117–119
standard exporter, 120
JFrameFactory, 375, 376
Jini
meaning, 2
success stories, 3
uses, 2
Jini 2.0
configuration mechanism, 122
ConfigUtils class, 274
constraints, 304
dynamic policy use, 350
explicit proxy, 134, 218, 231
explicit references, 124
exporting and unexporting, 119
HttpmdUtil class, 323
.jar packages repackaged, 23
Java security mechanism, 303
Jeri instead of RMI, 24
logging API, 25
logging package, 281
LookupDiscovery constructors, 44
main classes changed, 22
ProxyAccessor interface, 223
runtime configuration, 265
Jini 2.1 files for compilation, 38
Jini Extensible Remote Invocation. See Jeri
(Jini Extensible Remote Invocation)
7168IDX.fm Page 479 Friday, September 1, 2006 11:02 AM
480 ■I N D E X
jini.home parameter, 27
jini-core.jar file, 38
Jini-related errors, 22
JMF (Java Media Framework), 377
JoinManager class, 167–170
JRMP (Java Remote Method Protocol), 117,
137, 140–141
jsk-lib.jar, 38
jsk-platform.jar, 38
JTextArea, 60
JVM (Java virtual machine), 31, 60
JWindowFactory, 375
■K
keepalive means, 47
KeyEvent events, 215
keystores, 181, 336–337
keytool, 181
Konno, Satoshi, 252
■L
landlord interface, 82
landlord packages, 77–81
LandlordLease class, 79
LaunchAll program, 36
lazy services, 401
LeasedResource interface, 81
LeasePeriodPolicy interface, 82
LeaseRenewalService interface, 412–419
leases
abstract, 76
cancelling, 74
cookies, 77, 81
description, 73
event listeners, 230
expiring, 25, 74
granting and handling, 75
interfaces, 81–82
landlord class diagrams, 78, 79, 80
landlord packages, 77–81
policies, 82
requesting and receiving, 73
typical lease time, 73
See also renewing leases
levels, severity, 281
lib subdirectory, 23
licensing model, 1, 5
listeners
action listeners, 192
DiscoveryListener class, 44
MulticastRegister, 45
WindowListener, 191
See also events
listing services, 431–433
localhost parameter, 27, 274
localhost, error in use of, 23
Location class, 56
locators, lookup, 161–166, 175
logging, 305–306
logging API, 25
logging package
description, 281
LookupDiscovery class, 281–283
lookup locators, 161–166, 175
lookup service-related errors, 24
lookup services
broadcast discovery, 43–51
definition, 9
description, 35
discovery, 44
groups, 43
hostile, 171, 172–173, 178–181
locating, 35
multiple, 43
ServiceRegistrar class, 50–51
unicast discovery, 36–43
See also reggie lookup service; services,
registering
LookupCache, 243–248
LookupDiscovery class
description, 43
logging, 281–283
multicast search, 161
LookupDiscoveryManager class, 164–166
LookupDiscoveryService interface
fiddler service, 421–422
use of, 422–430
LookupLocator class
description, 36
getHost() and getPort() methods, 39
getRegistrar() method, 39–41
LookupLocatorDiscovery class, 163–164
7168IDX.fm Page 480 Friday, September 1, 2006 11:02 AM
481■I N D E X
Find it faster at
■M
Magneti Marelli Motorsport project, 4
mahalo transaction manager, 355
matching attributes, 55
matching example, 196–202
matching services, 70
methods, constraints on, 305
middleware, 2, 90, 117
MIME types, 87
MIMEType class, 91–93
monitoring cache, 246–248
MouseEvent events, 215, 216
MP3 format
encumbered, 438
interface for, 446
no player in JMF, 447
pulled, 439
MPEG format
movie player in JMF, 447
MPEG-7, 439, 456
multicast
clients, 99–104
description, 35
discovery, 43–51, 175
range, 49
MulticastRegister example, 45–49
multiple class files, 192
MutableFileClassifier interface, 222, 401
■N
Name class, 56
NameEntry interface, 187–189, 191, 193
names of projects, 31
Nedap N.V. project, 4
network configuration error, 23
network layer, dependence on, 23
“network plug and play” definition of Jini, 21
network plug and play, 1
networked environments, 1
networks, 9
nonactivatable server, 297–300
nonactivatable service, 286, 287–296
norm service, 411–412
■O
Ogg Vorbis
format, 438
interface, 445
open-source Apache license, 1, 5
Orange project, 5
Orbitz project, 5
■P
packages
Java-related errors, 21
Jini-related errors, 22
landlord, 77–81
PanelFactory, 375
parameters
Ant, 27
RMI, 179
set by preferences, 176
paranoia, 180
partitioning applications, 16–18
path name, fully qualified, 21
PayableFileClassifierImpl service, 358–363
permissions
AllPermission, 172, 173
granted to protection domains, 182
phoenix activation server, 390–391
pictures, 387
playlists, 461
“plug and play” definition of Jini, 21
plug and play, network, 1
points of failure, transaction, 357
policies for leases, 82
policy files
example, 176, 183
security, 171, 183
preferences, 176
preferred constraints, 304
preferred value error, 24
print statements for debugging, 25
printer, finding on network, 196
problem domain, 185–187
project files, 30–32
project names, 31
PropertyChange events, 215
protection domains, 180
protocols
choices, 122
end of, 18–19
HTTPMD (HTTP + Message Digest),
322–325
SSL (Secure Sockets Layer), 307, 320–322
TCP (Transmission Control Protocol),
306
7168IDX.fm Page 481 Friday, September 1, 2006 11:02 AM
482 ■I N D E X
proxies, service
choices, 127–131
description, 13–14, 104
explicit, 134, 218, 231
fat, 127
FileClassifier example, 132–159
mixed RMI and non-RMI, 131, 151–159
non-RMI, 129
ProxyPreparer interface, 307–312
RMI, 128
proxy objects
for lookup service, 50, 59
maintaining state information, 60
RMI, 60
proxy verification
clients, 326
errors, 328–330
HTTPMD, 322–325
SSL truster servers, 327–328
verifiers, 325
ProxyAccessor interface, 223
ProxyPreparer interface, 307–312
push/pull audio stream, 439
■R
random ports used by RMI, 178
range of broadcast, 49
Reaper (cleanup) class, 207–208
references
active, 25
strong and weak, 124
reggie lookup service
description, 35
HTTPMD, 325
location of objects, 180
RMI, 50
ServiceStarter class, 300
registrar, 6
registration of events, 217
registration. See services, registering
remote events, 216
remote interfaces, 121
remote method invocation. See RMI
remote procedure call (RPC) communica-
tions, 3, 105, 151
RemoteEventListener interface, 218–221
RemoteFileClassifier interface, 132, 134
renewing leases
LeaseRenewalManager class, 75
LeaseRenewalService class, 410
LeaseRenewalService interface, 412–419
norm service, 411–412
Representational State Transfer (REST) com-
munity, 457
resources directory, 27
restrictions on Entry class, 55
RMI (remote method invocation)
extending UnicastRemoteObject, 118
Jeri, 117–119
JRMP-style RMI, 137
parameters, 179
proxies, service, 128
random ports, 178
stubs-related errors, 24
thin proxy to fat service back-end, 105
traditional, 118
use of, 2
rmic compiler, 118, 119
rmid (replaced by phoenix), 390–391
RPC (remote procedure call) communica-
tions, 3, 105, 151
Rubean project, 4
runtime configuration, 265
■S
Secure Socket layer (SSL). See SSL
security
access limitations, 175
client requirements, 177–178
combinations, 332–334
djinns, 171
exceptions, 174
file classifier server, 312–318
invocation constraints, 303
JDK 1.2 model, 171
logging, 305–306
methods, constraints on, 305
paranoia, 180
permissions, 172, 173, 182
policy files, 171, 176, 183
policy for Web Service-Jini bridge, 472
protection domains, 180
ProxyPreparer interface, 307–312
service security requirements, 175–176
See also identity management
7168IDX.fm Page 482 Friday, September 1, 2006 11:02 AM
483■I N D E X
Find it faster at
SecurityManager, 171
semantic events, 215
sequence diagrams, UML, 39, 40, 45
server side-specific action listener, 192
server, unicast, 61–64
servers
Apache Axis, 468
authenticating, 338–343
file classifier, 312–318
file source servers, 457–461
generic, 274–279
nonactivatable, 297–300
proxy verification, 327–328
requiring authentication, 349–350
service providers, 104
sink servers, 453–456
source servers, 456–457
structure, 15–16
trusted, 327–328
service changes, leasing
client, 211–213
description, 202
FileClassifierLandlord class, 208–211
FileClassifierLeasedResource class,
206–207
leased FileClassifier class, 202–205
Reaper (cleanup) class, 207–208
server, 205–206
service ID, 65, 67, 268–271
service matching, inexact, 193–195
service proxies. See proxies, service
ServiceDiscoveryManager class
cache, monitoring, 246–248
filtering services, 241–242
interface, 237
LookupCache, 243–248
services, cache of, 242–245
services, finding immediately, 238–241
ServiceInfo class, 56
ServiceItem class, 60
ServiceItemFilter interface, 238, 241–242
ServiceMatches class, 69
ServiceRegistrar class
description, 50–51, 59, 179
finding services, 67–69
ServiceRegistration class, 60, 64
ServiceRegistration method, 50
services
changes, monitoring, 230–235
ClockFrame, 252–259
ComputerTimer, 251
defining common knowledge, 87
definition, 9
description pseudocode, 287
distance service, 196
exporting, 23
fiddler, 421–422
groups of, 43
lister program, 431–433
nonactivatable, 286, 287–296
PayableFileClassifierImpl, 358–363
signing, 182
support services, 18
supported, 1
TickerTimer, 250
Timer, 249
transactions example, 363–366
unknown, 433
uploading completely, 105–115
See also service changes, leasing; servic-
es, finding; services, registering
services, cache of, 242–245
services, finding
description, 67
immediately, 238–241
matching, 70
multiple matches, 69
ServiceRegistrar class, 67–69
specifying, 90
services, registering
description, 10–11, 59
generating ServiceEvent type events, 231
join manager, 167–170
register(), 60
ServiceItem class, 60
ServiceRegistrar class, 50–51, 59, 179
ServiceRegistration class, 60, 64
ServiceStarter class
description, 285
nonactivatable server, 297–300
nonactivatable service, 286, 287–296
reggie lookup service, 300
ServiceDescriptor interface, 285–287
ServiceTemplate class
description, 70
specifying sought service, 67
ServiceType class, 56, 57
severity levels, 281
signatures, creating, 181
signed trust certificates, 178
signing services, 182
signing standard files, 181
7168IDX.fm Page 483 Friday, September 1, 2006 11:02 AM
484 ■I N D E X
Simple Object Access Protocol (SOAP) invo-
cation protocol, 465, 466
sinks
content sinks, 447–450
HTTP sinks, 446
implementing, 450–453
servers, 453–456
sink interfaces, 439–441
sleep() method, 47
SOAP (Simple Object Access Protocol) invo-
cation protocol, 465, 466
Sommers, Frank, 4, 125
source files, 27, 30
sources of code, 180
specification, 10
specifying services, 90
src directory, 27, 30
src.files variable, 30
SSL (Secure Sockets Layer)
configuration, 307
integrity checking, 320–322
server confidentiality, 331–332
trusted servers, 327–328
standard files, signing, 181
Starter Kit installation process, 6
state information, maintaining, 60, 401–407
Status class, 56
staying alive, 47
strong and weak references, 124
stubs-related errors, 24
subtractive permissions, 174
success stories, 3
support services, 18
supported services, 1
Swing
JTextArea, 60
staying alive, 47
■T
targets, Ant, 28
taxi-driver, Jini, 217
TCP (Transmission Control Protocol), 306
The Jini Specifications, Second Edition book,
91
threads, daemon and user, 47
TickerTimer driver, 259
TickerTimer service, 250
time to live (TTL), 43, 50
Timer service, 249
TLS (Transport Layer Security), 320–322
toaster example, 68–69, 70
transactions
mahalo transaction manager, 355
manager, 354
overview, 353
participants, 355
two-phase commit protocol, 353
See also transactions example
transactions example
AccountsImpl service, 363–366
client, 366–371
description, 355–358
PayableFileClassifierImpl service,
358–363
transition match events, 231
Transmission Control Protocol (TCP), 306
transport layer as A/V parameter, 438
Transport Layer Security (TLS), 320–322
transport protocol choices, 122
trust certificates, signed, 178
trusted servers, 327–328
TTL (time to live), 43, 50
two-phase commit protocol, 353
■U
UDD, 466
UDP (User Datagram Protocol), 43
UIDescriptor class
attributes, 378
description, 376
role, 377
toolkit, 377
UML sequence diagrams, 39, 40, 45
unencumbered formats, 438
unexporting, 119
unicast
clients, 94–99
description, 35
discovery, 36–43, 175
server example, 61–64
UnicastRegister example, 39–43
UnicastRemoteObject class, 83
UnicastRemoteObject, extending, 118
universally unique identifier (UUID), 70, 77
unknown classes, 435
unknown services, 433
unlazy services, 401
uploading complete services, 105–115
UPnP solution to flashing clocks, 249
User Datagram Protocol (UDP), 43
user threads, 47
UUID (universally unique identifier), 70, 77
7168IDX.fm Page 484 Friday, September 1, 2006 11:02 AM
485■I N D E X
Find it faster at
■V
value error, 24
variables. See environment variables
Venners, Bill, 181
verifiers, 325
versions of Jini and Java, 22
versions of Jini. See Jini 2.0 and Jini 2.1
■W
Waldo, Jim, 91
WAV format
interface for, 446
uncompressed, 438
weak and strong references, 124
Web Services
integrating with Jini, 465–467
simple, 467–469
XML data types, 90
Web sites
author’s, 249
banking system, 4
failure modes of methods, 91
JAAS (Java Authentication and Authori-
zation Service), 335–336
Java security model, 181
Jeri, 125
Jini, 5
Magneti Marelli Motorsport project, 4
Nedap N.V. project, 5
Orange project, 5
Orbitz project, 5
success stories, 3
wildcarding, 55
WindowFactory, 375
WindowListener, 191
■Z
zero administration, 21
zero configuration, 23
7168IDX.fm Page 485 Friday, September 1, 2006 11:02 AM
Các file đính kèm theo tài liệu này:
- Foundations of Jini 2 Programming.pdf