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 [10/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/PortletApplicationWar.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletApplicationWar.java?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletApplicationWar.java (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletApplicationWar.java Tue Jul  5 14:55:37 2005
@@ -0,0 +1,709 @@
+/*
+ * 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.util.descriptor;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.Jetspeed;
+import org.apache.jetspeed.om.common.portlet.MutablePortletApplication;
+import org.apache.jetspeed.om.common.servlet.MutableWebApplication;
+import org.apache.jetspeed.tools.deploy.JetspeedWebApplicationRewriter;
+import org.apache.jetspeed.tools.pamanager.PortletApplicationException;
+import org.apache.jetspeed.util.DirectoryHelper;
+import org.apache.jetspeed.util.FileSystemHelper;
+import org.apache.pluto.om.common.SecurityRoleRef;
+import org.apache.pluto.om.common.SecurityRoleRefSet;
+import org.apache.pluto.om.common.SecurityRoleSet;
+import org.apache.pluto.om.portlet.PortletDefinition;
+import org.jdom.Document;
+import org.jdom.input.SAXBuilder;
+import org.jdom.output.Format;
+import org.jdom.output.XMLOutputter;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * <p>
+ * This class facilitates operations a portlet applications WAR file or WAR
+ * file-like structure.
+ * </p>
+ * <p>
+ * This class is utility class used mainly implementors of
+ * {@link org.apache.jetspeed.pamanager.Deployment}and
+ * {@link org.apache.jetspeed.pamanager.Registration}to assist in deployment
+ * and undeployment of portlet applications.
+ * 
+ * @author <a href="mailto:sweaver@einnovation.com">Scott T. Weaver </a>
+ * @author <a href="mailto:mavery@einnovation.com">Matt Avery </a>
+ * @version $Id: PortletApplicationWar.java,v 1.10 2004/07/06 16:56:19 weaver
+ *          Exp $
+ */
+public class PortletApplicationWar
+{
+    protected static final String WEB_XML_STRING = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>" +
+            "<!DOCTYPE web-app " +
+            "PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' " + 
+           "'http://java.sun.com/dtd/web-app_2_3.dtd'>\n" +
+            "<web-app></web-app>";
+
+    protected static final String PORTLET_XML_PATH = "WEB-INF/portlet.xml";
+    protected static final String WEB_XML_PATH = "WEB-INF/web.xml";
+    protected static final String EXTENDED_PORTLET_XML_PATH = "WEB-INF/jetspeed-portlet.xml";
+
+    public static final String JETSPEED_SERVLET_XPATH = "/web-app/servlet/servlet-name[contains(child::text(), \"JetspeedContainer\")]";
+    public static final String JETSPEED_SERVLET_MAPPING_XPATH = "/web-app/servlet-mapping/servlet-name[contains(child::text(), \"JetspeedContainer\")]";
+
+    protected static final Log log = LogFactory.getLog("deployment");
+
+    protected String paName;
+    protected String webAppContextRoot;
+    protected FileSystemHelper warStruct;
+    private MutableWebApplication webApp;
+    private MutablePortletApplication portletApp;
+    private long paChecksum;
+    protected final List openedResources;
+
+    protected static final String[] ELEMENTS_BEFORE_SERVLET = new String[]{"icon", "display-name", "description",
+            "distributable", "context-param", "filter", "filter-mapping", "listener", "servlet"};
+    protected static final String[] ELEMENTS_BEFORE_SERVLET_MAPPING = new String[]{"icon", "display-name",
+            "description", "distributable", "context-param", "filter", "filter-mapping", "listener", "servlet",
+            "servlet-mapping"};
+
+    /**
+     * @param warFile
+     *            {@link org.apache.jetspeed.util.FileSystemHelper}representing
+     *            the WAR file we are working with. This
+     *            <code>FileSystemHelper</code> can be an actual WAR file or a
+     *            directory structure layed out in a WAR-like fashion. name of
+     *            the portlet application the <code>warPath</code> contains
+     * @param webAppContextRoot
+     *            context root relative to the servlet container of this app
+     * @throws IOException
+     */
+    public PortletApplicationWar( FileSystemHelper warStruct, String paName, String webAppContextRoot )
+            throws IOException
+    {
+        validatePortletApplicationName(paName);
+
+        this.paName = paName;
+        this.webAppContextRoot = webAppContextRoot;
+        this.openedResources = new ArrayList();
+        this.warStruct = warStruct;
+        this.paChecksum = warStruct.getChecksum(PORTLET_XML_PATH);
+        if (paChecksum == 0)
+        {
+          throw new IOException("Cannot find required "+PORTLET_XML_PATH+" for Portlet Application "+paName);
+        }
+    }
+
+    public long getPortletApplicationChecksum()
+    {
+      return paChecksum;
+    }
+
+    /**
+     * <p>
+     * validatePortletApplicationName
+     * </p>
+     * 
+     * @param paName
+     */
+    private void validatePortletApplicationName( String paName )
+    {
+        if (paName == null || paName.startsWith("/") || paName.startsWith("\\") || paName.endsWith("/")
+                || paName.endsWith("\\"))
+        {
+            throw new IllegalStateException("Invalid paName \"" + paName
+                    + "\".  paName cannot be null nor can it begin nor end with any slashes.");
+        }
+    }
+
+    /**
+     * 
+     * <p>
+     * createWebApp
+     * </p>
+     * Creates a web applicaiton object based on the values in this WAR's
+     * WEB-INF/web.xml
+     * 
+     * @return @throws
+     *         PortletApplicationException
+     * @throws IOException
+     * @see org.apache.jetspeed.util.descriptor.WebApplicationDescriptor
+     */
+    public MutableWebApplication createWebApp() throws PortletApplicationException, IOException
+    {
+        Reader webXmlReader = getReader(WEB_XML_PATH);
+
+        try
+        {
+            WebApplicationDescriptor webAppDescriptor = new WebApplicationDescriptor(webXmlReader, webAppContextRoot);
+            webApp = webAppDescriptor.createWebApplication();
+            return webApp;
+        }
+
+        finally
+        {
+            try
+            {
+                if (webXmlReader != null)
+                {
+                    webXmlReader.close();
+                }
+            }
+            catch (IOException e1)
+            {
+                e1.printStackTrace();
+            }
+        }
+
+    }
+
+    /**
+     * 
+     * <p>
+     * createPortletApp
+     * </p>
+     * Creates a portlet application object based of the WAR file's
+     * WEB-INF/portlet.xml
+     * 
+     * @return @throws
+     *         PortletApplicationException
+     * @throws IOException
+     * @see org.apache.jetspeed.uitl.descriptor.PortletApplicationDescriptor
+     */
+    public MutablePortletApplication createPortletApp(ClassLoader classLoader) throws PortletApplicationException, IOException
+    {
+        Reader portletXmlReader = getReader(PORTLET_XML_PATH);
+        
+        try
+        {
+            PortletApplicationDescriptor paDescriptor = new PortletApplicationDescriptor(portletXmlReader, paName);
+            portletApp = paDescriptor.createPortletApplication(classLoader);
+            // validate(portletApplication);
+            Reader extMetaDataXml = null;
+            try
+            {
+                extMetaDataXml = getReader(EXTENDED_PORTLET_XML_PATH);
+                if (extMetaDataXml != null)
+                {
+                    ExtendedPortletMetadata extMetaData = new ExtendedPortletMetadata(extMetaDataXml, portletApp);
+                    extMetaData.load();
+                }
+            }
+            catch (IOException e)
+            {
+                if ( e instanceof FileNotFoundException )
+                {
+                    log.info("No extended metadata found.");
+                }
+                else
+                {
+                    log.warn("Failed to load existing metadata: " + e.toString());
+                }
+            }
+            catch (MetaDataException e)
+            {
+                log.warn("Failed to load existing metadata.  " + e.toString(), e);
+            }
+            finally
+            {
+                if (null != extMetaDataXml)
+                {
+                    extMetaDataXml.close();
+                }
+            }
+            portletApp.setChecksum(paChecksum);
+            return portletApp;
+        }
+        finally
+        {
+            if (portletXmlReader != null)
+            {
+                portletXmlReader.close();
+            }
+        }
+    }
+
+    public MutablePortletApplication createPortletApp() 
+    throws PortletApplicationException, IOException
+    {
+        return createPortletApp(this.getClass().getClassLoader());
+    }
+    
+    /**
+     * 
+     * <p>
+     * getReader
+     * </p>
+     * Returns a <code>java.io.Reader</code> to a resource within this WAR's
+     * structure.
+     * 
+     * @param path
+     *            realtive to an object within this WAR's file structure
+     * @return java.io.Reader to the file within the WAR
+     * @throws IOException
+     *             if the path does not exist or there was a problem reading the
+     *             WAR.
+     *  
+     */
+    protected Reader getReader( String path ) throws IOException
+    {
+        return new InputStreamReader(getInputStream(path));
+    }
+
+    /**
+     * 
+     * <p>
+     * getInputStream
+     * </p>
+     * 
+     * Returns a <code>java.io.InputStream</code> to a resource within this
+     * WAR's structure.
+     * 
+     * @param path
+     *            realtive to an object within this WAR's file structure
+     * @return java.io.InputStream to the file within the WAR
+     * @throws IOException
+     *             if the path does not exist or there was a problem reading the
+     *             WAR.
+     */
+    protected InputStream getInputStream( String path ) throws IOException
+    {
+        File child = new File(warStruct.getRootDirectory(), path);
+        if (child == null || !child.exists())
+        {
+            throw new FileNotFoundException("Unable to locate file or path " + child);
+        }
+
+        FileInputStream fileInputStream = new FileInputStream(child);
+        openedResources.add(fileInputStream);
+        return fileInputStream;
+    }
+
+    /**
+     * 
+     * <p>
+     * getOutputStream
+     * </p>
+     * 
+     * Returns a <code>java.io.OutputStream</code> to a resource within this
+     * WAR's structure.
+     * 
+     * @param path
+     *            realtive to an object within this WAR's file structure
+     * @return java.io.Reader to the file within the WAR
+     * @throws IOException
+     *             if the path does not exist or there was a problem reading the
+     *             WAR.
+     */
+    protected OutputStream getOutputStream( String path ) throws IOException
+    {
+        File child = new File(warStruct.getRootDirectory(), path);
+        if (child == null)             
+        {
+            throw new FileNotFoundException("Unable to locate file or path " + child);
+        }
+        FileOutputStream fileOutputStream = new FileOutputStream(child);
+        openedResources.add(fileOutputStream);
+        return fileOutputStream;
+    }
+
+    protected Writer getWriter( String path ) throws IOException
+    {
+        return new OutputStreamWriter(getOutputStream(path));
+    }
+
+    /**
+     * 
+     * <p>
+     * copyWar
+     * </p>
+     * Copies the entire WAR structure to the path defined in
+     * <code>targetAppRoot</code>
+     * 
+     * @param targetAppRoot
+     *            target to copy this WAR's content to. If the path ends in
+     *            <code>.war</code> or <code>.jar</code>. The war will be
+     *            copied into that file in jar format.
+     * @return PortletApplicationWar representing the newly created WAR.
+     * @throws IOException
+     */
+    public PortletApplicationWar copyWar( String targetAppRoot ) throws IOException
+    {
+        // FileObject target = fsManager.resolveFile(new
+        // File(targetAppRoot).getAbsolutePath());
+        FileSystemHelper target = new DirectoryHelper(new File(targetAppRoot));
+        try
+        {
+            target.copyFrom(warStruct.getRootDirectory());
+
+            return new PortletApplicationWar(target, paName, webAppContextRoot);
+
+        }
+        catch (IOException e)
+        {
+            throw e;
+        }
+        finally
+        {
+            target.close();
+
+        }
+    }
+
+    /**
+     * 
+     * <p>
+     * removeWar
+     * </p>
+     * Deletes this WAR. If the WAR is a file structure and not an actual WAR
+     * file, all children are delted first, then the directory is removed.
+     * 
+     * @throws IOException
+     *             if there is an error removing the WAR from the file system.
+     */
+    public void removeWar() throws IOException
+    {
+        if (warStruct.getRootDirectory().exists())
+        {
+            warStruct.remove();
+        }
+        else
+        {
+            throw new FileNotFoundException("PortletApplicationWar ," + warStruct.getRootDirectory()
+                    + ", does not exist.");
+        }
+    }
+
+    /**
+     * Validate a PortletApplicationDefinition tree AFTER its
+     * WebApplicationDefinition has been loaded. Currently, only the security
+     * role references of the portlet definitions are validated:
+     * <ul>
+     * <li>A security role reference should reference a security role through a
+     * roleLink. A warning message is logged if a direct reference is used.
+     * <li>For a security role reference a security role must be defined in the
+     * web application. An error message is logged and a
+     * PortletApplicationException is thrown if not.
+     * </ul>
+     * 
+     * @throws PortletApplicationException
+     */
+    public void validate() throws PortletApplicationException
+    {
+        if (portletApp == null || webApp == null)
+        {
+            throw new IllegalStateException(
+                    "createWebApp() and createPortletApp() must be called before invoking validate()");
+        }
+
+        SecurityRoleSet roles = webApp.getSecurityRoles();
+        Collection portlets = portletApp.getPortletDefinitions();
+        Iterator portletIterator = portlets.iterator();
+        while (portletIterator.hasNext())
+        {
+            PortletDefinition portlet = (PortletDefinition) portletIterator.next();
+            SecurityRoleRefSet securityRoleRefs = portlet.getInitSecurityRoleRefSet();
+            Iterator roleRefsIterator = securityRoleRefs.iterator();
+            while (roleRefsIterator.hasNext())
+            {
+                SecurityRoleRef roleRef = (SecurityRoleRef) roleRefsIterator.next();
+                String roleName = roleRef.getRoleLink();
+                if (roleName == null || roleName.length() == 0)
+                {
+                    roleName = roleRef.getRoleName();
+                }
+                if (roles.get(roleName) == null)
+                {
+                    String errorMsg = "Undefined security role " + roleName + " referenced from portlet "
+                            + portlet.getName();
+                    throw new PortletApplicationException(errorMsg);
+                }
+            }
+        }
+    }
+
+    /**
+     * 
+     * <p>
+     * processWebXML
+     * </p>
+     * 
+     * Infuses this PortletApplicationWar's web.xml file with
+     * <code>servlet</code> and a <code>servlet-mapping</code> element for
+     * the JetspeedContainer servlet. This is only done if the descriptor does
+     * not already contain these items.
+     * 
+     * @throws MetaDataException
+     *             if there is a problem infusing
+     */
+    public void processWebXML() throws MetaDataException
+    {
+        SAXBuilder builder = new SAXBuilder();
+        Writer webXmlWriter = null;
+        InputStream webXmlIn = null;
+
+        try
+        {
+            // Use the local dtd instead of remote dtd. This
+            // allows to deploy the application offline
+            builder.setEntityResolver(new EntityResolver()
+            {
+                public InputSource resolveEntity( java.lang.String publicId, java.lang.String systemId )
+                        throws SAXException, java.io.IOException
+                {
+
+                    if (systemId.equals("http://java.sun.com/dtd/web-app_2_3.dtd"))
+                    {
+                        return new InputSource(getClass().getResourceAsStream("web-app_2_3.dtd"));
+                    }
+                    else return null;
+                }
+            });
+
+            Document doc = null;
+            
+            try
+            {
+                webXmlIn = getInputStream(WEB_XML_PATH);
+                doc = builder.build(webXmlIn);
+            }
+            catch (FileNotFoundException fnfe)
+            {
+                // web.xml does not exist, create it
+                File file = File.createTempFile("j2-temp-", ".xml");
+                FileWriter writer = new FileWriter(file);
+                writer.write(WEB_XML_STRING);
+                writer.close();
+                doc = builder.build(file);
+                file.delete();
+            }
+            
+            
+            if (webXmlIn != null)
+            {
+                webXmlIn.close();
+            }
+
+
+            JetspeedWebApplicationRewriter rewriter = new JetspeedWebApplicationRewriter(doc);
+            rewriter.processWebXML();
+            
+            if (rewriter.isChanged())
+            {
+                System.out.println("Writing out infused web.xml for " + paName);
+                XMLOutputter output = new XMLOutputter(Format.getPrettyFormat());
+                webXmlWriter = getWriter(WEB_XML_PATH);
+                output.output(doc, webXmlWriter);
+                webXmlWriter.flush();
+
+            }
+            
+            if(rewriter.isPortletTaglibAdded())
+            {
+                //add portlet tag lib to war
+                String path = Jetspeed.getRealPath("WEB-INF/tld");
+                if (path != null)
+                {
+                    File portletTaglibDir = new File(path);
+                    File child = new File(warStruct.getRootDirectory(), "WEB-INF/tld");
+                    DirectoryHelper dh = new DirectoryHelper(child);
+                    dh.copyFrom(portletTaglibDir, new FileFilter(){
+
+                        public boolean accept(File pathname)
+                        {
+                            return pathname.getName().indexOf("portlet.tld") != -1;
+                        }                    
+                    });                
+                    dh.close();
+                }
+            }
+
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            throw new MetaDataException("Unable to process web.xml for infusion " + e.toString(), e);
+        }
+        finally
+        {
+            if (webXmlWriter != null)
+            {
+                try
+                {
+                    webXmlWriter.close();
+                }
+                catch (IOException e1)
+                {
+
+                }
+            }
+
+            if (webXmlIn != null)
+            {
+                try
+                {
+                    webXmlIn.close();
+                }
+                catch (IOException e1)
+                {
+
+                }
+            }
+        }
+
+    }
+
+
+    /**
+     * 
+     * <p>
+     * close
+     * </p>
+     * Closes any resource this PortletApplicationWar may have opened.
+     * 
+     * @throws IOException
+     */
+    public void close() throws IOException
+    {
+
+        Iterator resources = openedResources.iterator();
+        while (resources.hasNext())
+        {
+            try
+            {
+                Object res = resources.next();
+                if (res instanceof InputStream)
+                {
+                    ((InputStream) res).close();
+                }
+                else if (res instanceof OutputStream)
+                {
+                    ((OutputStream) res).close();
+                }
+            }
+            catch (Exception e)
+            {
+
+            }
+        }
+
+    }
+
+    /**
+     * 
+     * <p>
+     * createClassloader
+     * </p>
+     * 
+     * Use this method to create a classloader based on this wars structure.
+     * I.e. it will create a ClassLoader containing the contents of
+     * WEB-INF/classes and WEB-INF/lib and the ClassLoader will be searched in
+     * that order.
+     * 
+     * 
+     * @param parent
+     *            Parent ClassLoader. Can be <code>null</code>
+     * @return @throws
+     *         IOException
+     */
+    public ClassLoader createClassloader( ClassLoader parent ) throws IOException
+    {
+        ArrayList urls = new ArrayList();
+        File webInfClasses = null;
+
+        webInfClasses = new File(warStruct.getRootDirectory(), ("WEB-INF/classes/"));
+        if (webInfClasses.exists())
+        {
+            log.info("Adding " + webInfClasses.toURL() + " to class path.");
+            urls.add(webInfClasses.toURL());
+        }
+
+        File webInfLib = new File(warStruct.getRootDirectory(), "WEB-INF/lib");
+
+        if (webInfLib.exists())
+        {
+            File[] jars = webInfLib.listFiles();
+
+            for (int i = 0; i < jars.length; i++)
+            {
+                File jar = jars[i];
+                log.info("Adding " + jar.toURL() + " to class path.");
+                urls.add(jar.toURL());
+            }
+        }
+
+        return new URLClassLoader((URL[]) urls.toArray(new URL[urls.size()]), parent);
+    }
+
+    /**
+     * @return Returns the paName.
+     */
+    public String getPortletApplicationName()
+    {
+        return paName;
+    }
+
+    /**
+     * 
+     * <p>
+     * getDeployedPath
+     * </p>
+     * 
+     * @return A string representing the path to this WAR in the form of a URL
+     *         or <code>null</code> is the URL could not be created.
+     */
+    public String getDeployedPath()
+    {
+        try
+        {
+            return warStruct.getRootDirectory().toURL().toExternalForm();
+        }
+        catch (MalformedURLException e)
+        {
+            return null;
+        }
+    }
+    
+    public FileSystemHelper getFileSystem()
+    {
+        return warStruct;
+    }
+}

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletPreferenceRule.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletPreferenceRule.java?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletPreferenceRule.java (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletPreferenceRule.java Tue Jul  5 14:55:37 2005
@@ -0,0 +1,114 @@
+/*
+ * 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.util.descriptor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.digester.Rule;
+import org.apache.jetspeed.om.common.portlet.PortletDefinitionComposite;
+import org.apache.jetspeed.om.preference.impl.PrefsPreference;
+import org.apache.pluto.om.portlet.PortletApplicationDefinition;
+import org.xml.sax.Attributes;
+
+/**
+ * @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a>
+ */
+public class PortletPreferenceRule extends Rule
+{
+    
+
+    protected PortletDefinitionComposite portlet;
+    
+    protected String name;
+    protected boolean readOnly;
+    protected List values; 
+ 
+    /**
+     * <p>
+     * begin
+     * </p>
+     *
+     * @see org.apache.commons.digester.Rule#begin(java.lang.String, java.lang.String, org.xml.sax.Attributes)
+     * @param arg0
+     * @param arg1
+     * @param arg2
+     * @throws java.lang.Exception
+     */
+    public void begin( String arg0, String arg1, Attributes arg2 ) throws Exception
+    {
+        Object peeked = digester.peek();
+        portlet = (PortletDefinitionComposite) peeked;
+        portlet.setPortletApplicationDefinition((PortletApplicationDefinition) digester.getRoot());
+        
+        values = new ArrayList();
+        
+        TempValueObject temp = new TempValueObject();
+        digester.push(temp);
+    }
+    /**
+     * <p>
+     * end
+     * </p>
+     *
+     * @see org.apache.commons.digester.Rule#end(java.lang.String, java.lang.String)
+     * @param arg0
+     * @param arg1
+     * @throws java.lang.Exception
+     */
+    public void end( String arg0, String arg1 ) throws Exception
+    {       
+        PrefsPreference pref = new PrefsPreference(portlet, name);
+        pref.setValues(values);
+        pref.setReadOnly(readOnly);
+        digester.pop();
+    }
+    
+    public class TempValueObject
+    {
+        public void setName(String name)
+        {
+            PortletPreferenceRule.this.name = name;
+        }
+        
+        public void setReadOnly(boolean readOnly)
+        {
+            PortletPreferenceRule.this.readOnly = readOnly;
+        }
+        
+        public void addValue(String value)
+        {
+            PortletPreferenceRule.this.values.add(value);
+        }
+    }
+  
+    /**
+     * <p>
+     * finish
+     * </p>
+     *
+     * @see org.apache.commons.digester.Rule#finish()
+     * @throws java.lang.Exception
+     */
+    public void finish() throws Exception
+    {
+        if(values != null)
+        {
+            values.clear();
+        }
+        super.finish();
+    }
+}

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletPreferenceRuleSet.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletPreferenceRuleSet.java?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletPreferenceRuleSet.java (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletPreferenceRuleSet.java Tue Jul  5 14:55:37 2005
@@ -0,0 +1,50 @@
+/*
+ * 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.util.descriptor;
+
+import org.apache.commons.digester.Digester;
+import org.apache.commons.digester.RuleSetBase;
+
+/**
+ * @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a>
+ */
+public class PortletPreferenceRuleSet extends RuleSetBase
+{
+
+  
+
+    /**
+     * <p>
+     * addRuleInstances
+     * </p>
+     *
+     * @see org.apache.commons.digester.RuleSet#addRuleInstances(org.apache.commons.digester.Digester)
+     * @param arg0
+     */
+    public void addRuleInstances( Digester digester )
+    {
+       digester.addRule("portlet-app/portlet/portlet-preferences/preference", new PortletPreferenceRule());
+       digester.addBeanPropertySetter("portlet-app/portlet/portlet-preferences/preference/name", "name");
+       digester.addCallMethod("portlet-app/portlet/portlet-preferences/preference/value", "addValue", 0);
+       digester.addCallMethod(
+           "portlet-app/portlet/portlet-preferences/preference/read-only",
+           "setReadOnly",
+           0,
+           new Class[] { Boolean.class });
+
+    }
+
+}

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletRule.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletRule.java?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletRule.java (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletRule.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.util.descriptor;
+
+import org.apache.commons.digester.Rule;
+import org.apache.jetspeed.om.portlet.impl.PortletApplicationDefinitionImpl;
+import org.apache.jetspeed.om.portlet.impl.PortletDefinitionImpl;
+import org.xml.sax.Attributes;
+
+/**
+ * @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a>
+ */
+public class PortletRule extends Rule
+{
+
+    /**
+     * <p>
+     * begin
+     * </p>
+     *
+     * @see org.apache.commons.digester.Rule#begin(java.lang.String, java.lang.String, org.xml.sax.Attributes)
+     * @param arg0
+     * @param arg1
+     * @param arg2
+     * @throws java.lang.Exception
+     */
+    public void begin( String arg0, String arg1, Attributes arg2 ) throws Exception
+    {
+        PortletDefinitionImpl portlet = new PortletDefinitionImpl();
+        PortletApplicationDefinitionImpl app = (PortletApplicationDefinitionImpl) digester.getRoot();
+        app.addPortletDefinition(portlet);
+        digester.push(portlet);
+    }
+    /**
+     * <p>
+     * end
+     * </p>
+     *
+     * @see org.apache.commons.digester.Rule#end(java.lang.String, java.lang.String)
+     * @param arg0
+     * @param arg1
+     * @throws java.lang.Exception
+     */
+    public void end( String arg0, String arg1 ) throws Exception
+    {
+        digester.pop();
+    }
+}

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/WebApplicationDescriptor.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/WebApplicationDescriptor.java?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/WebApplicationDescriptor.java (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/WebApplicationDescriptor.java Tue Jul  5 14:55:37 2005
@@ -0,0 +1,101 @@
+/*
+ * 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.util.descriptor;
+
+import java.io.Reader;
+
+import org.apache.commons.digester.Digester;
+import org.apache.jetspeed.om.common.servlet.MutableWebApplication;
+import org.apache.jetspeed.om.servlet.impl.SecurityRoleImpl;
+import org.apache.jetspeed.om.servlet.impl.WebApplicationDefinitionImpl;
+import org.apache.jetspeed.tools.pamanager.PortletApplicationException;
+import org.apache.jetspeed.util.JetspeedLocale;
+
+/**
+ * Utilities for manipulating the web.xml deployment descriptor
+ * 
+ * @author <a href="mailto:ate@douma.nu">Ate Douma </a>*
+ * @version $Id: WebDescriptorUtilities.java,v 1.2 2004/05/12 22:25:04 taylor
+ *                Exp $
+ */
+public class WebApplicationDescriptor
+{
+
+    protected Reader webXmlReader;
+    protected String contextRoot;
+    public WebApplicationDescriptor(Reader webXmlReader, String contextRoot )
+    {
+        if(webXmlReader == null)
+        {
+            throw new IllegalArgumentException("webXmlReader cannot be null");
+        }
+        this.webXmlReader = webXmlReader;
+        this.contextRoot = contextRoot;
+    }
+    
+
+    /**
+     * Load a web.xml file into a Web Application tree
+     * 
+     * @param pathWebXML
+     *                  The path to the web.xml file
+     * @param contexRoot
+     *                  The context root of the web application
+     * @param locale
+     *                  The locale of the display name of the web application
+     * @param displayName
+     *                  The display name of the web application
+     * @return The Java object tree representing web.xml
+     */
+    public MutableWebApplication createWebApplication() throws PortletApplicationException
+    {
+        try
+        {
+
+            // TODO move config to digester-rules.xml. Example:
+            // http://www.onjava.com/pub/a/onjava/2002/10/23/digester.html?page=3
+            Digester digester = new Digester();
+            digester.setClassLoader(this.getClass().getClassLoader());
+            digester.setValidating(false);
+  
+            digester.register("-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN", WebApplicationDescriptor.class
+                    .getResource("web-app_2_2.dtd").toString());
+            digester.register("-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN", WebApplicationDescriptor.class
+                    .getResource("web-app_2_3.dtd").toString());
+                    
+            digester.addObjectCreate("web-app", WebApplicationDefinitionImpl.class);
+
+            digester.addObjectCreate("web-app/security-role", SecurityRoleImpl.class);
+            digester.addBeanPropertySetter("web-app/security-role/description", "description");
+            digester.addBeanPropertySetter("web-app/security-role/role-name", "roleName");
+            digester.addSetNext("web-app/security-role", "addSecurityRole");
+
+            WebApplicationDefinitionImpl wd = (WebApplicationDefinitionImpl) digester.parse(webXmlReader);
+
+            wd.setContextRoot(contextRoot);
+            //wd.addDescription(locale, displayName);
+            wd.addDescription(JetspeedLocale.getDefaultLocale(), contextRoot);
+            return wd;
+
+        }
+        catch (Throwable t)
+        {            
+            String msg = "Could not digester web.xml." + t.toString();            
+            throw new PortletApplicationException(msg, t);
+        }
+    }
+
+}

Added: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/web-app_2_2.dtd
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/web-app_2_2.dtd?rev=209328&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/web-app_2_2.dtd (added)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/web-app_2_2.dtd Tue Jul  5 14:55:37 2005
@@ -0,0 +1,565 @@
+
+<!--
+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*, servlet*, servlet-mapping*, session-config?,
+mime-mapping*, welcome-file-list?, error-page*, taglib*,
+resource-ref*, security-constraint*, login-config?, security-role*,
+env-entry*, ejb-ref*)>
+
+<!--
+The icon element contains a small-icon and a large-icon element
+which specify the location within the web application for a small and
+large image used to represent the web application in a GUI tool. At a
+minimum, tools must accept GIF and JPEG format images.
+-->
+
+<!ELEMENT icon (small-icon?, large-icon?)>
+
+<!--
+The small-icon element contains the location within the web
+application of a file containing a small (16x16 pixel) icon image.
+-->
+
+<!ELEMENT small-icon (#PCDATA)>
+
+<!--
+The large-icon element contains the location within the web
+application of a file containing a large (32x32 pixel) icon image.
+-->
+
+<!ELEMENT large-icon (#PCDATA)>
+
+<!--
+The display-name element contains a short name that is intended
+to be displayed by GUI tools
+-->
+
+<!ELEMENT display-name (#PCDATA)>
+
+<!--
+The description element is used to provide descriptive text about
+the parent element.
+-->
+
+<!ELEMENT description (#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
+-->
+
+<!ELEMENT distributable EMPTY>
+
+<!--
+The context-param element contains the declaration of a web
+application's servlet context initialization parameters.
+-->
+
+<!ELEMENT context-param (param-name, param-value, description?)>
+
+<!--
+The param-name element contains the name of a parameter.
+-->
+
+<!ELEMENT param-name (#PCDATA)>
+
+<!--
+The param-value element contains the value of a parameter.
+-->
+
+<!ELEMENT param-value (#PCDATA)>
+
+<!--
+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.
+-->
+
+<!ELEMENT servlet (icon?, servlet-name, display-name?, description?,
+(servlet-class|jsp-file), init-param*, load-on-startup?, security-role-ref*)>
+
+<!--
+The servlet-name element contains the canonical name of the
+servlet.
+-->
+
+<!ELEMENT servlet-name (#PCDATA)>
+
+<!--
+The servlet-class element contains the fully qualified class name
+of the servlet.
+-->
+
+<!ELEMENT servlet-class (#PCDATA)>
+
+<!--
+The jsp-file element contains the full path to a JSP file within
+the web application.
+-->
+
+<!ELEMENT jsp-file (#PCDATA)>
+
+<!--
+The init-param element contains a name/value pair as an
+initialization param of the servlet
+-->
+
+<!ELEMENT init-param (param-name, param-value, description?)>
+
+<!--
+The load-on-startup element indicates that this servlet should be
+loaded on the startup of the web application. The optional contents of
+these element must be a positive integer indicating the order in which
+the servlet should be loaded. Lower integers are loaded before higher
+integers. If no value is specified, or if the value specified is not a
+positive integer, the container is free to load it at any time in the
+startup sequence.
+-->
+
+<!ELEMENT load-on-startup (#PCDATA)>
+
+<!--
+The servlet-mapping element defines a mapping between a servlet
+and a url pattern
+-->
+
+<!ELEMENT servlet-mapping (servlet-name, url-pattern)>
+
+<!--
+The url-pattern element contains the url pattern of the
+mapping. Must follow the rules specified in Section 10 of the Servlet
+API Specification.
+-->
+
+<!ELEMENT url-pattern (#PCDATA)>
+
+<!--
+The session-config element defines the session parameters for
+this web application.
+-->
+
+<!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.
+-->
+
+<!ELEMENT session-timeout (#PCDATA)>
+
+<!--
+The mime-mapping element defines a mapping between an extension
+and a mime type.
+-->
+
+<!ELEMENT mime-mapping (extension, mime-type)>
+
+<!--
+The extension element contains a string describing an
+extension. example: "txt"
+-->
+
+<!ELEMENT extension (#PCDATA)>
+
+<!--
+The mime-type element contains a defined mime type. example:
+"text/plain"
+-->
+
+<!ELEMENT mime-type (#PCDATA)>
+
+<!--
+The welcome-file-list contains an ordered list of welcome files
+elements.
+-->
+
+<!ELEMENT welcome-file-list (welcome-file+)>
+
+<!--
+The welcome-file element contains file name to use as a default
+welcome file, such as index.html
+-->
+
+<!ELEMENT welcome-file (#PCDATA)>
+
+<!--
+The taglib element is used to describe a JSP tag library.
+-->
+
+<!ELEMENT taglib (taglib-uri, taglib-location)>
+
+<!--
+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.
+-->
+
+<!ELEMENT taglib-uri (#PCDATA)>
+
+<!--
+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.
+-->
+
+<!ELEMENT taglib-location (#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
+-->
+
+<!ELEMENT error-page ((error-code | exception-type), location)>
+
+<!--
+The error-code contains an HTTP error code, ex: 404
+-->
+
+<!ELEMENT error-code (#PCDATA)>
+
+<!--
+The exception type contains a fully qualified class name of a
+Java exception type.
+-->
+
+<!ELEMENT exception-type (#PCDATA)>
+
+<!--
+The location element contains the location of the resource in the
+web application
+-->
+
+<!ELEMENT location (#PCDATA)>
+
+<!--
+The resource-ref element contains a declaration of a Web
+Application's reference to an external resource.
+-->
+
+<!ELEMENT resource-ref (description?, res-ref-name, res-type, res-auth)>
+
+<!--
+The res-ref-name element specifies the name of the resource
+factory reference name.
+-->
+
+<!ELEMENT res-ref-name (#PCDATA)>
+
+<!--
+The res-type element specifies the (Java class) type of the data
+source.
+-->
+
+<!ELEMENT res-type (#PCDATA)>
+
+<!--
+The res-auth element indicates whether the application component
+code performs resource signon programmatically or whether the
+container signs onto the resource based on the principle mapping
+information supplied by the deployer. Must be CONTAINER or SERVLET
+-->
+
+<!ELEMENT res-auth (#PCDATA)>
+
+<!--
+The security-constraint element is used to associate security
+constraints with one or more web resource collections
+-->
+
+<!ELEMENT security-constraint (web-resource-collection+,
+auth-constraint?, user-data-constraint?)>
+
+<!--
+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.
+-->
+
+<!ELEMENT web-resource-collection (web-resource-name, description?,
+url-pattern*, http-method*)>
+
+<!--
+The web-resource-name contains the name of this web resource
+collection
+-->
+
+<!ELEMENT web-resource-name (#PCDATA)>
+
+<!--
+The http-method contains an HTTP method (GET | POST |...)
+-->
+
+<!ELEMENT http-method (#PCDATA)>
+
+<!--
+The user-data-constraint element is used to indicate how data
+communicated between the client and container should be protected
+-->
+
+<!ELEMENT user-data-constraint (description?, transport-guarantee)>
+
+<!--
+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.
+-->
+
+<!ELEMENT transport-guarantee (#PCDATA)>
+
+<!--
+The auth-constraint element indicates the user roles that should
+be permitted access to this resource collection. The role used here
+must appear in a security-role-ref element.
+-->
+
+<!ELEMENT auth-constraint (description?, role-name*)>
+
+<!--
+The role-name element contains the name of a security role.
+-->
+
+<!ELEMENT role-name (#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.
+-->
+
+<!ELEMENT login-config (auth-method?, realm-name?, form-login-config?)>
+
+<!--
+The realm name element specifies the realm name to use in HTTP
+Basic authorization
+-->
+
+<!ELEMENT realm-name (#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.
+-->
+
+<!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
+-->
+
+<!ELEMENT form-login-page (#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
+-->
+
+<!ELEMENT form-error-page (#PCDATA)>
+
+<!--
+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".
+-->
+
+<!ELEMENT auth-method (#PCDATA)>
+
+<!--
+The security-role element contains the declaration of a security
+role which is used in the security-constraints placed on the web
+application.
+-->
+
+<!ELEMENT security-role (description?, role-name)>
+
+<!--
+The role-name element contains the name of a role. This element
+must contain a non-empty string.
+-->
+
+<!ELEMENT security-role-ref (description?, role-name, role-link)>
+
+<!--
+The role-link element is used to link a security role 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.
+-->
+
+<!ELEMENT role-link (#PCDATA)>
+
+<!--
+The env-entry element contains the declaration of an
+application's environment entry. This element is required to be
+honored on in J2EE compliant servlet containers.
+-->
+
+<!ELEMENT env-entry (description?, env-entry-name, env-entry-value?,
+env-entry-type)>
+
+<!--
+The env-entry-name contains the name of an application's
+environment entry
+-->
+
+<!ELEMENT env-entry-name (#PCDATA)>
+
+<!--
+The env-entry-value element contains the value of an
+application's environment entry
+-->
+
+<!ELEMENT env-entry-value (#PCDATA)>
+
+<!--
+The env-entry-type element contains the fully qualified Java type
+of the environment entry value that is expected by the application
+code. The following are the legal values of env-entry-type:
+java.lang.Boolean, java.lang.String, java.lang.Integer,
+java.lang.Double, java.lang.Float.
+-->
+
+<!ELEMENT env-entry-type (#PCDATA)>
+
+<!--
+The ejb-ref element is used to declare a reference to an
+enterprise bean. 
+-->
+
+<!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. This is the JNDI name that the servlet code uses to get a
+reference to the enterprise bean.
+-->
+
+<!ELEMENT ejb-ref-name (#PCDATA)>
+
+<!--
+The ejb-ref-type element contains the expected java class type of
+the referenced EJB.
+-->
+
+<!ELEMENT ejb-ref-type (#PCDATA)>
+
+<!--
+The ejb-home element contains the fully qualified name of the
+EJB's home interface
+-->
+
+<!ELEMENT home (#PCDATA)>
+
+<!--
+The ejb-remote element contains the fully qualified name of the
+EJB's remote interface
+-->
+
+<!ELEMENT remote (#PCDATA)>
+
+<!--
+The ejb-link element is used in the ejb-ref element to specify
+that an EJB reference is linked to an EJB in an encompassing Java2
+Enterprise Edition (J2EE) application package. The value of the
+ejb-link element must be the ejb-name of and EJB in the J2EE
+application package.
+-->
+
+<!ELEMENT ejb-link (#PCDATA)>
+
+<!--
+The ID mechanism is to allow tools to easily make tool-specific
+references to the elements of the deployment descriptor. This allows
+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 tools-specific files to the information in the standard web-app
+deployment descriptor.
+-->
+
+<!ATTLIST web-app id ID #IMPLIED>
+<!ATTLIST icon id ID #IMPLIED>
+<!ATTLIST small-icon id ID #IMPLIED>
+<!ATTLIST large-icon id ID #IMPLIED>
+<!ATTLIST display-name id ID #IMPLIED>
+<!ATTLIST description id ID #IMPLIED>
+<!ATTLIST distributable id ID #IMPLIED>
+<!ATTLIST context-param id ID #IMPLIED>
+<!ATTLIST param-name id ID #IMPLIED>
+<!ATTLIST param-value id ID #IMPLIED>
+<!ATTLIST servlet id ID #IMPLIED>
+<!ATTLIST servlet-name id ID #IMPLIED>
+<!ATTLIST servlet-class id ID #IMPLIED>
+<!ATTLIST jsp-file id ID #IMPLIED>
+<!ATTLIST init-param id ID #IMPLIED>
+<!ATTLIST load-on-startup id ID #IMPLIED>
+<!ATTLIST servlet-mapping id ID #IMPLIED>
+<!ATTLIST url-pattern id ID #IMPLIED>
+<!ATTLIST session-config id ID #IMPLIED>
+<!ATTLIST session-timeout id ID #IMPLIED>
+<!ATTLIST mime-mapping id ID #IMPLIED>
+<!ATTLIST extension id ID #IMPLIED>
+<!ATTLIST mime-type id ID #IMPLIED>
+<!ATTLIST welcome-file-list id ID #IMPLIED>
+<!ATTLIST welcome-file id ID #IMPLIED>
+<!ATTLIST taglib id ID #IMPLIED>
+<!ATTLIST taglib-uri id ID #IMPLIED>
+<!ATTLIST taglib-location id ID #IMPLIED>
+<!ATTLIST error-page id ID #IMPLIED>
+<!ATTLIST error-code id ID #IMPLIED>
+<!ATTLIST exception-type id ID #IMPLIED>
+<!ATTLIST location id ID #IMPLIED>
+<!ATTLIST resource-ref id ID #IMPLIED>
+<!ATTLIST res-ref-name id ID #IMPLIED>
+<!ATTLIST res-type id ID #IMPLIED>
+<!ATTLIST res-auth id ID #IMPLIED>
+<!ATTLIST security-constraint id ID #IMPLIED>
+<!ATTLIST web-resource-collection id ID #IMPLIED>
+<!ATTLIST web-resource-name id ID #IMPLIED>
+<!ATTLIST http-method id ID #IMPLIED>
+<!ATTLIST user-data-constraint id ID #IMPLIED>
+<!ATTLIST transport-guarantee id ID #IMPLIED>
+<!ATTLIST auth-constraint id ID #IMPLIED>
+<!ATTLIST role-name id ID #IMPLIED>
+<!ATTLIST login-config id ID #IMPLIED>
+<!ATTLIST realm-name id ID #IMPLIED>
+<!ATTLIST form-login-config id ID #IMPLIED>
+<!ATTLIST form-login-page id ID #IMPLIED>
+<!ATTLIST form-error-page id ID #IMPLIED>
+<!ATTLIST auth-method id ID #IMPLIED>
+<!ATTLIST security-role id ID #IMPLIED>
+<!ATTLIST security-role-ref id ID #IMPLIED>
+<!ATTLIST role-link id ID #IMPLIED>
+<!ATTLIST env-entry id ID #IMPLIED>
+<!ATTLIST env-entry-name id ID #IMPLIED>
+<!ATTLIST env-entry-value id ID #IMPLIED>
+<!ATTLIST env-entry-type id ID #IMPLIED>
+<!ATTLIST ejb-ref id ID #IMPLIED>
+<!ATTLIST ejb-ref-name id ID #IMPLIED>
+<!ATTLIST ejb-ref-type id ID #IMPLIED>
+<!ATTLIST home id ID #IMPLIED>
+<!ATTLIST remote id ID #IMPLIED>
+<!ATTLIST ejb-link id ID #IMPLIED>



---------------------------------------------------------------------
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