portals-jetspeed-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dlest...@apache.org
Subject svn commit: r209328 [11/14] - in /portals/jetspeed-2/trunk/components/portal: src/ src/java/ src/java/org/ src/java/org/apache/ src/java/org/apache/jetspeed/ src/java/org/apache/jetspeed/aggregator/ src/java/org/apache/jetspeed/aggregator/impl/ src/jav...
Date Tue, 05 Jul 2005 21:55:50 GMT
Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/web-app_2_3.dtd
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/web-app_2_3.dtd?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/web-app_2_3.dtd (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/web-app_2_3.dtd Tue Jul  5 14:55:37 2005
@@ -0,0 +1,1063 @@
+<!--
+Copyright (c) 2000 Sun Microsystems, Inc.,
+901 San Antonio Road,
+Palo Alto, California 94303, U.S.A.
+All rights reserved.
+
+Sun Microsystems, Inc. has intellectual property rights relating to
+technology embodied in the product that is described in this document.
+In particular, and without limitation, these intellectual property
+rights may include one or more of the U.S. patents listed at
+http://www.sun.com/patents and one or more additional patents or
+pending patent applications in the U.S. and in other countries.
+
+This document and the product to which it pertains are distributed
+under licenses restricting their use, copying, distribution, and
+decompilation.  This document may be reproduced and distributed but may
+not be changed without prior written authorization of Sun and its
+licensors, if any.
+
+Third-party software, including font technology, is copyrighted and
+licensed from Sun suppliers.
+
+Sun,  Sun Microsystems,  the Sun logo,  Java,  JavaServer Pages,  Java
+Naming and Directory Interface,  JDBC,  JDK,  JavaMail and  and
+Enterprise JavaBeans are trademarks or registered trademarks of Sun
+Microsystems, Inc. in the U.S. and other countries.
+
+Federal Acquisitions: Commercial Software - Government Users Subject to
+Standard License Terms and Conditions.
+
+DOCUMENTATION IS PROVIDED "AS IS" AND ALL EXPRESS OR IMPLIED
+CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED
+WARRANTY OF MERCHANTABILITY, FITNESS FOR FOR A PARTICULAR PURPOSE OR
+NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH
+DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.
+
+
+_________________________________________________________________________
+
+Copyright (c) 2000 Sun Microsystems, Inc.,
+901 San Antonio Road,
+Palo Alto, California 94303, E'tats-Unis.
+Tous droits re'serve's.
+
+Sun Microsystems, Inc. a les droits de proprie'te' intellectuels
+relatants a` la technologie incorpore'e dans le produit qui est de'crit
+dans ce document. En particulier, et sans la limitation, ces droits de
+proprie'te' intellectuels peuvent inclure un ou plus des brevets
+ame'ricains e'nume're's a` http://www.sun.com/patents et un ou les
+brevets plus supple'mentaires ou les applications de brevet en attente
+dans les E'tats-Unis et dans les autres pays.
+
+Ce produit ou document est prote'ge' par un copyright et distribue'
+avec des licences qui en restreignent l'utilisation, la copie, la
+distribution, et la de'compilation.  Ce documention associe n peut
+e^tre reproduite et distribuer, par quelque moyen que ce soit, sans
+l'autorisation pre'alable et e'crite de Sun et de ses bailleurs de
+licence, le cas e'che'ant.
+
+Le logiciel de'tenu par des tiers, et qui comprend la technologie
+relative aux polices de caracte`res, est prote'ge' par un copyright et
+licencie' par des fournisseurs de Sun.
+
+Sun,  Sun Microsystems,  le logo Sun,  Java,  JavaServer Pages,  Java
+Naming and Directory Interface,  JDBC,  JDK,  JavaMail et  and
+Enterprise JavaBeans sont des marques de fabrique ou des marques
+de'pose'es de Sun Microsystems, Inc. aux E'tats-Unis et dans d'autres
+pays.
+
+LA DOCUMENTATION EST FOURNIE "EN L'E'TAT" ET TOUTES AUTRES CONDITIONS,
+DECLARATIONS ET GARANTIES EXPRESSES OU TACITES SONT FORMELLEMENT
+EXCLUES, DANS LA MESURE AUTORISEE PAR LA LOI APPLICABLE, Y COMPRIS
+NOTAMMENT TOUTE GARANTIE IMPLICITE RELATIVE A LA QUALITE MARCHANDE, A
+L'APTITUDE A UNE UTILISATION PARTICULIERE OU A L'ABSENCE DE
+CONTREFAC,ON.
+-->
+
+<!--
+This is the XML DTD for the Servlet 2.3 deployment descriptor.
+All Servlet 2.3 deployment descriptors must include a DOCTYPE
+of the following form:
+
+  <!DOCTYPE web-app PUBLIC
+"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+"http://java.sun.com/dtd/web-app_2_3.dtd">
+
+-->
+
+<!--
+The following conventions apply to all J2EE deployment descriptor
+elements unless indicated otherwise.
+
+- In elements that contain PCDATA, leading and trailing whitespace
+  in the data may be ignored.
+
+- In elements whose value is an "enumerated type", the value is
+  case sensitive.
+
+- In elements that specify a pathname to a file within the same
+  JAR file, relative filenames (i.e., those not starting with "/")
+  are considered relative to the root of the JAR file's namespace.
+  Absolute filenames (i.e., those starting with "/") also specify
+  names in the root of the JAR file's namespace.  In general, relative
+  names are preferred.  The exception is .war files where absolute
+  names are preferred for consistency with the servlet API.
+-->
+
+
+<!--
+The web-app element is the root of the deployment descriptor for
+a web application.
+-->
+<!ELEMENT web-app (icon?, display-name?, description?, distributable?,
+context-param*, filter*, filter-mapping*, listener*, servlet*,
+servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,
+error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,
+login-config?, security-role*, env-entry*, ejb-ref*,  ejb-local-ref*)>
+
+<!--
+The auth-constraint element indicates the user roles that should
+be permitted access to this resource collection. The role-name
+used here must either correspond to the role-name of one of the
+security-role elements defined for this web application, or be
+the specially reserved role-name "*" that is a compact syntax for
+indicating all roles in the web application. If both "*" and
+rolenames appear, the container interprets this as all roles.
+If no roles are defined, no user is allowed access to the portion of
+the web application described by the containing security-constraint.
+The container matches role names case sensitively when determining
+access.
+
+
+Used in: security-constraint
+-->
+<!ELEMENT auth-constraint (description?, role-name*)>
+
+<!--
+The auth-method element is used to configure the authentication
+mechanism for the web application. As a prerequisite to gaining access to any web resources which are protected by an authorization
+constraint, a user must have authenticated using the configured
+mechanism. Legal values for this element are "BASIC", "DIGEST",
+"FORM", or "CLIENT-CERT".
+
+Used in: login-config
+-->
+<!ELEMENT auth-method (#PCDATA)>
+
+<!--
+The context-param element contains the declaration of a web
+application's servlet context initialization parameters.
+
+Used in: web-app
+-->
+<!ELEMENT context-param (param-name, param-value, description?)>
+
+<!--
+The description element is used to provide text describing the parent
+element.  The description element should include any information that
+the web application war file producer wants to provide to the consumer of
+the web application war file (i.e., to the Deployer). Typically, the tools
+used by the web application war file consumer will display the description
+when processing the parent element that contains the description.
+
+Used in: auth-constraint, context-param, ejb-local-ref, ejb-ref,
+env-entry, filter, init-param, resource-env-ref, resource-ref, run-as,
+security-role, security-role-ref, servlet, user-data-constraint,
+web-app, web-resource-collection
+-->
+<!ELEMENT description (#PCDATA)>
+
+<!--
+The display-name element contains a short name that is intended to be
+displayed by tools.  The display name need not be unique.
+
+Used in: filter, security-constraint, servlet, web-app
+
+Example:
+
+<display-name>Employee Self Service</display-name>
+-->
+<!ELEMENT display-name (#PCDATA)>
+
+<!--
+The distributable element, by its presence in a web application
+deployment descriptor, indicates that this web application is
+programmed appropriately to be deployed into a distributed servlet
+container
+
+Used in: web-app
+-->
+<!ELEMENT distributable EMPTY>
+
+<!--
+The ejb-link element is used in the ejb-ref or ejb-local-ref
+elements to specify that an EJB reference is linked to an
+enterprise bean.
+
+The name in the ejb-link element is composed of a
+path name specifying the ejb-jar containing the referenced enterprise
+bean with the ejb-name of the target bean appended and separated from
+the path name by "#".  The path name is relative to the war file
+containing the web application that is referencing the enterprise bean.
+This allows multiple enterprise beans with the same ejb-name to be
+uniquely identified.
+
+Used in: ejb-local-ref, ejb-ref
+
+Examples:
+
+<ejb-link>EmployeeRecord</ejb-link>
+
+<ejb-link>../products/product.jar#ProductEJB</ejb-link>
+
+-->
+<!ELEMENT ejb-link (#PCDATA)>
+
+<!--
+The ejb-local-ref element is used for the declaration of a reference to
+an enterprise bean's local home. The declaration consists of:
+
+- an optional description
+- the EJB reference name used in the code of the web application
+  that's referencing the enterprise bean
+- the expected type of the referenced enterprise bean
+- the expected local home and local interfaces of the referenced
+  enterprise bean
+- optional ejb-link information, used to specify the referenced
+  enterprise bean
+
+Used in: web-app
+-->
+<!ELEMENT ejb-local-ref (description?, ejb-ref-name, ejb-ref-type,
+local-home, local, ejb-link?)>
+
+<!--
+The ejb-ref element is used for the declaration of a reference to
+an enterprise bean's home. The declaration consists of:
+
+- an optional description
+- the EJB reference name used in the code of
+  the web application that's referencing the enterprise bean
+- the expected type of the referenced enterprise bean
+- the expected home and remote interfaces of the referenced
+  enterprise bean
+- optional ejb-link information, used to specify the referenced
+  enterprise bean
+
+Used in: web-app
+-->
+<!ELEMENT ejb-ref (description?, ejb-ref-name, ejb-ref-type,
+home, remote, ejb-link?)>
+
+<!--
+The ejb-ref-name element contains the name of an EJB reference. The
+EJB reference is an entry in the web application's environment and is
+relative to the java:comp/env context.  The name must be unique
+within the web application.
+
+It is recommended that name is prefixed with "ejb/".
+
+Used in: ejb-local-ref, ejb-ref
+
+Example:
+
+<ejb-ref-name>ejb/Payroll</ejb-ref-name>
+-->
+<!ELEMENT ejb-ref-name (#PCDATA)>
+
+<!--
+The ejb-ref-type element contains the expected type of the
+referenced enterprise bean.
+
+The ejb-ref-type element must be one of the following:
+
+<ejb-ref-type>Entity</ejb-ref-type>
+<ejb-ref-type>Session</ejb-ref-type>
+
+Used in: ejb-local-ref, ejb-ref
+-->
+<!ELEMENT ejb-ref-type (#PCDATA)>
+
+<!--
+The env-entry element contains the declaration of a web application's
+environment entry. The declaration consists of an optional
+description, the name of the environment entry, and an optional
+value.  If a value is not specified, one must be supplied
+during deployment.
+-->
+<!ELEMENT env-entry (description?, env-entry-name, env-entry-value?,
+env-entry-type)>
+
+<!--
+The env-entry-name element contains the name of a web applications's
+environment entry.  The name is a JNDI name relative to the
+java:comp/env context.  The name must be unique within a web application.
+
+Example:
+
+<env-entry-name>minAmount</env-entry-name>
+
+Used in: env-entry
+-->
+<!ELEMENT env-entry-name (#PCDATA)>
+
+<!--
+The env-entry-type element contains the fully-qualified Java type of
+the environment entry value that is expected by the web application's
+code.
+
+The following are the legal values of env-entry-type:
+
+java.lang.Boolean
+java.lang.Byte
+java.lang.Character
+java.lang.String
+java.lang.Short
+java.lang.Integer
+java.lang.Long
+java.lang.Float
+java.lang.Double
+
+Used in: env-entry
+-->
+<!ELEMENT env-entry-type (#PCDATA)>
+
+<!--
+The env-entry-value element contains the value of a web application's
+environment entry. The value must be a String that is valid for the
+constructor of the specified type that takes a single String
+parameter, or for java.lang.Character, a single character.
+
+Example:
+
+<env-entry-value>100.00</env-entry-value>
+
+Used in: env-entry
+-->
+<!ELEMENT env-entry-value (#PCDATA)>
+
+<!--
+The error-code contains an HTTP error code, ex: 404
+
+Used in: error-page
+-->
+<!ELEMENT error-code (#PCDATA)>
+
+<!--
+The error-page element contains a mapping between an error code
+or exception type to the path of a resource in the web application
+
+Used in: web-app
+-->
+<!ELEMENT error-page ((error-code | exception-type), location)>
+
+<!--
+The exception type contains a fully qualified class name of a
+Java exception type.
+
+Used in: error-page
+-->
+<!ELEMENT exception-type (#PCDATA)>
+
+<!--
+The extension element contains a string describing an
+extension. example: "txt"
+
+Used in: mime-mapping
+-->
+<!ELEMENT extension (#PCDATA)>
+
+<!--
+Declares a filter in the web application. The filter is mapped to
+either a servlet or a URL pattern in the filter-mapping element, using
+the filter-name value to reference. Filters can access the
+initialization parameters declared in the deployment descriptor at
+runtime via the FilterConfig interface.
+
+Used in: web-app
+-->
+<!ELEMENT filter (icon?, filter-name, display-name?, description?,
+filter-class, init-param*)>
+
+<!--
+The fully qualified classname of the filter.
+
+Used in: filter
+-->
+<!ELEMENT filter-class (#PCDATA)>
+
+<!--
+Declaration of the filter mappings in this web application. The
+container uses the filter-mapping declarations to decide which filters
+to apply to a request, and in what order. The container matches the
+request URI to a Servlet in the normal way. To determine which filters
+to apply it matches filter-mapping declarations either on servlet-name,
+or on url-pattern for each filter-mapping element, depending on which
+style is used. The order in which filters are invoked is the order in
+which filter-mapping declarations that match a request URI for a
+servlet appear in the list of filter-mapping elements.The filter-name
+value must be the value of the <filter-name> sub-elements of one of the
+<filter> declarations in the deployment descriptor.
+
+Used in: web-app
+-->
+<!ELEMENT filter-mapping (filter-name, (url-pattern | servlet-name))>
+
+<!--
+The logical name of the filter. This name is used to map the filter.
+Each filter name is unique within the web application.
+
+Used in: filter, filter-mapping
+-->
+<!ELEMENT filter-name (#PCDATA)>
+
+<!--
+The form-error-page element defines the location in the web app
+where the error page that is displayed when login is not successful
+can be found. The path begins with a leading / and is interpreted
+relative to the root of the WAR.
+
+Used in: form-login-config
+-->
+<!ELEMENT form-error-page (#PCDATA)>
+
+<!--
+The form-login-config element specifies the login and error pages
+that should be used in form based login. If form based authentication
+is not used, these elements are ignored.
+
+Used in: login-config
+-->
+<!ELEMENT form-login-config (form-login-page, form-error-page)>
+
+<!--
+The form-login-page element defines the location in the web app
+where the page that can be used for login can be found. The path
+begins with a leading / and is interpreted relative to the root of the WAR.
+
+Used in: form-login-config
+-->
+<!ELEMENT form-login-page (#PCDATA)>
+
+<!--
+The home element contains the fully-qualified name of the enterprise
+bean's home interface.
+
+Used in: ejb-ref
+
+Example:
+
+<home>com.aardvark.payroll.PayrollHome</home>
+-->
+<!ELEMENT home (#PCDATA)>
+
+<!--
+The http-method contains an HTTP method (GET | POST |...).
+
+Used in: web-resource-collection
+-->
+<!ELEMENT http-method (#PCDATA)>
+
+<!--
+The icon element contains small-icon and large-icon elements that
+specify the file names for small and a large GIF or JPEG icon images
+used to represent the parent element in a GUI tool.
+
+Used in: filter, servlet, web-app
+-->
+<!ELEMENT icon (small-icon?, large-icon?)>
+
+<!--
+The init-param element contains a name/value pair as an
+initialization param of the servlet
+
+Used in: filter, servlet
+-->
+<!ELEMENT init-param (param-name, param-value, description?)>
+
+<!--
+The jsp-file element contains the full path to a JSP file within
+the web application beginning with a `/'.
+
+Used in: servlet
+-->
+<!ELEMENT jsp-file (#PCDATA)>
+
+<!--
+The large-icon element contains the name of a file
+containing a large (32 x 32) icon image. The file
+name is a relative path within the web application's
+war file.
+
+The image may be either in the JPEG or GIF format.
+The icon can be used by tools.
+
+Used in: icon
+
+Example:
+
+<large-icon>employee-service-icon32x32.jpg</large-icon>
+-->
+<!ELEMENT large-icon (#PCDATA)>
+
+<!--
+The listener element indicates the deployment properties for a web
+application listener bean.
+
+Used in: web-app
+-->
+<!ELEMENT listener (listener-class)>
+
+<!--
+The listener-class element declares a class in the application must be
+registered as a web application listener bean. The value is the fully qualified classname of the listener class.
+
+
+Used in: listener
+-->
+<!ELEMENT listener-class (#PCDATA)>
+
+<!--
+The load-on-startup element indicates that this servlet should be
+loaded (instantiated and have its init() called) on the startup
+of the web application. The optional contents of
+these element must be an integer indicating the order in which
+the servlet should be loaded. If the value is a negative integer,
+or the element is not present, the container is free to load the
+servlet whenever it chooses. If the value is a positive integer
+or 0, the container must load and initialize the servlet as the
+application is deployed. The container must guarantee that
+servlets marked with lower integers are loaded before servlets
+marked with higher integers. The container may choose the order
+of loading of servlets with the same load-on-start-up value.
+
+Used in: servlet
+-->
+<!ELEMENT load-on-startup (#PCDATA)>
+
+<!--
+
+The local element contains the fully-qualified name of the
+enterprise bean's local interface.
+
+Used in: ejb-local-ref
+
+-->
+<!ELEMENT local (#PCDATA)>
+
+<!--
+
+The local-home element contains the fully-qualified name of the
+enterprise bean's local home interface.
+
+Used in: ejb-local-ref
+-->
+<!ELEMENT local-home (#PCDATA)>
+
+<!--
+The location element contains the location of the resource in the web
+application relative to the root of the web application. The value of
+the location must have a leading `/'.
+
+Used in: error-page
+-->
+<!ELEMENT location (#PCDATA)>
+
+<!--
+The login-config element is used to configure the authentication
+method that should be used, the realm name that should be used for
+this application, and the attributes that are needed by the form login
+mechanism.
+
+Used in: web-app
+-->
+<!ELEMENT login-config (auth-method?, realm-name?, form-login-config?)>
+
+<!--
+The mime-mapping element defines a mapping between an extension
+and a mime type.
+
+Used in: web-app
+-->
+<!ELEMENT mime-mapping (extension, mime-type)>
+
+<!--
+The mime-type element contains a defined mime type. example:
+"text/plain"
+
+Used in: mime-mapping
+-->
+<!ELEMENT mime-type (#PCDATA)>
+
+<!--
+The param-name element contains the name of a parameter. Each parameter
+name must be unique in the web application.
+
+
+Used in: context-param, init-param
+-->
+<!ELEMENT param-name (#PCDATA)>
+
+<!--
+The param-value element contains the value of a parameter.
+
+Used in: context-param, init-param
+-->
+<!ELEMENT param-value (#PCDATA)>
+
+<!--
+The realm name element specifies the realm name to use in HTTP
+Basic authorization.
+
+Used in: login-config
+-->
+<!ELEMENT realm-name (#PCDATA)>
+
+<!--
+The remote element contains the fully-qualified name of the enterprise
+bean's remote interface.
+
+Used in: ejb-ref
+
+Example:
+
+<remote>com.wombat.empl.EmployeeService</remote>
+-->
+<!ELEMENT remote (#PCDATA)>
+
+<!--
+The res-auth element specifies whether the web application code signs
+on programmatically to the resource manager, or whether the Container
+will sign on to the resource manager on behalf of the web application. In the
+latter case, the Container uses information that is supplied by the
+Deployer.
+
+The value of this element must be one of the two following:
+
+<res-auth>Application</res-auth>
+<res-auth>Container</res-auth>
+
+Used in: resource-ref
+-->
+<!ELEMENT res-auth (#PCDATA)>
+
+<!--
+The res-ref-name element specifies the name of a resource manager
+connection factory reference.  The name is a JNDI name relative to the
+java:comp/env context.  The name must be unique within a web application.
+
+Used in: resource-ref
+-->
+<!ELEMENT res-ref-name (#PCDATA)>
+
+<!--
+The res-sharing-scope element specifies whether connections obtained
+through the given resource manager connection factory reference can be
+shared. The value of this element, if specified, must be one of the
+two following:
+
+<res-sharing-scope>Shareable</res-sharing-scope>
+<res-sharing-scope>Unshareable</res-sharing-scope>
+
+The default value is Shareable.
+
+Used in: resource-ref
+-->
+<!ELEMENT res-sharing-scope (#PCDATA)>
+
+<!--
+The res-type element specifies the type of the data source. The type
+is specified by the fully qualified Java language class or interface
+expected to be implemented by the data source.
+
+Used in: resource-ref
+-->
+<!ELEMENT res-type (#PCDATA)>
+
+<!--
+The resource-env-ref element contains a declaration of a web application's
+reference to an administered object associated with a resource
+in the web application's environment.  It consists of an optional
+description, the resource environment reference name, and an
+indication of the resource environment reference type expected by
+the web application code.
+
+Used in: web-app
+
+Example:
+
+<resource-env-ref>
+    <resource-env-ref-name>jms/StockQueue</resource-env-ref-name>
+    <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
+</resource-env-ref>
+-->
+<!ELEMENT resource-env-ref (description?, resource-env-ref-name,
+resource-env-ref-type)>
+
+<!--
+The resource-env-ref-name element specifies the name of a resource
+environment reference; its value is the environment entry name used in
+the web application code.  The name is a JNDI name relative to the
+java:comp/env context and must be unique within a web application.
+
+Used in: resource-env-ref
+-->
+<!ELEMENT resource-env-ref-name (#PCDATA)>
+
+<!--
+The resource-env-ref-type element specifies the type of a resource
+environment reference.  It is the fully qualified name of a Java
+language class or interface.
+
+Used in: resource-env-ref
+-->
+<!ELEMENT resource-env-ref-type (#PCDATA)>
+
+<!--
+The resource-ref element contains a declaration of a web application's
+reference to an external resource. It consists of an optional
+description, the resource manager connection factory reference name,
+the indication of the resource manager connection factory type
+expected by the web application code, the type of authentication
+(Application or Container), and an optional specification of the
+shareability of connections obtained from the resource (Shareable or
+Unshareable).
+
+Used in: web-app
+
+Example:
+
+    <resource-ref>
+<res-ref-name>jdbc/EmployeeAppDB</res-ref-name>
+<res-type>javax.sql.DataSource</res-type>
+<res-auth>Container</res-auth>
+<res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+-->
+<!ELEMENT resource-ref (description?, res-ref-name, res-type, res-auth,
+res-sharing-scope?)>
+
+<!--
+The role-link element is a reference to a defined security role. The
+role-link element must contain the name of one of the security roles
+defined in the security-role elements.
+
+Used in: security-role-ref
+-->
+<!ELEMENT role-link (#PCDATA)>
+
+<!--
+The role-name element contains the name of a security role.
+
+The name must conform to the lexical rules for an NMTOKEN.
+
+Used in: auth-constraint, run-as, security-role, security-role-ref
+-->
+<!ELEMENT role-name (#PCDATA)>
+
+<!--
+The run-as element specifies the run-as identity to be used for the
+execution of the web application. It contains an optional description, and
+the name of a security role.
+
+Used in: servlet
+-->
+<!ELEMENT run-as (description?, role-name)>
+
+<!--
+The security-constraint element is used to associate security
+constraints with one or more web resource collections
+
+Used in: web-app
+-->
+<!ELEMENT security-constraint (display-name?, web-resource-collection+,
+auth-constraint?, user-data-constraint?)>
+
+<!--
+The security-role element contains the definition of a security
+role. The definition consists of an optional description of the
+security role, and the security role name.
+
+Used in: web-app
+
+Example:
+
+    <security-role>
+<description>
+    This role includes all employees who are authorized
+    to access the employee service application.
+</description>
+<role-name>employee</role-name>
+    </security-role>
+-->
+<!ELEMENT security-role (description?, role-name)>
+
+<!--
+The security-role-ref element contains the declaration of a security
+role reference in the web application's code. The declaration consists
+of an optional description, the security role name used in the code,
+and an optional link to a security role. If the security role is not
+specified, the Deployer must choose an appropriate security role.
+
+The value of the role-name element must be the String used as the
+parameter to the EJBContext.isCallerInRole(String roleName) method
+or the HttpServletRequest.isUserInRole(String role) method.
+
+Used in: servlet
+
+-->
+<!ELEMENT security-role-ref (description?, role-name, role-link?)>
+
+<!--
+The servlet element contains the declarative data of a
+servlet. If a jsp-file is specified and the load-on-startup element is
+present, then the JSP should be precompiled and loaded.
+
+Used in: web-app
+-->
+<!ELEMENT servlet (icon?, servlet-name, display-name?, description?,
+(servlet-class|jsp-file), init-param*, load-on-startup?, run-as?, security-role-ref*)>
+
+<!--
+The servlet-class element contains the fully qualified class name
+of the servlet.
+
+Used in: servlet
+-->
+<!ELEMENT servlet-class (#PCDATA)>
+
+<!--
+The servlet-mapping element defines a mapping between a servlet
+and a url pattern
+
+Used in: web-app
+-->
+<!ELEMENT servlet-mapping (servlet-name, url-pattern)>
+
+<!--
+The servlet-name element contains the canonical name of the
+servlet. Each servlet name is unique within the web application.
+
+Used in: filter-mapping, servlet, servlet-mapping
+-->
+<!ELEMENT servlet-name (#PCDATA)>
+
+<!--
+The session-config element defines the session parameters for
+this web application.
+
+Used in: web-app
+-->
+<!ELEMENT session-config (session-timeout?)>
+
+<!--
+The session-timeout element defines the default session timeout
+interval for all sessions created in this web application. The
+specified timeout must be expressed in a whole number of minutes.
+If the timeout is 0 or less, the container ensures the default
+behaviour of sessions is never to time out.
+
+Used in: session-config
+-->
+<!ELEMENT session-timeout (#PCDATA)>
+
+<!--
+The small-icon element contains the name of a file
+containing a small (16 x 16) icon image. The file
+name is a relative path within the web application's
+war file.
+
+The image may be either in the JPEG or GIF format.
+The icon can be used by tools.
+
+Used in: icon
+
+Example:
+
+<small-icon>employee-service-icon16x16.jpg</small-icon>
+-->
+<!ELEMENT small-icon (#PCDATA)>
+
+<!--
+The taglib element is used to describe a JSP tag library.
+
+Used in: web-app
+-->
+<!ELEMENT taglib (taglib-uri, taglib-location)>
+
+<!--
+the taglib-location element contains the location (as a resource
+relative to the root of the web application) where to find the Tag
+Libary Description file for the tag library.
+
+Used in: taglib
+-->
+<!ELEMENT taglib-location (#PCDATA)>
+
+<!--
+The taglib-uri element describes a URI, relative to the location
+of the web.xml document, identifying a Tag Library used in the Web
+Application.
+
+Used in: taglib
+-->
+<!ELEMENT taglib-uri (#PCDATA)>
+
+<!--
+The transport-guarantee element specifies that the communication
+between client and server should be NONE, INTEGRAL, or
+CONFIDENTIAL. NONE means that the application does not require any
+transport guarantees. A value of INTEGRAL means that the application
+requires that the data sent between the client and server be sent in
+such a way that it can't be changed in transit. CONFIDENTIAL means
+that the application requires that the data be transmitted in a
+fashion that prevents other entities from observing the contents of
+the transmission. In most cases, the presence of the INTEGRAL or
+CONFIDENTIAL flag will indicate that the use of SSL is required.
+
+Used in: user-data-constraint
+-->
+<!ELEMENT transport-guarantee (#PCDATA)>
+
+<!--
+The url-pattern element contains the url pattern of the mapping. Must
+follow the rules specified in Section 11.2 of the Servlet API
+Specification.
+
+Used in: filter-mapping, servlet-mapping, web-resource-collection
+-->
+<!ELEMENT url-pattern (#PCDATA)>
+
+<!--
+The user-data-constraint element is used to indicate how data
+communicated between the client and container should be protected.
+
+Used in: security-constraint
+-->
+<!ELEMENT user-data-constraint (description?, transport-guarantee)>
+
+<!--
+The web-resource-collection element is used to identify a subset
+of the resources and HTTP methods on those resources within a web
+application to which a security constraint applies. If no HTTP methods
+are specified, then the security constraint applies to all HTTP
+methods.
+
+Used in: security-constraint
+-->
+<!ELEMENT web-resource-collection (web-resource-name, description?,
+url-pattern*, http-method*)>
+
+<!--
+The web-resource-name contains the name of this web resource
+collection.
+
+Used in: web-resource-collection
+-->
+<!ELEMENT web-resource-name (#PCDATA)>
+
+<!--
+The welcome-file element contains file name to use as a default
+welcome file, such as index.html
+
+Used in: welcome-file-list
+-->
+<!ELEMENT welcome-file (#PCDATA)>
+
+<!--
+The welcome-file-list contains an ordered list of welcome files
+elements.
+
+Used in: web-app
+-->
+<!ELEMENT welcome-file-list (welcome-file+)>
+
+<!--
+The ID mechanism is to allow tools that produce additional deployment
+information (i.e., information beyond the standard deployment
+descriptor information) to store the non-standard information in a
+separate file, and easily refer from these tool-specific files to the
+information in the standard deployment descriptor.
+
+Tools are not allowed to add the non-standard information into the
+standard deployment descriptor.
+-->
+
+<!ATTLIST auth-constraint id ID #IMPLIED>
+<!ATTLIST auth-method id ID #IMPLIED>
+<!ATTLIST context-param id ID #IMPLIED>
+<!ATTLIST description id ID #IMPLIED>
+<!ATTLIST display-name id ID #IMPLIED>
+<!ATTLIST distributable id ID #IMPLIED>
+<!ATTLIST ejb-link id ID #IMPLIED>
+<!ATTLIST ejb-local-ref id ID #IMPLIED>
+<!ATTLIST ejb-ref id ID #IMPLIED>
+<!ATTLIST ejb-ref-name id ID #IMPLIED>
+<!ATTLIST ejb-ref-type id ID #IMPLIED>
+<!ATTLIST env-entry id ID #IMPLIED>
+<!ATTLIST env-entry-name id ID #IMPLIED>
+<!ATTLIST env-entry-type id ID #IMPLIED>
+<!ATTLIST env-entry-value id ID #IMPLIED>
+<!ATTLIST error-code id ID #IMPLIED>
+<!ATTLIST error-page id ID #IMPLIED>
+<!ATTLIST exception-type id ID #IMPLIED>
+<!ATTLIST extension id ID #IMPLIED>
+<!ATTLIST filter id ID #IMPLIED>
+<!ATTLIST filter-class id ID #IMPLIED>
+<!ATTLIST filter-mapping id ID #IMPLIED>
+<!ATTLIST filter-name id ID #IMPLIED>
+<!ATTLIST form-error-page id ID #IMPLIED>
+<!ATTLIST form-login-config id ID #IMPLIED>
+<!ATTLIST form-login-page id ID #IMPLIED>
+<!ATTLIST home id ID #IMPLIED>
+<!ATTLIST http-method id ID #IMPLIED>
+<!ATTLIST icon id ID #IMPLIED>
+<!ATTLIST init-param id ID #IMPLIED>
+<!ATTLIST jsp-file id ID #IMPLIED>
+<!ATTLIST large-icon id ID #IMPLIED>
+<!ATTLIST listener id ID #IMPLIED>
+<!ATTLIST listener-class id ID #IMPLIED>
+<!ATTLIST load-on-startup id ID #IMPLIED>
+<!ATTLIST local id ID #IMPLIED>
+<!ATTLIST local-home id ID #IMPLIED>
+<!ATTLIST location id ID #IMPLIED>
+<!ATTLIST login-config id ID #IMPLIED>
+<!ATTLIST mime-mapping id ID #IMPLIED>
+<!ATTLIST mime-type id ID #IMPLIED>
+<!ATTLIST param-name id ID #IMPLIED>
+<!ATTLIST param-value id ID #IMPLIED>
+<!ATTLIST realm-name id ID #IMPLIED>
+<!ATTLIST remote id ID #IMPLIED>
+<!ATTLIST res-auth id ID #IMPLIED>
+<!ATTLIST res-ref-name id ID #IMPLIED>
+<!ATTLIST res-sharing-scope id ID #IMPLIED>
+<!ATTLIST res-type id ID #IMPLIED>
+<!ATTLIST resource-env-ref id ID #IMPLIED>
+<!ATTLIST resource-env-ref-name id ID #IMPLIED>
+<!ATTLIST resource-env-ref-type id ID #IMPLIED>
+<!ATTLIST resource-ref id ID #IMPLIED>
+<!ATTLIST role-link id ID #IMPLIED>
+<!ATTLIST role-name id ID #IMPLIED>
+<!ATTLIST run-as id ID #IMPLIED>
+<!ATTLIST security-constraint id ID #IMPLIED>
+<!ATTLIST security-role id ID #IMPLIED>
+<!ATTLIST security-role-ref id ID #IMPLIED>
+<!ATTLIST servlet id ID #IMPLIED>
+<!ATTLIST servlet-class id ID #IMPLIED>
+<!ATTLIST servlet-mapping id ID #IMPLIED>
+<!ATTLIST servlet-name id ID #IMPLIED>
+<!ATTLIST session-config id ID #IMPLIED>
+<!ATTLIST session-timeout id ID #IMPLIED>
+<!ATTLIST small-icon id ID #IMPLIED>
+<!ATTLIST taglib id ID #IMPLIED>
+<!ATTLIST taglib-location id ID #IMPLIED>
+<!ATTLIST taglib-uri id ID #IMPLIED>
+<!ATTLIST transport-guarantee id ID #IMPLIED>
+<!ATTLIST url-pattern id ID #IMPLIED>
+<!ATTLIST user-data-constraint id ID #IMPLIED>
+<!ATTLIST web-app id ID #IMPLIED>
+<!ATTLIST web-resource-collection id ID #IMPLIED>
+<!ATTLIST web-resource-name id ID #IMPLIED>
+<!ATTLIST welcome-file id ID #IMPLIED>
+<!ATTLIST welcome-file-list id ID #IMPLIED>
\ No newline at end of file

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/DecoratorAction.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/DecoratorAction.java?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/DecoratorAction.java (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/DecoratorAction.java Tue Jul  5 14:55:37 2005
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2000-2001,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.
+ */
+package org.apache.jetspeed.velocity;
+
+import java.io.Serializable;
+
+/**
+ * DecoratorAction
+ *
+ * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
+ * @version $Id: DecoratorAction.java 187404 2004-09-03 18:23:41Z taylor $
+ */
+public class DecoratorAction implements Serializable
+{
+    String name = null;
+    String link = null;
+    String alt = null;
+    String action = null;
+
+    /**
+     * Constructor
+     * 
+     * @param name   Name of the action
+     * @param alt    Alternative text description (localized)
+     */
+    public DecoratorAction(String name, String alt, String link)
+    {
+        this.name = name;
+        this.alt = alt;
+        this.link = link;
+    }
+    
+    public String getName()
+    {
+        return this.name;
+    }
+    
+    public String getLink()
+    {
+        return this.link;
+    }
+    
+    public void setLink(String link)
+    {
+        this.link = link;
+    }
+
+    public String getAlt()
+    {
+        return this.alt;
+    }
+
+    public String getAction()
+    {
+        return this.action;
+    }
+    
+    public void setAction(String action)
+    {
+        this.action = action;
+    }
+    
+}

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/HtmlUtilTool.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/HtmlUtilTool.java?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/HtmlUtilTool.java (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/HtmlUtilTool.java Tue Jul  5 14:55:37 2005
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+package org.apache.jetspeed.velocity;
+
+import org.apache.velocity.tools.view.tools.ViewTool;
+
+/**
+ * <p>
+ * HtmlUtilTool
+ * </p>
+ * <p>
+ *
+ * </p>
+ * @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a>
+ * @version $Id: HtmlUtilTool.java 187354 2004-08-25 00:45:18Z jford $
+ *
+ */
+public class HtmlUtilTool implements ViewTool
+{
+
+    /**
+     * <p>
+     * init
+     * </p>
+     *
+     * @see org.apache.velocity.tools.view.tools.ViewTool#init(java.lang.Object)
+     * @param arg0
+     */
+    public void init( Object arg0 )
+    {        
+        
+    }
+    
+    public String getSafeElementId(Object obj)
+    {
+        if(obj == null)
+        {
+            return "null";
+        }
+        else
+        {
+            // Convert "/" to "-"
+            String initValue = obj.toString();
+            return initValue.replaceAll("[\\/,\\.]","-");
+        }
+    }
+
+}

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerTool.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerTool.java?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerTool.java (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerTool.java Tue Jul  5 14:55:37 2005
@@ -0,0 +1,233 @@
+/*
+ * Copyright 2000-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.
+ */
+package org.apache.jetspeed.velocity;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.portlet.PortletMode;
+import javax.portlet.WindowState;
+import javax.security.auth.Subject;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.jetspeed.locator.TemplateDescriptor;
+import org.apache.jetspeed.locator.TemplateLocatorException;
+import org.apache.jetspeed.om.page.ContentFragment;
+import org.apache.jetspeed.om.page.Page;
+import org.apache.pluto.om.entity.PortletEntity;
+
+/**
+ * JetspeedPowerTool
+ * 
+ * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
+ * @version $Id: JetspeedPowerTool.java 188635 2005-06-02 06:23:26Z taylor $
+ */
+
+public interface JetspeedPowerTool
+{
+
+    public static final String GENERIC_TEMPLATE_TYPE = "generic";
+
+    public static final String FRAGMENT_PROCESSING_ERROR_PREFIX = "fragment.processing.error.";
+
+    public static final String FRAGMENT_ATTR = "fragment";
+
+    public static final String LAYOUT_ATTR = "layout";
+
+    public static final String HIDDEN = "hidden";
+
+    public static final String LAYOUT_TEMPLATE_TYPE = "layout";
+
+    public static final String DECORATOR_TYPE = "decorator";
+
+    /**
+     * Gets the window state for the current portlet window (fragment)
+     * 
+     * @return The window state for the current window
+     * @throws Exception
+     */
+    WindowState getWindowState() throws Exception;
+
+    /**
+     * Gets the portlet mode for a current portlet window (fragment)
+     * 
+     * @return The portlet mode of the current window
+     * @throws Exception
+     */
+    PortletMode getPortletMode() throws Exception;
+
+    /**
+     * 
+     * @return
+     */
+    ContentFragment getCurrentFragment();
+
+    /**
+     * 
+     * @param f
+     */
+    void setCurrentFragment(ContentFragment f);
+
+    void setCurrentLayout();
+
+    /**
+     * 
+     * @return
+     */
+    ContentFragment getCurrentLayout();
+
+    /**
+     * 
+     * @return
+     */
+    Page getPage();
+
+    /**
+     * 
+     * @return
+     */
+    List[] getColumns();
+
+    List getColumnSizes();
+
+    /**
+     * 
+     * @return
+     * @throws Exception
+     */
+    PortletEntity getCurrentPortletEntity() throws Exception;
+
+    /**
+     * 
+     * @param f
+     *                  Fragment whose <code>PortletEntity</code> we want to
+     *                  retreive.
+     * @return The PortletEntity represented by the current fragment.
+     * @throws Exception
+     */
+    PortletEntity getPortletEntity(ContentFragment f) throws Exception;
+
+    /**
+     * Checks the the visibilty of this fragment with respect to the current
+     * RenderReqeust.
+     * 
+     * @param f
+     *                  Fragment
+     * @return whether or not the Fragment in question should be considered
+     *              visible during rendering.
+     */
+    boolean isHidden(ContentFragment f);
+
+    /**
+     * Retreives a template using Jetspeed's
+     * 
+     * @see org.apache.jetspeed.locator.TemplateLocator
+     * 
+     * 
+     * @param path
+     *                  Expected to the template. This may actually be changed by the
+     *                  TL service based the capability and localization information
+     *                  provided by the client.
+     * @param templateType
+     *                  Type off template we are interested in.
+     * @return Template object containng the pertinent information required to
+     *              inlcude the request template path in the current response
+     * @throws TemplateLocatorException
+     *                   if the <code>path</code> does not exist.
+     */
+    TemplateDescriptor getTemplate(String path, String templateType)
+            throws TemplateLocatorException;
+
+    Configuration getTypeConfiguration(String type, String name, String location)
+            throws Exception;
+
+    TemplateDescriptor getDecoration(String path, String templateType)
+            throws TemplateLocatorException;
+
+    String includeTemplate(String template, String templateType)
+            throws IOException;
+
+    String includeDecoration(String template, String templateType)
+            throws IOException;
+
+    /**
+     * <p>
+     * Decorate and include fragment content.
+     * </p>
+     * 
+     * @param f
+     *                  Fragment to include and decorate
+     * @throws Exception
+     * @return String path to the decorator.
+     */
+    String decorateAndInclude(ContentFragment f) throws Exception;
+
+    /**
+     * Gets the list of decorator actions for a window. Each window (on each
+     * page) has its own collection of actionAccess flags associated with it.
+     * 
+     * @return A list of actions available to the current window, filtered by
+     *              securty access and current state.
+     * @throws Exception
+     */
+    List getDecoratorActions();
+
+    /**
+     * Gets the list of decorator actions for a page. Each layout fragment on a
+     * page has its own collection of actionAccess flags associated with it.
+     * 
+     * @return A list of actions available to the current window, filtered by
+     *              securty access and current state.
+     * @throws Exception
+     */
+    List getPageDecoratorActions() throws Exception;
+
+    /**
+     * 
+     * <p>
+     * getTitle
+     * </p>
+     * Returns the appropriate for the title based on locale prferences
+     * 
+     * @param entity
+     * @return
+     */
+    String getTitle(PortletEntity entity, ContentFragment f);
+
+    /**
+     * 
+     * <p>
+     * getTitle
+     * </p>
+     * Returns the appropriate for the title based on locale prferences
+     * 
+     * @param entity
+     * @return
+     */
+    String getTitle(PortletEntity entity);
+
+    Object getComponent(String name);
+
+    String getAbsoluteUrl(String relativePath);
+
+    Subject getSubject();
+
+    boolean getLoggedOn();
+
+    String getBasePath();
+
+    String getPageBasePath();
+}
\ No newline at end of file

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerToolFactory.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerToolFactory.java?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerToolFactory.java (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerToolFactory.java Tue Jul  5 14:55:37 2005
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2000-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.
+ */
+package org.apache.jetspeed.velocity;
+
+import java.lang.reflect.Constructor;
+import javax.portlet.PortletException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.request.RequestContext;
+
+public class JetspeedPowerToolFactory
+{
+    protected static final Log log = LogFactory.getLog(JetspeedPowerToolFactory.class);
+    
+    private Class jptClass;
+    private Constructor constructor;
+    private String jptClassName;
+    
+    public JetspeedPowerToolFactory(String jptClassName)
+    throws ClassNotFoundException, NoSuchMethodException
+    {
+        this.jptClassName = jptClassName;
+        jptClass = Thread.currentThread().getContextClassLoader().loadClass(jptClassName);
+        constructor =
+            jptClass.getConstructor(
+                new Class[] {RequestContext.class});        
+    }
+    
+    public JetspeedPowerTool getJetspeedPowerTool(RequestContext requestContext)
+    throws PortletException
+    {
+        try
+        {
+            Object[] initArgs = { requestContext };
+            return (JetspeedPowerTool)constructor.newInstance(initArgs);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            throw new PortletException(e);
+        }
+    }
+}

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerToolImpl.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerToolImpl.java?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerToolImpl.java (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerToolImpl.java Tue Jul  5 14:55:37 2005
@@ -0,0 +1,916 @@
+/*
+ * Copyright 2000-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.
+ */
+package org.apache.jetspeed.velocity;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import javax.portlet.PortletConfig;
+import javax.portlet.PortletMode;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.portlet.WindowState;
+import javax.security.auth.Subject;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.Jetspeed;
+import org.apache.jetspeed.JetspeedActions;
+import org.apache.jetspeed.PortalReservedParameters;
+import org.apache.jetspeed.capabilities.CapabilityMap;
+import org.apache.jetspeed.components.portletentity.PortletEntityAccessComponent;
+import org.apache.jetspeed.components.portletentity.PortletEntityNotGeneratedException;
+import org.apache.jetspeed.components.portletentity.PortletEntityNotStoredException;
+import org.apache.jetspeed.container.state.NavigationalState;
+import org.apache.jetspeed.container.url.PortalURL;
+import org.apache.jetspeed.container.window.FailedToRetrievePortletWindow;
+import org.apache.jetspeed.container.window.PortletWindowAccessor;
+import org.apache.jetspeed.locator.LocatorDescriptor;
+import org.apache.jetspeed.locator.TemplateDescriptor;
+import org.apache.jetspeed.locator.TemplateLocator;
+import org.apache.jetspeed.locator.TemplateLocatorException;
+import org.apache.jetspeed.om.common.portlet.PortletDefinitionComposite;
+import org.apache.jetspeed.om.page.ContentFragment;
+import org.apache.jetspeed.om.page.Page;
+import org.apache.jetspeed.request.RequestContext;
+import org.apache.jetspeed.util.ArgUtil;
+import org.apache.pluto.om.entity.PortletEntity;
+import org.apache.pluto.om.portlet.ContentTypeSet;
+import org.apache.pluto.om.window.PortletWindow;
+import org.apache.velocity.context.Context;
+
+/**
+ * <p>
+ * JetspeedPowerTool
+ * </p>
+ * <p>
+ * The JetspeedPowerTool is meant to be used by template designers to build
+ * templates for internal Jetspeed portlet applications. It hides the
+ * implementation details of the more common template actions so that future
+ * changes to said implementation have minimal effect on template.
+ * </p>
+ * <p>
+ * Where applicable, methods have been marked with a <strong>BEST PRATICES
+ * </strong> meaning that this method should be used instead the synonymous code
+ * listed within the method docuementation.
+ * </p>
+ * 
+ * @author <a href="mailto:weaver@apache.org">Scott T. Weaver </a>
+ * @version $Id: JetspeedPowerToolImpl.java 202133 2005-06-28 05:40:09Z taylor $
+ *  
+ */
+public class JetspeedPowerToolImpl implements JetspeedPowerTool
+{
+    
+    protected static final String PORTLET_CONFIG_ATTR = "javax.portlet.config";
+    protected static final String RENDER_RESPONSE_ATTR = "javax.portlet.response";
+    protected static final String RENDER_REQUEST_ATTR = "javax.portlet.request";
+    protected static final String COLUMNS_ATTR = "columns";
+    protected static final String COLUMN_SIZES = "columnSizes";
+
+    protected RenderRequest renderRequest;
+
+    protected RenderResponse renderResponse;
+
+    protected PortletConfig portletConfig;
+
+    protected Writer templateWriter;
+
+    protected static final String POWER_TOOL_SESSION_ACTIONS = "org.apache.jetspeed.powertool.actions";
+
+    protected static final Log log = LogFactory.getLog(JetspeedPowerToolImpl.class);
+
+    protected CapabilityMap capabilityMap;
+    protected Locale locale;
+    protected LocatorDescriptor templateLocatorDescriptor;
+    protected TemplateLocator templateLocator;
+    protected PortletEntityAccessComponent entityAccess;
+    protected TemplateLocator decorationLocator;
+    protected LocatorDescriptor decorationLocatorDescriptor;
+    protected PortletWindowAccessor windowAccess;
+
+    protected RequestContext requestContext;
+    protected Context velocityContext;
+    
+    public JetspeedPowerToolImpl( RequestContext requestContext ) throws Exception
+    {
+        HttpServletRequest request = requestContext.getRequest();
+        this.requestContext = requestContext;
+        windowAccess = (PortletWindowAccessor) getComponent(PortletWindowAccessor.class.getName());
+        entityAccess = (PortletEntityAccessComponent) getComponent(PortletEntityAccessComponent.class.getName());
+        renderRequest = (RenderRequest) request.getAttribute(RENDER_REQUEST_ATTR);
+        renderResponse = (RenderResponse) request.getAttribute(RENDER_RESPONSE_ATTR);
+        portletConfig = (PortletConfig) request.getAttribute(PORTLET_CONFIG_ATTR);
+        
+        templateLocator = (TemplateLocator) getComponent("TemplateLocator");
+        decorationLocator = (TemplateLocator) getComponent("DecorationLocator");
+        // By using null, we create a re-useable locator
+        capabilityMap = requestContext.getCapabilityMap();
+        locale = requestContext.getLocale();
+
+        templateLocatorDescriptor = templateLocator.createLocatorDescriptor(null);
+        templateLocatorDescriptor.setMediaType(capabilityMap.getPreferredMediaType().getName());
+        templateLocatorDescriptor.setCountry(locale.getCountry());
+        templateLocatorDescriptor.setLanguage(locale.getLanguage());
+
+        decorationLocatorDescriptor = decorationLocator.createLocatorDescriptor(null);
+        decorationLocatorDescriptor.setMediaType(capabilityMap.getPreferredMediaType().getName());
+        decorationLocatorDescriptor.setCountry(locale.getCountry());
+        decorationLocatorDescriptor.setLanguage(locale.getLanguage());
+    }
+
+
+    /**
+     * <p>
+     * getRequestContext
+     * </p>
+     * 
+     * @return
+     */
+    protected final RequestContext getRequestContext()
+    {
+        return requestContext;
+    }
+
+
+    /**
+     * Gets the window state for the current portlet window (fragment)
+     * 
+     * @return The window state for the current window
+     * @throws Exception
+     */
+    public WindowState getWindowState() throws Exception
+    {
+        try
+        {
+            NavigationalState nav = getRequestContext().getPortalURL().getNavigationalState();
+            return nav.getState(windowAccess.getPortletWindow(getCurrentFragment()));
+        }
+        catch (Exception e)
+        {
+            handleError(e, e.toString(), getCurrentFragment());
+            return null;
+        }
+    }
+
+    /**
+     * Gets the portlet mode for a current portlet window (fragment)
+     * 
+     * @return The portlet mode of the current window
+     * @throws Exception
+     */
+    public PortletMode getPortletMode() throws Exception
+    {
+
+        NavigationalState nav = getRequestContext().getPortalURL().getNavigationalState();
+        try
+        {
+            return nav.getMode(windowAccess.getPortletWindow(getCurrentFragment()));
+        }
+        catch (FailedToRetrievePortletWindow e)
+        {
+            handleError(e, e.toString(), getCurrentFragment());
+            return null;
+        }
+    }
+
+    /**
+     * 
+     * @return
+     */
+    public ContentFragment getCurrentFragment()
+    {
+        checkState();       
+       return (ContentFragment) renderRequest.getAttribute(PortalReservedParameters.FRAGMENT_ATTRIBUTE);
+    }
+
+    /**
+     * 
+     * @param f
+     */
+    public void setCurrentFragment( ContentFragment f )
+    {
+        checkState();
+        renderRequest.setAttribute(PortalReservedParameters.FRAGMENT_ATTRIBUTE, f);
+        
+    }
+
+    public void setCurrentLayout()
+    {
+        checkState();
+
+        ContentFragment f = (ContentFragment) getRequestContext().getRequest().getAttribute(LAYOUT_ATTR);
+        renderRequest.setAttribute(LAYOUT_ATTR, f);
+    }
+
+    /**
+     * 
+     * @return
+     */
+    public ContentFragment getCurrentLayout()
+    {
+        checkState();
+        return (ContentFragment) renderRequest.getAttribute(LAYOUT_ATTR);
+    }
+
+    /**
+     * 
+     * @return
+     */
+    public Page getPage()
+    {
+        checkState();
+        // return (Page) renderRequest.getAttribute(PortalReservedParameters.PAGE_ATTRIBUTE_KEY);
+        return requestContext.getPage();
+    }
+
+    /**
+     * 
+     * @return
+     */
+    public List[] getColumns()
+    {
+        checkState();
+        return (List[]) renderRequest.getAttribute(COLUMNS_ATTR);
+    }
+
+    public List getColumnSizes()
+    {
+        checkState();
+        Object o = renderRequest.getAttribute(COLUMN_SIZES);
+        if (o == null)
+            return null;
+        return (List) renderRequest.getAttribute(COLUMN_SIZES);
+    }
+    
+    /**
+     * 
+     * @return
+     * @throws Exception
+     */
+    public PortletEntity getCurrentPortletEntity() throws Exception
+    {
+        try
+        {
+            return windowAccess.getPortletWindow(getCurrentFragment()).getPortletEntity();
+        }
+        catch (Exception e)
+        {
+            handleError(e, "JetspeedPowerTool failed to retreive the current PortletEntity.  " + e.toString(),
+                    getCurrentFragment());
+            return null;
+        }
+    }
+
+    /**
+     * 
+     * @param f
+     *                  Fragment whose <code>PortletEntity</code> we want to
+     *                  retreive.
+     * @return The PortletEntity represented by the current fragment.
+     * @throws Exception
+     * @deprecated Please use WindowAccessor to get entities
+     */
+    public PortletEntity getPortletEntity( ContentFragment f ) throws Exception
+    {
+        PortletEntity portletEntity = entityAccess.getPortletEntityForFragment(f);
+        if (portletEntity == null)
+        {
+            try
+            {
+                portletEntity = entityAccess.generateEntityFromFragment(f);
+                entityAccess.storePortletEntity(portletEntity);
+            }
+            catch (PortletEntityNotGeneratedException e)
+            {
+                String msg = "JetspeedPowerTool failed to retreive a PortletEntity for Fragment " + f.getId() + ".  "
+                        + e.toString();
+                handleError(e, msg, f);
+            }
+            catch (PortletEntityNotStoredException e)
+            {
+                String msg = "JetspeedPowerTool failed to store a PortletEntity for Fragment " + f.getId() + ".  "
+                        + e.toString();
+                handleError(e, msg, f);
+            }
+        }
+        return portletEntity;
+    }
+
+    /**
+     * Checks the the visibilty of this fragment with respect to the current
+     * RenderReqeust.
+     * 
+     * @param f
+     *                  Fragment
+     * @return whether or not the Fragment in question should be considered
+     *              visible during rendering.
+     */
+    public boolean isHidden( ContentFragment f )
+    {
+        checkState();
+        if (f == null)
+        {
+            throw new IllegalArgumentException("Fragment cannot be null for isHidden(Fragment)");
+        }
+        return f.getState() != null && f.getState().equals(HIDDEN);
+    }
+
+    /**
+     * Retreives a template using Jetspeed's
+     * 
+     * @see org.apache.jetspeed.locator.TemplateLocator
+     * 
+     * 
+     * @param path
+     *                  Expected to the template. This may actually be changed by the
+     *                  TL service based the capability and localization information
+     *                  provided by the client.
+     * @param templateType
+     *                  Type off template we are interested in.
+     * @return Template object containng the pertinent information required to
+     *              inlcude the request template path in the current response
+     * @throws TemplateLocatorException
+     *                   if the <code>path</code> does not exist.
+     */
+    public TemplateDescriptor getTemplate( String path, String templateType ) throws TemplateLocatorException
+    {
+        checkState();
+        return getTemplate(path, templateType, templateLocator, templateLocatorDescriptor);
+    }
+
+    public Configuration getTypeConfiguration( String type, String name, String location ) throws Exception
+    {
+        ArgUtil.assertNotNull(String.class, type, this, "getTypeConfiguration(String type, String name)");
+        ArgUtil.assertNotNull(String.class, name, this, "getTypeConfiguration(String type, String name)");
+        try
+        {
+            TemplateDescriptor locator = null;
+            if (location.equals("templates"))
+            {
+                locator = getTemplate(name + "/" + type + ".properties", type);
+            }
+            else if (location.equals("decorations"))
+            {
+                locator = getDecoration(name + "/decorator.properties", type);
+            }
+            else
+            {
+                throw new IllegalArgumentException("Location type " + location
+                        + " is not supported by getTypeConfiguration().");
+            }
+            return new PropertiesConfiguration(locator.getAbsolutePath());
+        }
+        catch (TemplateLocatorException e)
+        {
+            log.warn(e.toString(), e);
+            return null;
+        }
+    }
+
+    public TemplateDescriptor getDecoration( String path, String templateType ) throws TemplateLocatorException
+    {
+        checkState();
+        return getTemplate(path, templateType, decorationLocator, decorationLocatorDescriptor);
+    }
+
+    public String  includeTemplate( String template, String templateType ) throws IOException
+    {
+        checkState();
+        try
+        {
+            TemplateDescriptor useLocator = getTemplate(template, templateType);
+            return useLocator.getAppRelativePath();
+        }
+        catch (Exception e)
+        {
+            PrintWriter directError = new PrintWriter(renderResponse.getWriter());
+            directError.write("Error occured process includeTemplate(): " + e.toString() + "\n\n");
+            e.printStackTrace(directError);
+            directError.close();
+            return null;
+        }
+    }
+
+    public String  includeDecoration( String template, String templateType ) throws IOException
+    {
+        checkState();
+        try
+        {
+            return getDecoration(template, templateType).getAppRelativePath();        
+        }
+        catch (Exception e)
+        {
+            PrintWriter directError = new PrintWriter(renderResponse.getWriter());
+            directError.write("Error occured process includeDecoration(): " + e.toString() + "\n\n");
+            e.printStackTrace(directError);
+            directError.close();
+            return null;
+        }
+    }
+
+
+
+    /**
+     * <p>
+     * Decorate and include fragment content.
+     * </p>
+     * 
+     * @param f
+     *                  Fragment to include and decorate
+     * @throws Exception
+     * @return String path to the decorator.
+     */
+    public String  decorateAndInclude( ContentFragment f ) throws Exception
+    {
+        // makes sure that any previous content has been written to
+        // preserve natural HTML rendering order
+
+         setCurrentFragment(f);
+         setCurrentLayout();
+
+        // include decorated layout or portlet fragment
+        try
+        {
+            String fragmentType = f.getType();
+            return decorateAndIncludePortlet(f);         
+        }
+        catch (Exception e)
+        {
+            renderResponse.getWriter().write(e.toString());
+            return null;
+        }
+
+    }
+    
+    /**
+     * <p>
+     * The decorator template itself is responsible for including the content of
+     * the target Fragment which is easily acheived like so: <br />
+     * in Velocity:
+     * 
+     * <pre>
+     *   <code>
+     * $jetspeed.include($jetspeed.currentFragment)
+     * </code>
+     * </pre>
+     * 
+     * In JSP:
+     * 
+     * <pre>
+     *   <code>
+     * 
+     *             &lt;% 
+     *              JetspeedPowerTool jetspeed = new JetspeedPowerTool(renderRequest, renderResponse, portletConfig);
+     *              jetspeed.include(jetspeed.getCurrentFragment());
+     *             %&gt;
+     *  
+     * </code>
+     * </pre>
+     * 
+     * 
+     * @param f
+     *                  Portlet fragment to "decorate"
+     * @throws Exception
+     */
+    protected String decorateAndIncludePortlet( ContentFragment f ) throws Exception
+    {
+        // make sure that any previous content has been written to
+        // preserve natural HTML rendering order
+
+        // get fragment decorator; fallback to the default decorator
+        // if the current fragment is not specifically decorated
+        String fragmentType = f.getType();
+        String decorator = f.getDecorator();
+        if (decorator == null)
+        {
+            decorator = getPage().getDefaultDecorator(fragmentType);
+        }
+
+        // get fragment properties for fragmentType or generic
+        TemplateDescriptor propsTemp = getTemplate(decorator + "/" + DECORATOR_TYPE + ".properties", fragmentType,
+                decorationLocator, decorationLocatorDescriptor);
+        if (propsTemp == null)
+        {
+            fragmentType = GENERIC_TEMPLATE_TYPE;
+            propsTemp = getTemplate(decorator + "/" + DECORATOR_TYPE + ".properties", fragmentType, decorationLocator,
+                    decorationLocatorDescriptor);
+        }
+
+        // get decorator template
+        Configuration decoConf = new PropertiesConfiguration(propsTemp.getAbsolutePath());
+        String ext = decoConf.getString("template.extension");
+        String decoratorPath = decorator + "/" + DECORATOR_TYPE + ext;
+        TemplateDescriptor template = null;
+        try
+        {
+            template = getDecoration(decoratorPath, fragmentType);
+        }
+        catch (TemplateLocatorException e)
+        {
+            String parent = decoConf.getString("extends");
+            if (parent != null)
+            {
+                template = getDecoration(parent + "/" + DECORATOR_TYPE + ext, fragmentType);
+            }
+        }
+
+        return  template.getAppRelativePath();
+    }   
+    
+    
+
+    /**
+     * 
+     * 
+     * @throws java.lang.IllegalStateException
+     *                   if the <code>PortletConfig</code>,
+     *                   <code>RenderRequest</code> or <code>RenderReponse</code>
+     *                   is null.
+     */
+    protected void checkState()
+    {
+        if (portletConfig == null || renderRequest == null || renderResponse == null)
+        {
+            throw new IllegalStateException("JetspeedPowerTool has not been properly initialized.  " + ""
+                    + "The JetspeedPowerTool generally only usuable during the rendering phase of  "
+                    + "internal portlet applications.");
+        }
+    }
+
+    protected TemplateDescriptor getTemplate( String path, String templateType, TemplateLocator locator,
+            LocatorDescriptor descriptor ) throws TemplateLocatorException
+    {
+        checkState();
+        if (templateType == null)
+        {
+            templateType = GENERIC_TEMPLATE_TYPE;
+        }
+        try
+        {
+
+            descriptor.setName(path);
+            descriptor.setType(templateType);
+
+            TemplateDescriptor template = locator.locateTemplate(descriptor);
+            return template;
+        }
+        catch (TemplateLocatorException e)
+        {
+            log.error("Unable to locate template: " + path, e);
+            System.out.println("Unable to locate template: " + path);
+            throw e;
+        }
+    }
+
+    /**
+     * <p>
+     * handleError
+     * </p>
+     * 
+     * @param e
+     * @param msg
+     */
+    protected void handleError( Exception e, String msg, ContentFragment fragment )
+    {
+        log.error(msg, e);
+
+        Set exceptions = (Set) renderRequest.getAttribute(FRAGMENT_PROCESSING_ERROR_PREFIX + fragment.getId());
+        if (exceptions == null)
+        {
+            exceptions = new HashSet();
+            renderRequest.setAttribute(FRAGMENT_PROCESSING_ERROR_PREFIX + fragment.getId(), exceptions);
+        }
+        exceptions.add(e);
+
+    }
+
+    /**
+     * Gets the list of decorator actions for a window. Each window (on each
+     * page) has its own collection of actionAccess flags associated with it.
+     * 
+     * @return A list of actions available to the current window, filtered by
+     *              securty access and current state.
+     * @throws Exception
+     */
+    public List getDecoratorActions()
+    {
+        return getDecoratorActions(false);
+    }
+
+    /**
+     * Gets the list of decorator actions for a page. Each layout fragment on a
+     * page has its own collection of actionAccess flags associated with it.
+     * 
+     * @return A list of actions available to the current window, filtered by
+     *              securty access and current state.
+     * @throws Exception
+     */
+    public List getPageDecoratorActions() throws Exception
+    {
+        return getDecoratorActions(true);
+    }
+
+    protected List getDecoratorActions(boolean layout)
+    {
+        try
+        {
+            String key = getPage().getId();
+            boolean anonymous = !getLoggedOn();
+            PageActionAccess pageActionAccess = null;            
+            
+            synchronized (getRequestContext().getRequest().getSession())
+            {
+                Map sessionActions = (Map) getRequestContext().getSessionAttribute(POWER_TOOL_SESSION_ACTIONS);
+                if ( sessionActions == null )
+                {
+                    sessionActions = new HashMap();
+                    getRequestContext().setSessionAttribute(POWER_TOOL_SESSION_ACTIONS, sessionActions);
+                }
+                else
+                {
+                    pageActionAccess = (PageActionAccess)sessionActions.get(key);
+                }
+                if ( pageActionAccess == null )
+                {
+                    pageActionAccess = new PageActionAccess(anonymous, getPage());
+                    sessionActions.put(key, pageActionAccess);
+                }
+                else
+                {
+                    pageActionAccess.checkReset(getLoggedOn(), getPage());
+                }
+            }
+            
+            PortletDefinitionComposite portlet = (PortletDefinitionComposite) getCurrentPortletEntity()
+                    .getPortletDefinition();
+            if (null == portlet)
+            {
+                return Collections.EMPTY_LIST; // allow nothing
+            }
+
+            List actions = new ArrayList();
+
+            PortletMode mode = getPortletMode();
+            WindowState state = getWindowState();
+            
+            ContentTypeSet content = portlet.getContentTypeSet();
+            ContentFragment fragment = getCurrentFragment();
+            String fragmentId = fragment.getId();
+            String portletName = portlet.getUniqueName();
+            PortletWindow window = windowAccess.getPortletWindow(fragment);
+            String resourceBase = getPageBasePath();
+
+            if ( !layout )
+            {
+                if (state.equals(WindowState.NORMAL))
+                {
+                    if ( pageActionAccess.checkWindowState(fragmentId, portletName, WindowState.MINIMIZED))
+                    {
+                        actions.add(createWindowStateAction(window, JetspeedActions.MINIMIZE, WindowState.MINIMIZED, resourceBase));
+                    }
+                    if ( pageActionAccess.checkWindowState(fragmentId, portletName, WindowState.MAXIMIZED))
+                    {
+                        actions.add(createWindowStateAction(window, JetspeedActions.MAXIMIZE, WindowState.MAXIMIZED, resourceBase));
+                    }
+                }
+                else if (state.equals(WindowState.MAXIMIZED))
+                {
+                    if ( pageActionAccess.checkWindowState(fragmentId, portletName, WindowState.MINIMIZED))
+                    {
+                        actions.add(createWindowStateAction(window, JetspeedActions.MINIMIZE, WindowState.MINIMIZED, resourceBase));
+                    }
+                    if ( pageActionAccess.checkWindowState(fragmentId, portletName, JetspeedActions.RESTORED))
+                    {
+                        actions.add(createWindowStateAction(window, JetspeedActions.RESTORE, WindowState.NORMAL, resourceBase));
+                    }
+                }
+                else
+                // minimized
+                {
+                    if ( pageActionAccess.checkWindowState(fragmentId, portletName, WindowState.MAXIMIZED))
+                    {
+                        actions.add(createWindowStateAction(window, JetspeedActions.MAXIMIZE, WindowState.MAXIMIZED, resourceBase));
+                    }
+                    if ( pageActionAccess.checkWindowState(fragmentId, portletName, JetspeedActions.RESTORED))
+                    {
+                        actions.add(createWindowStateAction(window, JetspeedActions.RESTORE, WindowState.NORMAL, resourceBase));
+                    }
+                }
+            }
+            
+            if ( !layout || pageActionAccess.isEditAllowed() )
+            {
+                if (mode.equals(PortletMode.VIEW))
+                {
+                    if (content.supportsPortletMode(PortletMode.EDIT) && pageActionAccess.isEditAllowed() && 
+                            pageActionAccess.checkPortletMode(fragmentId, portletName, PortletMode.EDIT))
+                    {
+                        actions.add(createPortletModeAction(window, JetspeedActions.EDIT, PortletMode.EDIT, resourceBase));
+                    }
+                    if (content.supportsPortletMode(PortletMode.HELP) && 
+                            pageActionAccess.checkPortletMode(fragmentId, portletName, PortletMode.HELP))
+                    {
+                        actions.add(createPortletModeAction(window, JetspeedActions.HELP, PortletMode.HELP, resourceBase));
+                    }
+                }
+                else if (mode.equals(PortletMode.EDIT))
+                {
+                    if (pageActionAccess.checkPortletMode(fragmentId, portletName, PortletMode.VIEW))
+                    {
+                        actions.add(createPortletModeAction(window, JetspeedActions.VIEW, PortletMode.VIEW, resourceBase));
+                    }
+                    if (content.supportsPortletMode(PortletMode.HELP) && 
+                            pageActionAccess.checkPortletMode(fragmentId, portletName, PortletMode.HELP))
+                    {
+                        actions.add(createPortletModeAction(window, JetspeedActions.HELP, PortletMode.HELP, resourceBase));
+                    }
+                }
+                else
+                // help
+                {
+                    if (pageActionAccess.checkPortletMode(fragmentId, portletName, PortletMode.VIEW))
+                    {
+                        actions.add(createPortletModeAction(window, JetspeedActions.VIEW, PortletMode.VIEW, resourceBase));
+                    }
+                    if (content.supportsPortletMode(PortletMode.EDIT) && pageActionAccess.isEditAllowed() && 
+                            pageActionAccess.checkPortletMode(fragmentId, portletName, PortletMode.EDIT))
+                    {
+                        actions.add(createPortletModeAction(window, JetspeedActions.EDIT, PortletMode.EDIT, resourceBase));
+                    }
+                }
+            }
+
+            return actions;
+        }
+        catch (Exception e)
+        {
+            log.warn("Unable to generate decortator actions: " + e.toString());
+            return Collections.EMPTY_LIST;
+        }
+    }
+
+    protected DecoratorAction createDecoratorAction( String resourceBase, String actionName )
+    {
+        // TODO: HARD-CODED .gif link
+        String link = renderResponse.encodeURL(resourceBase+"/content/images/"+actionName+".gif");
+        return new DecoratorAction(actionName, actionName, link); 
+    }
+    
+    /**
+     * Creates a Decorator PortletMode Action to be added to the list of actions
+     * decorating a portlet.
+     */
+    protected DecoratorAction createPortletModeAction( PortletWindow window, String actionName, PortletMode mode, String resourceBase )
+    {
+        DecoratorAction action = createDecoratorAction(resourceBase, actionName);
+        PortalURL portalURL = getRequestContext().getPortalURL(); 
+        action.setAction(renderResponse.encodeURL(portalURL.createPortletURL(window, mode, null, portalURL.isSecure()).toString()));
+        return action;
+    }
+
+    /**
+     * Creates a Decorator WindowState Action to be added to the list of actions
+     * decorating a portlet.
+     */
+    protected DecoratorAction createWindowStateAction( PortletWindow window, String actionName, WindowState state, String resourceBase )
+    {
+        DecoratorAction action = createDecoratorAction(resourceBase, actionName);
+        PortalURL portalURL = getRequestContext().getPortalURL(); 
+        action.setAction(renderResponse.encodeURL(portalURL.createPortletURL(window, null, state, portalURL.isSecure()).toString()));
+        return action;
+    }
+
+    /**
+     * 
+     * <p>
+     * getTitle
+     * </p>
+     * Returns the appropriate for the title based on locale prferences
+     * 
+     * @param entity
+     * @return
+     */
+    public String getTitle( PortletEntity entity, ContentFragment f )
+    {
+        String title = null;
+
+        String override = (String)getRequestContext().getRequest().getAttribute(
+                PortalReservedParameters.OVERRIDE_PORTLET_TITLE_ATTR
+                        + "::entity.id::" + entity.getId());
+        if (override != null)
+        {
+            title = override;
+        }
+        else if (f != null)
+        {
+            title = f.getTitle();
+        }
+
+        if(title == null)
+        {
+            title = getTitle(entity);
+        }
+
+        return title;
+    }
+
+    /**
+     * 
+     * <p>
+     * getTitle
+     * </p>
+     * Returns the appropriate for the title based on locale prferences
+     * 
+     * @param entity
+     * @return
+     */
+    public String getTitle( PortletEntity entity )
+    {
+        String title = null;
+        if (entity != null && entity.getPortletDefinition() != null)
+        {
+            title = getRequestContext().getPreferedLanguage(entity.getPortletDefinition()).getTitle();
+        }
+        
+        if (title == null && entity.getPortletDefinition() != null)
+        {
+            title = entity.getPortletDefinition().getName();
+        }
+        else if (title == null)
+        {
+            title = "Invalid portlet entity "+entity.getId();
+        }
+        return title;
+    }
+
+    public Object getComponent( String name )
+    {
+        return Jetspeed.getComponentManager().getComponent(name);
+    }
+
+    public String getAbsoluteUrl( String relativePath )
+    {
+        // only rewrite a non-absolute url
+        if ( relativePath != null && relativePath.indexOf("://") == -1)
+        {
+          HttpServletRequest request = getRequestContext().getRequest();
+          StringBuffer path = new StringBuffer();
+          return renderResponse.encodeURL(path.append(request.getScheme()).append("://").append(request.getServerName()).append(":").append(
+                  request.getServerPort()).append(request.getContextPath()).append(request.getServletPath()).append(
+                  relativePath).toString());
+        }
+        else
+        {
+            return relativePath;
+        }
+    }
+
+    public Subject getSubject()
+    {
+        return requestContext.getSubject();
+    }
+    
+    public boolean getLoggedOn()
+    {
+        Principal principal = requestContext.getRequest().getUserPrincipal();
+        return (principal != null);
+    }
+    
+    public String getBasePath()
+    {
+        return getRequestContext().getPortalURL().getBasePath();
+    }
+    
+    public String getPageBasePath()
+    {
+        return getRequestContext().getPortalURL().getPageBasePath();
+    }
+    
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org


Mime
View raw message