blob: 86e19d5797ea5b6c0059f74fe53a12c3f1fd6011 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
-->
<document>
<properties>
<author email="unknown">Jean-Baptiste Joret</author>
<author email="david.AT.daviddewolf.DOT.com">David H. DeWolf</author>
<title>Pluto Project</title>
</properties>
<body>
<section name="Architecture Overview">
<p>
Let's begin by examining Pluto's architecture and underlying concepts.
First, we briefly explain the portal that runs the RI, and see where
to find a portlet container inside a portal architecture. Next, we
investigate Pluto's architecture in detail. Last, we look at how it
solves one challenging item of the portlet container: portlet deployment.
</p>
<p><strong>The Portal</strong>
<blockquote>
Pluto normally serves to show how the Portlet API works and
offers developers a working example platform from which they can test
their portlets. However, it's cumbersome to execute and test the portlet
container without a driver, in this case, the portal. Pluto's simple
portal component is built only on the portlet container's and the JSR
168's requirements. (In contrast, the more sophisticated, open source
Apache Jetspeed project concentrates on the portal itself rather than
the portlet container, and considers requirements from other groups.)
</blockquote>
<blockquote>
Figure 1 depicts the portal's basic architecture. The portal Web
application processes the client request, retrieves the portlets on
the user's current page, and then calls the portlet container to
retrieve each portlet's content. The portal accesses the portlet
container with the Portlet Container Invoker API, representing the
portlet container's main interface supporting request-based methods
to call portlets from a portal's viewpoint. The container's user must
implement the portlet container's Container Provider SPI (Service
Provider Interface) callback interface to get portal-related
information. Finally, the portlet container calls all portlets
via the Portlet API.
</blockquote>
<blockquote>
<div align="center">
<p>
<a href="../../images/v101/jw-0801-portal_arch.jpg">
<img src="../../images/v101/jw-0801-portal_arch.jpg"
alt="Portal Architecture" width="500"/></a></p>
<p><b><i><font size="-1">Figure 1. The simple portal included with Pluto. Click on the picture to enlarge it</font></i></b></p>
</div>
</blockquote>
</p>
<p><strong>The Portlet Container</strong>
<blockquote>
The portlet container, the portlets' runtime environment and a core
component of each portal, requires knowledge about the portal itself
and must reuse common code from it. Consequently, the portlet
container remains completely separated from every other portal component.
That said, you can embed the standalone portlet container in any portal
by complying with the portlet container's requirements, such as
implementing all SPIs.
</blockquote>
<blockquote>
The Portlet Container Invoker API, also called an entrance point, acts
as the portlet container's main calling interface. The API combines a
portlet container's lifecycle (init, destroy) with request-based
calling methods (initPage(), performTitle(), portletService(), and so
on). Because the portlet container calls a portlet in the end, the
method signature resembles the Portlet API's main portlet interface,
except that a portlet identifier must be passed. With this additional
portlet identifier, the container can determine the portlet and call
it accordingly.
</blockquote>
<blockquote>
Besides using the APIs to access the portlet container, the portal
must implement SPIs defined for the portlet container. Therefore,
the RI introduces container services: pluggable components that can
be registered at the container to either extend or provide basic
functionality. The RI includes the following built-in container services
(the first four must be implemented to run the portlet container, while
the fifth is optional):
</blockquote>
<blockquote>
<ul>
<li> Information provider: Gives the portlet container information about
the portal and its framework. Only known information or information
that should be stored within the portal is present through this
interface. Such information includes URL generation with navigational
state, portlet context, portlet mode, and window-state handling</li>
<li> Factory manager: Defines how to get an implementation through a
factory. (A normal portal should already own such an implementation.)</li>
<li> Log service: Defines a logging facility. (A normal portal should
already own such an implementation.)</li>
<li> Config service: Defines how to get configuration values. (A normal portal
should already own such an implementation.)</li>
<li> Property manager (optional): A property manager interface implementation
lets a portal handle properties as defined in the JSR 168 specification.</li>
</ul>
</blockquote>
<blockquote>
Strictly speaking, the Portlet Object Model also acts as an SPI, but has an
exceptional position among the SPIs. Therefore, don't consider it part of the
container services as it deals with all portlet objects and comprises a collection
of interwoven interfaces.
</blockquote>
<blockquote>
<div align="center">
<p>
<a href="../../images/v101/jw-0801-pluto_arch.jpg">
<img src="../../images/v101/jw-0801-pluto_arch.jpg"
alt="Pluto Architecture" width="500"/></a></p>
<p><b><i><font size="-1">Figure 2. The portlet container's architecture. Click on the picture to enlarge it</font></i></b></p>
</div>
</blockquote>
</p>
<p><strong>Portlet Deployment</strong>
<blockquote>
The portlet container can leverage the servlet container's functionality, upon
which the portlet container is built. To accomplish that, the portlet container
must inject servlet artifacts into each portlet-application war file, as Figure
3 shows. The portlet component, Deployment, takes the original war file, then
injects a new or modified web.xml and a servlet to wrap each portlet and uses
it as a calling point. Then the portlet deployment passes the modified war
file to the application server deployment, which deploys it into the
application server's system. During the portlet's invocation, the portlet
container calls the injected servlet as an entrance point into the deployed
portlet war file.
</blockquote>
<blockquote>
<div align="center">
<p><a href="../../images/v101/jw-0801-RI_deploy.jpg">
<img src="../../images/v101/jw-0801-RI_deploy.jpg"
alt="Deployment" width="500"/></a></p>
<p><b><i><font size="-1">Figure 3. Portlet deployment in the RI. Click on thumbnail to view full-size image.</font></i></b></p>
</div>
</blockquote>
</p>
<p><strong>Pluto and the WSRP standard</strong>
<blockquote>
The JSR 168 aligns closely with the Web Services for Remote Portlets (WSRP) standard.
Both standards, which emerged at the same time, released open source implementations
capable of all necessary functions described in the respective specifications.
As a mutual goal, both standards strive to work well together. As a result,
the portlet container can run WSRP portlets as a consumer as well as a producer.
</blockquote>
<blockquote>
Pluto must be able to run multiple portlet containers in one portal. Consequently,
Pluto's portlet container can be instantiated multiple times and, more importantly,
it can be instrumented in different ways. Each portlet container, therefore, can
use different implementations for SPIs.
</blockquote>
</p>
</section>
</body>
</document>