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 sm...@apache.org on 2007/10/26 02:40:57 UTC
svn commit: r588454 [2/2] - in
/portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/layout/impl:
AddPortletAction.java MovePortletAction.java
PortletPlacementContextImpl.java RemovePortletAction.java
Modified: portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/layout/impl/PortletPlacementContextImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/layout/impl/PortletPlacementContextImpl.java?rev=588454&r1=588453&r2=588454&view=diff
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/layout/impl/PortletPlacementContextImpl.java (original)
+++ portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/layout/impl/PortletPlacementContextImpl.java Thu Oct 25 17:40:57 2007
@@ -1,656 +1,615 @@
-/*
+/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.layout.impl;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.Vector;
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.jetspeed.layout.Coordinate;
-import org.apache.jetspeed.layout.PortletPlacementException;
-import org.apache.jetspeed.layout.PortletPlacementContext;
-import org.apache.jetspeed.om.page.Fragment;
-import org.apache.jetspeed.om.page.Page;
-import org.apache.jetspeed.request.RequestContext;
-
-
-/**
- * Portal Placement Context
- *
- * The purpose of the object is to provide an API that
- * can be used to move a portlet fragment on the page.
- * This includes moving, adding, removing and getting
- * information about portlets that are on the page and
- * portlets that are available to be added to the page.
- *
- * An important note about this object:
- * This object is really only intended to be used to do
- * a single operation such as "moveabs" or "add". After
- * performing the operation, the hashmap data structures
- * are not correct and should not be used for subsequent
- * operations. The reason they are incorrect is that when
- * a fragment is moved, the coordinate of fragments below
- * it are now different. These could be updated, but it
- * really doesn't serve a purpose since this is a short
- * lived object.
- *
- * @author <a>David Gurney</a>
- * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
- * @version $Id: $
- */
-public class PortletPlacementContextImpl implements PortletPlacementContext
-{
- private static final int NO_DEPTH_LIMIT = -1;
-
- /** Logger */
- private Log log = LogFactory.getLog(PortletPlacementContextImpl.class);
-
- // Columns are reference by index, the rows are held
- // in the array list as shown below:
- //
- // [0] [1] [2]
- // ArrayList ArrayList ArrayList
- // Row1Frag Row1Frag Row1Frag
- // Row2Frag Row2Frag Row2Frag
- // Row3Frag Row3Frag Row3Frag
- // ...
- //
- protected Vector[] columnsList = null;
-
- // Used as a convience when looking up a particular fragment
- //
- // Key is Fragment, value is a Coordinate object
- protected Map fragmentCoordinateMap = new HashMap();
-
- // Used as a convience when looking up a particular fragment by id
- //
- // Key is the Fragment id (String), value is the Fragment
- protected Map fragmentMap = new HashMap();
-
- // Number of columns found
- protected int numberOfColumns = -1;
-
- protected Page page;
- protected Fragment containerFragment;
-
- public PortletPlacementContextImpl(RequestContext requestContext)
- throws PortletPlacementException
- {
- init(requestContext, null, NO_DEPTH_LIMIT);
- }
-
- public PortletPlacementContextImpl(RequestContext requestContext, Fragment container, int maxdepth)
- throws PortletPlacementException
- {
- init(requestContext, container, maxdepth);
- }
-
- // Initialize the data structures by getting the fragments
- // from the page manager
- protected void init(RequestContext requestContext, Fragment container, int maxdepth)
- throws PortletPlacementException
- {
- this.page = requestContext.getPage();
- if ( container == null )
- {
- container = page.getRootFragment();
- }
- this.containerFragment = container;
-
- // Recursively process each fragment
- processFragment( container, maxdepth, 0 );
-
- // The final step is to populate the array with the fragments
- populateArray();
-
- //debugFragments( "init" );
- }
-
- /**
- * Evaluate each portlet fragment and populate the internal data
- * structures
- */
- protected int processFragment( Fragment fragment, int remainingDepth, int rowCount )
- throws PortletPlacementException
- {
- // Process this fragment, then its children
- if(fragment != null)
- {
- // Only process portlet fragments
- //if(fragment.getType().equalsIgnoreCase("portlet"))
- {
- // Get the column and row of this fragment
- int col = getFragmentCol(fragment);
- int row = getFragmentRow(fragment);
-
- if(row < 0)
- {
- row = rowCount;
- }
- // Add this fragment to the data structures
- addFragmentInternal(fragment, col, row);
- rowCount++;
- }
-
- if ( remainingDepth == NO_DEPTH_LIMIT || remainingDepth > 0 )
- {
- // Process the children
- List children = fragment.getFragments();
- int childRowCount = 0;
- for(int ix = 0; ix < children.size(); ix++)
- {
- Fragment childFrag = (Fragment)children.get(ix);
-
- if(childFrag != null)
- {
- childRowCount = processFragment(childFrag, ((remainingDepth == NO_DEPTH_LIMIT) ? NO_DEPTH_LIMIT : remainingDepth-1), childRowCount );
- }
- }
- }
- }
- return rowCount;
- }
-
- public Fragment debugFragments(String debug)
- {
- StringBuffer out = new StringBuffer();
- out.append( "PortletPlacementContext - " ).append( debug ).append( " - container: " ).append( containerFragment == null ? "<null>" : ( containerFragment.getId() + " / " + containerFragment.getType() ) ).append( "\n" );
- for (int ix = 0; ix < this.columnsList.length; ix++)
- {
- Vector column = this.columnsList[ix];
- out.append( " column " ).append( ix ).append( "\n" );
- Iterator frags = column.iterator();
- while ( frags.hasNext() )
- {
- Fragment f = (Fragment)frags.next();
- out.append( " frag " ).append( f == null ? "<null>" : f.getId() );
- if ( f != null )
- out.append( " / " ).append( f.getType() ).append( " col=" ).append( f.getLayoutColumn() ).append( " row=" ).append( f.getLayoutRow() );
- out.append( "\n" );
- }
- }
- log.debug( out.toString() );
- return containerFragment;
- }
-
- /**
- * Takes the internal portlet placement state and stores back
- * out to fragment state
- *
- * @return the managed page layout with updated fragment state.
- */
- public Page syncPageFragments()
- {
- for (int col = 0; col < this.columnsList.length; col++)
- {
- Vector column = this.columnsList[col];
- Iterator frags = column.iterator();
- int row = 0;
- while (frags.hasNext())
- {
- Fragment f = (Fragment)frags.next();
- if (f == null)
- continue;
- f.setLayoutColumn(col);
- f.setLayoutRow(row);
- row++;
- }
- }
- //debugFragments( "syncPageFragments" );
- return page;
- }
-
- // Helper method
- // The implementation will probably change to get this information
- // directly from the fragment via fragment.getFragmentCol()
- protected int getFragmentRow(Fragment fragment)
- {
- return fragment.getLayoutRow();
- }
-
- // The implementation will probably change to get this information
- // directly from the fragment via fragment.getFragmentRow()
- protected int getFragmentCol(Fragment fragment)
- {
- int col = fragment.getLayoutColumn();
- if (col < 0)
- col = 0;
- return col;
- }
-
- // Adds the fragment to the internal data structures
- protected void addFragmentInternal(Fragment fragment, int col, int row)
- {
- // Create a Coordinate object to hold the row and column
- CoordinateImpl coordinate = new CoordinateImpl(col, row);
-
- // Save the fragment in the lookup hash
- this.fragmentCoordinateMap.put(fragment, coordinate);
- this.fragmentMap.put(fragment.getId(), fragment);
-
- // Establish the maximum column number
- if(col > this.numberOfColumns)
- {
- this.numberOfColumns = col + 1;
- }
- }
-
- /**
- * Now that we know the number of columns, the array can be
- * constructed and populated
- */
- protected void populateArray() throws PortletPlacementException
- {
- if(this.numberOfColumns == -1)
- {
- //throw new PortletPlacementException("no columns found");
- this.numberOfColumns = 1; // create a new column
- }
-
- // Allocate the memory for the array of ArrayLists
- // Add one since it is zero based
- this.columnsList = new Vector[this.numberOfColumns + 1];
-
- // Put an array list into each index
- for(int i = 0; i < this.numberOfColumns + 1; i++)
- {
- this.columnsList[i] = new Vector();
- }
-
- // Get all of the fragments from the hashmap
- Set keys = this.fragmentCoordinateMap.keySet();
- Iterator keyIterator = keys.iterator();
- while(keyIterator.hasNext())
- {
- // The key is a Fragment
- Fragment fragment = (Fragment) keyIterator.next();
-
- // Get the Coordinate associated with this fragment
- Coordinate coordinate = (Coordinate)this.fragmentCoordinateMap.get(fragment);
-
- // Make sure we have both
- if(fragment != null && coordinate != null)
- {
- // Get the array list for the column
- Vector columnArray = this.columnsList[coordinate.getOldCol()];
-
- int row = coordinate.getOldRow();
-
- // Before setting the fragment in the array it might
- // be necessary to add blank rows before this row
- // An ArrayList can only set an element that already exists
- prepareList(columnArray, row);
-
- // Place the fragment in the array list using the row
- columnArray.set(row, fragment);
- }
- }
- }
-
- // Ensures that the array list has at least row number of rows
- protected void prepareList(Vector list, int row)
- {
- if(list != null)
- {
- int size = list.size();
- if(row + 1 > size)
- {
- // Add one to the row since it is zero based
- for(int i = size; i < row + 1; i++)
- {
- list.add(null);
- }
- }
- }
- }
-
- // Ensures that there is room for the fragment at the given row
- // This method will insert null rows as necessary
- protected List makeSpace(Coordinate newCoordinate)
- {
- int newCol = newCoordinate.getNewCol();
- int newRow = newCoordinate.getNewRow();
-
- // Find the column. Note that a new column will never be created
- List column = this.columnsList[newCol];
- if(newRow + 1 > column.size())
- {
- // Need to add rows
- for(int i = column.size(); i < newRow + 1; i++)
- {
- column.add(null);
- }
- }
- return column;
- }
-
- public int addColumns( int col )
- throws PortletPlacementException
- {
- if ( col > this.numberOfColumns )
- {
- if ( col < 100 ) // arbitrary limit of columns
- {
- // expand
- int prevNumberOfColumns = this.numberOfColumns;
- this.numberOfColumns = col + 1;
-
- Vector [] temp = new Vector[this.numberOfColumns];
- for (int ix = 0; ix < prevNumberOfColumns; ix++)
- temp[ix] = this.columnsList[ix];
- for (int ix = prevNumberOfColumns; ix < temp.length; ix++)
- temp[ix] = new Vector();
- this.columnsList = temp;
- }
- else
- {
- throw new PortletPlacementException( "cannot add column - " + col + " is above the limit of columns that this api supports" );
- }
- }
- return col;
- }
-
- public Coordinate add(Fragment fragment, Coordinate coordinate) throws PortletPlacementException
- {
- int col = coordinate.getNewCol();
- int row = coordinate.getNewRow();
-
- if (this.numberOfColumns == -1)
- {
- this.numberOfColumns = 1;
- this.columnsList = new Vector[this.numberOfColumns];
- col = 0;
- }
- if (col > this.numberOfColumns)
- {
- col = addColumns( col );
- }
-
- Vector column = this.columnsList[col];
- if (column != null)
- {
- for (int ix = 0; ix < column.size(); ix++)
- {
- Fragment frag = (Fragment)column.get(ix);
- if (frag == null)
- continue;
- Coordinate c = (Coordinate)this.fragmentCoordinateMap.get(frag);
- if (c == null)
- continue;
- if (c.getNewCol() == row)
- {
- row++;
- }
-
- }
- // Make sure that the column has room to add the row
- if(row < 0 || row > column.size()) {
- // Add to the end
- column.addElement(fragment);
- row = column.size()-1;
- } else {
- column.add(row, fragment);
- }
- Coordinate newCoord = new CoordinateImpl(col, row, col, row);
- this.fragmentCoordinateMap.put(fragment, newCoord);
- return newCoord;
- }
- return coordinate;
- }
-
- // Adds an existing fragment to the coordinate position
- protected Coordinate addInternal(Fragment fragment, Coordinate coordinate)
- throws PortletPlacementException
- {
- int newCol = coordinate.getNewCol();
- int newRow = coordinate.getNewRow();
-
- // Check to see if the column exists
- if(newCol < 0 || newCol > this.columnsList.length)
- {
- throw new PortletPlacementException("column out of bounds" + fragment.getName());
- }
-
- Vector columnArray = this.columnsList[newCol];
-
- // Make sure the list has enough room for the set
- prepareList(columnArray, newRow);
-
- columnArray.setElementAt(fragment, newRow);
-
- // Add the fragment to the hash map
- this.fragmentCoordinateMap.put(fragment, coordinate);
-
- return coordinate;
- }
-
- public Fragment getFragment(String fragmentId) throws PortletPlacementException
- {
- return (Fragment)this.fragmentMap.get(fragmentId);
- }
-
- public Fragment getFragmentAtOldCoordinate(Coordinate coordinate) throws PortletPlacementException
- {
- return getFragmentAtCoordinate(coordinate, true);
- }
-
- public Fragment getFragmentAtNewCoordinate(Coordinate coordinate) throws PortletPlacementException
- {
- return getFragmentAtCoordinate(coordinate, false);
- }
-
- protected Fragment getFragmentAtCoordinate(Coordinate coordinate, boolean isOld) throws PortletPlacementException
- {
- int col = -1;
- int row = -1;
- if (isOld == true)
- {
- col = coordinate.getOldCol();
- row = coordinate.getOldRow();
- } else
- {
- col = coordinate.getNewCol();
- row = coordinate.getNewRow();
- }
-
- // Do some sanity checking about the request
- if(col < 0 || col > this.columnsList.length)
- {
- throw new PortletPlacementException("requested column is out of bounds");
- }
-
- // Get the array list associated with the column
- Vector columnArray = this.columnsList[col];
- if(row < 0 || row > columnArray.size())
- {
- throw new PortletPlacementException("requested row is out of bounds");
- }
-
- return (Fragment)columnArray.get(row);
- }
-
- public Fragment getFragmentById(String fragmentId) throws PortletPlacementException
- {
- return (Fragment)this.fragmentMap.get(fragmentId);
- }
-
- public int getNumberColumns() throws PortletPlacementException
- {
- return numberOfColumns;
- //return this.columnsList.length;
- }
-
- public int getNumberRows(int col) throws PortletPlacementException
- {
- // Sanity check the column
- if(col < 0 || col > this.columnsList.length)
- {
- throw new PortletPlacementException("column out of bounds");
- }
-
- return this.columnsList[col].size();
- }
-
- public Coordinate moveAbsolute(Fragment fragment, Coordinate newCoordinate)
- throws PortletPlacementException
- {
- // Find the fragment
- Coordinate oldCoordinate = (Coordinate)this.fragmentCoordinateMap.get(fragment);
- if(oldCoordinate == null)
- {
- throw new PortletPlacementException("could not find fragment");
- }
-
- // Save the old coordinates
- int oldCol = oldCoordinate.getOldCol();
- int oldRow = oldCoordinate.getOldRow();
-
- // Create a new coordinate object with both the old and new positions
- int newCol = newCoordinate.getNewCol();
- int newRow = newCoordinate.getNewRow();
-
- // Make sure there is a place for the move
- //List oldRowList = makeSpace(newCoordinate);
-
- List oldRowList = this.columnsList[oldCol];
-
- // Remove the fragment from it's old position
- oldRowList.remove(oldRow);
-
- // The next two lines must occur after the remove above. This is
- // because the new and old columns might be the same and the remove
- // will change the number of rows
- if (newCol > this.numberOfColumns)
- {
- newCol = addColumns( newCol );
- }
-
- List newRowList = this.columnsList[newCol];
- int numRowsNewColumn = newRowList.size();
-
- // Decide whether an insert or an add is appropriate
- if(newRow > (numRowsNewColumn - 1))
- {
- newRow = numRowsNewColumn;
- // Add a new row
- newRowList.add(fragment);
- }
- else
- {
- // Insert the fragment at the new position
- ((Vector)newRowList).insertElementAt(fragment, newRow);
- }
-
- //debugFragments("move absolute ");
-
- // New coordinates after moving
- return new CoordinateImpl(oldCol, oldRow, newCol, newRow);
- }
-
- protected Coordinate moveDirection(Fragment fragment, int deltaCol, int deltaRow)
- throws PortletPlacementException
- {
- // Find the fragment
- Coordinate foundCoordinate = (Coordinate)this.fragmentCoordinateMap.get(fragment);
- if(foundCoordinate == null)
- {
- throw new PortletPlacementException("could not find fragment");
- }
-
- // Check the coordinates to make sure that there is room to move down
- int oldCol = foundCoordinate.getOldCol();
- int oldRow = foundCoordinate.getOldRow();
-
- Vector columnArray = this.columnsList[oldCol];
-
- // Check the row and column boundaries to make sure there is room
- // to do the move
- if((oldRow + deltaRow + 1 > columnArray.size()) || ((oldRow + deltaRow) < 0) ||
- (oldCol + deltaCol + 1 > this.columnsList.length) || ((oldCol + deltaCol) < 0))
- {
- // Out of bounds, don't do the move
- Coordinate c = new CoordinateImpl(oldCol, oldRow, oldCol, oldRow);
- //debugFragments("move direction (1)");
- return c;
- }
- else
- {
- Coordinate c = moveAbsolute(fragment, new CoordinateImpl(oldCol, oldRow, oldCol + deltaCol, oldRow + deltaRow));
- //debugFragments("move direction (2)");
- return c;
- }
- }
-
- public Coordinate moveDown(Fragment fragment) throws PortletPlacementException
- {
- return moveDirection(fragment, 0, 1);
- }
-
- public Coordinate moveUp(Fragment fragment) throws PortletPlacementException
- {
- return moveDirection(fragment, 0, -1);
- }
-
- public Coordinate moveLeft(Fragment fragment) throws PortletPlacementException
- {
- return moveDirection(fragment, -1, 0);
- }
-
- public Coordinate moveRight(Fragment fragment) throws PortletPlacementException
- {
- return moveDirection(fragment, 1, 0);
- }
-
- public Coordinate remove(Fragment fragment) throws PortletPlacementException
- {
- // Locate the fragment
- Coordinate coordinate = (Coordinate)this.fragmentCoordinateMap.get(fragment);
- if(coordinate == null)
- {
- throw new PortletPlacementException("fragment not found:" + fragment.getName());
- }
-
- int col = coordinate.getOldCol();
- int row = coordinate.getOldRow();
-
- if(col < 0 || col > this.columnsList.length)
- {
- throw new PortletPlacementException("column out of bounds:" + fragment.getName());
- }
-
- Vector columnArray = this.columnsList[col];
- if(row < 0 || row > columnArray.size())
- {
- throw new PortletPlacementException("row out of bounds:" + fragment.getName());
- }
-
- // Remove the fragment from the array
- columnArray.remove(row);
-
- // Remove the fragment from the hashmap
- this.fragmentCoordinateMap.remove(fragment);
- this.fragmentMap.remove(fragment.getId());
-
- return coordinate;
- }
-
-}
+ * 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.layout.impl;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.layout.Coordinate;
+import org.apache.jetspeed.layout.PortletPlacementException;
+import org.apache.jetspeed.layout.PortletPlacementContext;
+import org.apache.jetspeed.om.page.Fragment;
+import org.apache.jetspeed.om.page.Page;
+import org.apache.jetspeed.request.RequestContext;
+
+
+/**
+ * Portal Placement Context
+ *
+ * The purpose of the object is to provide an API that
+ * can be used to move a portlet fragment on the page.
+ * This includes moving, adding, removing and getting
+ * information about portlets that are on the page and
+ * portlets that are available to be added to the page.
+ *
+ * This object represents the fragment contents of a
+ * single layout fragment (i.e. nested depth cannot
+ * be captured by this object).
+ *
+ * An important note about this object:
+ * This object is really only intended to be used to do
+ * a single operation such as "moveabs" or "add". After
+ * performing the operation, the hashmap data structures
+ * are not correct and should not be used for subsequent
+ * operations. The reason they are incorrect is that when
+ * a fragment is moved, the coordinate of fragments below
+ * it are now different. These could be updated, but it
+ * really doesn't serve a purpose since this is a short
+ * lived object.
+ *
+ * @author <a>David Gurney</a>
+ * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
+ * @version $Id: $
+ */
+public class PortletPlacementContextImpl implements PortletPlacementContext
+{
+ /** Logger */
+ private Log log = LogFactory.getLog(PortletPlacementContextImpl.class);
+
+ // Columns are reference by index, the rows are held
+ // in the array list as shown below:
+ //
+ // [0] [1] [2]
+ // ArrayList ArrayList ArrayList
+ // Row1Frag Row1Frag Row1Frag
+ // Row2Frag Row2Frag Row2Frag
+ // Row3Frag Row3Frag Row3Frag
+ // ...
+ //
+ protected Vector[] columnsList = null;
+
+ // Used as a convience when looking up a particular fragment
+ //
+ // Key is Fragment, value is a Coordinate object
+ protected Map fragmentCoordinateMap = new HashMap();
+
+ // Used as a convience when looking up a particular fragment by id
+ //
+ // Key is the Fragment id (String), value is the Fragment
+ protected Map fragmentMap = new HashMap();
+
+ // Number of columns found
+ protected int numberOfColumns = -1;
+
+ protected Page page;
+ protected Fragment layoutContainerFragment;
+
+ public PortletPlacementContextImpl( RequestContext requestContext )
+ throws PortletPlacementException
+ {
+ init( requestContext, null );
+ }
+
+ public PortletPlacementContextImpl( RequestContext requestContext, Fragment container )
+ throws PortletPlacementException
+ {
+ init( requestContext, container );
+ }
+
+ // Initialize the data structures by getting the fragments
+ // from the page manager
+ protected void init( RequestContext requestContext, Fragment container )
+ throws PortletPlacementException
+ {
+ this.page = requestContext.getPage();
+ if ( container == null )
+ {
+ container = page.getRootFragment();
+ }
+ this.layoutContainerFragment = container;
+
+ processLayoutContainerFragment();
+
+ // The final step is to populate the array with the fragments
+ populateArray();
+
+ //debugFragments( "init" );
+ }
+
+ /**
+ * For the layout container fragment, evaluate each child fragment and
+ * populate the internal data structures
+ */
+ protected void processLayoutContainerFragment()
+ throws PortletPlacementException
+ {
+ // Process this fragment, then its children
+ if ( this.layoutContainerFragment != null )
+ {
+ // Process the child fragments
+ List childFragments = this.layoutContainerFragment.getFragments();
+ int highRow = 0;
+ for( int ix = 0; ix < childFragments.size(); ix++ )
+ {
+ Fragment fragment = (Fragment)childFragments.get( ix );
+
+ if ( fragment != null )
+ {
+ int col = getFragmentCol( fragment );
+ int row = getFragmentRow( fragment );
+
+ if ( row < 0 )
+ row = highRow;
+ else if ( row > highRow )
+ highRow = row;
+
+ // Add this fragment to the data structures
+ addFragmentInternal( fragment, col, row );
+ }
+ }
+ }
+ }
+
+ // Adds the fragment to the internal data structures
+ protected void addFragmentInternal( Fragment fragment, int col, int row )
+ {
+ // Create a Coordinate object to hold the row and column
+ CoordinateImpl coordinate = new CoordinateImpl( col, row );
+
+ // Save the fragment in the lookup hash
+ this.fragmentCoordinateMap.put( fragment, coordinate );
+ this.fragmentMap.put( fragment.getId(), fragment );
+
+ // Establish the maximum column number
+ if ( col > this.numberOfColumns )
+ {
+ this.numberOfColumns = col + 1;
+ }
+ }
+
+ public Fragment debugFragments(String debug)
+ {
+ StringBuffer out = new StringBuffer();
+ out.append( "PortletPlacementContext - " ).append( debug ).append( " - container: " ).append( layoutContainerFragment == null ? "<null>" : ( layoutContainerFragment.getId() + " / " + layoutContainerFragment.getType() ) ).append( "\n" );
+ for (int ix = 0; ix < this.columnsList.length; ix++)
+ {
+ Vector column = this.columnsList[ix];
+ out.append( " column " ).append( ix ).append( "\n" );
+ Iterator frags = column.iterator();
+ while ( frags.hasNext() )
+ {
+ Fragment f = (Fragment)frags.next();
+ out.append( " frag " ).append( f == null ? "<null>" : f.getId() );
+ if ( f != null )
+ out.append( " / " ).append( f.getType() ).append( " col=" ).append( f.getLayoutColumn() ).append( " row=" ).append( f.getLayoutRow() );
+ out.append( "\n" );
+ }
+ }
+ log.info( out.toString() );
+ return layoutContainerFragment;
+ }
+
+ /**
+ * Takes the internal portlet placement state and stores back
+ * out to fragment state
+ *
+ * @return the managed page layout with updated fragment state.
+ */
+ public Page syncPageFragments()
+ {
+ for ( int col = 0; col < this.columnsList.length; col++ )
+ {
+ Vector column = this.columnsList[col];
+ Iterator frags = column.iterator();
+ int row = 0;
+ while ( frags.hasNext() )
+ {
+ Fragment f = (Fragment)frags.next();
+ if ( f == null )
+ continue;
+ f.setLayoutColumn( col );
+ f.setLayoutRow( row );
+ row++;
+ }
+ }
+ //debugFragments( "syncPageFragments" );
+ return page;
+ }
+
+ // Helper method
+ // The implementation will probably change to get this information
+ // directly from the fragment via fragment.getFragmentCol()
+ protected int getFragmentRow(Fragment fragment)
+ {
+ return fragment.getLayoutRow();
+ }
+
+ // The implementation will probably change to get this information
+ // directly from the fragment via fragment.getFragmentRow()
+ protected int getFragmentCol(Fragment fragment)
+ {
+ int col = fragment.getLayoutColumn();
+ if (col < 0)
+ col = 0;
+ return col;
+ }
+
+ /**
+ * Now that we know the number of columns, the array can be
+ * constructed and populated
+ */
+ protected void populateArray() throws PortletPlacementException
+ {
+ if ( this.numberOfColumns == -1 )
+ {
+ //throw new PortletPlacementException("no columns found");
+ this.numberOfColumns = 1; // create a new column
+ }
+
+ // Allocate the memory for the array of ArrayLists
+ // Add one since it is zero based
+ this.columnsList = new Vector[this.numberOfColumns + 1];
+
+ // Put an array list into each index
+ for ( int i = 0; i < this.numberOfColumns + 1; i++ )
+ {
+ this.columnsList[i] = new Vector();
+ }
+
+ // Get all of the fragments from the hashmap
+ Set keys = this.fragmentCoordinateMap.keySet();
+ Iterator keyIterator = keys.iterator();
+ while ( keyIterator.hasNext() )
+ {
+ // The key is a Fragment
+ Fragment fragment = (Fragment) keyIterator.next();
+
+ // Get the Coordinate associated with this fragment
+ Coordinate coordinate = (Coordinate)this.fragmentCoordinateMap.get( fragment );
+
+ // Make sure we have both
+ if ( fragment != null && coordinate != null )
+ {
+ // Get the array list for the column
+ Vector columnArray = this.columnsList[coordinate.getOldCol()];
+
+ int row = coordinate.getOldRow();
+
+ // Before setting the fragment in the array it might
+ // be necessary to add blank rows before this row
+ // An ArrayList can only set an element that already exists
+ prepareList( columnArray, row );
+
+ // Place the fragment in the array list using the row
+ columnArray.set( row, fragment );
+ }
+ }
+ }
+
+ // Ensures that the array list has at least row number of rows
+ protected void prepareList(Vector list, int row)
+ {
+ if(list != null)
+ {
+ int size = list.size();
+ if(row + 1 > size)
+ {
+ // Add one to the row since it is zero based
+ for(int i = size; i < row + 1; i++)
+ {
+ list.add(null);
+ }
+ }
+ }
+ }
+
+ public int addColumns( int col )
+ throws PortletPlacementException
+ {
+ if ( col > this.numberOfColumns )
+ {
+ if ( col < 100 ) // arbitrary limit of columns
+ {
+ // expand
+ int prevNumberOfColumns = this.numberOfColumns;
+ this.numberOfColumns = col + 1;
+
+ Vector [] temp = new Vector[this.numberOfColumns];
+ for (int ix = 0; ix < prevNumberOfColumns; ix++)
+ temp[ix] = this.columnsList[ix];
+ for (int ix = prevNumberOfColumns; ix < temp.length; ix++)
+ temp[ix] = new Vector();
+ this.columnsList = temp;
+ }
+ else
+ {
+ throw new PortletPlacementException( "cannot add column - " + col + " is above the limit of columns that this api supports" );
+ }
+ }
+ return col;
+ }
+
+ public Fragment getFragment(String fragmentId) throws PortletPlacementException
+ {
+ return (Fragment)this.fragmentMap.get(fragmentId);
+ }
+
+ public Fragment getFragmentAtOldCoordinate(Coordinate coordinate) throws PortletPlacementException
+ {
+ return getFragmentAtCoordinate(coordinate, true);
+ }
+
+ public Fragment getFragmentAtNewCoordinate(Coordinate coordinate) throws PortletPlacementException
+ {
+ return getFragmentAtCoordinate(coordinate, false);
+ }
+
+ protected Fragment getFragmentAtCoordinate(Coordinate coordinate, boolean isOld) throws PortletPlacementException
+ {
+ int col = -1;
+ int row = -1;
+ if (isOld == true)
+ {
+ col = coordinate.getOldCol();
+ row = coordinate.getOldRow();
+ } else
+ {
+ col = coordinate.getNewCol();
+ row = coordinate.getNewRow();
+ }
+
+ // Do some sanity checking about the request
+ if ( col < 0 || col > this.columnsList.length )
+ {
+ throw new PortletPlacementException("requested column is out of bounds");
+ }
+
+ // Get the array list associated with the column
+ Vector columnArray = this.columnsList[col];
+ if ( row < 0 || row > columnArray.size() )
+ {
+ throw new PortletPlacementException("requested row is out of bounds");
+ }
+
+ return (Fragment)columnArray.get( row );
+ }
+
+ public Fragment getFragmentById(String fragmentId) throws PortletPlacementException
+ {
+ return (Fragment)this.fragmentMap.get( fragmentId );
+ }
+
+ public int getNumberColumns() throws PortletPlacementException
+ {
+ return numberOfColumns;
+ //return this.columnsList.length;
+ }
+
+ public int getNumberRows(int col) throws PortletPlacementException
+ {
+ // Sanity check the column
+ if ( col < 0 || col > this.columnsList.length )
+ {
+ throw new PortletPlacementException( "column out of bounds" );
+ }
+
+ return this.columnsList[col].size();
+ }
+
+ public Coordinate add( Fragment fragment, Coordinate coordinate ) throws PortletPlacementException
+ {
+ int col = coordinate.getNewCol();
+ int row = coordinate.getNewRow();
+
+ if ( this.numberOfColumns == -1 )
+ {
+ this.numberOfColumns = 1;
+ this.columnsList = new Vector[this.numberOfColumns];
+ col = 0;
+ }
+ if ( col > this.numberOfColumns )
+ {
+ col = addColumns( col );
+ }
+
+ Vector column = this.columnsList[col];
+ if ( column != null )
+ {
+ for ( int ix = 0; ix < column.size(); ix++ )
+ {
+ Fragment frag = (Fragment)column.get( ix );
+ if (frag == null)
+ continue;
+ Coordinate c = (Coordinate)this.fragmentCoordinateMap.get( frag );
+ if (c == null)
+ continue;
+ if ( c.getNewCol() == row )
+ {
+ row++;
+ }
+ }
+ // Make sure that the column has room to add the row
+ if ( row < 0 || row > column.size() )
+ {
+ // Add to the end
+ column.addElement(fragment);
+ row = column.size()-1;
+ }
+ else
+ {
+ column.add(row, fragment);
+ }
+ Coordinate newCoord = new CoordinateImpl( col, row, col, row );
+ this.fragmentCoordinateMap.put( fragment, newCoord );
+ return newCoord;
+ }
+ return coordinate;
+ }
+
+ public Coordinate moveAbsolute( Fragment fragment, Coordinate newCoordinate )
+ throws PortletPlacementException
+ {
+ return moveAbsolute( fragment, newCoordinate, false );
+ }
+ public Coordinate moveAbsolute( Fragment fragment, Coordinate newCoordinate, boolean addFragment )
+ throws PortletPlacementException
+ {
+ int newCol = newCoordinate.getNewCol();
+ int newRow = newCoordinate.getNewRow();
+
+ int oldCol = newCol, oldRow = newRow;
+ if ( ! addFragment )
+ {
+ // Find the fragment
+ Coordinate oldCoordinate = (Coordinate)this.fragmentCoordinateMap.get(fragment);
+ if ( oldCoordinate == null )
+ {
+ throw new PortletPlacementException("could not find fragment");
+ }
+
+ // Save the old coordinates
+ oldCol = oldCoordinate.getOldCol();
+ oldRow = oldCoordinate.getOldRow();
+
+ List oldRowList = this.columnsList[oldCol];
+
+ // Remove the fragment from it's old position
+ oldRowList.remove( oldRow );
+ }
+
+ // Create a new coordinate object with both the old and new positions
+
+ // The next two lines must occur after the remove above. This is
+ // because the new and old columns might be the same and the remove
+ // will change the number of rows
+ if ( newCol > this.numberOfColumns )
+ {
+ newCol = addColumns( newCol );
+ }
+
+ List newRowList = this.columnsList[newCol];
+ int numRowsNewColumn = newRowList.size();
+
+ // Decide whether an insert or an add is appropriate
+ if ( newRow > (numRowsNewColumn - 1) )
+ {
+ newRow = numRowsNewColumn;
+ // Add a new row
+ newRowList.add(fragment);
+ }
+ else
+ {
+ // Insert the fragment at the new position
+ ((Vector)newRowList).insertElementAt( fragment, newRow );
+ }
+
+ //debugFragments( "move absolute [" + fragment.getId() + "] " + ( addFragment ? "(add-fragment) " : "" ) );
+
+ // New coordinates after moving
+ newCoordinate = new CoordinateImpl( oldCol, oldRow, newCol, newRow );
+ this.fragmentCoordinateMap.put( fragment, newCoordinate );
+ if ( addFragment )
+ {
+ this.fragmentMap.put( fragment.getId(), fragment );
+ }
+ return newCoordinate;
+ }
+
+ protected Coordinate moveDirection(Fragment fragment, int deltaCol, int deltaRow)
+ throws PortletPlacementException
+ {
+ // Find the fragment
+ Coordinate foundCoordinate = (Coordinate)this.fragmentCoordinateMap.get(fragment);
+ if(foundCoordinate == null)
+ {
+ throw new PortletPlacementException("could not find fragment");
+ }
+
+ // Check the coordinates to make sure that there is room to move down
+ int oldCol = foundCoordinate.getOldCol();
+ int oldRow = foundCoordinate.getOldRow();
+
+ Vector columnArray = this.columnsList[oldCol];
+
+ // Check the row and column boundaries to make sure there is room
+ // to do the move
+ if((oldRow + deltaRow + 1 > columnArray.size()) || ((oldRow + deltaRow) < 0) ||
+ (oldCol + deltaCol + 1 > this.columnsList.length) || ((oldCol + deltaCol) < 0))
+ {
+ // Out of bounds, don't do the move
+ Coordinate c = new CoordinateImpl(oldCol, oldRow, oldCol, oldRow);
+ //debugFragments("move direction (1)");
+ return c;
+ }
+ else
+ {
+ Coordinate c = moveAbsolute(fragment, new CoordinateImpl(oldCol, oldRow, oldCol + deltaCol, oldRow + deltaRow));
+ //debugFragments("move direction (2)");
+ return c;
+ }
+ }
+
+ public Coordinate moveDown(Fragment fragment) throws PortletPlacementException
+ {
+ return moveDirection(fragment, 0, 1);
+ }
+
+ public Coordinate moveUp(Fragment fragment) throws PortletPlacementException
+ {
+ return moveDirection(fragment, 0, -1);
+ }
+
+ public Coordinate moveLeft(Fragment fragment) throws PortletPlacementException
+ {
+ return moveDirection(fragment, -1, 0);
+ }
+
+ public Coordinate moveRight(Fragment fragment) throws PortletPlacementException
+ {
+ return moveDirection(fragment, 1, 0);
+ }
+
+ public Coordinate remove(Fragment fragment) throws PortletPlacementException
+ {
+ // Locate the fragment
+ Coordinate coordinate = (Coordinate)this.fragmentCoordinateMap.get(fragment);
+ if(coordinate == null)
+ {
+ throw new PortletPlacementException("fragment not found:" + fragment.getName());
+ }
+
+ int col = coordinate.getOldCol();
+ int row = coordinate.getOldRow();
+
+ if(col < 0 || col > this.columnsList.length)
+ {
+ throw new PortletPlacementException("column out of bounds:" + fragment.getName());
+ }
+
+ Vector columnArray = this.columnsList[col];
+ if(row < 0 || row > columnArray.size())
+ {
+ throw new PortletPlacementException("row out of bounds:" + fragment.getName());
+ }
+
+ // Remove the fragment from the array
+ columnArray.remove(row);
+
+ // Remove the fragment from the hashmap
+ this.fragmentCoordinateMap.remove(fragment);
+ this.fragmentMap.remove(fragment.getId());
+
+ return coordinate;
+ }
+
+}
Modified: portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/layout/impl/RemovePortletAction.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/layout/impl/RemovePortletAction.java?rev=588454&r1=588453&r2=588454&view=diff
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/layout/impl/RemovePortletAction.java (original)
+++ portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/layout/impl/RemovePortletAction.java Thu Oct 25 17:40:57 2007
@@ -1,159 +1,166 @@
-/*
+/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.layout.impl;
-
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.jetspeed.JetspeedActions;
-import org.apache.jetspeed.ajax.AJAXException;
-import org.apache.jetspeed.ajax.AjaxAction;
-import org.apache.jetspeed.ajax.AjaxBuilder;
-import org.apache.jetspeed.layout.PortletActionSecurityBehavior;
-import org.apache.jetspeed.layout.PortletPlacementContext;
-import org.apache.jetspeed.om.page.Fragment;
-import org.apache.jetspeed.om.page.Page;
-import org.apache.jetspeed.page.PageManager;
-import org.apache.jetspeed.pipeline.PipelineException;
-import org.apache.jetspeed.request.RequestContext;
-
-
-/**
- * Remove Portlet portlet placement action
- *
- * AJAX Parameters:
- * id = the fragment id of the portlet to remove
- * page = (implied in the URL)
- *
- * @author <a>David Gurney </a>
- * @author <a href="mailto:taylor@apache.org">David Sean Taylor </a>
- * @version $Id: $
- */
-public class RemovePortletAction
- extends BasePortletAction
- implements AjaxAction, AjaxBuilder, Constants
-{
- protected static final Log log = LogFactory.getLog(RemovePortletAction.class);
-
- public RemovePortletAction(String template, String errorTemplate)
- throws PipelineException
- {
- this(template, errorTemplate, null, null);
- }
-
- public RemovePortletAction(String template,
- String errorTemplate,
- PageManager pageManager,
- PortletActionSecurityBehavior securityBehavior)
- throws PipelineException
- {
- super(template, errorTemplate, pageManager, securityBehavior);
- }
-
- public boolean runBatch(RequestContext requestContext, Map resultMap) throws AJAXException
- {
- return runAction(requestContext, resultMap, true);
- }
-
- public boolean run(RequestContext requestContext, Map resultMap)
- throws AJAXException
- {
- return runAction(requestContext, resultMap, false);
- }
-
- public boolean runAction(RequestContext requestContext, Map resultMap, boolean batch)
- {
- boolean success = true;
- String status = "success";
- try
- {
- resultMap.put(ACTION, "remove");
- // Get the necessary parameters off of the request
- String portletId = getActionParameter(requestContext, PORTLETID);
- if (portletId == null)
- {
- success = false;
- resultMap.put(REASON, "Portlet ID not provided");
- return success;
- }
- resultMap.put(PORTLETID, portletId);
- if (false == checkAccess(requestContext, JetspeedActions.EDIT))
- {
- Page page = requestContext.getPage();
- Fragment fragment = page.getFragmentById(portletId);
- if (fragment == null)
- {
- success = false;
- resultMap.put(REASON, "Fragment not found");
- return success;
- }
- int column = fragment.getLayoutColumn();
- int row = fragment.getLayoutRow();
- if (!createNewPageOnEdit(requestContext))
- {
- success = false;
- resultMap.put(REASON, "Insufficient access to edit page");
- return success;
- }
- status = "refresh";
- // translate old portlet id to new portlet id
- Fragment newFragment = getFragmentIdFromLocation(row, column, requestContext.getPage());
- if (newFragment == null)
- {
- success = false;
- resultMap.put(REASON, "Failed to find new fragment");
- return success;
- }
- portletId = newFragment.getId();
- }
-
- // Use the Portlet Placement Manager to accomplish the removal
- PortletPlacementContext placement = new PortletPlacementContextImpl(requestContext);
- Fragment fragment = placement.getFragmentById(portletId);
- if (fragment == null)
- {
- success = false;
- resultMap.put(REASON, "Fragment not found");
- return success;
- }
- placement.remove(fragment);
- Page page = placement.syncPageFragments();
- page.removeFragmentById(fragment.getId());
- if (!batch)
- {
- if (pageManager != null)
- pageManager.updatePage(page);
- }
- // Build the results for the response
- resultMap.put(PORTLETID, portletId);
- resultMap.put(STATUS, status);
- resultMap.put(OLDCOL, String.valueOf(fragment.getLayoutColumn()));
- resultMap.put(OLDROW, String.valueOf(fragment.getLayoutRow()));
- }
- catch (Exception e)
- {
- // Log the exception
- log.error("exception while adding a portlet", e);
- resultMap.put(REASON, e.toString());
- // Return a failure indicator
- success = false;
- }
-
- return success;
- }
-}
+ * 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.layout.impl;
+
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.JetspeedActions;
+import org.apache.jetspeed.ajax.AJAXException;
+import org.apache.jetspeed.ajax.AjaxAction;
+import org.apache.jetspeed.ajax.AjaxBuilder;
+import org.apache.jetspeed.layout.PortletActionSecurityBehavior;
+import org.apache.jetspeed.layout.PortletPlacementContext;
+import org.apache.jetspeed.om.page.Fragment;
+import org.apache.jetspeed.om.page.Page;
+import org.apache.jetspeed.page.PageManager;
+import org.apache.jetspeed.pipeline.PipelineException;
+import org.apache.jetspeed.request.RequestContext;
+
+
+/**
+ * Remove Portlet portlet placement action
+ *
+ * AJAX Parameters:
+ * id = the fragment id of the portlet to remove
+ * page = (implied in the URL)
+ *
+ * @author <a>David Gurney </a>
+ * @author <a href="mailto:taylor@apache.org">David Sean Taylor </a>
+ * @version $Id: $
+ */
+public class RemovePortletAction
+ extends BasePortletAction
+ implements AjaxAction, AjaxBuilder, Constants
+{
+ protected static final Log log = LogFactory.getLog(RemovePortletAction.class);
+
+ public RemovePortletAction(String template, String errorTemplate)
+ throws PipelineException
+ {
+ this(template, errorTemplate, null, null);
+ }
+
+ public RemovePortletAction(String template,
+ String errorTemplate,
+ PageManager pageManager,
+ PortletActionSecurityBehavior securityBehavior)
+ throws PipelineException
+ {
+ super(template, errorTemplate, pageManager, securityBehavior);
+ }
+
+ public boolean runBatch(RequestContext requestContext, Map resultMap) throws AJAXException
+ {
+ return runAction(requestContext, resultMap, true);
+ }
+
+ public boolean run(RequestContext requestContext, Map resultMap)
+ throws AJAXException
+ {
+ return runAction(requestContext, resultMap, false);
+ }
+
+ public boolean runAction(RequestContext requestContext, Map resultMap, boolean batch)
+ {
+ boolean success = true;
+ String status = "success";
+ try
+ {
+ resultMap.put(ACTION, "remove");
+ // Get the necessary parameters off of the request
+ String portletId = getActionParameter(requestContext, PORTLETID);
+ if (portletId == null)
+ {
+ success = false;
+ resultMap.put(REASON, "Portlet ID not provided");
+ return success;
+ }
+ resultMap.put(PORTLETID, portletId);
+ if (false == checkAccess(requestContext, JetspeedActions.EDIT))
+ {
+ Page page = requestContext.getPage();
+ Fragment fragment = page.getFragmentById(portletId);
+ if (fragment == null)
+ {
+ success = false;
+ resultMap.put(REASON, "Fragment not found");
+ return success;
+ }
+ int column = fragment.getLayoutColumn();
+ int row = fragment.getLayoutRow();
+ if (!createNewPageOnEdit(requestContext))
+ {
+ success = false;
+ resultMap.put(REASON, "Insufficient access to edit page");
+ return success;
+ }
+ status = "refresh";
+ // translate old portlet id to new portlet id
+ Fragment newFragment = getFragmentIdFromLocation(row, column, requestContext.getPage());
+ if (newFragment == null)
+ {
+ success = false;
+ resultMap.put(REASON, "Failed to find new fragment");
+ return success;
+ }
+ portletId = newFragment.getId();
+ }
+
+ // Use the Portlet Placement Manager to accomplish the removal
+ Fragment root = requestContext.getPage().getRootFragment();
+ Fragment layoutContainerFragment = getParentFragmentById( portletId, root );
+ PortletPlacementContext placement = null;
+ Fragment fragment = null;
+ if ( layoutContainerFragment != null )
+ {
+ placement = new PortletPlacementContextImpl(requestContext, layoutContainerFragment);
+ fragment = placement.getFragmentById(portletId);
+ }
+ if ( fragment == null )
+ {
+ success = false;
+ resultMap.put(REASON, "Fragment not found");
+ return success;
+ }
+ placement.remove(fragment);
+ Page page = placement.syncPageFragments();
+ page.removeFragmentById(fragment.getId());
+ if (!batch)
+ {
+ if (pageManager != null)
+ pageManager.updatePage(page);
+ }
+ // Build the results for the response
+ resultMap.put(PORTLETID, portletId);
+ resultMap.put(STATUS, status);
+ resultMap.put(OLDCOL, String.valueOf(fragment.getLayoutColumn()));
+ resultMap.put(OLDROW, String.valueOf(fragment.getLayoutRow()));
+ }
+ catch (Exception e)
+ {
+ // Log the exception
+ log.error("exception while adding a portlet", e);
+ resultMap.put(REASON, e.toString());
+ // Return a failure indicator
+ success = false;
+ }
+
+ return success;
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org