corba/src/share/classes/org/omg/PortableServer/package.html
author ohair
Tue, 25 May 2010 15:52:11 -0700
changeset 5555 b2b5ed3f0d0d
parent 4 02bb8761fcce
permissions -rw-r--r--
6943119: Rebrand source copyright notices Reviewed-by: darcy
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
02bb8761fcce Initial load
duke
parents:
diff changeset
     1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
02bb8761fcce Initial load
duke
parents:
diff changeset
     2
<html>
02bb8761fcce Initial load
duke
parents:
diff changeset
     3
<head>
02bb8761fcce Initial load
duke
parents:
diff changeset
     4
<!--
02bb8761fcce Initial load
duke
parents:
diff changeset
     5
 
5555
b2b5ed3f0d0d 6943119: Rebrand source copyright notices
ohair
parents: 4
diff changeset
     6
 Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved.
4
02bb8761fcce Initial load
duke
parents:
diff changeset
     7
 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
02bb8761fcce Initial load
duke
parents:
diff changeset
     8
02bb8761fcce Initial load
duke
parents:
diff changeset
     9
 This code is free software; you can redistribute it and/or modify it
02bb8761fcce Initial load
duke
parents:
diff changeset
    10
 under the terms of the GNU General Public License version 2 only, as
5555
b2b5ed3f0d0d 6943119: Rebrand source copyright notices
ohair
parents: 4
diff changeset
    11
 published by the Free Software Foundation.  Oracle designates this
4
02bb8761fcce Initial load
duke
parents:
diff changeset
    12
 particular file as subject to the "Classpath" exception as provided
5555
b2b5ed3f0d0d 6943119: Rebrand source copyright notices
ohair
parents: 4
diff changeset
    13
 by Oracle in the LICENSE file that accompanied this code.
4
02bb8761fcce Initial load
duke
parents:
diff changeset
    14
02bb8761fcce Initial load
duke
parents:
diff changeset
    15
 This code is distributed in the hope that it will be useful, but WITHOUT
02bb8761fcce Initial load
duke
parents:
diff changeset
    16
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
02bb8761fcce Initial load
duke
parents:
diff changeset
    17
 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
02bb8761fcce Initial load
duke
parents:
diff changeset
    18
 version 2 for more details (a copy is included in the LICENSE file that
02bb8761fcce Initial load
duke
parents:
diff changeset
    19
 accompanied this code).
02bb8761fcce Initial load
duke
parents:
diff changeset
    20
02bb8761fcce Initial load
duke
parents:
diff changeset
    21
 You should have received a copy of the GNU General Public License version
02bb8761fcce Initial load
duke
parents:
diff changeset
    22
 2 along with this work; if not, write to the Free Software Foundation,
02bb8761fcce Initial load
duke
parents:
diff changeset
    23
 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
02bb8761fcce Initial load
duke
parents:
diff changeset
    24
5555
b2b5ed3f0d0d 6943119: Rebrand source copyright notices
ohair
parents: 4
diff changeset
    25
 Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b2b5ed3f0d0d 6943119: Rebrand source copyright notices
ohair
parents: 4
diff changeset
    26
 or visit www.oracle.com if you need additional information or have any
b2b5ed3f0d0d 6943119: Rebrand source copyright notices
ohair
parents: 4
diff changeset
    27
 questions.
4
02bb8761fcce Initial load
duke
parents:
diff changeset
    28
02bb8761fcce Initial load
duke
parents:
diff changeset
    29
02bb8761fcce Initial load
duke
parents:
diff changeset
    30
-->
02bb8761fcce Initial load
duke
parents:
diff changeset
    31
02bb8761fcce Initial load
duke
parents:
diff changeset
    32
</head>
02bb8761fcce Initial load
duke
parents:
diff changeset
    33
<body bgcolor="white">
02bb8761fcce Initial load
duke
parents:
diff changeset
    34
Provides classes and interfaces for making the server side of your applications 
02bb8761fcce Initial load
duke
parents:
diff changeset
    35
