View Javadoc

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.om.page.impl;
18  
19  import java.security.AccessController;
20  import java.util.Iterator;
21  import java.util.List;
22  import java.util.Map;
23  
24  import org.apache.jetspeed.JetspeedActions;
25  import org.apache.jetspeed.om.folder.Folder;
26  import org.apache.jetspeed.om.page.Fragment;
27  import org.apache.jetspeed.om.page.PageSecurity;
28  import org.apache.jetspeed.page.impl.DatabasePageManagerUtils;
29  import org.apache.jetspeed.security.FragmentPermission;
30  
31  /***
32   * FragmentImpl
33   *
34   * @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
35   * @version $Id$
36   */
37  public class FragmentImpl extends BaseElementImpl implements Fragment
38  {
39      private List fragments;
40      private String type;
41      private String skin;
42      private String decorator;
43      private String state;
44      private String mode;
45      private int layoutRowProperty = -1;
46      private int layoutColumnProperty = -1;
47      private String layoutSizesProperty;
48      private float layoutXProperty = -1.0F;
49      private float layoutYProperty = -1.0F;
50      private float layoutZProperty = -1.0F;
51      private float layoutWidthProperty = -1.0F;
52      private float layoutHeightProperty = -1.0F;
53      private String extendedPropertyName1;
54      private String extendedPropertyValue1;
55      private String extendedPropertyName2;
56      private String extendedPropertyValue2;
57      private List preferences;
58  
59      private FragmentList fragmentsList;
60      private FragmentPropertyMap propertiesMap;
61      private FragmentPreferenceList fragmentPreferences;
62      private PageImpl page;
63  
64      public FragmentImpl()
65      {
66          super(new FragmentSecurityConstraintsImpl());
67      }
68  
69      /***
70       * accessFragments
71       *
72       * Access mutable persistent collection member for List wrappers.
73       *
74       * @return persistent collection
75       */
76      List accessFragments()
77      {
78          // create initial collection if necessary
79          if (fragments == null)
80          {
81              fragments = DatabasePageManagerUtils.createList();
82          }
83          return fragments;
84      }
85  
86      /***
87       * accessPreferences
88       *
89       * Access mutable persistent collection member for List wrappers.
90       *
91       * @return persistent collection
92       */
93      List accessPreferences()
94      {
95          // create initial collection if necessary
96          if (preferences == null)
97          {
98              preferences = DatabasePageManagerUtils.createList();
99          }
100         return preferences;
101     }
102 
103     /***
104      * getPage
105      *
106      * Get page implementation that owns fragment.
107      *
108      * @return owning page implementation
109      */
110     PageImpl getPage()
111     {
112         return page;
113     }
114 
115     /***
116      * setPage
117      *
118      * Set page implementation that owns fragment and
119      * propagate to all child fragments.
120      *
121      * @param page owning page implementation
122      */
123     void setPage(PageImpl page)
124     {
125         // set page implementation
126         this.page = page;
127         // propagate to children
128         if (fragments != null)
129         {
130             Iterator fragmentsIter = fragments.iterator();
131             while (fragmentsIter.hasNext())
132             {
133                 ((FragmentImpl)fragmentsIter.next()).setPage(page);
134             }
135         }
136     }
137 
138     /***
139      * getFragmentById
140      *
141      * Retrieve fragment with matching id from
142      * this or child fragments.
143      *
144      * @param id fragment id to retrieve.
145      * @return matched fragment
146      */
147     Fragment getFragmentById(String id)
148     {
149         // check for match
150         if (getId().equals(id))
151         {
152             return this;
153         }
154         // match children
155         if (fragments != null)
156         {
157             Iterator fragmentsIter = fragments.iterator();
158             while (fragmentsIter.hasNext())
159             {
160                 Fragment matchedFragment = ((FragmentImpl)fragmentsIter.next()).getFragmentById(id);
161                 if (matchedFragment != null)
162                 {
163                     return matchedFragment;
164                 }
165             }
166         }
167         return null;
168     }
169 
170     /***
171      * removeFragmentById
172      *
173      * Remove fragment with matching id from
174      * child fragments.
175      *
176      * @param id fragment id to remove.
177      * @return removed fragment
178      */
179     Fragment removeFragmentById(String id)
180     {
181         // remove from deep children
182         if (fragments != null)
183         {
184             Iterator fragmentsIter = fragments.iterator();
185             while (fragmentsIter.hasNext())
186             {
187                 FragmentImpl fragment = (FragmentImpl)fragmentsIter.next();
188                 if (!fragment.getId().equals(id))
189                 {
190                     Fragment removed = fragment.removeFragmentById(id);
191                     if (removed != null)
192                     {
193                         return removed;
194                     }
195                 }
196                 else
197                 {
198                     fragmentsIter.remove();
199                     return fragment;
200                 }
201             }
202         }
203         return null;
204     }
205 
206     /***
207      * getFragmentsByName
208      *
209      * Retrieve fragments with matching name including
210      * this and child fragments.
211      *
212      * @param name fragment name to retrieve.
213      * @return list of matched fragments
214      */
215     List getFragmentsByName(String name)
216     {
217         List matchedFragments = null;
218         // check for match
219         if ((getName() != null) && getName().equals(name))
220         {
221             if (matchedFragments == null)
222             {
223                 matchedFragments = DatabasePageManagerUtils.createList();
224             }
225             matchedFragments.add(this);
226         }
227         // match children
228         if (fragments != null)
229         {
230             Iterator fragmentsIter = fragments.iterator();
231             while (fragmentsIter.hasNext())
232             {
233                 List matchedChildFragments = ((FragmentImpl)fragmentsIter.next()).getFragmentsByName(name);
234                 if (matchedChildFragments != null)
235                 {
236                     if (matchedFragments == null)
237                     {
238                         matchedFragments = matchedChildFragments;
239                     }
240                     else
241                     {
242                         matchedFragments.addAll(matchedChildFragments);
243                     }
244                 }
245             }
246         }
247         return matchedFragments;
248     }
249 
250     /***
251      * getPropertyMemberKeys
252      *
253      * Get valid explicit property member keys.
254      *
255      * @return list of property member keys with values
256      */
257     List getPropertyMemberKeys()
258     {
259         List keys = DatabasePageManagerUtils.createList();
260         if (layoutRowProperty >= 0)
261         {
262             keys.add(ROW_PROPERTY_NAME);
263         }
264         if (layoutColumnProperty >= 0)
265         {
266             keys.add(COLUMN_PROPERTY_NAME);
267         }
268         if (layoutSizesProperty != null)
269         {
270             keys.add(SIZES_PROPERTY_NAME);
271         }
272         if (layoutXProperty >= 0.0F)
273         {
274             keys.add(X_PROPERTY_NAME);
275         }
276         if (layoutYProperty >= 0.0F)
277         {
278             keys.add(Y_PROPERTY_NAME);
279         }
280         if (layoutZProperty >= 0.0F)
281         {
282             keys.add(Z_PROPERTY_NAME);
283         }
284         if (layoutWidthProperty >= 0.0F)
285         {
286             keys.add(WIDTH_PROPERTY_NAME);
287         }
288         if (layoutHeightProperty >= 0.0F)
289         {
290             keys.add(HEIGHT_PROPERTY_NAME);
291         }
292         if ((extendedPropertyName1 != null) && (extendedPropertyValue1 != null))
293         {
294             keys.add(extendedPropertyName1);
295         }
296         if ((extendedPropertyName2 != null) && (extendedPropertyValue2 != null))
297         {
298             keys.add(extendedPropertyName2);
299         }
300         return keys;
301     }
302 
303     /***
304      * getPropertyMember
305      *
306      * Get explicit property member.
307      *
308      * @param key property name
309      * @return property setting
310      */
311     String getPropertyMember(String key)
312     {
313         // set fragment explicit property member
314         if (key.equals(ROW_PROPERTY_NAME))
315         {
316             if (layoutRowProperty >= 0)
317             {
318                 return String.valueOf(layoutRowProperty);
319             }
320         }
321         else if (key.equals(COLUMN_PROPERTY_NAME))
322         {
323             if (layoutColumnProperty >= 0)
324             {
325                 return String.valueOf(layoutColumnProperty);
326             }
327         }
328         else if (key.equals(SIZES_PROPERTY_NAME))
329         {
330             return layoutSizesProperty;
331         }
332         else if (key.equals(X_PROPERTY_NAME))
333         {
334             if (layoutXProperty >= 0.0F)
335             {
336                 return String.valueOf(layoutXProperty);
337             }
338         }
339         else if (key.equals(Y_PROPERTY_NAME))
340         {
341             if (layoutYProperty >= 0.0F)
342             {
343                 return String.valueOf(layoutYProperty);
344             }
345         }
346         else if (key.equals(Z_PROPERTY_NAME))
347         {
348             if (layoutZProperty >= 0.0F)
349             {
350                 return String.valueOf(layoutZProperty);
351             }
352         }
353         else if (key.equals(WIDTH_PROPERTY_NAME))
354         {
355             if (layoutWidthProperty >= 0.0F)
356             {
357                 return String.valueOf(layoutWidthProperty);
358             }
359         }
360         else if (key.equals(HEIGHT_PROPERTY_NAME))
361         {
362             if (layoutHeightProperty >= 0.0F)
363             {
364                 return String.valueOf(layoutHeightProperty);
365             }
366         }
367         else if (key.equals(extendedPropertyName1))
368         {
369             return extendedPropertyValue1;
370         }
371         else if (key.equals(extendedPropertyName2))
372         {
373             return extendedPropertyValue2;
374         }
375         return null;
376     }
377 
378     /***
379      * setPropertyMember
380      *
381      * Set explicit property member.
382      *
383      * @param key property name
384      * @param value property setting
385      */
386     void setPropertyMember(String key, String value)
387     {
388         // set fragment explicit property member
389         if (key.equals(ROW_PROPERTY_NAME))
390         {
391             layoutRowProperty = Integer.parseInt(value);
392         }
393         else if (key.equals(COLUMN_PROPERTY_NAME))
394         {
395             layoutColumnProperty = Integer.parseInt(value);
396         }
397         else if (key.equals(SIZES_PROPERTY_NAME))
398         {
399             layoutSizesProperty = value;
400         }
401         else if (key.equals(X_PROPERTY_NAME))
402         {
403             layoutXProperty = Float.parseFloat(value);
404         }
405         else if (key.equals(Y_PROPERTY_NAME))
406         {
407             layoutYProperty = Float.parseFloat(value);
408         }
409         else if (key.equals(Z_PROPERTY_NAME))
410         {
411             layoutZProperty = Float.parseFloat(value);
412         }
413         else if (key.equals(WIDTH_PROPERTY_NAME))
414         {
415             layoutWidthProperty = Float.parseFloat(value);
416         }
417         else if (key.equals(HEIGHT_PROPERTY_NAME))
418         {
419             layoutHeightProperty = Float.parseFloat(value);
420         }
421         else if (key.equals(extendedPropertyName1))
422         {
423             extendedPropertyValue1 = value;
424         }
425         else if (key.equals(extendedPropertyName2))
426         {
427             extendedPropertyValue2 = value;
428         }
429         else if (extendedPropertyName1 == null)
430         {
431             extendedPropertyName1 = key;
432             extendedPropertyValue1 = value;
433         }
434         else if (extendedPropertyName2 == null)
435         {
436             extendedPropertyName2 = key;
437             extendedPropertyValue2 = value;
438         }
439         else
440         {
441             throw new RuntimeException("Unable to set fragment property " + key + ", extended properties already used.");
442         }
443     }
444 
445     /***
446      * clearPropertyMember
447      *
448      * Clear explicit property member.
449      *
450      * @param key property name
451      */
452     void clearPropertyMember(String key)
453     {
454         if (key.equals(ROW_PROPERTY_NAME))
455         {
456             layoutRowProperty = -1;
457         }
458         else if (key.equals(COLUMN_PROPERTY_NAME))
459         {
460             layoutColumnProperty = -1;
461         }
462         else if (key.equals(SIZES_PROPERTY_NAME))
463         {
464             layoutSizesProperty = null;
465         }
466         else if (key.equals(X_PROPERTY_NAME))
467         {
468             layoutXProperty = -1.0F;
469         }
470         else if (key.equals(Y_PROPERTY_NAME))
471         {
472             layoutYProperty = -1.0F;
473         }
474         else if (key.equals(Z_PROPERTY_NAME))
475         {
476             layoutZProperty = -1.0F;
477         }
478         else if (key.equals(WIDTH_PROPERTY_NAME))
479         {
480             layoutWidthProperty = -1.0F;
481         }
482         else if (key.equals(HEIGHT_PROPERTY_NAME))
483         {
484             layoutHeightProperty = -1.0F;
485         }
486         else if (key.equals(extendedPropertyName1))
487         {
488             extendedPropertyName1 = null;
489             extendedPropertyValue1 = null;
490         }
491         else if (key.equals(extendedPropertyName2))
492         {
493             extendedPropertyName2 = null;
494             extendedPropertyValue2 = null;
495         }
496     }
497 
498     /* (non-Javadoc)
499      * @see org.apache.jetspeed.om.page.impl.BaseElementImpl#getEffectivePageSecurity()
500      */
501     public PageSecurity getEffectivePageSecurity()
502     {
503         // delegate to page implementation
504         if (page != null)
505         {
506             return page.getEffectivePageSecurity();
507         }
508         return null;
509     }
510 
511     /* (non-Javadoc)
512      * @see org.apache.jetspeed.om.page.impl.BaseElementImpl#getLogicalPermissionPath()
513      */
514     public String getLogicalPermissionPath()
515     {
516         // use page implementation path as base and append name
517         if ((page != null) && (getName() != null))
518         {
519             return page.getLogicalPermissionPath() + Folder.PATH_SEPARATOR + getName();
520         }
521         return null;
522     }
523 
524     /* (non-Javadoc)
525      * @see org.apache.jetspeed.om.page.impl.BaseElementImpl#getPhysicalPermissionPath()
526      */
527     public String getPhysicalPermissionPath()
528     {
529         // use page implementation path as base and append name
530         if ((page != null) && (getName() != null))
531         {
532             return page.getPhysicalPermissionPath() + Folder.PATH_SEPARATOR + getName();
533         }
534         return null;
535     }
536 
537     /* (non-Javadoc)
538      * @see org.apache.jetspeed.om.page.impl.BaseElementImpl#resetCachedSecurityConstraints()
539      */
540     public void resetCachedSecurityConstraints()
541     {
542         // propagate to super and sub fragments
543         super.resetCachedSecurityConstraints();
544         if (fragments != null)
545         {
546             Iterator fragmentsIter = fragments.iterator();
547             while (fragmentsIter.hasNext())
548             {
549                 ((FragmentImpl)fragmentsIter.next()).resetCachedSecurityConstraints();
550             }
551         }
552     }
553 
554     /* (non-Javadoc)
555      * @see org.apache.jetspeed.om.page.impl.BaseElementImpl#checkPermissions(java.lang.String, int, boolean, boolean)
556      */
557     public void checkPermissions(String path, int mask, boolean checkNodeOnly, boolean checkParentsOnly) throws SecurityException
558     {
559         // always check for granted fragment permissions
560         FragmentPermission permission = new FragmentPermission(path, mask);
561         AccessController.checkPermission(permission);
562     }
563 
564     /* (non-Javadoc)
565      * @see org.apache.jetspeed.om.common.SecuredResource#getConstraintsEnabled()
566      */
567     public boolean getConstraintsEnabled()
568     {
569         if (page != null)
570         {
571             return page.getConstraintsEnabled();
572         }
573         return false;
574     }
575     
576     /* (non-Javadoc)
577      * @see org.apache.jetspeed.om.common.SecuredResource#getPermissionsEnabled()
578      */
579     public boolean getPermissionsEnabled()
580     {
581         if (page != null)
582         {
583             return page.getPermissionsEnabled();
584         }
585         return false;
586     }
587 
588     /* (non-Javadoc)
589      * @see org.apache.jetspeed.om.page.Fragment#getType()
590      */
591     public String getType()
592     {
593         return type;
594     }
595     
596     /* (non-Javadoc)
597      * @see org.apache.jetspeed.om.page.Fragment#setType(java.lang.String)
598      */
599     public void setType(String type)
600     {
601         this.type = type;
602     }
603 
604     /* (non-Javadoc)
605      * @see org.apache.jetspeed.om.page.Fragment#getSkin()
606      */
607     public String getSkin()
608     {
609         return skin;
610     }
611     
612     /* (non-Javadoc)
613      * @see org.apache.jetspeed.om.page.Fragment#setSkin(java.lang.String)
614      */
615     public void setSkin(String skinName)
616     {
617         this.skin = skinName;
618     }
619 
620     /* (non-Javadoc)
621      * @see org.apache.jetspeed.om.page.Fragment#getDecorator()
622      */
623     public String getDecorator()
624     {
625         return decorator;
626     }
627     
628     /* (non-Javadoc)
629      * @see org.apache.jetspeed.om.page.Fragment#setDecorator(java.lang.String)
630      */
631     public void setDecorator(String decoratorName)
632     {
633         this.decorator = decoratorName;
634     }
635 
636     /* (non-Javadoc)
637      * @see org.apache.jetspeed.om.page.Fragment#getState()
638      */
639     public String getState()
640     {
641         return state;
642     }
643     
644     /* (non-Javadoc)
645      * @see org.apache.jetspeed.om.page.Fragment#setState(java.lang.String)
646      */
647     public void setState(String state)
648     {
649         this.state = state;
650     }
651 
652     /* (non-Javadoc)
653      * @see org.apache.jetspeed.om.page.Fragment#getMode()
654      */
655     public String getMode()
656     {
657         return mode;
658     }
659     
660     /* (non-Javadoc)
661      * @see org.apache.jetspeed.om.page.Fragment#setMode(java.lang.String)
662      */
663     public void setMode(String mode)
664     {
665         this.mode = mode;
666     }
667 
668     /* (non-Javadoc)
669      * @see org.apache.jetspeed.om.page.Fragment#getFragments()
670      */
671     public List getFragments()
672     {
673         // create and return mutable fragments collection
674         // filtered by view access
675         if (fragmentsList == null)
676         {
677             fragmentsList = new FragmentList(this);
678         }
679         return filterFragmentsByAccess(fragmentsList, true);
680     }
681     
682     /* (non-Javadoc)
683      * @see org.apache.jetspeed.om.page.Fragment#getProperty(java.lang.String)
684      */
685     public String getProperty(String propName)
686     {
687         return (String)getProperties().get(propName);
688     }
689     
690     /* (non-Javadoc)
691      * @see org.apache.jetspeed.om.page.Fragment#getIntProperty(java.lang.String)
692      */
693     public int getIntProperty(String propName)
694     {
695         String propValue = (String)getProperties().get(propName);
696         if (propValue != null)
697         {
698             return Integer.parseInt(propValue);
699         }
700         return -1;
701     }
702     
703     /* (non-Javadoc)
704      * @see org.apache.jetspeed.om.page.Fragment#getFloatProperty(java.lang.String)
705      */
706     public float getFloatProperty(String propName)
707     {
708         String propValue = (String)getProperties().get(propName);
709         if (propValue != null)
710         {
711             return Float.parseFloat(propValue);
712         }
713         return -1.0F;
714     }
715     
716     /* (non-Javadoc)
717      * @see org.apache.jetspeed.om.page.Fragment#getProperties()
718      */
719     public Map getProperties()
720     {
721         // initialize and return writable properties map
722         if (propertiesMap == null)
723         {
724             propertiesMap = new FragmentPropertyMap(this);
725         }
726         return propertiesMap;
727     }
728     
729     /* (non-Javadoc)
730      * @see org.apache.jetspeed.om.page.Fragment#getLayoutRow()
731      */
732     public int getLayoutRow()
733     {
734         // get standard int property
735         return getIntProperty(ROW_PROPERTY_NAME);
736     }
737     
738     /* (non-Javadoc)
739      * @see org.apache.jetspeed.om.page.Fragment#setLayoutRow(int)
740      */
741     public void setLayoutRow(int row)
742     {
743         // set standard int property
744         if (row >= 0)
745         {
746             getProperties().put(ROW_PROPERTY_NAME, String.valueOf(row));
747         }
748         else
749         {
750             getProperties().remove(ROW_PROPERTY_NAME);
751         }
752     }
753     
754     /* (non-Javadoc)
755      * @see org.apache.jetspeed.om.page.Fragment#getLayoutColumn()
756      */
757     public int getLayoutColumn()
758     {
759         // get standard int property
760         return getIntProperty(COLUMN_PROPERTY_NAME);
761     }
762     
763     /* (non-Javadoc)
764      * @see org.apache.jetspeed.om.page.Fragment#setLayoutColumn(int)
765      */
766     public void setLayoutColumn(int column)
767     {
768         // set standard int property
769         if (column >= 0)
770         {
771             getProperties().put(COLUMN_PROPERTY_NAME, String.valueOf(column));
772         }
773         else
774         {
775             getProperties().remove(COLUMN_PROPERTY_NAME);
776         }
777     }
778 
779     /* (non-Javadoc)
780      * @see org.apache.jetspeed.om.page.Fragment#getLayoutSizes()
781      */
782     public String getLayoutSizes()
783     {
784         // get standard string property
785         return getProperty(SIZES_PROPERTY_NAME);
786     }
787     
788     /* (non-Javadoc)
789      * @see org.apache.jetspeed.om.page.Fragment#setLayoutSizes(java.lang.String)
790      */
791     public void setLayoutSizes(String sizes)
792     {
793         // set standard string property
794         if (sizes != null)
795         {
796             getProperties().put(SIZES_PROPERTY_NAME, sizes);
797         }
798         else
799         {
800             getProperties().remove(SIZES_PROPERTY_NAME);
801         }
802     }
803     
804     /* (non-Javadoc)
805      * @see org.apache.jetspeed.om.page.Fragment#getLayoutX()
806      */
807     public float getLayoutX()
808     {
809         // get standard float property
810         return getFloatProperty(X_PROPERTY_NAME);
811     }
812     
813     /* (non-Javadoc)
814      * @see org.apache.jetspeed.om.page.Fragment#setLayoutX(float)
815      */
816     public void setLayoutX(float x)
817     {
818         // set standard float property
819         if (x >= 0.0F)
820         {
821             getProperties().put(X_PROPERTY_NAME, String.valueOf(x));
822         }
823         else
824         {
825             getProperties().remove(X_PROPERTY_NAME);
826         }
827     }
828     
829     /* (non-Javadoc)
830      * @see org.apache.jetspeed.om.page.Fragment#getLayoutY()
831      */
832     public float getLayoutY()
833     {
834         // get standard float property
835         return getFloatProperty(Y_PROPERTY_NAME);
836     }
837     
838     /* (non-Javadoc)
839      * @see org.apache.jetspeed.om.page.Fragment#setLayoutY(float)
840      */
841     public void setLayoutY(float y)
842     {
843         // set standard float property
844         if (y >= 0.0F)
845         {
846             getProperties().put(Y_PROPERTY_NAME, String.valueOf(y));
847         }
848         else
849         {
850             getProperties().remove(Y_PROPERTY_NAME);
851         }
852     }
853 
854     /* (non-Javadoc)
855      * @see org.apache.jetspeed.om.page.Fragment#getLayoutZ()
856      */
857     public float getLayoutZ()
858     {
859         // get standard float property
860         return getFloatProperty(Z_PROPERTY_NAME);
861     }
862     
863     /* (non-Javadoc)
864      * @see org.apache.jetspeed.om.page.Fragment#setLayoutZ(float)
865      */
866     public void setLayoutZ(float z)
867     {
868         // set standard float property
869         if (z >= 0.0F)
870         {
871             getProperties().put(Z_PROPERTY_NAME, String.valueOf(z));
872         }
873         else
874         {
875             getProperties().remove(Z_PROPERTY_NAME);
876         }
877     }
878 
879     /* (non-Javadoc)
880      * @see org.apache.jetspeed.om.page.Fragment#getLayoutWidth()
881      */
882     public float getLayoutWidth()
883     {
884         // get standard float property
885         return getFloatProperty(WIDTH_PROPERTY_NAME);
886     }
887     
888     /* (non-Javadoc)
889      * @see org.apache.jetspeed.om.page.Fragment#setLayoutWidth(float)
890      */
891     public void setLayoutWidth(float width)
892     {
893         // set standard float property
894         if (width >= 0.0F)
895         {
896             getProperties().put(WIDTH_PROPERTY_NAME, String.valueOf(width));
897         }
898         else
899         {
900             getProperties().remove(WIDTH_PROPERTY_NAME);
901         }
902     }
903 
904     /* (non-Javadoc)
905      * @see org.apache.jetspeed.om.page.Fragment#getLayoutHeight()
906      */
907     public float getLayoutHeight()
908     {
909         // get standard float property
910         return getFloatProperty(HEIGHT_PROPERTY_NAME);
911     }
912     
913     /* (non-Javadoc)
914      * @see org.apache.jetspeed.om.page.Fragment#setLayoutHeight(float)
915      */
916     public void setLayoutHeight(float height)
917     {
918         // set standard float property
919         if (height >= 0.0F)
920         {
921             getProperties().put(HEIGHT_PROPERTY_NAME, String.valueOf(height));
922         }
923         else
924         {
925             getProperties().remove(HEIGHT_PROPERTY_NAME);
926         }
927     }
928 
929     /* (non-Javadoc)
930      * @see org.apache.jetspeed.om.page.Fragment#isReference()
931      */
932     public boolean isReference()
933     {
934         return false; // NYI
935     }
936     
937     /* (non-Javadoc)
938      * @see org.apache.jetspeed.om.page.Fragment#getPreferences()
939      */
940     public List getPreferences()
941     {
942         // return mutable preferences list
943         // by using list wrapper to manage
944         // element uniqueness
945         if (fragmentPreferences == null)
946         {
947             fragmentPreferences = new FragmentPreferenceList(this);
948         }
949         return fragmentPreferences;
950     }
951     
952     /* (non-Javadoc)
953      * @see org.apache.jetspeed.om.page.Fragment#setPreferences(java.util.List)
954      */
955     public void setPreferences(List preferences)
956     {
957         // set preferences by replacing existing
958         // entries with new elements if new collection
959         // is specified
960         List fragmentPreferences = getPreferences();
961         if (preferences != fragmentPreferences)
962         {
963             // replace all preferences
964             fragmentPreferences.clear();
965             if (preferences != null)
966             {
967                 fragmentPreferences.addAll(preferences);
968             }
969         }
970     }
971     
972     /***
973      * filterFragmentsByAccess
974      *
975      * Filter fragments list for view access.
976      *
977      * @param nodes list containing fragments to check
978      * @param mutable make returned list mutable
979      * @return original list if all elements viewable, a filtered
980      *         partial list, or null if all filtered for view access
981      */
982     List filterFragmentsByAccess(List fragments, boolean mutable)
983     {
984         if ((fragments != null) && !fragments.isEmpty())
985         {
986             // check permissions and constraints, filter fragments as required
987             List filteredFragments = null;
988             Iterator checkAccessIter = fragments.iterator();
989             while (checkAccessIter.hasNext())
990             {
991                 Fragment fragment = (Fragment)checkAccessIter.next();
992                 try
993                 {
994                     // check access
995                     fragment.checkAccess(JetspeedActions.VIEW);
996 
997                     // add to filteredFragments fragments if copying
998                     if (filteredFragments != null)
999                     {
1000                         // permitted, add to filteredFragments fragments
1001                         filteredFragments.add(fragment);
1002                     }
1003                 }
1004                 catch (SecurityException se)
1005                 {
1006                     // create filteredFragments fragments if not already copying
1007                     if (filteredFragments == null)
1008                     {
1009                         // not permitted, copy previously permitted fragments
1010                         // to new filteredFragments node set with same comparator
1011                         filteredFragments = DatabasePageManagerUtils.createList();
1012                         Iterator copyIter = fragments.iterator();
1013                         while (copyIter.hasNext())
1014                         {
1015                             Fragment copyFragment = (Fragment)copyIter.next();
1016                             if (copyFragment != fragment)
1017                             {
1018                                 filteredFragments.add(copyFragment);
1019                             }
1020                             else
1021                             {
1022                                 break;
1023                             }
1024                         }
1025                     }
1026                 }
1027             }
1028 
1029             // return filteredFragments fragments if generated
1030             if (filteredFragments != null)
1031             {
1032                 if (!filteredFragments.isEmpty())
1033                 {
1034                     if (mutable)
1035                     {
1036                         return new FilteredFragmentList(this, filteredFragments);
1037                     }
1038                     else
1039                     {
1040                         return filteredFragments;
1041                     }
1042                 }
1043                 else
1044                 {
1045                     return new FilteredFragmentList(this, filteredFragments);
1046                 }
1047             }
1048         }
1049         return fragments;
1050     }
1051 }