Coverage report

  %line %branch
org.apache.jetspeed.portlets.layout.MultiColumnPortlet
0% 
0% 

 1  
 /*
 2  
  * Licensed to the Apache Software Foundation (ASF) under one or more
 3  
  * contributor license agreements.  See the NOTICE file distributed with
 4  
  * this work for additional information regarding copyright ownership.
 5  
  * The ASF licenses this file to You under the Apache License, Version 2.0
 6  
  * (the "License"); you may not use this file except in compliance with
 7  
  * the License.  You may obtain a copy of the License at
 8  
  * 
 9  
  *      http://www.apache.org/licenses/LICENSE-2.0
 10  
  * 
 11  
  * Unless required by applicable law or agreed to in writing, software
 12  
  * distributed under the License is distributed on an "AS IS" BASIS,
 13  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 14  
  * See the License for the specific language governing permissions and
 15  
  * limitations under the License.
 16  
  */
 17  
 package org.apache.jetspeed.portlets.layout;
 18  
 
 19  
 import java.io.IOException;
 20  
 import java.io.UnsupportedEncodingException;
 21  
 import java.net.URLEncoder;
 22  
 import java.util.ArrayList;
 23  
 import java.util.Iterator;
 24  
 import java.util.List;
 25  
 import java.util.StringTokenizer;
 26  
 
 27  
 import javax.portlet.ActionRequest;
 28  
 import javax.portlet.ActionResponse;
 29  
 import javax.portlet.PortletConfig;
 30  
 import javax.portlet.PortletException;
 31  
 import javax.portlet.PortletMode;
 32  
 import javax.portlet.RenderRequest;
 33  
 import javax.portlet.RenderResponse;
 34  
 
 35  
 import org.apache.commons.logging.Log;
 36  
 import org.apache.commons.logging.LogFactory;
 37  
 import org.apache.jetspeed.CommonPortletServices;
 38  
 import org.apache.jetspeed.PortalReservedParameters;
 39  
 import org.apache.jetspeed.cache.JetspeedContentCache;
 40  
 import org.apache.jetspeed.decoration.DecorationFactory;
 41  
 import org.apache.jetspeed.decoration.PageEditAccess;
 42  
 import org.apache.jetspeed.desktop.JetspeedDesktop;
 43  
 import org.apache.jetspeed.om.folder.Folder;
 44  
 import org.apache.jetspeed.om.page.ContentFragment;
 45  
 import org.apache.jetspeed.om.page.ContentPage;
 46  
 import org.apache.jetspeed.om.page.Fragment;
 47  
 import org.apache.jetspeed.om.page.Page;
 48  
 import org.apache.jetspeed.page.FolderNotUpdatedException;
 49  
 import org.apache.jetspeed.page.document.NodeException;
 50  
 import org.apache.jetspeed.request.RequestContext;
 51  
 import org.apache.pluto.om.window.PortletWindow;
 52  
 
 53  
 /**
 54  
  */
 55  0
 public class MultiColumnPortlet extends LayoutPortlet
 56  
 {
 57  
     /** Commons logging */
 58  0
     protected final static Log log = LogFactory.getLog(MultiColumnPortlet.class);
 59  
 
 60  
     protected final static String PARAM_NUM_COLUMN = "columns";
 61  
     protected final static int DEFAULT_NUM_COLUMN = 2;
 62  
     protected final static String PARAM_COLUMN_SIZES = "sizes";
 63  
     protected final static String DEFAULT_ONE_COLUMN_SIZES = "100%";
 64  
     protected final static String DEFAULT_TWO_COLUMN_SIZES = "50%,50%";
 65  
     protected final static String DEFAULT_THREE_COLUMN_SIZES = "34%,33%,33%";
 66  
 
 67  0
     private int numColumns = 0;
 68  0
     private String columnSizes = null;
 69  0
     private String portletName = null;
 70  
     private String layoutType;
 71  0
     private String editorType = null;
 72  
     protected DecorationFactory decorators;
 73  
     protected JetspeedDesktop desktop;
 74  
     protected JetspeedContentCache decoratorCache;
 75  
 
 76  
     public void init( PortletConfig config ) throws PortletException
 77  
     {
 78  0
         super.init(config);
 79  0
         this.portletName = config.getPortletName();
 80  0
         this.layoutType = config.getInitParameter("layoutType");
 81  0
         this.editorType = config.getInitParameter("editorType");
 82  0
         if (this.layoutType == null)
 83  
         {
 84  0
             throw new PortletException("Layout type not specified for " + this.portletName);
 85  
         }
 86  0
         this.numColumns = Integer.parseInt(config.getInitParameter(PARAM_NUM_COLUMN));
 87  0
         if (this.numColumns < 1)
 88  
         {
 89  0
             this.numColumns = 1;
 90  
         }
 91  0
         this.columnSizes = config.getInitParameter(PARAM_COLUMN_SIZES);
 92  0
         if ((this.columnSizes == null) || (class="keyword">this.columnSizes.trim().length() == 0))
 93  
         {
 94  0
             switch (this.numColumns)
 95  
             {
 96  0
             case 1: this.columnSizes = DEFAULT_ONE_COLUMN_SIZES; break;
 97  0
             case 2: this.columnSizes = DEFAULT_TWO_COLUMN_SIZES; break;
 98  0
             case 3: this.columnSizes = DEFAULT_THREE_COLUMN_SIZES; break;
 99  0
             default: this.columnSizes = null; break;
 100  
             }
 101  
         }
 102  0
         if (this.columnSizes == null)
 103  
         {
 104  0
             throw new PortletException("Column sizes cannot be defaulted for " + this.numColumns + " columns and are not specified for " + this.portletName);
 105  
         }
 106  
        
 107  0
         this.decorators = (DecorationFactory)getPortletContext().getAttribute(CommonPortletServices.CPS_DECORATION_FACTORY);
 108  0
         if (null == this.decorators)
 109  
         {
 110  0
             throw new PortletException("Failed to find the Decoration Factory on portlet initialization");
 111  
         }
 112  
         
 113  0
         this.desktop = (JetspeedDesktop)getPortletContext().getAttribute(CommonPortletServices.CPS_DESKTOP);
 114  
         
 115  0
         this.decoratorCache = (JetspeedContentCache)getPortletContext().getAttribute(CommonPortletServices.CPS_DECORATOR_CACHE);
 116  0
     }
 117  
 
 118  
     public void doView( RenderRequest request, RenderResponse response ) throws PortletException, IOException
 119  
     {
 120  0
         RequestContext context = getRequestContext(request);
 121  
 
 122  0
         ContentPage requestPage = context.getPage();       
 123  0
         PageEditAccess pageEditAccess = (PageEditAccess)context.getAttribute(PortalReservedParameters.PAGE_EDIT_ACCESS_ATTRIBUTE);
 124  0
         if ( requestPage == null)
 125  
         {
 126  
             // Targetting this portlet REQUIRES that the ProfilerValve has been invoked!
 127  0
             throw new PortletException("Current request page not available.");
 128  
         }
 129  0
         if (pageEditAccess == null)
 130  
         {
 131  
             // Targetting this portlet REQUIRES that the ProfilerValve has been invoked!
 132  0
             throw new PortletException("Current PageEditAccess not available.");            
 133  
         }
 134  
         
 135  0
         Boolean editing = ( pageEditAccess.isEditing() && 
 136  
                             PortletMode.VIEW.equals(request.getPortletMode()) && 
 137  
                             request.isPortletModeAllowed(PortletMode.EDIT))
 138  
                           ? Boolean.TRUE : Boolean.FALSE;
 139  
                                          
 140  0
         PortletWindow window = context.getPortalURL().getNavigationalState().getMaximizedWindow();
 141  0
         if (window != null)
 142  
         {
 143  0
             super.doView(request, response);
 144  0
             return;
 145  
         }
 146  
         
 147  
         // get fragment column sizes
 148  0
         Fragment f = getFragment(request, false);
 149  0
         String fragmentColumnSizes = columnSizes;
 150  0
         String fragmentColumnSizesProperty = f.getProperty(Fragment.SIZES_PROPERTY_NAME);
 151  0
         if (fragmentColumnSizesProperty != null)
 152  
         {
 153  0
             fragmentColumnSizes = fragmentColumnSizesProperty;
 154  
         }
 155  0
         String [] fragmentColumnSizesArray = fragmentColumnSizes.split("\\,");
 156  0
         List fragmentColumnSizesList = new ArrayList(fragmentColumnSizesArray.length);
 157  0
         for (int i = 0; (i < fragmentColumnSizesArray.length); i++)
 158  
         {
 159  0
             fragmentColumnSizesList.add(fragmentColumnSizesArray[i]);
 160  
         }
 161  
 
 162  
         // construct layout object
 163  
         ColumnLayout layout;
 164  
         try
 165  
         {
 166  0
             layout = new ColumnLayout(numColumns, layoutType, f.getFragments(), fragmentColumnSizesArray);
 167  0
             layout.addLayoutEventListener(new PageManagerLayoutEventListener(pageManager, context.getPage(), layoutType));
 168  
         }
 169  0
         catch (LayoutEventException e1)
 170  
         {
 171  0
             throw new PortletException("Failed to build ColumnLayout "+e1.getMessage(), e1);
 172  0
         }
 173  
 
 174  
         // invoke the JSP associated with this portlet
 175  0
         request.setAttribute("columnLayout", layout);
 176  0
         request.setAttribute("numberOfColumns", new Integer(numColumns));
 177  0
         request.setAttribute("decorationFactory", this.decorators);
 178  0
         request.setAttribute("columnSizes", fragmentColumnSizesList);
 179  0
         request.setAttribute("editing",editing);
 180  0
         request.setAttribute("fragmentNestingLevel",new Integer(getFragmentNestingLevel(requestPage,f.getId())));
 181  0
         super.doView(request, response);
 182  0
         request.removeAttribute("decorationFactory");
 183  0
         request.removeAttribute("columnLayout");
 184  0
         request.removeAttribute("numberOfColumns");
 185  0
         request.removeAttribute("columnSizes");
 186  0
         request.removeAttribute("editing");
 187  0
         request.removeAttribute(("fragmentNestingLevel"));
 188  0
     }
 189  
 
 190  
     public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException
 191  
     {
 192  0
         RequestContext requestContext = (RequestContext)request.getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
 193  
         
 194  0
         ContentPage requestPage = requestContext.getPage();       
 195  0
         PageEditAccess pageEditAccess = (PageEditAccess)requestContext.getAttribute(PortalReservedParameters.PAGE_EDIT_ACCESS_ATTRIBUTE);
 196  0
         if ( requestPage == null || pageEditAccess == class="keyword">null )
 197  
         {
 198  
             // Targetting this portlet with an ActionRequest REQUIRES that the ProfilerValve has been invoked!
 199  0
             throw new PortletException("Current request page or PageEditAccess not available.");
 200  
         }
 201  
 
 202  0
         decoratorCache.invalidate(requestContext);
 203  
         
 204  0
         String pageMode = request.getParameter("pageMode");
 205  0
         if ( pageMode != null )
 206  
         {
 207  0
             if ( "view".equals(pageMode) )
 208  
             {
 209  0
                 pageEditAccess.setEditing(false);
 210  
             }
 211  0
             else if ( "edit".equals(pageMode) && pageEditAccess.isEditAllowed() )
 212  
             {
 213  0
                 if ( this.editorType != null && class="keyword">this.editorType.equals( "desktop" ) )
 214  
                 {
 215  0
                     String redirectUrl = this.desktop.getPortalUrl( requestContext, requestContext.getPath() );
 216  0
                     redirectUrl += "?editPage=true&portal=true";
 217  0
                     response.sendRedirect( redirectUrl );
 218  0
                 }
 219  
                 else
 220  
                 {
 221  0
                     pageEditAccess.setEditing(true);
 222  
                 }
 223  
             }
 224  0
             return;
 225  
         }
 226  
         
 227  0
         if ( pageEditAccess.isEditAllowed() && request.isPortletModeAllowed(PortletMode.EDIT) )
 228  
         {
 229  0
             String layout = null;
 230  
             
 231  0
             boolean addLayout = request.getParameter("jsAddLayout") != null;
 232  0
             if ( addLayout || request.getParameter("jsChangeLayout") != null )
 233  
             {
 234  0
                 layout = request.getParameter("layout");
 235  0
                 if ( layout != null && layout.length() > 0 )
 236  
                 {
 237  0
                     PortletWindow window = requestContext.getActionWindow();
 238  0
                     ContentFragment targetFragment = requestPage.getContentFragmentById(window.getId().toString());
 239  
                     
 240  0
                     if ( targetFragment == null )
 241  
                     {
 242  
                         // ignore no longer consistent page definition
 243  0
                         return;
 244  
                     }
 245  
                     
 246  0
                     if ( addLayout )
 247  
                     {
 248  
                         try
 249  
                         {
 250  0
                             Fragment fragment = pageManager.newFragment();
 251  0
                             fragment.setType(Fragment.LAYOUT);
 252  0
                             fragment.setName(layout);                            
 253  0
                             targetFragment.getFragments().add(fragment);
 254  0
                             pageManager.updatePage(requestPage);
 255  0
                             clearLayoutAttributes(request);                            
 256  
                         }
 257  0
                         catch (Exception e)
 258  
                         {
 259  0
                             throw new PortletException("failed to add portlet " + layout + " to page: " + requestPage+": "+e.getMessage(), e);
 260  0
                         }
 261  
                     }
 262  0
                     else if ( !layout.equals(targetFragment.getName()) )
 263  
                     {
 264  
                         try
 265  
                         {
 266  
                             // layout portlet change
 267  0
                             targetFragment.setName(layout);
 268  0
                             pageManager.updatePage(requestPage);
 269  0
                             entityAccess.updatePortletEntity(window.getPortletEntity(), targetFragment);
 270  0
                             entityAccess.storePortletEntity(window.getPortletEntity());
 271  0
                             windowAccess.createPortletWindow(window.getPortletEntity(), targetFragment.getId());
 272  0
                             clearLayoutAttributes(request);
 273  0
                             return;
 274  
                         }
 275  0
                         catch (Exception e)
 276  
                         {
 277  0
                             throw new PortletException("Unable to update page: "+e.getMessage(), e);
 278  
                         }
 279  
                     }
 280  
                 }
 281  0
                 return;
 282  
             }
 283  
 
 284  0
             if ( request.getParameter("jsSubmitPage" ) != null )
 285  
             {
 286  0
                 String jsPageName = request.getParameter("jsPageName");
 287  0
                 String jsPageTitle = request.getParameter("jsPageTitle");
 288  0
                 String jsPageShortTitle = request.getParameter("jsPageShortTitle");
 289  0
                 if ( jsPageName != null && jsPageName.length() > 0 && jsPageName.indexOf(Folder.PATH_SEPARATOR) == -1 )
 290  
                 {
 291  
                     try
 292  
                     {                
 293  0
                         Folder parent = (Folder)requestPage.getParent();
 294  0
                         if (parent != null)
 295  
                         {
 296  0
                             String path = parent.getPath();
 297  0
                             if (path.endsWith(Folder.PATH_SEPARATOR))
 298  
                             {
 299  0
                                 path = path + getEscapedName(jsPageName);
 300  
                             }
 301  
                             else
 302  
                             {
 303  0
                                 path = path + Folder.PATH_SEPARATOR
 304  
                                         + getEscapedName(jsPageName);
 305  
                             }
 306  0
                             Page page = pageManager.newPage(path);
 307  0
                             if ( layout == null || layout.length() == 0 )
 308  
                             {
 309  0
                                 layout = requestPage.getRootFragment().getName();
 310  
                             }
 311  0
                             page.getRootFragment().setName(layout);
 312  0
                             page.setDefaultDecorator(requestPage.getDefaultDecorator(Fragment.LAYOUT), Fragment.LAYOUT);
 313  0
                             page.setDefaultDecorator(requestPage.getDefaultDecorator(Fragment.PORTLET), Fragment.PORTLET);
 314  0
                             page.setTitle(jsPageTitle != null && !jsPageTitle.equals("") ? jsPageTitle : jsPageName);
 315  0
                             page.setShortTitle(jsPageShortTitle != null
 316  
                                             && !jsPageShortTitle.equals("") ? jsPageShortTitle
 317  
                                             : jsPageName);
 318  0
                             pageManager.updatePage(page);
 319  0
                             clearLayoutAttributes(request);                            
 320  0
                             List orderList = parent.getDocumentOrder();
 321  0
                             if (orderList != null)
 322  
                             {
 323  0
                                 String name = page.getName();
 324  0
                                 if (orderList.indexOf(name) < 0)
 325  
                                 {
 326  0
                                     orderList.add(name);
 327  0
                                     parent.setDocumentOrder(orderList);
 328  0
                                     pageManager.updateFolder(parent);
 329  
                                 }
 330  
                             }
 331  
                         }
 332  
                     }
 333  0
                     catch (Exception e)
 334  
                     {
 335  0
                         throw new PortletException("Unable to access page for editing: "+e.getMessage(), e);
 336  0
                     }                        
 337  
                 }
 338  0
                 return;
 339  
             }
 340  
 
 341  0
             if (request.getParameter("jsChangePageName") != null)
 342  
             {
 343  0
                 String jsPageTitle = request.getParameter("jsPageTitle");
 344  0
                 String jsPageShortTitle = request
 345  
                         .getParameter("jsPageShortTitle");
 346  
                 try
 347  
                 {
 348  0
                     if (jsPageTitle != null && !jsPageTitle.equals(""))
 349  
                     {
 350  0
                         requestPage.setTitle(jsPageTitle);
 351  
                     }
 352  0
                     if (jsPageShortTitle != null
 353  
                             && !jsPageShortTitle.equals(""))
 354  
                     {
 355  0
                         requestPage.setShortTitle(jsPageShortTitle);
 356  
                     }
 357  0
                     pageManager.updatePage(requestPage);
 358  
                 }
 359  0
                 catch (Exception e)
 360  
                 {
 361  0
                     throw new PortletException(
 362  
                             "Unable to access page for editing: "
 363  
                                     + e.getMessage(), e);
 364  0
                 }
 365  0
                 return;
 366  
             }
 367  
 
 368  0
             if ( request.getParameter("jsDeletePage" ) != null )
 369  
             {
 370  
                 try
 371  
                 {
 372  0
                     Folder parent = (Folder)requestPage.getParent();
 373  0
                     if (parent != null)
 374  
                     {
 375  0
                         List orderList = parent.getDocumentOrder();
 376  0
                         if (orderList != null)
 377  
                         {
 378  0
                             String name = requestPage.getName();
 379  0
                             if (orderList.indexOf(name) > -1)
 380  
                             {
 381  0
                                 orderList.remove(name);
 382  0
                                 parent.setDocumentOrder(orderList);
 383  0
                                 pageManager.updateFolder(parent);
 384  
                             }
 385  
                         }
 386  
                     }
 387  
 
 388  0
                     pageManager.removePage(requestPage);
 389  
                 }
 390  0
                 catch (Exception e)
 391  
                 {
 392  0
                     throw new PortletException("Unable to access page for removing: "+e.getMessage(), e);
 393  0
                 }
 394  0
                 return;
 395  
             }
 396  
 
 397  0
             if (request.getParameter("jsMovePageLeft") != null)
 398  
             {
 399  
                 try
 400  
                 {
 401  0
                     Folder parent = (Folder) requestPage.getParent();
 402  0
                     if (parent != null)
 403  
                     {
 404  0
                         List orderList = parent.getDocumentOrder();
 405  0
                         String name = requestPage.getName();
 406  0
                         if (orderList != null)
 407  
                         {
 408  0
                             int index = orderList.indexOf(name);
 409  0
                             if (index > -1)
 410  
                             {
 411  0
                                 String type = requestPage.getType();
 412  0
                                 int i = index - 1;
 413  0
                                 while (i >= 0)
 414  
                                 {
 415  0
                                     String value = (String) orderList.get(i);
 416  0
                                     if (value.endsWith(type))
 417  
                                     {
 418  0
                                         orderList.remove(index);
 419  0
                                         orderList.add(i, name);
 420  0
                                         parent.setDocumentOrder(orderList);
 421  0
                                         pageManager.updateFolder(parent);
 422  0
                                         break;
 423  
                                     }
 424  0
                                     i--;
 425  0
                                 }
 426  0
                             }
 427  
                             else
 428  
                             {
 429  0
                                 orderList.add(name);
 430  0
                                 parent.setDocumentOrder(orderList);
 431  0
                                 pageManager.updateFolder(parent);
 432  
                             }
 433  0
                         }
 434  
                         else
 435  
                         {
 436  0
                             orderList = new ArrayList(4);
 437  0
                             orderList.add(name);
 438  0
                             parent.setDocumentOrder(orderList);
 439  0
                             pageManager.updateFolder(parent);
 440  
                         }
 441  
                     }
 442  
                 }
 443  0
                 catch (Exception e)
 444  
                 {
 445  0
                     throw new PortletException(
 446  
                             "Unable to access page for changing the document order: "
 447  
                                     + e.getMessage(), e);
 448  0
                 }
 449  0
                 return;
 450  
             }
 451  
 
 452  0
             if (request.getParameter("jsMovePageRight") != null)
 453  
             {
 454  
                 try
 455  
                 {
 456  0
                     Folder parent = (Folder) requestPage.getParent();
 457  0
                     if (parent != null)
 458  
                     {
 459  0
                         List orderList = parent.getDocumentOrder();
 460  0
                         String name = requestPage.getName();
 461  0
                         if (orderList != null)
 462  
                         {
 463  0
                             int index = orderList.indexOf(name);
 464  0
                             if (index > -1)
 465  
                             {
 466  0
                                 String type = requestPage.getType();
 467  0
                                 int i = index + 1;
 468  0
                                 while (i < orderList.size())
 469  
                                 {
 470  0
                                     String value = (String) orderList.get(i);
 471  0
                                     if (value.endsWith(type))
 472  
                                     {
 473  0
                                         orderList.remove(index);
 474  0
                                         orderList.add(i, name);
 475  0
                                         parent.setDocumentOrder(orderList);
 476  0
                                         pageManager.updateFolder(parent);
 477  0
                                         break;
 478  
                                     }
 479  0
                                     i++;
 480  0
                                 }
 481  0
                             }
 482  
                             else
 483  
                             {
 484  0
                                 orderList.add(name);
 485  0
                                 parent.setDocumentOrder(orderList);
 486  0
                                 pageManager.updateFolder(parent);
 487  
                             }
 488  0
                         }
 489  
                         else
 490  
                         {
 491  0
                             orderList = new ArrayList(4);
 492  0
                             orderList.add(name);
 493  0
                             parent.setDocumentOrder(orderList);
 494  0
                             pageManager.updateFolder(parent);
 495  
                         }
 496  
                     }
 497  
                 }
 498  0
                 catch (Exception e)
 499  
                 {
 500  0
                     throw new PortletException(
 501  
                             "Unable to access page for changing the document order: "
 502  
                                     + e.getMessage(), e);
 503  0
                 }
 504  0
                 return;
 505  
             }            
 506  
 
 507  0
             if (request.getParameter("jsSubmitFolder") != null)
 508  
             {
 509  0
                 String jsFolderName = request.getParameter("jsFolderName");
 510  0
                 String jsFolderTitle = request.getParameter("jsFolderTitle");
 511  0
                 String jsFolderShortTitle = request.getParameter("jsFolderShortTitle");
 512  0
                 if (jsFolderName != null && jsFolderName.length() > 0
 513  
                         && jsFolderName.indexOf(Folder.PATH_SEPARATOR) == -1)
 514  
                 {
 515  
                     try
 516  
                     {
 517  0
                         Folder parent = (Folder) requestPage.getParent();
 518  0
                         if (parent != null)
 519  
                         {
 520  0
                             String path = parent.getPath();
 521  0
                             if (path.endsWith(Folder.PATH_SEPARATOR))
 522  
                             {
 523  0
                                 path = path + getEscapedName(jsFolderName);
 524  
                             }
 525  
                             else
 526  
                             {
 527  0
                                 path = path + Folder.PATH_SEPARATOR
 528  
                                         + getEscapedName(jsFolderName);
 529  
                             }
 530  0
                             Folder folder = pageManager.newFolder(path);
 531  0
                             if (layout == null || layout.length() == 0)
 532  
                             {
 533  0
                                 layout = requestPage.getRootFragment()
 534  
                                         .getName();
 535  
                             }
 536  0
                             folder.setDefaultDecorator(requestPage
 537  
                                     .getDefaultDecorator(Fragment.LAYOUT),
 538  
                                     Fragment.LAYOUT);
 539  0
                             folder.setDefaultDecorator(requestPage
 540  
                                     .getDefaultDecorator(Fragment.PORTLET),
 541  
                                     Fragment.PORTLET);
 542  0
                             folder
 543  
                                     .setTitle(jsFolderTitle != null
 544  
                                             && !jsFolderTitle.equals("") ? jsFolderTitle
 545  
                                             : jsFolderName);
 546  0
                             folder
 547  
                                     .setShortTitle(jsFolderShortTitle != null
 548  
                                             && !jsFolderShortTitle.equals("") ? jsFolderShortTitle
 549  
                                             : jsFolderName);
 550  0
                             pageManager.updateFolder(folder);
 551  
 
 552  0
                             List orderList = parent.getDocumentOrder();
 553  0
                             if (orderList != null)
 554  
                             {
 555  0
                                 String name = folder.getName();
 556  0
                                 if (orderList.indexOf(name) < 0)
 557  
                                 {
 558  0
                                     orderList.add(name);
 559  0
                                     parent.setDocumentOrder(orderList);
 560  0
                                     pageManager.updateFolder(parent);
 561  
                                 }
 562  
                             }
 563  
 
 564  
                             // add default page
 565  0
                             path = folder.getPath();
 566  0
                             if (path.endsWith(Folder.PATH_SEPARATOR))
 567  
                             {
 568  0
                                 path = path + getEscapedName("default-page");
 569  
                             }
 570  
                             else
 571  
                             {
 572  0
                                 path = path + Folder.PATH_SEPARATOR
 573  
                                         + getEscapedName("default-page");
 574  
                             }
 575  0
                             Page page = pageManager.newPage(path);
 576  0
                             if (layout == null || layout.length() == 0)
 577  
                             {
 578  0
                                 layout = requestPage.getRootFragment()
 579  
                                         .getName();
 580  
                             }
 581  0
                             page.getRootFragment().setName(layout);
 582  0
                             page.setDefaultDecorator(requestPage
 583  
                                     .getDefaultDecorator(Fragment.LAYOUT),
 584  
                                     Fragment.LAYOUT);
 585  0
                             page.setDefaultDecorator(requestPage
 586  
                                     .getDefaultDecorator(Fragment.PORTLET),
 587  
                                     Fragment.PORTLET);
 588  0
                             page.setTitle(jsFolderName);
 589  0
                             pageManager.updatePage(page);
 590  
 
 591  0
                             orderList = folder.getDocumentOrder();
 592  0
                             if (orderList != null)
 593  
                             {
 594  0
                                 String name = page.getName();
 595  0
                                 if (orderList.indexOf(name) < 0)
 596  
                                 {
 597  0
                                     orderList.add(name);
 598  0
                                     folder.setDocumentOrder(orderList);
 599  0
                                     pageManager.updateFolder(folder);
 600  
                                 }
 601  
                             }
 602  
                         }
 603  
                     }
 604  0
                     catch (Exception e)
 605  
                     {
 606  0
                         throw new PortletException(
 607  
                                 "Unable to access folder for editing: "
 608  
                                         + e.getMessage(), e);
 609  0
                     }
 610  
                 }
 611  0
                 return;
 612  
             }
 613  
 
 614  0
             if (request.getParameter("jsChangeFolderName") != null)
 615  
             {
 616  0
                 String jsFolderTitle = request.getParameter("jsFolderTitle");
 617  0
                 String jsFolderShortTitle = request
 618  
                         .getParameter("jsFolderShortTitle");
 619  
                 try
 620  
                 {
 621  0
                     Folder parent = (Folder) requestPage.getParent();
 622  0
                     if (parent != null)
 623  
                     {
 624  0
                         if (jsFolderTitle != null && !jsFolderTitle.equals(""))
 625  
                         {
 626  0
                             parent.setTitle(jsFolderTitle);
 627  
                         }
 628  0
                         if (jsFolderShortTitle != null
 629  
                                 && !jsFolderShortTitle.equals(""))
 630  
                         {
 631  0
                             parent.setShortTitle(jsFolderShortTitle);
 632  
                         }
 633  0
                         pageManager.updateFolder(parent);
 634  
                     }
 635  
 
 636  
                 }
 637  0
                 catch (Exception e)
 638  
                 {
 639  0
                     throw new PortletException(
 640  
                             "Unable to access folder for editing: "
 641  
                                     + e.getMessage(), e);
 642  0
                 }
 643  0
                 return;
 644  
             }
 645  
             
 646  0
             if (request.getParameter("jsDeleteFolder") != null)
 647  
             {
 648  
                 try
 649  
                 {
 650  0
                     Folder targetFolder = (Folder) requestPage.getParent();
 651  0
                     Folder parent = (Folder) targetFolder.getParent();
 652  0
                     if (parent != null)
 653  
                     {
 654  0
                         List orderList = parent.getDocumentOrder();
 655  0
                         if (orderList != null)
 656  
                         {
 657  0
                             String name = targetFolder.getName();
 658  0
                             if (orderList.indexOf(name) > -1)
 659  
                             {
 660  0
                                 orderList.remove(name);
 661  0
                                 parent.setDocumentOrder(orderList);
 662  0
                                 pageManager.updateFolder(parent);
 663  
                             }
 664  
                         }
 665  
 
 666  
                         // do not remove if the folder is root.
 667  0
                         pageManager.removeFolder(targetFolder);
 668  
                     }
 669  
                 }
 670  0
                 catch (Exception e)
 671  
                 {
 672  0
                     throw new PortletException(
 673  
                             "Unable to access folder for removing: "
 674  
                                     + e.getMessage(), e);
 675  0
                 }
 676  0
                 return;
 677  
             }
 678  
 
 679  0
             if (request.getParameter("jsMoveFolderLeft") != null)
 680  
             {
 681  
                 try
 682  
                 {
 683  0
                     Folder targetFolder = (Folder) requestPage.getParent();
 684  0
                     Folder parent = (Folder) targetFolder.getParent();
 685  0
                     if (parent != null)
 686  
                     {
 687  0
                         List orderList = parent.getDocumentOrder();
 688  0
                         String name = targetFolder.getName();
 689  0
                         if (orderList != null)
 690  
                         {
 691  0
                             int index = orderList.indexOf(name);
 692  0
                             if (index > -1)
 693  
                             {
 694  0
                                 int i = index - 1;
 695  0
                                 while (i >= 0)
 696  
                                 {
 697  0
                                     String value = (String) orderList.get(i);
 698  0
                                     if (!value.endsWith(".psml")
 699  
                                             && !value.endsWith(".link"))
 700  
                                     {
 701  0
                                         orderList.remove(index);
 702  0
                                         orderList.add(i, name);
 703  0
                                         parent.setDocumentOrder(orderList);
 704  0
                                         pageManager.updateFolder(parent);
 705  0
                                         break;
 706  
                                     }
 707  0
                                     i--;
 708  0
                                 }
 709  0
                             }
 710  
                             else
 711  
                             {
 712  0
                                 orderList.add(name);
 713  0
                                 parent.setDocumentOrder(orderList);
 714  0
                                 pageManager.updateFolder(parent);
 715  
                             }
 716  0
                         }
 717  
                         else
 718  
                         {
 719  0
                             orderList = new ArrayList(4);
 720  0
                             orderList.add(name);
 721  0
                             parent.setDocumentOrder(orderList);
 722  0
                             pageManager.updateFolder(parent);
 723  
                         }
 724  
                     }
 725  
                 }
 726  0
                 catch (Exception e)
 727  
                 {
 728  0
                     throw new PortletException(
 729  
                             "Unable to access folder for changing the document order: "
 730  
                                     + e.getMessage(), e);
 731  0
                 }
 732  0
                 return;
 733  
             }
 734  
 
 735  0
             if (request.getParameter("jsMoveFolderRight") != null)
 736  
             {
 737  
                 try
 738  
                 {
 739  0
                     Folder targetFolder = (Folder) requestPage.getParent();
 740  0
                     Folder parent = (Folder) targetFolder.getParent();
 741  0
                     if (parent != null)
 742  
                     {
 743  0
                         List orderList = parent.getDocumentOrder();
 744  0
                         String name = targetFolder.getName();
 745  0
                         if (orderList != null)
 746  
                         {
 747  0
                             int index = orderList.indexOf(name);
 748  0
                             if (index > -1)
 749  
                             {
 750  0
                                 int i = index + 1;
 751  0
                                 while (i < orderList.size())
 752  
                                 {
 753  0
                                     String value = (String) orderList.get(i);
 754  0
                                     if (!value.endsWith(".psml")
 755  
                                             && !value.endsWith(".link"))
 756  
                                     {
 757  0
                                         orderList.remove(index);
 758  0
                                         orderList.add(i, name);
 759  0
                                         parent.setDocumentOrder(orderList);
 760  0
                                         pageManager.updateFolder(parent);
 761  0
                                         break;
 762  
                                     }
 763  0
                                     i++;
 764  0
                                 }
 765  0
                             }
 766  
                             else
 767  
                             {
 768  0
                                 orderList.add(name);
 769  0
                                 parent.setDocumentOrder(orderList);
 770  0
                                 pageManager.updateFolder(parent);
 771  
                             }
 772  0
                         }
 773  
                         else
 774  
                         {
 775  0
                             orderList = new ArrayList(4);
 776  0
                             orderList.add(name);
 777  0
                             parent.setDocumentOrder(orderList);
 778  0
                             pageManager.updateFolder(parent);
 779  
                         }
 780  
                     }
 781  
                 }
 782  0
                 catch (Exception e)
 783  
                 {
 784  0
                     throw new PortletException(
 785  
                             "Unable to access folder for changing the document order: "
 786  
                                     + e.getMessage(), e);
 787  0
                 }
 788  0
                 return;
 789  
             }
 790  
 
 791  0
             String theme = request.getParameter("theme");
 792  0
             if ( theme != null && theme.length() > 0 && !theme.equals(requestPage.getDefaultDecorator(Fragment.LAYOUT)) )
 793  
             {
 794  0
                 requestPage.setDefaultDecorator(theme, Fragment.LAYOUT);
 795  
                 try
 796  
                 {
 797  0
                     pageManager.updatePage(requestPage);
 798  
                 }
 799  0
                 catch (Exception e)
 800  
                 {
 801  0
                     throw new PortletException("Unable to update page: "+e.getMessage(), e);
 802  0
                 }
 803  0
                 return;
 804  
             }
 805  
             
 806  0
             String fragmentId = request.getParameter("fragment");
 807  0
             if ( fragmentId != null && fragmentId.length() > 0 )
 808  
             {
 809  0
                 String move = request.getParameter("move");
 810  0
                 if ( move != null && move.length() > 0 )
 811  
                 {
 812  0
                     int moveCode = Integer.parseInt(move);                    
 813  0
                     PortletWindow window = requestContext.getActionWindow();
 814  0
                     Fragment currentFragment = requestPage.getFragmentById(window.getId().toString());
 815  0
                     Fragment fragmentToMove = requestPage.getFragmentById(fragmentId);
 816  
                     
 817  0
                     if ( currentFragment == null || fragmentToMove == class="keyword">null )
 818  
                     {
 819  
                         // ignore no longer consistent page definition
 820  0
                         return;
 821  
                     }
 822  
                     
 823  
                     ColumnLayout columnLayout;
 824  
                     try
 825  
                     {
 826  0
                         columnLayout = new ColumnLayout(numColumns, layoutType, currentFragment.getFragments(), null);
 827  0
                         columnLayout.addLayoutEventListener(new PageManagerLayoutEventListener(pageManager, requestPage, layoutType));
 828  
                     }
 829  0
                     catch (LayoutEventException e1)
 830  
                     {
 831  0
                         throw new PortletException("Failed to build ColumnLayout "+e1.getMessage(), e1);
 832  0
                     }
 833  
 
 834  
                     try
 835  
                     {                
 836  0
                         switch (moveCode)
 837  
                         {
 838  
                         case LayoutEvent.MOVED_UP:
 839  0
                             columnLayout.moveUp(fragmentToMove);
 840  0
                             break;
 841  
                         case LayoutEvent.MOVED_DOWN:
 842  0
                             columnLayout.moveDown(fragmentToMove);
 843  0
                             break;
 844  
                         case LayoutEvent.MOVED_RIGHT:
 845  0
                             columnLayout.moveRight(fragmentToMove);
 846  0
                             break;
 847  
                         case LayoutEvent.MOVED_LEFT:
 848  0
                             columnLayout.moveLeft(fragmentToMove);
 849  0
                             break;
 850  
                         default:
 851  0
                             throw new PortletException("Invalid movement code " + moveCode);
 852  
                         }
 853  
                        
 854  
                     }
 855  0
                     catch (SecurityException se)
 856  
                     {
 857  
                         // ignore page security constraint violations, only
 858  
                         // permitted users can edit managed pages; page
 859  
                         // update will remain transient
 860  0
                         log.info("Unable to update page " + requestPage.getId() + " layout due to security permission/constraint.", se);
 861  
                     }
 862  0
                     catch (Exception e)
 863  
                     {
 864  0
                         if (e instanceof PortletException)
 865  
                         {
 866  0
                             throw (PortletException)e;
 867  
                         }
 868  
                         else
 869  
                         {
 870  0
                             throw new PortletException("Unable to process layout for page " + requestPage.getId() + " layout: " + e.toString(), e);
 871  
                         }
 872  0
                     }
 873  0
                     return;
 874  
                 }
 875  
                 
 876  0
                 String remove = request.getParameter("remove");
 877  0
                 if ( remove != null && remove.length() > 0 )
 878  
                 {
 879  0
                     Page page = null;
 880  
                     try
 881  
                     {
 882  
                         // TODO: for now retrieve the real Page instead of ContentPage
 883  
                         //       because removing fragments isn't working through the ContentFragment wrapping
 884  0
                         page = pageManager.getPage(requestPage.getPath());
 885  
                     }
 886  0
                     catch (Exception e)
 887  
                     {
 888  0
                         throw new PortletException("Unable to retrieve page "+requestPage.getId(),e);
 889  0
                     }
 890  
 
 891  0
                     PortletWindow window = requestContext.getActionWindow();
 892  0
                     Fragment currentFragment = page.getFragmentById(window.getId().toString());
 893  
 
 894  0
                     if ( currentFragment == null )
 895  
                     {
 896  
                         // ignore no longer consistent page definition
 897  0
                         return;
 898  
                     }
 899  
                     
 900  0
                     removeFragment(page, currentFragment, fragmentId);
 901  0
                     return;
 902  
                 }
 903  
                 
 904  0
                 String decorator = request.getParameter("decorator");
 905  0
                 if ( decorator != null )
 906  
                 {
 907  0
                     Fragment fragment = requestPage.getFragmentById(fragmentId);
 908  
 
 909  0
                     if ( fragment == null )
 910  
                     {
 911  
                         // ignore no longer consistent page definition
 912  0
                         return;
 913  
                     }
 914  
                     
 915  0
                     if (decorator.trim().length() == 0)
 916  0
                         fragment.setDecorator(null);
 917  
                     else
 918  0
                         fragment.setDecorator(decorator);
 919  
                     try
 920  
                     {
 921  0
                         pageManager.updatePage(requestPage);
 922  
                     }
 923  0
                     catch (Exception e)
 924  
                     {
 925  0
                         throw new PortletException("Unable to update page for fragment decorator: "+e.getMessage(), e);
 926  0
                     }
 927  0
                     return;
 928  
                 }
 929  
             }
 930  
             // change style for all pages in user folder 
 931  0
             String jsChangeUserPagesTheme = request.getParameter("jsChangeUserPagesTheme");
 932  0
             if ( jsChangeUserPagesTheme != null )
 933  
             {
 934  0
                String user_pages_theme = request.getParameter("user_pages_theme");
 935  
                try
 936  
                 {
 937  0
                    Folder f = pageManager.getUserFolder(request.getRemoteUser());
 938  0
                    applyStyle(f,user_pages_theme,Fragment.LAYOUT);
 939  
                 }
 940  0
                 catch (Exception e)
 941  
                 {
 942  0
                    throw new PortletException("Unable to update folder for defUserLayoutDeco decorator: "+e.getMessage(), e);
 943  0
                 }
 944  0
                 return;
 945  
             }                
 946  0
             String jsChangeUserPortletsDeco = request.getParameter("jsChangeUserPortletsDeco");
 947  0
             if ( jsChangeUserPortletsDeco != null )
 948  
             {                  
 949  0
                String user_portlets_deco = request.getParameter("user_portlets_deco");
 950  
                try
 951  
                 {
 952  0
                    Folder f = pageManager.getUserFolder(request.getRemoteUser());
 953  0
                    applyStyle(f,user_portlets_deco,Fragment.PORTLET);
 954  
                 }
 955  0
                catch (Exception e)
 956  
                 {
 957  0
                     throw new PortletException("Unable to update folder for defUserPortletDeco decorator: "+e.getMessage(), e);
 958  0
                 }
 959  0
                return;
 960  
             }                                
 961  
             
 962  0
             String jsChangeThemeAll = request.getParameter("jsChangeThemeAll");
 963  0
             if (jsChangeThemeAll != null)
 964  
             {
 965  0
                 String decorators = request.getParameter("decorators");                
 966  0
                 Iterator fragmentsIter = requestPage.getRootFragment().getFragments().iterator();
 967  0
                 while(fragmentsIter.hasNext())
 968  
                 {
 969  0
                     Fragment fragment = (Fragment) fragmentsIter.next();
 970  0
                     if ( fragment == null )
 971  
                     {
 972  
                         // ignore no longer consistent page definition
 973  0
                         return;
 974  
                     }
 975  
                     
 976  0
                     if (decorators.trim().length() == 0)
 977  0
                         fragment.setDecorator(null);
 978  
                     else
 979  0
                         fragment.setDecorator(decorators);
 980  0
                 }
 981  
                 try
 982  
                 {
 983  0
                     pageManager.updatePage(requestPage);
 984  
                 }
 985  0
                 catch (Exception e)
 986  
                 {
 987  0
                     throw new PortletException("Unable to update page for fragment decorator: "+e.getMessage(), e);
 988  0
                 }
 989  0
                 return;
 990  
             }                
 991  
             
 992  0
             String portlets = request.getParameter("portlets");
 993  0
             if ( portlets != null && portlets.length() > 0 )
 994  
             {
 995  0
                 PortletWindow window = requestContext.getActionWindow();
 996  0
                 Fragment targetFragment = requestPage.getFragmentById(window.getId().toString());
 997  
 
 998  0
                 if ( targetFragment == null )
 999  
                 {
 1000  
                     // ignore no longer consistent page definition
 1001  0
                     return;
 1002  
                 }
 1003  
                 
 1004  0
                 StringTokenizer tokenizer = new StringTokenizer(portlets, ",");            
 1005  0
                 while (tokenizer.hasMoreTokens())
 1006  
                 {
 1007  0
                     String portlet = tokenizer.nextToken();
 1008  0
                     if (portlet.startsWith("box_"))
 1009  
                     {
 1010  0
                         portlet = portlet.substring("box_".length());                        
 1011  0
                         addPortletToPage(requestPage, targetFragment, portlet);
 1012  
                     }
 1013  0
                 }
 1014  0
                 return;
 1015  
             }
 1016  
         }
 1017  0
     }
 1018  
         
 1019  
     protected void clearLayoutAttributes(ActionRequest request)
 1020  
     {
 1021  0
         request.getPortletSession().removeAttribute(PortalReservedParameters.PAGE_LAYOUT_VIEW);
 1022  0
         request.getPortletSession().removeAttribute(PortalReservedParameters.PAGE_LAYOUT_SOLO);
 1023  0
         request.getPortletSession().removeAttribute(PortalReservedParameters.PAGE_LAYOUT_MAX);        
 1024  0
         request.getPortletSession().removeAttribute(PortalReservedParameters.PAGE_LAYOUT_HELP);
 1025  0
     }
 1026  
 
 1027  
     protected int getFragmentNestingLevel(Page page, String fragmentId)
 1028  
     {
 1029  0
         Fragment root = page.getRootFragment();
 1030  0
         if ( root.getId().equals(fragmentId) )
 1031  
         {
 1032  0
             return 0;
 1033  
         }
 1034  
         else
 1035  
         {
 1036  0
             return getFragmentNestingLevel(root, 1, fragmentId);
 1037  
         }
 1038  
     }
 1039  
     
 1040  
     protected int getFragmentNestingLevel(Fragment parent, class="keyword">int level, String fragmentId)
 1041  
     {
 1042  0
         Iterator iter = parent.getFragments().iterator();
 1043  
         Fragment child;
 1044  
         int childLevel;
 1045  0
         while ( iter.hasNext() )
 1046  
         {
 1047  0
             child = (Fragment)iter.next();
 1048  0
             if (child.getId().equals(fragmentId))
 1049  
             {
 1050  0
                 return level;
 1051  
             }
 1052  
             else
 1053  
             {
 1054  0
                 childLevel = getFragmentNestingLevel(child, level+1, fragmentId);
 1055  0
                 if ( childLevel != -1 )
 1056  
                 {
 1057  0
                     return childLevel;
 1058  
                 }
 1059  
             }
 1060  
         }
 1061  0
         return -1;
 1062  
     }
 1063  
 
 1064  
     protected String getEscapedName(String pageName)
 1065  
     {
 1066  
         try
 1067  
         {
 1068  0
             return URLEncoder.encode(pageName, "UTF-8").replace('%', '_');
 1069  
         }
 1070  0
         catch (UnsupportedEncodingException e)
 1071  
         {
 1072  0
             log.warn("Unsupported Encoding Exception.", e);
 1073  0
             return pageName;
 1074  
         }
 1075  
     }
 1076  
     
 1077  
     private void applyStyle(Folder f, String theme, String theme_type) throws FolderNotUpdatedException, NodeException 
 1078  
     {
 1079  0
        f.setDefaultDecorator(theme, theme_type);
 1080  0
        pageManager.updateFolder(f);
 1081  0
        Iterator pagesIter = f.getPages().iterator();
 1082  0
        while(pagesIter.hasNext())
 1083  
        {
 1084  0
            Page pp = (Page) pagesIter.next();
 1085  0
            pp.setDefaultDecorator(theme, theme_type);
 1086  0
            pageManager.updatePage(pp);
 1087  0
        }                       
 1088  0
        Iterator userFoldersIter = pageManager.getFolders(f).iterator();
 1089  0
        while(userFoldersIter.hasNext()) 
 1090  
        {
 1091  0
            Folder ff = (Folder) userFoldersIter.next();
 1092  0
            applyStyle(ff,theme,theme_type);
 1093  0
        }
 1094  0
     }    
 1095  
 }

This report is generated by jcoverage, Maven and Maven JCoverage Plugin.