portable across multivendor ORBs.
02bb8761fcce Initial load
duke
parents:
diff changeset
    36
02bb8761fcce Initial load
duke
parents:
diff changeset
    37
<P>In Java, Portable Object Adaptor (POA)-based Dynamic Skeleton Interface (DSI) 
02bb8761fcce Initial load
duke
parents:
diff changeset
    38
servants inherit from the  standard <TT>DynamicImplementation</TT> class, which 
02bb8761fcce Initial load
duke
parents:
diff changeset
    39
inherits from the <TT>Servant</TT> class. The native <TT>Servant</TT> type is 
02bb8761fcce Initial load
duke
parents:
diff changeset
    40
defined by the <TT>PortableServer</TT> module for the POA. In Java, the 
02bb8761fcce Initial load
duke
parents:
diff changeset
    41
  <TT>Servant</TT> type is mapped to the Java 
02bb8761fcce Initial load
duke
parents:
diff changeset
    42
  <TT>org.omg.PortableServer.Servant</TT> class.
02bb8761fcce Initial load
duke
parents:
diff changeset
    43
  It serves as the base class for all POA servant 
02bb8761fcce Initial load
duke
parents:
diff changeset
    44
  implementations and provides a number of methods that may 
02bb8761fcce Initial load
duke
parents:
diff changeset
    45
  be invoked by the application programmer, as well as methods 
02bb8761fcce Initial load
duke
parents:
diff changeset
    46
  which are invoked by the POA itself and may be overridden by 
02bb8761fcce Initial load
duke
parents:
diff changeset
    47
  the user to control aspects of servant behavior. 
02bb8761fcce Initial load
duke
parents:
diff changeset
    48
  
02bb8761fcce Initial load
duke
parents:
diff changeset
    49
<H2>Package Specification</H2>
02bb8761fcce Initial load
duke
parents:
diff changeset
    50
 
02bb8761fcce Initial load
duke
parents:
diff changeset
    51
<P>For a precise list of supported sections of official OMG specifications with which 
02bb8761fcce Initial load
duke
parents:
diff changeset
    52
the Java[tm] Platform, Standard Edition 6 complies, see <A 
02bb8761fcce Initial load
duke
parents:
diff changeset
    53
HREF="../CORBA/doc-files/compliance.html">Official Specifications for CORBA 
02bb8761fcce Initial load
duke
parents:
diff changeset
    54
support in Java[tm] SE 6</A>.
02bb8761fcce Initial load
duke
parents:
diff changeset
    55
<p>
02bb8761fcce Initial load
duke
parents:
diff changeset
    56
02bb8761fcce Initial load
duke
parents:
diff changeset
    57
<H2>POA-related Interfaces</H2>
02bb8761fcce Initial load
duke
parents:
diff changeset
    58
02bb8761fcce Initial load
duke
parents:
diff changeset
    59
<P>The <TT>PortableServer</TT> module defines the following POA-related interfaces:
02bb8761fcce Initial load
duke
parents:
diff changeset
    60
<P>
02bb8761fcce Initial load
duke
parents:
diff changeset
    61
<UL>
02bb8761fcce Initial load
duke
parents:
diff changeset
    62
	<LI><TT>POA</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    63
	<LI><TT>POAManager</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    64
	<LI><TT>ServantManager</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    65
	<LI><TT>ServantActivator</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    66
	<LI><TT>ServantLocator</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    67
	<LI><TT>AdapterActivator</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    68
	<LI><TT>ThreadPolicy</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    69
	<LI><TT>LifespanPolicy</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    70
	<LI><TT>IdUniquenessPolicy</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    71
	<LI><TT>IdAssignmentPolicy</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    72
	<LI><TT>ImplicitActivationPolicy</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    73
	<LI><TT>ServantRetentionPolicy</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    74
	<LI><TT>RequestProcessingPolicy</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    75
	<LI><TT>Current</TT>
02bb8761fcce Initial load
duke
parents:
diff changeset
    76
