<!--
Copyright 2004 The Apache Software Foundation
Licensed  under the  Apache License,  Version 2.0  (the "License");
you may not use  this file  except in  compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed  under the  License is distributed on an "AS IS" BASIS,
WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
implied.

See the License for the specific language governing permissions and
limitations under the License.
-->
<HTML>
<HEAD><TITLE>Apache Pluto</TITLE></HEAD>
<BODY>
<P>The root package of the Pluto Portlet Container.</P>

<P>Portals embedding Pluto must implement the 
   {@link org.apache.pluto.services.PortletContainerServices}
   interfac and then retrieve an instance of the container from
   the {@link org.apache.pluto.PortletContainerFactory}.</P>
<H3>Initialization of the container</H3>   
<P>
<xmp>
PortletContainerServices services = // your implementation!
PortletContainer container =
   PortletContainerFactory.createContainer("MyContainer", services);

ServletContext context = // the servlet context within which the portal is executing
container.init(servletContext);
</xmp>
</P>

<H3>Processing of Requests</H3>   
<P>
<xmp>
if(isActionRequest) {
    container.doAction(request, response);
}
else if(isRenderRequest) {
    container.doRender(request, response);
}
</xmp>
</P>

<H3>Shutting Down the Container</H3>
<P>
<xmp>
container.destroy();
</xmp>
</P>

</BODY>
</HTML>