1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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
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
126 this.page = page;
127
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
150 if (getId().equals(id))
151 {
152 return this;
153 }
154
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
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
219 if ((getName() != null) && getName().equals(name))
220 {
221 if (matchedFragments == null)
222 {
223 matchedFragments = DatabasePageManagerUtils.createList();
224 }
225 matchedFragments.add(this);
226 }
227
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
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
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
499
500
501 public PageSecurity getEffectivePageSecurity()
502 {
503
504 if (page != null)
505 {
506 return page.getEffectivePageSecurity();
507 }
508 return null;
509 }
510
511
512
513
514 public String getLogicalPermissionPath()
515 {
516
517 if ((page != null) && (getName() != null))
518 {
519 return page.getLogicalPermissionPath() + Folder.PATH_SEPARATOR + getName();
520 }
521 return null;
522 }
523
524
525
526
527 public String getPhysicalPermissionPath()
528 {
529
530 if ((page != null) && (getName() != null))
531 {
532 return page.getPhysicalPermissionPath() + Folder.PATH_SEPARATOR + getName();
533 }
534 return null;
535 }
536
537
538
539
540 public void resetCachedSecurityConstraints()
541 {
542
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
555
556
557 public void checkPermissions(String path, int mask, boolean checkNodeOnly, boolean checkParentsOnly) throws SecurityException
558 {
559
560 FragmentPermission permission = new FragmentPermission(path, mask);
561 AccessController.checkPermission(permission);
562 }
563
564
565
566
567 public boolean getConstraintsEnabled()
568 {
569 if (page != null)
570 {
571 return page.getConstraintsEnabled();
572 }
573 return false;
574 }
575
576
577
578
579 public boolean getPermissionsEnabled()
580 {
581 if (page != null)
582 {
583 return page.getPermissionsEnabled();
584 }
585 return false;
586 }
587
588
589
590
591 public String getType()
592 {
593 return type;
594 }
595
596
597
598
599 public void setType(String type)
600 {
601 this.type = type;
602 }
603
604
605
606
607 public String getSkin()
608 {
609 return skin;
610 }
611
612
613
614
615 public void setSkin(String skinName)
616 {
617 this.skin = skinName;
618 }
619
620
621
622
623 public String getDecorator()
624 {
625 return decorator;
626 }
627
628
629
630
631 public void setDecorator(String decoratorName)
632 {
633 this.decorator = decoratorName;
634 }
635
636
637
638
639 public String getState()
640 {
641 return state;
642 }
643
644
645
646
647 public void setState(String state)
648 {
649 this.state = state;
650 }
651
652
653
654
655 public String getMode()
656 {
657 return mode;
658 }
659
660
661
662
663 public void setMode(String mode)
664 {
665 this.mode = mode;
666 }
667
668
669
670
671 public List getFragments()
672 {
673
674
675 if (fragmentsList == null)
676 {
677 fragmentsList = new FragmentList(this);
678 }
679 return filterFragmentsByAccess(fragmentsList, true);
680 }
681
682
683
684
685 public String getProperty(String propName)
686 {
687 return (String)getProperties().get(propName);
688 }
689
690
691
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
704
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
717
718
719 public Map getProperties()
720 {
721
722 if (propertiesMap == null)
723 {
724 propertiesMap = new FragmentPropertyMap(this);
725 }
726 return propertiesMap;
727 }
728
729
730
731
732 public int getLayoutRow()
733 {
734
735 return getIntProperty(ROW_PROPERTY_NAME);
736 }
737
738
739
740
741 public void setLayoutRow(int row)
742 {
743
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
755
756
757 public int getLayoutColumn()
758 {
759
760 return getIntProperty(COLUMN_PROPERTY_NAME);
761 }
762
763
764
765
766 public void setLayoutColumn(int column)
767 {
768
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
780
781
782 public String getLayoutSizes()
783 {
784
785 return getProperty(SIZES_PROPERTY_NAME);
786 }
787
788
789
790
791 public void setLayoutSizes(String sizes)
792 {
793
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
805
806
807 public float getLayoutX()
808 {
809
810 return getFloatProperty(X_PROPERTY_NAME);
811 }
812
813
814
815
816 public void setLayoutX(float x)
817 {
818
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
830
831
832 public float getLayoutY()
833 {
834
835 return getFloatProperty(Y_PROPERTY_NAME);
836 }
837
838
839
840
841 public void setLayoutY(float y)
842 {
843
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
855
856
857 public float getLayoutZ()
858 {
859
860 return getFloatProperty(Z_PROPERTY_NAME);
861 }
862
863
864
865
866 public void setLayoutZ(float z)
867 {
868
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
880
881
882 public float getLayoutWidth()
883 {
884
885 return getFloatProperty(WIDTH_PROPERTY_NAME);
886 }
887
888
889
890
891 public void setLayoutWidth(float width)
892 {
893
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
905
906
907 public float getLayoutHeight()
908 {
909
910 return getFloatProperty(HEIGHT_PROPERTY_NAME);
911 }
912
913
914
915
916 public void setLayoutHeight(float height)
917 {
918
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
930
931
932 public boolean isReference()
933 {
934 return false;
935 }
936
937
938
939
940 public List getPreferences()
941 {
942
943
944
945 if (fragmentPreferences == null)
946 {
947 fragmentPreferences = new FragmentPreferenceList(this);
948 }
949 return fragmentPreferences;
950 }
951
952
953
954
955 public void setPreferences(List preferences)
956 {
957
958
959
960 List fragmentPreferences = getPreferences();
961 if (preferences != fragmentPreferences)
962 {
963
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
987 List filteredFragments = null;
988 Iterator checkAccessIter = fragments.iterator();
989 while (checkAccessIter.hasNext())
990 {
991 Fragment fragment = (Fragment)checkAccessIter.next();
992 try
993 {
994
995 fragment.checkAccess(JetspeedActions.VIEW);
996
997
998 if (filteredFragments != null)
999 {
1000
1001 filteredFragments.add(fragment);
1002 }
1003 }
1004 catch (SecurityException se)
1005 {
1006
1007 if (filteredFragments == null)
1008 {
1009
1010
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
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 }