</UL>
02bb8761fcce Initial load
duke
parents:
diff changeset
    77
02bb8761fcce Initial load
duke
parents:
diff changeset
    78
<P>In addition, the POA defines the <TT>Servant</TT> native type.
02bb8761fcce Initial load
duke
parents:
diff changeset
    79
02bb8761fcce Initial load
duke
parents:
diff changeset
    80
<H3>Operations classes</H3>
02bb8761fcce Initial load
duke
parents:
diff changeset
    81
02bb8761fcce Initial load
duke
parents:
diff changeset
    82
<P>Each of the interfaces listed above has an associated <code>Operations</code> interface.  The <code>Operations</code> interface is generated by the <code>idlj</code> compiler and contains the method signatures for methods defined in its associated interface.  The <code>Operations</code> interface can be accessed by both the client and the server, while its associated interface can only be called by the client.
02bb8761fcce Initial load
duke
parents:
diff changeset
    83
02bb8761fcce Initial load
duke
parents:
diff changeset
    84
<H3>Value Classes</H3>
02bb8761fcce Initial load
duke
parents:
diff changeset
    85
02bb8761fcce Initial load
duke
parents:
diff changeset
    86
Classes ending in the suffix <code>PolicyValue</code> provide the values used for the <code>create_POA</code> call, which sets the policy for the POA.   See the <a href="#sampleserver">sample code</a> below for a demonstration.  <code>PolicyValue</code> files include the following:
02bb8761fcce Initial load
duke
parents:
diff changeset
    87
<P>
02bb8761fcce Initial load
duke
parents:
diff changeset
    88
<UL>
02bb8761fcce Initial load
duke
parents:
diff changeset
    89
<LI><code>IdAssignmentPolicyValue</code> 
02bb8761fcce Initial load
duke
parents:
diff changeset
    90
<LI><code>IdUniquenessPolicyValue</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
    91
<LI><code>ImplicitActivationPolicyValue</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
    92
<LI><code>LifespanPolicyValue</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
    93
<LI><code>RequestProcessingPolicyValue</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
    94
<LI><code>ServantRetentionPolicyValue</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
    95
<LI><code>ThreadPolicyValue</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
    96
</UL>
02bb8761fcce Initial load
duke
parents:
diff changeset
    97
02bb8761fcce Initial load
duke
parents:
diff changeset
    98
<H3>Helper Classes</H3>
02bb8761fcce Initial load
duke
parents:
diff changeset
    99
02bb8761fcce Initial load
duke
parents:
diff changeset
   100
<P>Helper classes, which are generated for all user-defined types in an OMG IDL 
02bb8761fcce Initial load
duke
parents:
diff changeset
   101
interface, supply static methods needed to manipulate those types.  There is only one method in a helper class that an application programmer uses: the  <code>narrow</code> method.  Only Java interfaces mapped from IDL interfaces will have a helper class that includes a <code>narrow</code> method, so in the <code>PortableServer</code> package, only the following classes have a <code>narrow</code> method:
02bb8761fcce Initial load
duke
parents:
diff changeset
   102
<P>
02bb8761fcce Initial load
duke
parents:
diff changeset
   103
<UL>
02bb8761fcce Initial load
duke
parents:
diff changeset
   104
<LI><code>ForwardRequestHelper</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
   105
<LI><code>ServantActivatorHelper</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
   106
<LI><code>ServantLocatorHelper</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
   107
</UL>
02bb8761fcce Initial load
duke
parents:
diff changeset
   108
02bb8761fcce Initial load
duke
parents:
diff changeset
   109
<H3>POA Classes</H3>
02bb8761fcce Initial load
duke
parents:
diff changeset
   110
02bb8761fcce Initial load
duke
parents:
diff changeset
   111
<P>POA classes are used to implement the <code>ServantActivator</code> or <code>ServantLocator</code>.
02bb8761fcce Initial load
duke
parents:
diff changeset
   112
