Author: julien(a)jboss.com
Date: 2007-04-25 08:36:23 -0400 (Wed, 25 Apr 2007)
New Revision: 7041
Added:
trunk/api/src/main/org/jboss/portal/api/node/PortalNodeURLFactory.java
trunk/common/src/main/org/jboss/portal/common/servlet/
trunk/common/src/main/org/jboss/portal/common/servlet/BufferingRequestWrapper.java
trunk/common/src/main/org/jboss/portal/common/servlet/BufferingResponseWrapper.java
trunk/common/src/main/org/jboss/portal/common/servlet/ServletOutputStreamBuffer.java
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeURLFactoryImpl.java
Removed:
trunk/common/src/main/org/jboss/portal/common/http/HttpServletRequestWrapper.java
trunk/common/src/main/org/jboss/portal/common/http/HttpServletResponseWriter.java
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeURLFactory.java
Modified:
trunk/api/src/main/org/jboss/portal/api/node/PortalNode.java
trunk/common/src/main/org/jboss/portal/common/util/Tools.java
trunk/core/src/main/org/jboss/portal/core/aspects/controller/PageCustomizerInterceptor.java
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/Navigation.java
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeInterceptor.java
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalObjectNode.java
trunk/core/src/main/org/jboss/portlet/JBossActionResponse.java
trunk/core/src/main/org/jboss/portlet/JBossRenderResponse.java
trunk/core/src/resources/portal-core-sar/META-INF/jboss-service.xml
trunk/core/src/resources/portal-core-war/WEB-INF/jsp/header/header.jsp
trunk/core/src/resources/portal-core-war/WEB-INF/jsp/header/tabs.jsp
Log:
- improved implementation of PortalNode to include security filtering, display name
- use PortalNode api for the tabs JSP as it is part of the API (no need to expose a new
API)
- renamed PageCustomizer attributes to have suffix "Path" instead of
"JSP" as any servlet can be used, not only JSPs
Modified: trunk/api/src/main/org/jboss/portal/api/node/PortalNode.java
===================================================================
--- trunk/api/src/main/org/jboss/portal/api/node/PortalNode.java 2007-04-25 12:15:13 UTC
(rev 7040)
+++ trunk/api/src/main/org/jboss/portal/api/node/PortalNode.java 2007-04-25 12:36:23 UTC
(rev 7041)
@@ -24,6 +24,7 @@
import java.util.Collection;
import java.util.Map;
+import java.util.Locale;
/**
* Represents a portal node, a first class entity for the portal.
@@ -75,6 +76,13 @@
String getName();
/**
+ * Returns the best display name for specified locale.
+ *
+ * @return the display name
+ */
+ String getDisplayName(Locale locale);
+
+ /**
* Return a child of this object.
*
* @param name the child name
Added: trunk/api/src/main/org/jboss/portal/api/node/PortalNodeURLFactory.java
===================================================================
--- trunk/api/src/main/org/jboss/portal/api/node/PortalNodeURLFactory.java
(rev 0)
+++ trunk/api/src/main/org/jboss/portal/api/node/PortalNodeURLFactory.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -0,0 +1,36 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portal.api.node;
+
+/**
+ * The context of a portal node.
+ *
+ * @author <a href="mailto:julien@jboss.org">Julien Viet</a>
+ * @version $Revision: 1.1 $
+ */
+public interface PortalNodeURLFactory
+{
+
+ PortalNodeURL createURL(PortalNode node) throws IllegalArgumentException;
+
+}
Deleted:
trunk/common/src/main/org/jboss/portal/common/http/HttpServletRequestWrapper.java
===================================================================
---
trunk/common/src/main/org/jboss/portal/common/http/HttpServletRequestWrapper.java 2007-04-25
12:15:13 UTC (rev 7040)
+++
trunk/common/src/main/org/jboss/portal/common/http/HttpServletRequestWrapper.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -1,70 +0,0 @@
-/******************************************************************************
- * JBoss, a division of Red Hat *
- * Copyright 2006, Red Hat Middleware, LLC, and individual *
- * contributors as indicated by the @authors tag. See the *
- * copyright.txt in the distribution for a full listing of *
- * individual contributors. *
- * *
- * This is free software; you can redistribute it and/or modify it *
- * under the terms of the GNU Lesser General Public License as *
- * published by the Free Software Foundation; either version 2.1 of *
- * the License, or (at your option) any later version. *
- * *
- * This software is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
- * Lesser General Public License for more details. *
- * *
- * You should have received a copy of the GNU Lesser General Public *
- * License along with this software; if not, write to the Free *
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
- ******************************************************************************/
-package org.jboss.portal.common.http;
-
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * Wrapper around a HTTPServletRequest to add attributes without
- * affecting the actual request
- * @author <a href="mailto:theute@jboss.org">Thomas Heute</a>
- * @version $Revision: 1.1 $
- */
-public class HttpServletRequestWrapper extends
- javax.servlet.http.HttpServletRequestWrapper
-{
-
- private Map attributes;
-
-
- public HttpServletRequestWrapper(HttpServletRequest servletRequest)
- {
- super(servletRequest);
- attributes = new HashMap();
- }
-
- public void setAttribute(String name, Object value)
- {
- attributes.put(name, value);
- }
-
- public Object getAttribute(String name)
- {
- Object value = attributes.get(name);
- if (value == null)
- {
- value = getRequest().getAttribute(name);
- }
- return value;
- }
-
- public Enumeration getAttributeNames()
- {
- throw new UnsupportedOperationException();
- }
-
-}
Deleted:
trunk/common/src/main/org/jboss/portal/common/http/HttpServletResponseWriter.java
===================================================================
---
trunk/common/src/main/org/jboss/portal/common/http/HttpServletResponseWriter.java 2007-04-25
12:15:13 UTC (rev 7040)
+++
trunk/common/src/main/org/jboss/portal/common/http/HttpServletResponseWriter.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -1,286 +0,0 @@
-/******************************************************************************
- * JBoss, a division of Red Hat *
- * Copyright 2006, Red Hat Middleware, LLC, and individual *
- * contributors as indicated by the @authors tag. See the *
- * copyright.txt in the distribution for a full listing of *
- * individual contributors. *
- * *
- * This is free software; you can redistribute it and/or modify it *
- * under the terms of the GNU Lesser General Public License as *
- * published by the Free Software Foundation; either version 2.1 of *
- * the License, or (at your option) any later version. *
- * *
- * This software is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
- * Lesser General Public License for more details. *
- * *
- * You should have received a copy of the GNU Lesser General Public *
- * License along with this software; if not, write to the Free *
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
- ******************************************************************************/
-package org.jboss.portal.common.http;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.util.Locale;
-
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Redirection of the Writer
- * @author <a href="mailto:theute@jboss.org">Thomas Heute</a>
- * @version $Revision: 1.1 $
- */
-public class HttpServletResponseWriter implements HttpServletResponse
-{
-
- static class MockServletOutputStream extends ServletOutputStream
- {
- private ByteArrayOutputStream buffer;
-
- private String encoding;
-
- public MockServletOutputStream(int size, String encoding)
- {
- buffer = new ByteArrayOutputStream(size);
- this.encoding = encoding;
- }
-
- public void setEncoding(String encoding)
- {
- this.encoding = encoding;
- }
-
- public void write(int value) throws IOException
- {
- buffer.write(value);
- }
-
- public String getContent() throws IOException
- {
- try {
- buffer.flush();
- return buffer.toString(encoding);
- } catch (IOException e) {
- throw e;
- }
- }
-
- public byte[] getBinaryContent() throws IOException
- {
- try {
- buffer.flush();
- return buffer.toByteArray();
- } catch (IOException e) {
- throw e;
- }
- }
-
- public void clearContent()
- {
- buffer = new ByteArrayOutputStream();
- }
-
- public String toString()
- {
- try {
- return getContent();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return super.toString();
- }
- }
-
- private ServletOutputStream outputStream;
- private PrintWriter writer;
- private String characterEncoding;
- private int bufferSize;
-
- public HttpServletResponseWriter(HttpServletResponse response)
- {
- this.characterEncoding = response.getCharacterEncoding();
- this.outputStream = new MockServletOutputStream(bufferSize,
this.characterEncoding);
- this.bufferSize = response.getBufferSize();
- }
-
- public String getContent()
- {
- try {
- return ((MockServletOutputStream)outputStream).getContent();
- } catch (IOException e) {
- return "test";
- }
- }
-
- public void addCookie(Cookie arg0)
- {
- throw new UnsupportedOperationException();
- }
-
- public void addDateHeader(String arg0, long arg1)
- {
- throw new UnsupportedOperationException();
- }
-
- public void addHeader(String arg0, String arg1)
- {
- throw new UnsupportedOperationException();
- }
-
- public void addIntHeader(String arg0, int arg1)
- {
- throw new UnsupportedOperationException();
- }
-
- public boolean containsHeader(String arg0)
- {
- throw new UnsupportedOperationException();
- }
-
- public String encodeRedirectURL(String arg0)
- {
- throw new UnsupportedOperationException();
- }
-
- public String encodeRedirectUrl(String arg0)
- {
- throw new UnsupportedOperationException();
- }
-
- public String encodeURL(String arg0)
- {
- throw new UnsupportedOperationException();
- }
-
- public String encodeUrl(String arg0)
- {
- throw new UnsupportedOperationException();
- }
-
- public void sendError(int arg0) throws IOException
- {
- throw new UnsupportedOperationException();
- }
-
- public void sendError(int arg0, String arg1) throws IOException
- {
- throw new UnsupportedOperationException();
- }
-
- public void sendRedirect(String arg0) throws IOException
- {
- throw new UnsupportedOperationException();
- }
-
- public void setDateHeader(String arg0, long arg1)
- {
- throw new UnsupportedOperationException();
- }
-
- public void setHeader(String arg0, String arg1)
- {
- throw new UnsupportedOperationException();
- }
-
- public void setIntHeader(String arg0, int arg1)
- {
- throw new UnsupportedOperationException();
- }
-
- public void setStatus(int arg0)
- {
- throw new UnsupportedOperationException();
- }
-
- public void setStatus(int arg0, String arg1)
- {
- throw new UnsupportedOperationException();
- }
-
- public void flushBuffer() throws IOException
- {
- throw new UnsupportedOperationException();
- }
-
- public int getBufferSize()
- {
- return bufferSize;
- }
-
- public String getCharacterEncoding()
- {
- return characterEncoding;
- }
-
- public String getContentType()
- {
- throw new UnsupportedOperationException();
- }
-
- public Locale getLocale()
- {
- throw new UnsupportedOperationException();
- }
-
- public ServletOutputStream getOutputStream() throws IOException
- {
- return outputStream;
- }
-
- public PrintWriter getWriter() throws IOException
- {
- if (writer == null)
- {
- writer = new PrintWriter(new OutputStreamWriter(outputStream,
characterEncoding), true);
- }
- return writer;
- }
-
- public boolean isCommitted()
- {
- throw new UnsupportedOperationException();
- }
-
- public void reset()
- {
- throw new UnsupportedOperationException();
- }
-
- public void resetBuffer()
- {
- throw new UnsupportedOperationException();
- }
-
- public void setBufferSize(int bufferSize)
- {
- this.bufferSize = bufferSize;
- }
-
- public void setCharacterEncoding(String characterEncoding)
- {
- this.characterEncoding = characterEncoding;
- }
-
- public void setContentLength(int arg0)
- {
- throw new UnsupportedOperationException();
- }
-
- public void setContentType(String arg0)
- {
- throw new UnsupportedOperationException();
- }
-
- public void setLocale(Locale arg0)
- {
- throw new UnsupportedOperationException();
- }
-
-}
Added: trunk/common/src/main/org/jboss/portal/common/servlet/BufferingRequestWrapper.java
===================================================================
--- trunk/common/src/main/org/jboss/portal/common/servlet/BufferingRequestWrapper.java
(rev 0)
+++
trunk/common/src/main/org/jboss/portal/common/servlet/BufferingRequestWrapper.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -0,0 +1,153 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portal.common.servlet;
+
+import org.jboss.portal.common.util.Tools;
+
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Locale;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+/**
+ * Wrapper around a HTTPServletRequest to add attributes without
+ * affecting the actual request.
+ *
+ * @author <a href="mailto:theute@jboss.org">Thomas Heute</a>
+ * @version $Revision: 1.1 $
+ */
+public class BufferingRequestWrapper extends HttpServletRequestWrapper
+{
+
+ /** . */
+ private static final Object REMOVED_ATTRIBUTE = new Object();
+
+ /** . */
+ private Map attributes;
+
+ /** . */
+ private Locale[] locales;
+
+ /** . */
+ private String contextPath;
+
+ public BufferingRequestWrapper(HttpServletRequest servletRequest, String contextPath,
Locale[] locales)
+ {
+ super(servletRequest);
+
+ //
+ this.contextPath = contextPath;
+ this.locales = locales;
+ this.attributes = new HashMap();
+ }
+
+ public String getContextPath()
+ {
+ return contextPath;
+ }
+
+ public Locale getLocale()
+ {
+ return locales.length > 0 ? locales[0] : null;
+ }
+
+ public Enumeration getLocales()
+ {
+ return Tools.toEnumeration(locales);
+ }
+
+ public String getMethod()
+ {
+ return "GET";
+ }
+
+ public void setAttribute(String name, Object value)
+ {
+ if (value == null)
+ {
+ value = REMOVED_ATTRIBUTE;
+ }
+
+ //
+ attributes.put(name, value);
+ }
+
+ public Object getAttribute(String name)
+ {
+ Object value = attributes.get(name);
+
+ //
+ if (value == REMOVED_ATTRIBUTE)
+ {
+ value = null;
+ }
+ else if (value == null)
+ {
+ value = getRequest().getAttribute(name);
+ }
+
+ //
+ return value;
+ }
+
+ public void removeAttribute(String name)
+ {
+ setAttribute(name, null);
+ }
+
+ public Enumeration getAttributeNames()
+ {
+ Set names = new HashSet();
+
+ //
+ for (Enumeration e = getRequest().getAttributeNames();e.hasMoreElements();)
+ {
+ names.add(e.nextElement());
+ }
+
+ //
+ for (Iterator i = attributes.entrySet().iterator(); i.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry)i.next();
+ String name = (String)entry.getKey();
+ Object value = entry.getValue();
+ if (value == REMOVED_ATTRIBUTE)
+ {
+ names.remove(name);
+ }
+ else
+ {
+ names.add(name);
+ }
+ }
+
+ //
+ return Tools.toEnumeration(names.iterator());
+ }
+}
Added:
trunk/common/src/main/org/jboss/portal/common/servlet/BufferingResponseWrapper.java
===================================================================
--- trunk/common/src/main/org/jboss/portal/common/servlet/BufferingResponseWrapper.java
(rev 0)
+++
trunk/common/src/main/org/jboss/portal/common/servlet/BufferingResponseWrapper.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -0,0 +1,225 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portal.common.servlet;
+
+import org.jboss.portal.common.io.UndeclaredIOException;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Locale;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+/**
+ * Redirection of the Writer
+ * @author <a href="mailto:theute@jboss.org">Thomas Heute</a>
+ * @version $Revision: 1.1 $
+ */
+public class BufferingResponseWrapper extends HttpServletResponseWrapper
+{
+
+ /** . */
+ private ServletOutputStreamBuffer outputStream;
+
+ /** . */
+ private PrintWriter writer;
+
+ /** . */
+ private StringWriter chars;
+
+ /** . */
+ private String characterEncoding;
+
+ /** Not really used but we need it to memorize what the client set optionally. */
+ protected int bufferSize;
+
+ public BufferingResponseWrapper(HttpServletResponse response)
+ {
+ super(response);
+
+ // By default inherit the character encoding of the wrapped response
+ this.characterEncoding = response.getCharacterEncoding();
+
+ // 0 means no buffering - we say no buffering
+ this.bufferSize = 0;
+ }
+
+ public String getContent()
+ {
+ if (outputStream != null)
+ {
+ try
+ {
+ outputStream.flush();
+ return outputStream.getContent(characterEncoding);
+ }
+ catch (IOException e)
+ {
+ throw new UndeclaredIOException(e);
+ }
+ }
+ else if (chars != null)
+ {
+ writer.flush();
+ return chars.toString();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public void addCookie(Cookie arg0)
+ {
+ }
+
+ public void addDateHeader(String arg0, long arg1)
+ {
+ }
+
+ public void addHeader(String arg0, String arg1)
+ {
+ }
+
+ public void addIntHeader(String arg0, int arg1)
+ {
+ }
+
+ public void sendError(int arg0) throws IOException
+ {
+ }
+
+ public void sendError(int arg0, String arg1) throws IOException
+ {
+ }
+
+ public void sendRedirect(String arg0) throws IOException
+ {
+ }
+
+ public void setDateHeader(String arg0, long arg1)
+ {
+ }
+
+ public void setHeader(String arg0, String arg1)
+ {
+ }
+
+ public void setIntHeader(String arg0, int arg1)
+ {
+ }
+
+ public void setStatus(int arg0)
+ {
+ }
+
+ public void setStatus(int arg0, String arg1)
+ {
+ }
+
+ public int getBufferSize()
+ {
+ return bufferSize;
+ }
+
+ public String getCharacterEncoding()
+ {
+ return characterEncoding;
+ }
+
+ public ServletOutputStream getOutputStream() throws IOException
+ {
+ if (writer != null)
+ {
+ throw new IllegalStateException("Already obtained a PrintWriter");
+ }
+ if (outputStream == null)
+ {
+ outputStream = new ServletOutputStreamBuffer(500);
+ }
+ return outputStream;
+ }
+
+ public PrintWriter getWriter() throws IOException
+ {
+ if (outputStream != null)
+ {
+ throw new IllegalStateException("Already obtained a
ServletOutputStream");
+ }
+ if (writer == null)
+ {
+ chars = new StringWriter();
+ writer = new PrintWriter(chars, false);
+ }
+ return writer;
+ }
+
+ public boolean isCommitted()
+ {
+ return false;
+ }
+
+ public void reset()
+ {
+ resetBuffer();
+ }
+
+ public void resetBuffer()
+ {
+ if (outputStream != null)
+ {
+ outputStream.reset();
+ }
+ else if (chars != null)
+ {
+ writer.flush();
+ chars.getBuffer().setLength(0);
+ }
+ }
+
+ public void setBufferSize(int bufferSize)
+ {
+ this.bufferSize = bufferSize;
+ }
+
+ public void setCharacterEncoding(String characterEncoding)
+ {
+ this.characterEncoding = characterEncoding;
+ }
+
+ public void setContentLength(int arg0)
+ {
+ }
+
+ public void setContentType(String arg0)
+ {
+ }
+
+ public void setLocale(Locale arg0)
+ {
+ }
+}
Added:
trunk/common/src/main/org/jboss/portal/common/servlet/ServletOutputStreamBuffer.java
===================================================================
--- trunk/common/src/main/org/jboss/portal/common/servlet/ServletOutputStreamBuffer.java
(rev 0)
+++
trunk/common/src/main/org/jboss/portal/common/servlet/ServletOutputStreamBuffer.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -0,0 +1,69 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portal.common.servlet;
+
+import javax.servlet.ServletOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * @author <a href="mailto:julien@jboss.org">Julien Viet</a>
+ * @version $Revision: 1.1 $
+ */
+public class ServletOutputStreamBuffer extends ServletOutputStream
+{
+
+ /** . */
+ private ByteArrayOutputStream buffer;
+
+ public ServletOutputStreamBuffer(int size)
+ {
+ buffer = new ByteArrayOutputStream(size);
+ }
+
+ public void write(int value) throws IOException
+ {
+ buffer.write(value);
+ }
+
+ public String getContent(String encoding) throws IOException
+ {
+ buffer.flush();
+
+ //
+ return buffer.toString(encoding);
+ }
+
+ public byte[] getBinaryContent() throws IOException
+ {
+ buffer.flush();
+
+ //
+ return buffer.toByteArray();
+ }
+
+ public void reset()
+ {
+ buffer.reset();
+ }
+}
Modified: trunk/common/src/main/org/jboss/portal/common/util/Tools.java
===================================================================
--- trunk/common/src/main/org/jboss/portal/common/util/Tools.java 2007-04-25 12:15:13 UTC
(rev 7040)
+++ trunk/common/src/main/org/jboss/portal/common/util/Tools.java 2007-04-25 12:36:23 UTC
(rev 7041)
@@ -404,6 +404,31 @@
};
}
+ public static Enumeration toEnumeration(final Object[] objects)
+ {
+ return new Enumeration()
+ {
+ int index = 0;
+
+ public boolean hasMoreElements()
+ {
+ return index < objects.length;
+ }
+
+ public Object nextElement()
+ {
+ if (index < objects.length)
+ {
+ return objects[index++];
+ }
+ else
+ {
+ throw new NoSuchElementException();
+ }
+ }
+ };
+ }
+
public static Enumeration toEnumeration(final Object o)
{
return new Enumeration()
Modified:
trunk/core/src/main/org/jboss/portal/core/aspects/controller/PageCustomizerInterceptor.java
===================================================================
---
trunk/core/src/main/org/jboss/portal/core/aspects/controller/PageCustomizerInterceptor.java 2007-04-25
12:15:13 UTC (rev 7040)
+++
trunk/core/src/main/org/jboss/portal/core/aspects/controller/PageCustomizerInterceptor.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -23,51 +23,38 @@
package org.jboss.portal.core.aspects.controller;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
-import java.util.Comparator;
import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.jboss.portal.Mode;
import org.jboss.portal.WindowState;
-import org.jboss.portal.api.node.PortalNode;
-import org.jboss.portal.common.http.HttpServletRequestWrapper;
-import org.jboss.portal.common.http.HttpServletResponseWriter;
+import org.jboss.portal.common.servlet.BufferingRequestWrapper;
+import org.jboss.portal.common.servlet.BufferingResponseWrapper;
import org.jboss.portal.core.controller.Controller;
import org.jboss.portal.core.controller.ControllerCommand;
import org.jboss.portal.core.controller.ControllerContext;
import org.jboss.portal.core.controller.ControllerInterceptor;
import org.jboss.portal.core.controller.ControllerResponse;
import org.jboss.portal.core.controller.command.SignOutCommand;
-import org.jboss.portal.core.impl.model.portal.PortalObjectImpl;
import org.jboss.portal.core.model.CustomizationManager;
import
org.jboss.portal.core.model.instance.command.action.InvokePortletInstanceRenderCommand;
import org.jboss.portal.core.model.portal.Page;
import org.jboss.portal.core.model.portal.Portal;
-import org.jboss.portal.core.model.portal.PortalContainer;
import org.jboss.portal.core.model.portal.PortalObject;
import org.jboss.portal.core.model.portal.PortalObjectId;
import org.jboss.portal.core.model.portal.PortalObjectPermission;
-import org.jboss.portal.core.model.portal.Window;
import org.jboss.portal.core.model.portal.command.action.ImportPageToDashboardCommand;
import org.jboss.portal.core.model.portal.command.render.RenderPageCommand;
import org.jboss.portal.core.model.portal.command.view.ViewDashboardCommand;
import org.jboss.portal.core.model.portal.command.view.ViewPageCommand;
import org.jboss.portal.core.theme.PageRendition;
+import org.jboss.portal.core.aspects.controller.node.Navigation;
import org.jboss.portal.identity.User;
import org.jboss.portal.portlet.PortletParametersStateString;
import org.jboss.portal.security.PortalSecurityException;
@@ -95,20 +82,17 @@
private static final DynaRenderOptions NO_AJAX_OPTIONS =
DynaRenderOptions.getOptions(Boolean.FALSE, Boolean.FALSE);
/** . */
- private static final String RESOURCE_PREFIX = "PAGENAME_";
+ private String targetContextPath;
- private String JSPContext;
+ /** . */
+ private String headerPath;
- private String headerJSP;
+ /** . */
+ private String tabsPath;
- private String tabsJSP;
-
/** . */
private PortalAuthorizationManagerFactory portalAuthorizationManagerFactory;
- /** Tab order. */
- private static final String ORDER = "order";
-
public PortalAuthorizationManagerFactory getPortalAuthorizationManagerFactory()
{
return portalAuthorizationManagerFactory;
@@ -133,14 +117,14 @@
RenderPageCommand rpc = (RenderPageCommand)cmd;
//
- StringBuffer tabbedNav = injectTabbedNav(rpc);
+ String tabbedNav = injectTabbedNav(rpc);
if (tabbedNav != null)
{
Map windowProps = new HashMap();
windowProps.put(ThemeConstants.PORTAL_PROP_WINDOW_RENDERER,
"emptyRenderer");
windowProps.put(ThemeConstants.PORTAL_PROP_DECORATION_RENDERER,
"emptyRenderer");
windowProps.put(ThemeConstants.PORTAL_PROP_PORTLET_RENDERER,
"emptyRenderer");
- WindowResult res = new WindowResult("", tabbedNav.toString(),
Collections.EMPTY_MAP, windowProps, null, WindowState.NORMAL, Mode.VIEW);
+ WindowResult res = new WindowResult("", tabbedNav,
Collections.EMPTY_MAP, windowProps, null, WindowState.NORMAL, Mode.VIEW);
WindowContext blah = new WindowContext("BLAH",
"navigation", 0, res);
rendition.getPageResult().addWindowContext(blah);
@@ -151,14 +135,14 @@
}
//
- StringBuffer dashboardNav = injectDashboardNav(cmd);
+ String dashboardNav = injectDashboardNav(cmd);
if (dashboardNav != null)
{
Map windowProps = new HashMap();
windowProps.put(ThemeConstants.PORTAL_PROP_WINDOW_RENDERER,
"emptyRenderer");
windowProps.put(ThemeConstants.PORTAL_PROP_DECORATION_RENDERER,
"emptyRenderer");
windowProps.put(ThemeConstants.PORTAL_PROP_PORTLET_RENDERER,
"emptyRenderer");
- WindowResult res = new WindowResult("", dashboardNav.toString(),
Collections.EMPTY_MAP, windowProps, null, WindowState.NORMAL, Mode.VIEW);
+ WindowResult res = new WindowResult("", dashboardNav,
Collections.EMPTY_MAP, windowProps, null, WindowState.NORMAL, Mode.VIEW);
WindowContext bluh = new WindowContext("BLUH",
"dashboardnav", 0, res);
rendition.getPageResult().addWindowContext(bluh);
@@ -172,378 +156,205 @@
return resp;
}
- public StringBuffer injectDashboardNav(ControllerCommand cc)
+ public String injectDashboardNav(ControllerCommand cc)
{
StringBuffer sb = new StringBuffer();
ControllerContext controllerCtx = cc.getControllerContext();
-
ServerInvocationContext serverContext =
controllerCtx.getServerInvocation().getServerContext();
- ServletContext servletContext =
serverContext.getClientRequest().getSession().getServletContext().getContext(JSPContext);
-
- RequestDispatcher rd = servletContext.getRequestDispatcher(headerJSP);
-
- HttpServletResponse response = new
HttpServletResponseWriter(serverContext.getClientResponse());
- HttpServletRequest request = new
HttpServletRequestWrapper(serverContext.getClientRequest());
-
- // Get user
- Controller controller = controllerCtx.getController();
- User user = controllerCtx.getUser();
- request.setAttribute("org.jboss.portal.header.user", user);
-
- // Edit dashboard page || Copy to dashboard link
- boolean isDashboard = false;
- if (cc instanceof RenderPageCommand)
+ ServletContext servletContext =
serverContext.getClientRequest().getSession().getServletContext().getContext(targetContextPath);
+ RequestDispatcher rd = servletContext.getRequestDispatcher(headerPath);
+
+ //
+ if (rd != null)
{
- RenderPageCommand rpc = (RenderPageCommand)cc;
- Page page = rpc.getPage();
- String pageName = page.getName();
- isDashboard = rpc.isDashboard();
- //
- if (isDashboard)
+ BufferingResponseWrapper response = new
BufferingResponseWrapper(serverContext.getClientResponse());
+ BufferingRequestWrapper request = new BufferingRequestWrapper(
+ serverContext.getClientRequest(),
+ targetContextPath,
+ cc.getControllerContext().getServerInvocation().getRequest().getLocales());
+
+ // Get user
+ Controller controller = controllerCtx.getController();
+ User user = controllerCtx.getUser();
+ request.setAttribute("org.jboss.portal.header.USER", user);
+
+ // Edit dashboard page || Copy to dashboard link
+ boolean isDashboard = false;
+ if (cc instanceof RenderPageCommand)
{
- // Edit page
- PortletParametersStateString navState = new PortletParametersStateString();
- navState.setValue("editPageSelect", pageName);
- InvokePortletInstanceRenderCommand command = new
InvokePortletInstanceRenderCommand("DashboardConfigPortletInstance", navState);
- request.setAttribute("org.jboss.portal.header.editDashboardURL",
controllerCtx.renderURL(command, null, null));
- }
- else
- {
+ RenderPageCommand rpc = (RenderPageCommand)cc;
+ Page page = rpc.getPage();
+ String pageName = page.getName();
+ isDashboard = rpc.isDashboard();
+
//
- if (user != null)
+ if (isDashboard)
{
- CustomizationManager cm = controller.getCustomizationManager();
- Portal dashboard = cm.getDashboard(user);
- if (dashboard.getChild(pageName) == null)
+ // Edit page
+ PortletParametersStateString navState = new
PortletParametersStateString();
+ navState.setValue("editPageSelect", pageName);
+ InvokePortletInstanceRenderCommand command = new
InvokePortletInstanceRenderCommand("DashboardConfigPortletInstance", navState);
+
request.setAttribute("org.jboss.portal.header.EDIT_DASDHBOARD_URL",
controllerCtx.renderURL(command, null, null));
+ }
+ else
+ {
+ //
+ if (user != null)
{
- ImportPageToDashboardCommand iptdc = new
ImportPageToDashboardCommand(page.getId());
-
request.setAttribute("org.jboss.portal.header.copyToDashboardURL",
controllerCtx.renderURL(iptdc, null, null));
+ CustomizationManager cm = controller.getCustomizationManager();
+ Portal dashboard = cm.getDashboard(user);
+ if (dashboard.getChild(pageName) == null)
+ {
+ ImportPageToDashboardCommand iptdc = new
ImportPageToDashboardCommand(page.getId());
+
request.setAttribute("org.jboss.portal.header.COPY_TO_DASHBOARD_URL",
controllerCtx.renderURL(iptdc, null, null));
+ }
}
+
}
-
}
- }
- if (! isDashboard)
- {
- ViewDashboardCommand vdc = new ViewDashboardCommand();
- request.setAttribute("org.jboss.portal.header.dashboardURL",
controllerCtx.renderURL(vdc, null, null));
- }
-
- boolean admin = false;
- if (cc instanceof RenderPageCommand)
- {
- RenderPageCommand rpc = (RenderPageCommand)cc;
- PortalObject portalObject = rpc.getPage().getPortal();
- admin = "admin".equalsIgnoreCase(portalObject.getName());
- }
-
- if (!admin || isDashboard)
- {
- PortalObjectPermission perm = new PortalObjectPermission(new PortalObjectId(new
String[]{"admin"}), PortalObjectPermission.VIEW_MASK);
- try
+ //
+ if (! isDashboard)
{
- if
(controller.getPortalAuthorizationManagerFactory().getManager().checkPermission(perm))
- {
- ViewPageCommand showadmin = new ViewPageCommand(new PortalObjectId(new
String[]{"admin"}));
- request.setAttribute("org.jboss.portal.header.adminPortalURL",
controllerCtx.renderURL(showadmin, null, null));
- }
+ ViewDashboardCommand vdc = new ViewDashboardCommand();
+ request.setAttribute("org.jboss.portal.header.DASHBOARD_URL",
controllerCtx.renderURL(vdc, null, null));
}
- catch (PortalSecurityException e)
- {
- log.error("", e);
- }
- }
-
- if (admin || isDashboard)
- {
- // Link to default page of default portal
- ViewPageCommand _rpc = new ViewPageCommand(new PortalObjectId(new
String[]{"default", "default"}));
- request.setAttribute("org.jboss.portal.header.defaultPortalURL",
controllerCtx.renderURL(_rpc, null, null));
- }
-
- SignOutCommand cmd = new SignOutCommand();
- URLContext urlContext =
controllerCtx.getServerInvocation().getServerContext().getURLContext();
- String logoutURL = controllerCtx.renderURL(cmd, urlContext.asNonAuthenticated(),
null);
- request.setAttribute("org.jboss.portal.header.signOutURL", logoutURL);
-
- try
- {
- rd.include(request, response);
- response.getWriter().flush();
- }
- catch (ServletException e1)
- {
- e1.printStackTrace();
- }
- catch (IOException e1)
- {
- e1.printStackTrace();
- }
-
- try
- {
- sb.append(response.getOutputStream().toString());
- }
- catch (IOException e1)
- {
- e1.printStackTrace();
- }
-
- return sb;
- }
-
- public StringBuffer injectTabbedNav(RenderPageCommand rpc)
- {
- StringBuffer sb = new StringBuffer();
- ControllerContext controllerCtx = rpc.getControllerContext();
-
- ServerInvocationContext serverContext =
controllerCtx.getServerInvocation().getServerContext();
- ServletContext servletContext =
serverContext.getClientRequest().getSession().getServletContext().getContext(JSPContext);
-
- RequestDispatcher rd = servletContext.getRequestDispatcher(tabsJSP);
-
- HttpServletResponse response = new
HttpServletResponseWriter(serverContext.getClientResponse());
- HttpServletRequest request = new
HttpServletRequestWrapper(serverContext.getClientRequest());
-
-
- Node root = new Node("root", null);
-
- try
- {
- Page page = rpc.getPage();
-
- // Now build the list
- List navElements = new ArrayList();
- for (Iterator iterator = page.getPortal().getChildren().iterator();
iterator.hasNext();)
+ //
+ boolean admin = false;
+ if (cc instanceof RenderPageCommand)
{
- PortalObject child = (PortalObject)iterator.next();
- if (child.getType() == PortalNode.TYPE_PAGE)
- {
- PortalObjectImpl portalObject = (PortalObjectImpl)child;
- navElements.add(portalObject);
- }
+ RenderPageCommand rpc = (RenderPageCommand)cc;
+ PortalObject portalObject = rpc.getPage().getPortal();
+ admin = "admin".equalsIgnoreCase(portalObject.getName());
}
- sortTabs(navElements);
- for (Iterator i = navElements.iterator(); i.hasNext();)
+ //
+ if (!admin || isDashboard)
{
- PortalObjectImpl navElement = (PortalObjectImpl)i.next();
-
- // build up markup for the navigation , based on these nodes
- String name = navElement.getName();
+ PortalObjectPermission perm = new PortalObjectPermission(new
PortalObjectId(new String[]{"admin"}), PortalObjectPermission.VIEW_MASK);
try
{
- // localize node name
- Locale requestLocale =
rpc.getControllerContext().getServerInvocation().getRequest().getLocale();
- ResourceBundle rb =
ResourceBundle.getBundle("conf.bundles.Resource", requestLocale,
Thread.currentThread().getContextClassLoader());
- name = rb.getString(RESOURCE_PREFIX + name);
+ if
(controller.getPortalAuthorizationManagerFactory().getManager().checkPermission(perm))
+ {
+ ViewPageCommand showadmin = new ViewPageCommand(new PortalObjectId(new
String[]{"admin"}));
+
request.setAttribute("org.jboss.portal.header.ADMIN_PORTAL_URL",
controllerCtx.renderURL(showadmin, null, null));
+ }
}
- catch (MissingResourceException e)
+ catch (PortalSecurityException e)
{
+ log.error("", e);
}
+ }
- PortalObjectId id = navElement.getId();
+ //
+ if (admin || isDashboard)
+ {
+ // Link to default page of default portal
+ ViewPageCommand _rpc = new ViewPageCommand(new PortalObjectId(new
String[]{"default", "default"}));
+ request.setAttribute("org.jboss.portal.header.DASHBOARD_URL",
controllerCtx.renderURL(_rpc, null, null));
+ }
- PortalObjectPermission perm = new PortalObjectPermission(id,
PortalObjectPermission.VIEW_MASK);
- if (portalAuthorizationManagerFactory.getManager().checkPermission(perm))
- {
- ViewPageCommand cmd = new ViewPageCommand(navElement.getId());
- String childURL = rpc.getControllerContext().renderURL(cmd, null, null);
- Node childNode = new Node(name, childURL);
- if (page == navElement)
- {
- childNode.current = true;
- }
-
- root.addChild(childNode);
- // if we were able to detect the selected node in the hierarchie level of
the nav elements,
- // then flag the node so the css can style it as the selected one
+ //
+ SignOutCommand cmd = new SignOutCommand();
+ URLContext urlContext =
controllerCtx.getServerInvocation().getServerContext().getURLContext();
+ String logoutURL = controllerCtx.renderURL(cmd, urlContext.asNonAuthenticated(),
null);
+ request.setAttribute("org.jboss.portal.header.SIGN_OUT_URL",
logoutURL);
- List childPages = getAuthorizedChildrenPages(navElement);
-
- // Submenu logic
- if (childPages.size() != 0)
- {
- for (Iterator j = childPages.iterator(); j.hasNext();)
- {
- PortalObject child = (PortalObject)j.next();
- if (child.getType() == PortalObject.TYPE_PAGE)
- {
- ViewPageCommand renderCmd = new ViewPageCommand(child.getId());
- String subChildURL =
rpc.getControllerContext().renderURL(renderCmd, null, null);
- String childName = child.getName();
- try
- {
- // localize node name
- Locale requestLocale =
rpc.getControllerContext().getServerInvocation().getRequest().getLocale();
- ResourceBundle rb =
ResourceBundle.getBundle("conf.bundles.Resource", requestLocale,
Thread.currentThread().getContextClassLoader());
- childName = rb.getString(RESOURCE_PREFIX + childName);
- }
- catch (MissingResourceException e)
- {
- }
- childNode.addChild(new Node(childName, subChildURL));
- }
- }
- }
- }
+ //
+ try
+ {
+ rd.include(request, response);
+ return response.getContent();
}
- }
- catch (Exception e)
- {
- log.error("", e);
- }
-
- request.setAttribute("org.jboss.portal.header.root", root);
-
- try
- {
- rd.include(request, response);
- response.getWriter().flush();
- }
- catch (ServletException e1)
- {
- e1.printStackTrace();
- }
- catch (IOException e1)
- {
- e1.printStackTrace();
- }
-
- try
- {
- sb.append(response.getOutputStream().toString());
- }
- catch (IOException e1)
- {
- e1.printStackTrace();
- }
- return sb;
- }
-
- private List getAuthorizedChildrenPages(PortalObject portalObject)
- {
- List result = new ArrayList();
- Collection children = portalObject.getChildren(PortalObject.PAGE_MASK);
-
- for (Iterator i = children.iterator(); i.hasNext();)
- {
- PortalObject child = (PortalObject)i.next();
- PortalObjectId id = child.getId();
-
- PortalObjectPermission perm = new PortalObjectPermission(id,
PortalObjectPermission.VIEW_MASK);
- if (portalAuthorizationManagerFactory.getManager().checkPermission(perm))
+ catch (ServletException e1)
{
- result.add(child);
+ e1.printStackTrace();
}
- }
- return result;
- }
-
- protected void sortTabs(List navElements)
- {
- Collections.sort(navElements, new Comparator()
- {
- public int compare(Object o1, Object o2)
+ catch (IOException e1)
{
- Float high1 = new Float(getOrder(o1));
- Float high2 = new Float(getOrder(o2));
- if (high1.equals(high2))
- {
- return ((PortalObject)o1).getName()
- .compareTo(((PortalObject)o2).getName());
- }
- else
- {
- return high1.compareTo(high2);
- }
+ e1.printStackTrace();
}
- });
+ }
+
+ //
+ return null;
}
- private static float getOrder(Object o)
+ public String injectTabbedNav(RenderPageCommand rpc)
{
- if (o instanceof PortalContainer)
+ ControllerContext controllerCtx = rpc.getControllerContext();
+
+ //
+ ServerInvocationContext serverContext =
controllerCtx.getServerInvocation().getServerContext();
+
+ // Get the right servlet context
+ ServletContext servletContext =
serverContext.getClientRequest().getSession().getServletContext().getContext(targetContextPath);
+
+ // Get request dispatcher
+ RequestDispatcher rd = servletContext.getRequestDispatcher(tabsPath);
+
+ //
+ if (rd != null)
{
- return 0;
- }
- if (o instanceof Portal)
- {
- return 1;
- }
- if (o instanceof Page)
- {
- String orderProperty = ((Page)o).getDeclaredProperty(ORDER);
- if (orderProperty == null)
+ // Wrap request and response safely
+ BufferingResponseWrapper response = new
BufferingResponseWrapper(serverContext.getClientResponse());
+ BufferingRequestWrapper request = new BufferingRequestWrapper(
+ serverContext.getClientRequest(),
+ targetContextPath,
+ rpc.getControllerContext().getServerInvocation().getRequest().getLocales());
+
+ //
+ request.setAttribute("org.jboss.portal.api.PORTAL_NODE",
Navigation.getCurrentNode());
+ request.setAttribute("org.jboss.portal.api.PORTAL_NODE_URL_FACTORY",
Navigation.getFactory());
+
+ //
+ try
{
- return 2.999f;
+ rd.include(request, response);
+ return response.getContent();
}
- try
+ catch (ServletException e)
{
- return Float.parseFloat("2." + orderProperty);
+ e.printStackTrace();
}
- catch (NumberFormatException e)
+ catch (IOException e)
{
- return 2.999f;
+ e.printStackTrace();
}
}
- if (o instanceof Window)
- {
- return 3;
- }
- return 4;
+
+ //
+ return null;
}
-
- public class Node
- {
- public String name;
- public List children;
- public String url;
- public boolean current;
-
- public Node(String name, String url)
- {
- this.name = name;
- this.url = url;
- this.children = new ArrayList();
- this.current = false;
- }
-
- public void addChild(Node node)
- {
- children.add(node);
- }
- }
- public String getHeaderJSP()
+ public String getHeaderPath()
{
- return headerJSP;
+ return headerPath;
}
- public void setHeaderJSP(String headerJSP)
+ public void setHeaderPath(String headerPath)
{
- this.headerJSP = headerJSP;
+ this.headerPath = headerPath;
}
- public String getJSPContext()
+ public String getTargetContextPath()
{
- return JSPContext;
+ return targetContextPath;
}
- public void setJSPContext(String context)
+ public void setTargetContextPath(String context)
{
- JSPContext = context;
+ targetContextPath = context;
}
- public String getTabsJSP()
+ public String getTabsPath()
{
- return tabsJSP;
+ return tabsPath;
}
- public void setTabsJSP(String tabsJSP)
+ public void setTabsPath(String tabsPath)
{
- this.tabsJSP = tabsJSP;
+ this.tabsPath = tabsPath;
}
}
Modified:
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/Navigation.java
===================================================================
---
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/Navigation.java 2007-04-25
12:15:13 UTC (rev 7040)
+++
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/Navigation.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -22,6 +22,8 @@
******************************************************************************/
package org.jboss.portal.core.aspects.controller.node;
+import org.jboss.portal.api.node.PortalNodeURLFactory;
+
/**
* @author <a href="mailto:julien@jboss.org">Julien Viet</a>
* @version $Revision: 3201 $
@@ -29,20 +31,34 @@
public class Navigation
{
- /** Enforce singleton. */
- private Navigation()
- {
- }
-
+ /** . */
private static final ThreadLocal currentNodeLocal = new ThreadLocal();
+ /** . */
+ private static final ThreadLocal factoryLocal = new ThreadLocal();
+
public static PortalObjectNode getCurrentNode()
{
return (PortalObjectNode)currentNodeLocal.get();
}
- public static void setCurrentNode(PortalObjectNode currentNode)
+ static void setCurrentNode(PortalObjectNode currentNode)
{
currentNodeLocal.set(currentNode);
}
+
+ public static PortalNodeURLFactory getFactory()
+ {
+ return (PortalNodeURLFactory)factoryLocal.get();
+ }
+
+ static void setFactory(PortalNodeURLFactory factory)
+ {
+ factoryLocal.set(factory);
+ }
+
+ /** Enforce singleton. */
+ private Navigation()
+ {
+ }
}
Modified:
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeInterceptor.java
===================================================================
---
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeInterceptor.java 2007-04-25
12:15:13 UTC (rev 7040)
+++
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeInterceptor.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -30,6 +30,8 @@
import org.jboss.portal.core.model.portal.command.WindowCommand;
import org.jboss.portal.core.model.portal.Page;
import org.jboss.portal.core.model.portal.Window;
+import org.jboss.portal.security.spi.auth.PortalAuthorizationManagerFactory;
+import org.jboss.portal.security.spi.auth.PortalAuthorizationManager;
/**
* @author <a href="mailto:julien@jboss.org">Julien Viet</a>
@@ -38,6 +40,19 @@
public class PortalNodeInterceptor extends ControllerInterceptor
{
+ /** . */
+ private PortalAuthorizationManagerFactory portalAuthorizationManagerFactory;
+
+ public PortalAuthorizationManagerFactory getPortalAuthorizationManagerFactory()
+ {
+ return portalAuthorizationManagerFactory;
+ }
+
+ public void setPortalAuthorizationManagerFactory(PortalAuthorizationManagerFactory
portalAuthorizationManagerFactory)
+ {
+ this.portalAuthorizationManagerFactory = portalAuthorizationManagerFactory;
+ }
+
public ControllerResponse invoke(ControllerCommand cmd) throws Exception,
InvocationException
{
// Get the next node
@@ -46,11 +61,20 @@
// Save previous node temporarily
PortalObjectNode previous = Navigation.getCurrentNode();
+ // Whether or not we inherit from an existing factory
+ boolean noFactory = Navigation.getFactory() == null;
+
try
{
// Set next node
Navigation.setCurrentNode(next);
+ //
+ if (noFactory)
+ {
+ Navigation.setFactory(new
PortalNodeURLFactoryImpl(cmd.getControllerContext()));
+ }
+
// Invoke
return (ControllerResponse)cmd.invokeNext();
}
@@ -58,24 +82,35 @@
{
// Set previous node back
Navigation.setCurrentNode(previous);
+
+ //
+ if (noFactory)
+ {
+ Navigation.setFactory(null);
+ }
}
}
private PortalObjectNode getNode(ControllerCommand cmd)
{
+ PortalAuthorizationManager pam = portalAuthorizationManagerFactory.getManager();
PortalObjectNode next = null;
+
+ //
if (cmd instanceof WindowCommand)
{
WindowCommand windowCmd = (WindowCommand)cmd;
Window window = windowCmd.getWindow();
- next = new PortalObjectNode(window);
+ next = new PortalObjectNode(pam, window);
}
else if (cmd instanceof RenderPageCommand)
{
RenderPageCommand rpCmd = (RenderPageCommand)cmd;
Page page = rpCmd.getPage();
- next = new PortalObjectNode(page);
+ next = new PortalObjectNode(pam, page);
}
+
+ //
return next;
}
}
Deleted:
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeURLFactory.java
===================================================================
---
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeURLFactory.java 2007-04-25
12:15:13 UTC (rev 7040)
+++
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeURLFactory.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -1,154 +0,0 @@
-/******************************************************************************
- * JBoss, a division of Red Hat *
- * Copyright 2006, Red Hat Middleware, LLC, and individual *
- * contributors as indicated by the @authors tag. See the *
- * copyright.txt in the distribution for a full listing of *
- * individual contributors. *
- * *
- * This is free software; you can redistribute it and/or modify it *
- * under the terms of the GNU Lesser General Public License as *
- * published by the Free Software Foundation; either version 2.1 of *
- * the License, or (at your option) any later version. *
- * *
- * This software is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
- * Lesser General Public License for more details. *
- * *
- * You should have received a copy of the GNU Lesser General Public *
- * License along with this software; if not, write to the Free *
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
- ******************************************************************************/
-package org.jboss.portal.core.aspects.controller.node;
-
-import org.jboss.portal.api.node.PortalNode;
-import org.jboss.portal.api.node.PortalNodeURL;
-import org.jboss.portal.portlet.PortletParametersStateString;
-import org.jboss.portal.server.request.URLContext;
-import org.jboss.portal.server.request.URLFormat;
-import org.jboss.portal.core.controller.ControllerContext;
-import
org.jboss.portal.core.model.portal.command.action.InvokePortletWindowRenderCommand;
-import org.jboss.portal.core.model.portal.command.view.ViewPageCommand;
-import org.jboss.portal.core.model.portal.PortalObjectId;
-
-/**
- * @author <a href="mailto:julien@jboss.org">Julien Viet</a>
- * @version $Revision: 5136 $
- */
-public class PortalNodeURLFactory
-{
-
- public static PortalNodeURL createActionURL(PortalObjectNode node, ControllerContext
controllerContext)
- {
- switch (node.getType())
- {
- case PortalNode.TYPE_WINDOW:
- return null;
- case PortalNode.TYPE_CONTEXT:
- case PortalNode.TYPE_PAGE:
- case PortalNode.TYPE_PORTAL:
- default:
- throw new IllegalArgumentException("This kind of node does not support
action url " + node);
- }
- }
-
- public static PortalNodeURL createRenderURL(PortalObjectNode node, ControllerContext
controllerContext)
- {
- switch (node.getType())
- {
- case PortalNode.TYPE_WINDOW:
- return new WindowURL(node.getObjectId(), controllerContext);
- case PortalNode.TYPE_PAGE:
- return new PageURL(node.getObjectId(), controllerContext);
- case PortalNode.TYPE_PORTAL:
- return null;
- case PortalNode.TYPE_CONTEXT:
- default:
- throw new IllegalArgumentException("This kind of node does not support
render url " + node);
- }
- }
-
- private static class AbstractPortalNodeURL implements PortalNodeURL
- {
-
- protected PortalObjectId id;
- protected ControllerContext controllerContext;
- protected PortletParametersStateString parameters;
- protected Boolean wantSecure;
- protected Boolean wantAuthenticated;
- protected boolean relative;
-
- public AbstractPortalNodeURL(PortalObjectId id, ControllerContext
controllerContext)
- {
- this.id = id;
- this.controllerContext = controllerContext;
- this.relative = true;
- this.parameters = new PortletParametersStateString();
- }
-
- public void setParameter(String name, String value)
- {
- parameters.setValue(name, value);
- }
-
- public void setParameter(String name, String[] values)
- {
- parameters.setValues(name, values);
- }
-
- public void setAuthenticated(Boolean authenticated)
- {
- this.wantAuthenticated = authenticated;
- }
-
- public void setSecure(Boolean secure)
- {
- this.wantSecure = secure;
- }
-
- public void setRelative(boolean relative)
- {
- this.relative = relative;
- }
-
- protected URLContext getURLContext()
- {
- return
controllerContext.getServerInvocation().getServerContext().getURLContext();
- }
-
- }
-
- private static class WindowURL extends AbstractPortalNodeURL
- {
-
- public WindowURL(PortalObjectId id, ControllerContext controllerContext)
- {
- super(id, controllerContext);
- }
-
- public String toString()
- {
- InvokePortletWindowRenderCommand cmd = new InvokePortletWindowRenderCommand(id,
null, null, parameters);
- URLContext urlContext = getURLContext();
- return controllerContext.renderURL(cmd, urlContext,
URLFormat.newInstance(relative, true));
- }
- }
-
- private static class PageURL extends AbstractPortalNodeURL
- {
-
- public PageURL(PortalObjectId id, ControllerContext controllerContext)
- {
- super(id, controllerContext);
- }
-
- public String toString()
- {
- ViewPageCommand cmd = new ViewPageCommand(id);
- URLContext urlContext = getURLContext();
- return controllerContext.renderURL(cmd, urlContext,
URLFormat.newInstance(relative, true));
- }
- }
-
-}
Copied:
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeURLFactoryImpl.java
(from rev 7039,
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeURLFactory.java)
===================================================================
---
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeURLFactoryImpl.java
(rev 0)
+++
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalNodeURLFactoryImpl.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -0,0 +1,159 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portal.core.aspects.controller.node;
+
+import org.jboss.portal.api.node.PortalNode;
+import org.jboss.portal.api.node.PortalNodeURL;
+import org.jboss.portal.api.node.PortalNodeURLFactory;
+import org.jboss.portal.portlet.PortletParametersStateString;
+import org.jboss.portal.server.request.URLContext;
+import org.jboss.portal.server.request.URLFormat;
+import org.jboss.portal.core.controller.ControllerContext;
+import
org.jboss.portal.core.model.portal.command.action.InvokePortletWindowRenderCommand;
+import org.jboss.portal.core.model.portal.command.view.ViewPageCommand;
+import org.jboss.portal.core.model.portal.PortalObjectId;
+
+/**
+ * @author <a href="mailto:julien@jboss.org">Julien Viet</a>
+ * @version $Revision: 5136 $
+ */
+public class PortalNodeURLFactoryImpl implements PortalNodeURLFactory
+{
+
+ /** . */
+ private final ControllerContext controllerContext;
+
+ public PortalNodeURLFactoryImpl(ControllerContext controllerContext)
+ {
+ this.controllerContext = controllerContext;
+ }
+
+ public PortalNodeURL createURL(PortalNode node)
+ {
+ PortalObjectNode pon = (PortalObjectNode)node;
+ switch (node.getType())
+ {
+ case PortalNode.TYPE_WINDOW:
+ return new WindowURL(pon.getObjectId(), controllerContext);
+ case PortalNode.TYPE_PAGE:
+ return new PageURL(pon.getObjectId(), controllerContext);
+ case PortalNode.TYPE_PORTAL:
+ case PortalNode.TYPE_CONTEXT:
+ default:
+ throw new IllegalArgumentException("This kind of node does not support
render url " + node);
+ }
+ }
+
+ private static class AbstractPortalNodeURL implements PortalNodeURL
+ {
+
+ /** . */
+ protected PortalObjectId id;
+
+ /** . */
+ protected ControllerContext controllerContext;
+
+ /** . */
+ protected PortletParametersStateString parameters;
+
+ /** . */
+ protected Boolean wantSecure;
+
+ /** . */
+ protected Boolean wantAuthenticated;
+
+ /** . */
+ protected boolean relative;
+
+ public AbstractPortalNodeURL(PortalObjectId id, ControllerContext
controllerContext)
+ {
+ this.id = id;
+ this.controllerContext = controllerContext;
+ this.relative = true;
+ this.parameters = new PortletParametersStateString();
+ }
+
+ public void setParameter(String name, String value)
+ {
+ parameters.setValue(name, value);
+ }
+
+ public void setParameter(String name, String[] values)
+ {
+ parameters.setValues(name, values);
+ }
+
+ public void setAuthenticated(Boolean authenticated)
+ {
+ this.wantAuthenticated = authenticated;
+ }
+
+ public void setSecure(Boolean secure)
+ {
+ this.wantSecure = secure;
+ }
+
+ public void setRelative(boolean relative)
+ {
+ this.relative = relative;
+ }
+
+ protected URLContext getURLContext()
+ {
+ return
controllerContext.getServerInvocation().getServerContext().getURLContext();
+ }
+
+ }
+
+ private static class WindowURL extends AbstractPortalNodeURL
+ {
+
+ public WindowURL(PortalObjectId id, ControllerContext controllerContext)
+ {
+ super(id, controllerContext);
+ }
+
+ public String toString()
+ {
+ InvokePortletWindowRenderCommand cmd = new InvokePortletWindowRenderCommand(id,
null, null, parameters);
+ URLContext urlContext = getURLContext();
+ return controllerContext.renderURL(cmd, urlContext,
URLFormat.newInstance(relative, true));
+ }
+ }
+
+ private static class PageURL extends AbstractPortalNodeURL
+ {
+
+ public PageURL(PortalObjectId id, ControllerContext controllerContext)
+ {
+ super(id, controllerContext);
+ }
+
+ public String toString()
+ {
+ ViewPageCommand cmd = new ViewPageCommand(id);
+ URLContext urlContext = getURLContext();
+ return controllerContext.renderURL(cmd, urlContext,
URLFormat.newInstance(relative, true));
+ }
+ }
+}
Modified:
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalObjectNode.java
===================================================================
---
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalObjectNode.java 2007-04-25
12:15:13 UTC (rev 7040)
+++
trunk/core/src/main/org/jboss/portal/core/aspects/controller/node/PortalObjectNode.java 2007-04-25
12:36:23 UTC (rev 7041)
@@ -27,16 +27,26 @@
import org.jboss.portal.api.node.event.PortalNodeEventContext;
import org.jboss.portal.api.node.event.PortalNodeEventListener;
import org.jboss.portal.common.path.RelativePathParser;
+import org.jboss.portal.common.i18n.ResourceBundleManager;
+import org.jboss.portal.common.i18n.SimpleResourceBundleFactory;
import org.jboss.portal.core.event.PortalEventListenerRegistry;
import org.jboss.portal.core.model.portal.PortalObject;
import org.jboss.portal.core.model.portal.PortalObjectId;
+import org.jboss.portal.core.model.portal.PortalObjectPermission;
import org.jboss.portal.spi.runtime.NavigationalStateContext;
+import org.jboss.portal.security.spi.auth.PortalAuthorizationManager;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.MissingResourceException;
+import java.util.Comparator;
+import java.util.List;
+import java.util.ArrayList;
/**
* @author <a href="mailto:julien@jboss.org">Julien Viet</a>
@@ -45,55 +55,78 @@
public class PortalObjectNode implements PortalNode
{
+ /** Order. */
+ private static final String ORDER = "order";
+
+ /** The prefix for resources in the bundle. */
+ private static final String RESOURCE_PREFIX = "PAGENAME_";
+
+ /** . */
+ private static final String BUNDLE_BASE_NAME = "conf.bundles.Resource";
+
+ /** . */
+ private static final ResourceBundleManager resourceBundles = new
ResourceBundleManager(null, new SimpleResourceBundleFactory(BUNDLE_BASE_NAME,
PortalObjectNode.class.getClassLoader()));
+
/** The wrapped portal object. */
private final PortalObject object;
/** The parent node. */
private PortalObjectNode parentNode;
- /** The children map. */
- private Map childrenNodes;
+ /** The children. */
+ private final NodeList children;
/** The root node. */
private PortalNode root;
+ /** The key for the display name in the resource bundle. */
+ private String displayNameKey;
+
+ /** The security checks. */
+ private final PortalAuthorizationManager portalAuthorizationManager;
+
/**
* Build a portal node object wrapping the specified portal object.
*
* @param object the wrapped portal object
* @throws IllegalArgumentException if the specified object is null
*/
- public PortalObjectNode(PortalObject object) throws IllegalArgumentException
+ public PortalObjectNode(PortalAuthorizationManager portalAuthorizationManager,
PortalObject object) throws IllegalArgumentException
{
if (object == null)
{
throw new IllegalArgumentException();
}
+ this.portalAuthorizationManager = portalAuthorizationManager;
this.object = object;
+ this.children = new Children(this);
}
/**
+ * Used during the construction of a children list.
+ *
* @param parentNode the parent node of this node
* @param object the wrapped portal object
*/
- private PortalObjectNode(PortalObjectNode parentNode, PortalObject object)
+ protected PortalObjectNode(PortalObjectNode parentNode, PortalObject object)
{
+ this.portalAuthorizationManager = parentNode.portalAuthorizationManager;
this.parentNode = parentNode;
this.object = object;
+ this.children = new Children(this);
}
/**
+ * Used when building the parent.
+ *
* @param object the wrapped portal object
* @param childNode the child node creating that object
*/
private PortalObjectNode(PortalObject object, PortalObjectNode childNode)
{
+ this.portalAuthorizationManager = childNode.portalAuthorizationManager;
this.object = object;
-
- //
- Map childrenNodes = getChildrenNodes();
- childrenNodes.put(childNode.getName(), childNode);
- this.childrenNodes = Collections.unmodifiableMap(childrenNodes);
+ this.children = new Siblings(childNode);
}
public int getType()
@@ -136,22 +169,46 @@
return object.getName();
}
- public PortalNode getChild(String name)
+ public String getDisplayName(Locale locale)
{
- if (childrenNodes == null)
+ // Lazyly compute the display name
+ if (displayNameKey == null)
{
- childrenNodes = Collections.unmodifiableMap(getChildrenNodes());
+ displayNameKey = RESOURCE_PREFIX + object.getName();
}
- return (PortalNode)childrenNodes.get(name);
+
+ // Try to get the display name from the resource bundles
+ String displayName = null;
+ ResourceBundle bundle = resourceBundles.getResourceBundle(locale);
+ if (bundle != null)
+ {
+ try
+ {
+ displayName = bundle.getString(displayNameKey);
+ }
+ catch (MissingResourceException ignore)
+ {
+ }
+ }
+
+ // If nothing found just use the name
+ if (displayName == null)
+ {
+ displayName = object.getName();
+ }
+
+ //
+ return displayName;
}
+ public PortalNode getChild(String name)
+ {
+ return (PortalNode)children.getMap().get(name);
+ }
+
public Collection getChildren()
{
- if (childrenNodes == null)
- {
- childrenNodes = Collections.unmodifiableMap(getChildrenNodes());
- }
- return childrenNodes.values();
+ return children.getList();
}
public PortalNode resolve(String relativePath)
@@ -195,23 +252,6 @@
return bubbler.dispatch();
}
- private Map getChildrenNodes()
- {
- Map childrenMap = Collections.EMPTY_MAP;
- Collection tmp = object.getChildren();
- if (tmp.isEmpty() == false)
- {
- childrenMap = new HashMap();
- for (Iterator i = tmp.iterator(); i.hasNext();)
- {
- PortalObject childObject = (PortalObject)i.next();
- PortalObjectNode child = new PortalObjectNode(this, childObject);
- childrenMap.put(child.getName(), child);
- }
- }
- return childrenMap;
- }
-
private static class Bubbler implements PortalNodeEventContext
{
@@ -297,4 +337,175 @@
return node;
}
}
+
+ private float getWeight()
+ {
+ switch(object.getType())
+ {
+ case PortalObject.TYPE_CONTEXT:
+ return 0;
+ case PortalObject.TYPE_PORTAL:
+ return 1;
+ case PortalObject.TYPE_PAGE:
+ String orderProperty = object.getDeclaredProperty(ORDER);
+ if (orderProperty == null)
+ {
+ return 2.999f;
+ }
+ try
+ {
+ return Float.parseFloat("2." + orderProperty);
+ }
+ catch (NumberFormatException e)
+ {
+ return 2.999f;
+ }
+ case PortalObject.TYPE_WINDOW:
+ return 3;
+ default:
+ return 4;
+ }
+ }
+
+ private static final Comparator siblingComparator = new Comparator()
+ {
+ public int compare(Object o1, Object o2)
+ {
+ PortalObjectNode node1 = (PortalObjectNode)o1;
+ PortalObjectNode node2 = (PortalObjectNode)o2;
+ float weight1 = node1.getWeight();
+ float weight2 = node2.getWeight();
+ if (weight1 == weight2)
+ {
+ return node1.getName().compareTo(node2.getName());
+ }
+ else if (weight1 < weight2)
+ {
+ return -1;
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ };
+
+ private class Children extends NodeList
+ {
+
+ /** . */
+ private PortalObjectNode node;
+
+ public Children(PortalObjectNode node)
+ {
+ this.node = node;
+ }
+
+ protected Map createMap()
+ {
+ return buildChildMap(node);
+ }
+ }
+
+ private class Siblings extends NodeList
+ {
+
+ /** . */
+ private PortalObjectNode node;
+
+ private Siblings(PortalObjectNode node)
+ {
+ this.node = node;
+ }
+
+ protected Map createMap()
+ {
+ Map childrenNodes = buildChildMap(node.parentNode);
+
+ // Replace the node with the one provided
+ childrenNodes.put(node.getName(), node);
+
+ //
+ return childrenNodes;
+ }
+ }
+
+ private abstract class NodeList
+ {
+
+ /** . */
+ private Map map;
+
+ /** . */
+ private List list;
+
+ protected abstract Map createMap();
+
+ public final List getList()
+ {
+ if (list == null)
+ {
+ Map childrenMap = getMap();
+
+ //
+ list = new ArrayList(childrenMap.values());
+ Collections.sort(list, siblingComparator);
+ list = Collections.unmodifiableList(list);
+ }
+
+ //
+ return list;
+ }
+
+ public final Map getMap()
+ {
+ if (map == null)
+ {
+ map = createMap();
+ }
+
+ //
+ return map;
+ }
+
+ /**
+ * Compute and returns a modifiable map made of the children nodes.
+ */
+ protected final Map buildChildMap(PortalObjectNode objectNode)
+ {
+ PortalObject object = objectNode.object;
+
+ //
+ Collection tmp = object.getChildren();
+
+ //
+ if (tmp.size() > 0)
+ {
+ Map childrenMap = new HashMap();
+
+ //
+ for (Iterator i = tmp.iterator(); i.hasNext();)
+ {
+ PortalObject childObject = (PortalObject)i.next();
+
+ // Prepare to check
+ PortalObjectPermission perm = new
PortalObjectPermission(childObject.getId(), PortalObjectPermission.VIEW_MASK);
+
+ // We only add it if the user can view the node
+ if (portalAuthorizationManager.checkPermission(perm))
+ {
+ PortalObjectNode child = new PortalObjectNode(objectNode,
childObject);
+ childrenMap.put(child.getName(), child);
+ }
+ }
+
+ //
+ return childrenMap;
+ }
+ else
+ {
+ return Collections.EMPTY_MAP;
+ }
+ }
+ }
}
Modified: trunk/core/src/main/org/jboss/portlet/JBossActionResponse.java
===================================================================
--- trunk/core/src/main/org/jboss/portlet/JBossActionResponse.java 2007-04-25 12:15:13 UTC
(rev 7040)
+++ trunk/core/src/main/org/jboss/portlet/JBossActionResponse.java 2007-04-25 12:36:23 UTC
(rev 7041)
@@ -24,15 +24,14 @@
import org.jboss.portal.api.node.PortalNode;
import org.jboss.portal.api.node.PortalNodeURL;
+import org.jboss.portal.api.node.PortalNodeURLFactory;
import org.jboss.portal.common.util.URLTools;
-import org.jboss.portal.core.aspects.controller.node.PortalNodeURLFactory;
import org.jboss.portal.core.aspects.controller.node.PortalObjectNode;
+import org.jboss.portal.core.aspects.controller.node.Navigation;
import org.jboss.portal.core.controller.portlet.SignOutResponse;
-import org.jboss.portal.core.controller.ControllerContext;
import org.jboss.portal.portlet.impl.jsr168.api.ActionResponseImpl;
import org.jboss.portal.portlet.impl.jsr168.api.PortletRequestImpl;
import org.jboss.portal.portlet.invocation.ActionInvocation;
-import org.jboss.portal.portlet.invocation.PortletInvocation;
import javax.portlet.PortletRequest;
@@ -43,15 +42,9 @@
public class JBossActionResponse extends ActionResponseImpl
{
- /** . */
- private ControllerContext controllerContext;
-
public JBossActionResponse(ActionInvocation invocation, PortletRequestImpl preq)
{
super(invocation, preq);
-
- //
- this.controllerContext =
(ControllerContext)invocation.getAttribute(PortletInvocation.INVOCATION_SCOPE,
"controller_context");
}
// /**
@@ -95,13 +88,18 @@
public PortalNodeURL createActionURL(PortalNode node) throws IllegalArgumentException,
IllegalStateException
{
- if (controllerContext == null)
+ PortalNodeURLFactory factory = Navigation.getFactory();
+
+ //
+ if (factory == null)
{
throw new IllegalStateException("Not in a controller context");
}
+
+ //
if (node instanceof PortalObjectNode)
{
- return PortalNodeURLFactory.createActionURL((PortalObjectNode)node,
controllerContext);
+ return factory.createURL(node);
}
else
{
@@ -111,13 +109,18 @@
public PortalNodeURL createRenderURL(PortalNode node) throws IllegalArgumentException,
IllegalStateException
{
- if (controllerContext == null)
+ PortalNodeURLFactory factory = Navigation.getFactory();
+
+ //
+ if (factory == null)
{
throw new IllegalStateException("Not in a controller context");
}
+
+ //
if (node instanceof PortalObjectNode)
{
- return PortalNodeURLFactory.createRenderURL((PortalObjectNode)node,
controllerContext);
+ return factory.createURL(node);
}
else
{
Modified: trunk/core/src/main/org/jboss/portlet/JBossRenderResponse.java
===================================================================
--- trunk/core/src/main/org/jboss/portlet/JBossRenderResponse.java 2007-04-25 12:15:13 UTC
(rev 7040)
+++ trunk/core/src/main/org/jboss/portlet/JBossRenderResponse.java 2007-04-25 12:36:23 UTC
(rev 7041)
@@ -24,9 +24,9 @@
import org.jboss.portal.api.node.PortalNode;
import org.jboss.portal.api.node.PortalNodeURL;
-import org.jboss.portal.core.aspects.controller.node.PortalNodeURLFactory;
+import org.jboss.portal.api.node.PortalNodeURLFactory;
import org.jboss.portal.core.aspects.controller.node.PortalObjectNode;
-import org.jboss.portal.core.controller.ControllerContext;
+import org.jboss.portal.core.aspects.controller.node.Navigation;
import org.jboss.portal.portlet.impl.jsr168.api.PortletRequestImpl;
import org.jboss.portal.portlet.impl.jsr168.api.RenderResponseImpl;
import org.jboss.portal.portlet.invocation.PortletInvocation;
@@ -39,26 +39,25 @@
public class JBossRenderResponse extends RenderResponseImpl
{
- /** . */
- private ControllerContext controllerContext;
-
public JBossRenderResponse(RenderInvocation invocation, PortletRequestImpl preq)
{
super(invocation, preq);
-
- //
- this.controllerContext =
(ControllerContext)invocation.getAttribute(PortletInvocation.INVOCATION_SCOPE,
"controller_context");
}
public PortalNodeURL createActionURL(PortalNode node) throws IllegalArgumentException,
IllegalStateException
{
- if (controllerContext == null)
+ PortalNodeURLFactory factory = Navigation.getFactory();
+
+ //
+ if (factory == null)
{
throw new IllegalStateException("Not in a controller context");
}
+
+ //
if (node instanceof PortalObjectNode)
{
- return PortalNodeURLFactory.createActionURL((PortalObjectNode)node,
controllerContext);
+ return factory.createURL(node);
}
else
{
@@ -68,13 +67,18 @@
public PortalNodeURL createRenderURL(PortalNode node) throws IllegalArgumentException,
IllegalStateException
{
- if (controllerContext == null)
+ PortalNodeURLFactory factory = Navigation.getFactory();
+
+ //
+ if (factory == null)
{
throw new IllegalStateException("Not in a controller context");
}
+
+ //
if (node instanceof PortalObjectNode)
{
- return PortalNodeURLFactory.createRenderURL((PortalObjectNode)node,
controllerContext);
+ return factory.createURL(node);
}
else
{
@@ -87,5 +91,4 @@
{
return invocation;
}
-
}
Modified: trunk/core/src/resources/portal-core-sar/META-INF/jboss-service.xml
===================================================================
--- trunk/core/src/resources/portal-core-sar/META-INF/jboss-service.xml 2007-04-25
12:15:13 UTC (rev 7040)
+++ trunk/core/src/resources/portal-core-sar/META-INF/jboss-service.xml 2007-04-25
12:36:23 UTC (rev 7041)
@@ -182,6 +182,9 @@
xmbean-dd=""
xmbean-code="org.jboss.portal.jems.as.system.JBossServiceModelMBean">
<xmbean/>
+ <depends
+ optional-attribute-name="PortalAuthorizationManagerFactory"
+
proxy-type="attribute">portal:service=PortalAuthorizationManagerFactory</depends>
</mbean>
<mbean
code="org.jboss.portal.core.aspects.controller.PolicyEnforcementInterceptor"
@@ -196,9 +199,9 @@
xmbean-dd=""
xmbean-code="org.jboss.portal.jems.as.system.JBossServiceModelMBean">
<xmbean/>
- <attribute name="JSPContext">/portal-core</attribute>
- <attribute
name="HeaderJSP">/WEB-INF/jsp/header/header.jsp</attribute>
- <attribute
name="TabsJSP">/WEB-INF/jsp/header/tabs.jsp</attribute>
+ <attribute name="TargetContextPath">/portal-core</attribute>
+ <attribute
name="HeaderPath">/WEB-INF/jsp/header/header.jsp</attribute>
+ <attribute
name="TabsPath">/WEB-INF/jsp/header/tabs.jsp</attribute>
<depends
optional-attribute-name="PortalAuthorizationManagerFactory"
proxy-type="attribute">portal:service=PortalAuthorizationManagerFactory</depends>
Modified: trunk/core/src/resources/portal-core-war/WEB-INF/jsp/header/header.jsp
===================================================================
--- trunk/core/src/resources/portal-core-war/WEB-INF/jsp/header/header.jsp 2007-04-25
12:15:13 UTC (rev 7040)
+++ trunk/core/src/resources/portal-core-war/WEB-INF/jsp/header/header.jsp 2007-04-25
12:36:23 UTC (rev 7041)
@@ -1,13 +1,13 @@
<%@ page import="org.jboss.portal.identity.User" %>
<%
- User user = (User) request.getAttribute("org.jboss.portal.header.user");
- String dashboardURL = (String)
request.getAttribute("org.jboss.portal.header.dashboardURL");
- String defaultPortalURL = (String)
request.getAttribute("org.jboss.portal.header.defaultPortalURL");
- String adminPortalURL = (String)
request.getAttribute("org.jboss.portal.header.adminPortalURL");
- String editDashboardURL = (String)
request.getAttribute("org.jboss.portal.header.editDashboardURL");
- String copyToDashboardURL = (String)
request.getAttribute("org.jboss.portal.header.copyToDashboardURL");
- String signOutURL = (String)
request.getAttribute("org.jboss.portal.header.signOutURL");
+ User user = (User) request.getAttribute("org.jboss.portal.header.USER");
+ String dashboardURL = (String)
request.getAttribute("org.jboss.portal.header.DASHBOARD_URL");
+ String defaultPortalURL = (String)
request.getAttribute("org.jboss.portal.header.DEFAULT_PORTAL_URL");
+ String adminPortalURL = (String)
request.getAttribute("org.jboss.portal.header.ADMIN_PORTAL_URL");
+ String editDashboardURL = (String)
request.getAttribute("org.jboss.portal.header.EDIT_DASDHBOARD_URL");
+ String copyToDashboardURL = (String)
request.getAttribute("org.jboss.portal.header.COPY_TO_DASHBOARD_URL");
+ String signOutURL = (String)
request.getAttribute("org.jboss.portal.header.SIGN_OUT_URL");
%>
<%
Modified: trunk/core/src/resources/portal-core-war/WEB-INF/jsp/header/tabs.jsp
===================================================================
--- trunk/core/src/resources/portal-core-war/WEB-INF/jsp/header/tabs.jsp 2007-04-25
12:15:13 UTC (rev 7040)
+++ trunk/core/src/resources/portal-core-war/WEB-INF/jsp/header/tabs.jsp 2007-04-25
12:36:23 UTC (rev 7041)
@@ -1,20 +1,43 @@
-<%@ page
import="org.jboss.portal.core.aspects.controller.PageCustomizerInterceptor.Node"
%>
<%@ page import="java.util.Iterator" %>
+<%@ page import="org.jboss.portal.api.node.PortalNode" %>
+<%@ page import="org.jboss.portal.api.node.PortalNodeURLFactory" %>
+<%@ page import="java.util.Locale" %>
+<%@ page import="java.util.ArrayList" %>
<%
- Node root = (Node) request.getAttribute("org.jboss.portal.header.root");
+ PortalNode root =
(PortalNode)request.getAttribute("org.jboss.portal.api.PORTAL_NODE");
+ PortalNodeURLFactory factory =
(PortalNodeURLFactory)request.getAttribute("org.jboss.portal.api.PORTAL_NODE_URL_FACTORY");
+
+ // Get a locale
+ Locale locale = request.getLocale();
+ if (locale == null)
+ {
+ locale = Locale.getDefault();
+ }
%>
<ul id="tabsHeader">
<%
- Iterator childrenIt = root.children.iterator();
- while (childrenIt.hasNext())
+ ArrayList tmp = new ArrayList(10);
+ Iterator siblingsIt = root.getParent().getChildren().iterator();
+ while (siblingsIt.hasNext())
{
- Node child = (Node)childrenIt.next();
+ PortalNode sibling = (PortalNode)siblingsIt.next();
+
+ // Get the list of child pages
+ tmp.clear();
+ for (Iterator i = sibling.getChildren().iterator();i.hasNext();)
+ {
+ PortalNode siblingChild = (PortalNode)i.next();
+ if (siblingChild.getType() == PortalNode.TYPE_PAGE)
+ {
+ tmp.add(siblingChild);
+ }
+ }
%>
- <li <% if(child.current) out.println(" id=\"current\"");
%> onmouseover="this.className='hoverOn'"
onmouseout="this.className='hoverOff'"><a href="<%=
child.url %>"><%= child.name %>
+ <li <% if(sibling == root) out.println(" id=\"current\"");
%> onmouseover="this.className='hoverOn'"
onmouseout="this.className='hoverOff'"><a href="<%=
factory.createURL(sibling) %>"><%= sibling.getDisplayName(locale) %>
<%
- if (child.children.size() == 0)
+ if (tmp.size() == 0)
{
%>
</a>
@@ -27,11 +50,11 @@
<!--[if lte IE 6]><table><tr><td><![endif]-->
<ul>
<%
- for (Iterator j = child.children.iterator(); j.hasNext();)
+ for (Iterator j = tmp.iterator(); j.hasNext();)
{
- Node subChild = (Node)j.next();
+ PortalNode siblingChild = (PortalNode)j.next();
%>
- <li><a href='<%= subChild.url %>'><%=
subChild.name %></a></li>
+ <li><a href='<%= factory.createURL(siblingChild)
%>'><%= siblingChild.getDisplayName(locale) %></a></li>
<%
}
%>