You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by rw...@apache.org on 2006/01/24 08:01:47 UTC

svn commit: r371848 - in /portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page: impl/FilteredFragmentList.java impl/FragmentImpl.java impl/PageImpl.java psml/FilteredFragmentList.java psml/FragmentImpl.java

Author: rwatler
Date: Mon Jan 23 23:01:45 2006
New Revision: 371848

URL: http://svn.apache.org/viewcvs?rev=371848&view=rev
Log:
ensure Fragment fragments lists always immutable: see JS2-473

Added:
    portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/FilteredFragmentList.java
    portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/FilteredFragmentList.java
Modified:
    portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/FragmentImpl.java
    portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/PageImpl.java
    portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/FragmentImpl.java

Added: portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/FilteredFragmentList.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/FilteredFragmentList.java?rev=371848&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/FilteredFragmentList.java (added)
+++ portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/FilteredFragmentList.java Mon Jan 23 23:01:45 2006
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2005 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.om.page.impl;
+
+import java.util.AbstractList;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * FragmentList
+ *
+ * @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
+ * @version $Id$
+ */
+class FilteredFragmentList extends AbstractList
+{
+    private FragmentImpl fragment;
+    private List filteredList;
+
+    FilteredFragmentList(FragmentImpl fragment, List filteredList)
+    {
+        super();
+        this.fragment = fragment;
+        this.filteredList = filteredList;
+    }
+
+    /* (non-Javadoc)
+     * @see java.util.List#add(int,java.lang.Object)
+     */
+    public void add(int index, Object element)
+    {
+        // implement for modifiable AbstractList
+        filteredList.add(index, element);
+        // add object to persistent list
+        fragment.accessFragments().add(element);
+        // maintain page implementation reference
+        if ((fragment.getPage() != null) && (element instanceof FragmentImpl))
+        {
+            ((FragmentImpl)element).setPage(fragment.getPage());
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see java.util.List#get(int)
+     */
+    public Object get(int index)
+    {
+        // implement for modifiable AbstractList
+        return filteredList.get(index);
+    }
+
+    /* (non-Javadoc)
+     * @see java.util.List#remove(int)
+     */
+    public Object remove(int index)
+    {
+        // implement for modifiable AbstractList
+        Object o = filteredList.remove(index);
+        // remove removed object from persistent list
+        if (o != null)
+        {
+            ListIterator iter = fragment.accessFragments().listIterator();
+            while (iter.hasNext())
+            {
+                if (iter.next() == o)
+                {
+                    iter.remove();
+                    break;
+                }
+            }
+        }
+        return o;
+    }
+
+    /* (non-Javadoc)
+     * @see java.util.List#set(int,java.lang.Object)
+     */
+    public Object set(int index, Object element)
+    {
+        // implement for modifiable AbstractList
+        Object o = filteredList.set(index, element);
+        // replace replaced object in persistent list
+        if (o != null)
+        {
+            ListIterator iter = fragment.accessFragments().listIterator();
+            while (iter.hasNext())
+            {
+                if (iter.next() == o)
+                {
+                    iter.set(element);
+                    break;
+                }
+            }
+        }
+        // maintain page implementation reference
+        if ((fragment.getPage() != null) && (element instanceof FragmentImpl))
+        {
+            ((FragmentImpl)element).setPage(fragment.getPage());
+        }
+        return o;
+    }
+
+    /* (non-Javadoc)
+     * @see java.util.List#size()
+     */
+    public int size()
+    {
+        // implement for modifiable AbstractList
+        return filteredList.size();
+    }
+}

Modified: portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/FragmentImpl.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/FragmentImpl.java?rev=371848&r1=371847&r2=371848&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/FragmentImpl.java (original)
+++ portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/FragmentImpl.java Mon Jan 23 23:01:45 2006
@@ -556,16 +556,13 @@
      */
     public List getFragments()
     {
-        // mutable fragments collection must be defined... note
-        // that this collection is only mutable if user has full
-        // access rights to all fragments; otherwise, a copy of
-        // the list will be returned and any modifications to the
-        // set of fragments in the collection will not be preserved
+        // create and return mutable fragments collection
+        // filtered by view access
         if (fragmentsList == null)
         {
             fragmentsList = new FragmentList(this);
         }
-        return filterFragmentsByAccess(fragmentsList);
+        return filterFragmentsByAccess(fragmentsList, true);
     }
     
     /* (non-Javadoc)
@@ -726,10 +723,11 @@
      * Filter fragments list for view access.
      *
      * @param nodes list containing fragments to check
+     * @param mutable make returned list mutable
      * @return original list if all elements viewable, a filtered
      *         partial list, or null if all filtered for view access
      */
-    static List filterFragmentsByAccess(List fragments)
+    List filterFragmentsByAccess(List fragments, boolean mutable)
     {
         if ((fragments != null) && !fragments.isEmpty())
         {
@@ -781,7 +779,14 @@
             {
                 if (!filteredFragments.isEmpty())
                 {
-                    return filteredFragments;
+                    if (mutable)
+                    {
+                        return new FilteredFragmentList(this, filteredFragments);
+                    }
+                    else
+                    {
+                        return filteredFragments;
+                    }
                 }
                 else
                 {

Modified: portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/PageImpl.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/PageImpl.java?rev=371848&r1=371847&r2=371848&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/PageImpl.java (original)
+++ portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/impl/PageImpl.java Mon Jan 23 23:01:45 2006
@@ -306,7 +306,8 @@
         FragmentImpl rootFragment = (FragmentImpl)getRootFragment();
         if (rootFragment != null)
         {
-            return FragmentImpl.filterFragmentsByAccess(rootFragment.getFragmentsByName(name));
+            // return immutable filtered fragment list
+            return rootFragment.filterFragmentsByAccess(rootFragment.getFragmentsByName(name), false);
         }
         return null;
     }

Added: portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/FilteredFragmentList.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/FilteredFragmentList.java?rev=371848&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/FilteredFragmentList.java (added)
+++ portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/FilteredFragmentList.java Mon Jan 23 23:01:45 2006
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2005 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.om.page.psml;
+
+import java.util.AbstractList;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * FragmentList
+ *
+ * @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
+ * @version $Id$
+ */
+class FilteredFragmentList extends AbstractList
+{
+    private FragmentImpl fragment;
+    private List filteredList;
+
+    FilteredFragmentList(FragmentImpl fragment, List filteredList)
+    {
+        super();
+        this.fragment = fragment;
+        this.filteredList = filteredList;
+    }
+
+    /* (non-Javadoc)
+     * @see java.util.List#add(int,java.lang.Object)
+     */
+    public void add(int index, Object element)
+    {
+        // implement for modifiable AbstractList
+        filteredList.add(index, element);
+        // add object to persistent list
+        fragment.accessFragments().add(element);
+        // maintain page implementation reference
+        if ((fragment.getPage() != null) && (element instanceof FragmentImpl))
+        {
+            ((FragmentImpl)element).setPage(fragment.getPage());
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see java.util.List#get(int)
+     */
+    public Object get(int index)
+    {
+        // implement for modifiable AbstractList
+        return filteredList.get(index);
+    }
+
+    /* (non-Javadoc)
+     * @see java.util.List#remove(int)
+     */
+    public Object remove(int index)
+    {
+        // implement for modifiable AbstractList
+        Object o = filteredList.remove(index);
+        // remove removed object from persistent list
+        if (o != null)
+        {
+            ListIterator iter = fragment.accessFragments().listIterator();
+            while (iter.hasNext())
+            {
+                if (iter.next() == o)
+                {
+                    iter.remove();
+                    break;
+                }
+            }
+        }
+        return o;
+    }
+
+    /* (non-Javadoc)
+     * @see java.util.List#set(int,java.lang.Object)
+     */
+    public Object set(int index, Object element)
+    {
+        // implement for modifiable AbstractList
+        Object o = filteredList.set(index, element);
+        // replace replaced object in persistent list
+        if (o != null)
+        {
+            ListIterator iter = fragment.accessFragments().listIterator();
+            while (iter.hasNext())
+            {
+                if (iter.next() == o)
+                {
+                    iter.set(element);
+                    break;
+                }
+            }
+        }
+        // maintain page implementation reference
+        if ((fragment.getPage() != null) && (element instanceof FragmentImpl))
+        {
+            ((FragmentImpl)element).setPage(fragment.getPage());
+        }
+        return o;
+    }
+
+    /* (non-Javadoc)
+     * @see java.util.List#size()
+     */
+    public int size()
+    {
+        // implement for modifiable AbstractList
+        return filteredList.size();
+    }
+}

Modified: portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/FragmentImpl.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/FragmentImpl.java?rev=371848&r1=371847&r2=371848&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/FragmentImpl.java (original)
+++ portals/jetspeed-2/trunk/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/FragmentImpl.java Mon Jan 23 23:01:45 2006
@@ -119,7 +119,8 @@
 
     public List getFragments()
     {
-        // return mutable fragments list if possible
+        // create and return mutable fragments collection
+        // filtered by view access
         if (fragmentsList == null)
         {
             fragmentsList = new FragmentList(this);
@@ -501,7 +502,7 @@
      * @return original list if all elements viewable, a filtered
      *         partial list, or null if all filtered for view access
      */
-    static List filterFragmentsByAccess(List fragments)
+    List filterFragmentsByAccess(List fragments)
     {
         if ((fragments != null) && !fragments.isEmpty())
         {
@@ -553,7 +554,7 @@
             {
                 if (!filteredFragments.isEmpty())
                 {
-                    return filteredFragments;
+                    return new FilteredFragmentList(this, filteredFragments);
                 }
                 else
                 {



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