02bb8761fcce Initial load
duke
parents:
diff changeset
   113
<H3>Exceptions</H3>
02bb8761fcce Initial load
duke
parents:
diff changeset
   114
02bb8761fcce Initial load
duke
parents:
diff changeset
   115
<P>The <code>ForwardRequest</code> exception indicates to the ORB 
02bb8761fcce Initial load
duke
parents:
diff changeset
   116
that it is responsible for delivering the current request and subsequent <code>ForwardRequest</code> requests to the object denoted in the 
02bb8761fcce Initial load
duke
parents:
diff changeset
   117
 <code>forward_reference</code> member of the exception.
02bb8761fcce Initial load
duke
parents:
diff changeset
   118
02bb8761fcce Initial load
duke
parents:
diff changeset
   119
<H3>Interfaces Implemented by the Application Programmer</H3>
02bb8761fcce Initial load
duke
parents:
diff changeset
   120
02bb8761fcce Initial load
duke
parents:
diff changeset
   121
<P>Most of what <code>PortableServer</code> does is transparent to the user.  The result is that programmers will use only a few of the interfaces mentioned above.  The remaining interfaces will be provided by the ORB implementation.  The interfaces of interest to application programmers are the following:
02bb8761fcce Initial load
duke
parents:
diff changeset
   122
<P>
02bb8761fcce Initial load
duke
parents:
diff changeset
   123
<ul>
02bb8761fcce Initial load
duke
parents:
diff changeset
   124
	<LI><code>AdapterActivator</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
   125
	<P>Adapter activators are associated with POAs.  An adapter activator supplies a POA with the ability to create child POAs on demand, as a side-effect of receiving a request that names the child POA (or one of its children), or when <code>find_POA</code> is called with an activate parameter value of <code>TRUE</code>.  An application server that creates all its needed POAs at the beginning of execution does not need to use or provide an adapter activator; it is necessary only for the case in which POAs need to be created during request processing.
02bb8761fcce Initial load
duke
parents:
diff changeset
   126
	<P>
02bb8761fcce Initial load
duke
parents:
diff changeset
   127
	<LI><code>ServantLocator</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
   128
	<P>When the POA has the <code>NON_RETAIN</code> policy, it uses servant managers that are <code>ServantLocator</code>s.
02bb8761fcce Initial load
duke
parents:
diff changeset
   129
	<P>
02bb8761fcce Initial load
duke
parents:
diff changeset
   130
	<LI><code>ServantActivator</code>
02bb8761fcce Initial load
duke
parents:
diff changeset
   131
	<P>When the POA has the <code>RETAIN</code> policy, it uses servant managers that are <code>ServantActivator</code>s.
02bb8761fcce Initial load
duke
parents:
diff changeset
   132
</ul>
02bb8761fcce Initial load
duke
parents:
diff changeset
   133
02bb8761fcce Initial load
duke
parents:
diff changeset
   134
02bb8761fcce Initial load
duke
parents:
diff changeset
   135
<H2>Package <TT>org.omg.PortableServer.ServantLocatorPackage</TT></H2>
02bb8761fcce Initial load
duke
parents:
diff changeset
   136
02bb8761fcce Initial load
duke
parents:
diff changeset
   137
<P>This package supplies a <TT>CookieHolder</TT> class for passing 
02bb8761fcce Initial load
duke
parents:
diff changeset
   138
the <TT>Cookie</TT> type as an <code>out</code> parameter. The <code>CookieHolder</code> class 
02bb8761fcce Initial load
duke
parents:
diff changeset
   139
follows exactly the same pattern as the other holder classes for basic types.
02bb8761fcce Initial load
duke
parents:
diff changeset
   140
02bb8761fcce Initial load
duke
parents:
diff changeset
   141
<H2>Related Documentation</H2>
02bb8761fcce Initial load
duke
parents:
diff changeset
   142
02bb8761fcce Initial load
duke
parents:
diff changeset
   143
<P>For an overview of Java IDL, please see:
02bb8761fcce Initial load
duke
parents:
diff changeset
   144
<P>
02bb8761fcce Initial load
duke
parents:
diff changeset
   145
<LI><A HREF="../../../../technotes/guides/idl/index.html">Java IDL home page</A>.
02bb8761fcce Initial load
duke
parents:
diff changeset
   146
02bb8761fcce Initial load
duke
parents:
diff changeset
   147
<H2>Example Code</H2>
02bb8761fcce Initial load
duke
parents:
diff changeset
   148
<a name="sampleserver"></a>
02bb8761fcce Initial load
duke
parents:
diff changeset
   149
<H3>Example Server Code</H3>
02bb8761fcce Initial load
duke
parents:
diff changeset
   150
<P>
02bb8761fcce Initial load
duke
parents:
diff changeset
   151
<PRE>
02bb8761fcce Initial load
duke
parents:
diff changeset
   152
import javax.naming.InitialContext;
02bb8761fcce Initial load
duke
parents:
diff changeset
   153
import javax.naming.Context;
02bb8761fcce Initial load
duke
parents:
diff changeset
   154
import javax.rmi.PortableRemoteObject ;
02bb8761fcce Initial load
duke
parents:
diff changeset
   155
import com.sun.corba.se.impl.poa.POAORB;
02bb8761fcce Initial load
duke
parents:
diff changeset
   156
import org.omg.PortableServer.*;
02bb8761fcce Initial load
duke
parents:
diff changeset
   157
import java.util.*;
02bb8761fcce Initial load
duke
parents:
diff changeset
   158
import org.omg.CORBA.*;
02bb8761fcce Initial load
duke
parents:
diff changeset
   159
import javax.rmi.CORBA.Stub;
02bb8761fcce Initial load
duke
parents:
diff changeset
   160
import javax.rmi.CORBA.Util;
02bb8761fcce Initial load
duke
parents:
diff changeset
   161
02bb8761fcce Initial load
duke
parents:
diff changeset
   162
02bb8761fcce Initial load
duke
parents:
diff changeset
   163
02bb8761fcce Initial load
duke
parents:
diff changeset
   164
public class HelloServer {
02bb8761fcce Initial load
duke
parents:
diff changeset
   165
    public HelloServer(String[] args) {
02bb8761fcce Initial load
duke
parents:
diff changeset
   166
        try {
02bb8761fcce Initial load
duke
parents:
diff changeset
   167
            Properties p = System.getProperties();
02bb8761fcce Initial load
duke
parents:
diff changeset
   168
         //   p.put("org.omg.CORBA.ORBClass", "com.sun.corba.ee.internal.POA.POAORB");
02bb8761fcce Initial load
duke
parents:
diff changeset
   169
            ORB orb = ORB.init( args, p );
02bb8761fcce Initial load
duke
parents:
diff changeset
   170
02bb8761fcce Initial load
duke
parents:
diff changeset
   171
            POA rootPOA = (POA)orb.resolve_initial_references("RootPOA");
02bb8761fcce Initial load
duke
parents:
diff changeset
   172
<strong>
02bb8761fcce Initial load
duke
parents:
diff changeset
   173
            Policy[] tpolicy = new Policy[3];
02bb8761fcce Initial load
duke
parents:
diff changeset
   174
            tpolicy[0] = rootPOA.create_lifespan_policy(
02bb8761fcce Initial load
duke
parents:
diff changeset
   175
                LifespanPolicyValue.TRANSIENT );
02bb8761fcce Initial load
duke
parents:
diff changeset
   176
            tpolicy[1] = rootPOA.create_request_processing_policy(
02bb8761fcce Initial load
duke
parents:
diff changeset
   177
                RequestProcessingPolicyValue.USE_ACTIVE_OBJECT_MAP_ONLY );
02bb8761fcce Initial load
duke
parents:
diff changeset
   178
            tpolicy[2] = rootPOA.create_servant_retention_policy(
02bb8761fcce Initial load
duke
parents:
diff changeset
   179
                ServantRetentionPolicyValue.RETAIN);
02bb8761fcce Initial load
duke
parents:
diff changeset
   180
            POA tpoa = rootPOA.create_POA("MyTransientPOA", null, tpolicy);
02bb8761fcce Initial load
duke
parents:
diff changeset
   181
</strong>
02bb8761fcce Initial load
duke
parents:
diff changeset
   182
02bb8761fcce Initial load
duke
parents:
diff changeset
   183
            String  ObjectId = "MyObjectId";
02bb8761fcce Initial load
duke
parents:
diff changeset
   184
            byte[] oid = ObjectId.getBytes();
02bb8761fcce Initial load
duke
parents:
diff changeset
   185
02bb8761fcce Initial load
duke
parents:
diff changeset
   186
            org.omg.CORBA.Object obj = tpoa.create_reference_with_id(oid,
02bb8761fcce Initial load
duke
parents:
diff changeset
   187
                new _HelloImpl_Tie()._all_interfaces(tpoa, oid)[0]);
02bb8761fcce Initial load
duke
parents:
diff changeset
   188
            HelloInterface helloRef = (HelloInterface)PortableRemoteObject.narrow(
02bb8761fcce Initial load
duke
parents:
diff changeset
   189
                obj, HelloInterface.class );
02bb8761fcce Initial load
duke
parents:
diff changeset
   190
02bb8761fcce Initial load
duke
parents:
diff changeset
   191
            Context initialNamingContext = new InitialContext();
02bb8761fcce Initial load
duke
parents:
diff changeset
   192
            initialNamingContext.rebind("HelloService", helloRef);
02bb8761fcce Initial load
duke
parents:
diff changeset
   193
            System.out.println("Hello Server: Ready...");
02bb8761fcce Initial load
duke
parents:
diff changeset
   194
            orb.run();
02bb8761fcce Initial load
duke
parents:
diff changeset
   195
         } catch (Exception e) {
02bb8761fcce Initial load
duke
parents:
diff changeset
   196
            System.out.println("Trouble: " + e);
02bb8761fcce Initial load
duke
parents:
diff changeset
   197
            e.printStackTrace();
02bb8761fcce Initial load
duke
parents:
diff changeset
   198
         } 
02bb8761fcce Initial load
duke
parents:
diff changeset
   199
     }
02bb8761fcce Initial load
duke
parents:
diff changeset
   200
02bb8761fcce Initial load
duke
parents:
diff changeset
   201
02bb8761fcce Initial load
duke
parents:
diff changeset
   202
     public static void main(String args[]) {
02bb8761fcce Initial load
duke
parents:
diff changeset
   203
         new HelloServer( args );
02bb8761fcce Initial load
duke
parents:
diff changeset
   204
     }
02bb8761fcce Initial load
duke
parents:
diff changeset
   205
}
02bb8761fcce Initial load
duke
parents:
diff changeset
   206
02bb8761fcce Initial load
duke
parents:
diff changeset
   207
02bb8761fcce Initial load
duke
parents:
diff changeset
   208
</PRE>
02bb8761fcce Initial load
duke
parents:
diff changeset
   209
02bb8761fcce Initial load
duke
parents:
diff changeset
   210
02bb8761fcce Initial load
duke
parents:
diff changeset
   211
02bb8761fcce Initial load
duke
parents:
diff changeset
   212
<P>
02bb8761fcce Initial load
duke
parents:
diff changeset
   213
02bb8761fcce Initial load
duke
parents:
diff changeset
   214
02bb8761fcce Initial load
duke
parents:
diff changeset
   215
@since 1.4
02bb8761fcce Initial load
duke
parents:
diff changeset
   216
<br>
02bb8761fcce Initial load
duke
parents:
diff changeset
   217
@serial exclude
02bb8761fcce Initial load
duke
parents:
diff changeset
   218
</body>
02bb8761fcce Initial load
duke
parents:
diff changeset
   219
</html>