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;
18  
19  import java.io.Serializable;
20  import java.util.Collection;
21  import java.util.Iterator;
22  import java.util.List;
23  import java.util.ListIterator;
24  import java.util.Map;
25  
26  import org.apache.commons.logging.Log;
27  import org.apache.commons.logging.LogFactory;
28  import org.apache.jetspeed.aggregator.PortletContent;
29  import org.apache.jetspeed.decoration.Decoration;
30  import org.apache.jetspeed.om.common.SecurityConstraint;
31  import org.apache.jetspeed.om.common.SecurityConstraints;
32  import org.apache.jetspeed.page.impl.DatabasePageManagerUtils;
33  
34  public class ContentFragmentImpl implements ContentFragment
35  {
36      
37  
38      private final Fragment fragment;
39      private StringBuffer overridenContent;
40      private PortletContent portletContent;
41      private List contentFragments;
42      private static final Log log = LogFactory.getLog(ContentFragmentImpl.class);
43      private final Map cachedFragments;
44      private Decoration decoration;
45      
46  
47      public ContentFragmentImpl(Fragment fragment, Map cachedFagments)
48      {
49          this.fragment = fragment;
50          this.cachedFragments = cachedFagments;
51      }
52  
53      /* (non-Javadoc)
54       * @see org.apache.jetspeed.om.page.ContentFragment#getContentFragments()
55       */
56      public List getContentFragments()
57      {   
58          if(contentFragments == null)
59          {
60             contentFragments = new ContentFragmentList();
61          }
62          return contentFragments;
63      }
64  
65      /* (non-Javadoc)
66       * @see org.apache.jetspeed.om.page.ContentFragment#getFragments()
67       */
68      public List getFragments()
69      {
70          return getContentFragments();
71      }
72      
73      /* (non-Javadoc)
74       * @see org.apache.jetspeed.om.page.ContentFragment#getOverriddenContent()
75       */
76      public String getOverriddenContent()
77      {
78          return overridenContent != null ? overridenContent.toString() : null;
79      }
80  
81      /* (non-Javadoc)
82       * @see org.apache.jetspeed.om.page.ContentFragment#getRenderedContent()
83       */
84      public String getRenderedContent() throws IllegalStateException
85      {       
86          if(overridenContent != null)
87          {
88              return overridenContent.toString();
89          }
90          
91          
92          if (portletContent != null)
93          {
94              //TODO are you sure? Intellij warns, synchronization on a non-final field is
95              //unlikely to have useful semantics.
96              synchronized (portletContent)
97              {
98                  if (portletContent.isComplete())
99                  {
100                     return portletContent.getContent();
101                 }
102                 else
103                 {
104                     try
105                     {
106                         log.debug("Waiting on content for Fragment " + getId());
107                         portletContent.wait();
108                         return portletContent.getContent();
109                     }
110                     catch (InterruptedException e)
111                     {
112                         return e.getMessage();
113                     }
114                     finally
115                     {
116                         log.debug("Been notified that Faragment " + getId() + " is complete");
117                     }
118                 }
119             }
120         }
121         else
122         {
123             throw new IllegalStateException("You cannot invoke getRenderedContent() until the content has been set.");
124         }
125     }
126 
127     /* (non-Javadoc)
128      * @see org.apache.jetspeed.om.page.ContentFragment#overrideRenderedContent(java.lang.String)
129      */
130     public void overrideRenderedContent(String contnent)
131     {
132         if ( contnent != null )
133         {
134             if(overridenContent == null)
135             {
136                 overridenContent = new StringBuffer();
137             }
138             // prevent repeated storing of the same error message
139             if (!contnent.equals(overridenContent.toString()))
140             {
141                 overridenContent.append(contnent);
142             }
143         }
144         
145     }
146 
147     /* (non-Javadoc)
148      * @see org.apache.jetspeed.om.page.ContentFragment#setPortletContent(org.apache.jetspeed.aggregator.PortletContent)
149      */
150     public void setPortletContent(PortletContent portletContent)
151     {
152         this.portletContent = portletContent;        
153     }
154 
155     /* (non-Javadoc)
156      * @see org.apache.jetspeed.om.page.Fragment#getDecorator()
157      */
158     public String getDecorator()
159     {
160         
161         return fragment.getDecorator();
162     }
163 
164     /* (non-Javadoc)
165      * @see org.apache.jetspeed.om.page.Fragment#getName()
166      */
167     public String getName()
168     {
169         
170         return fragment.getName();
171     }
172 
173     /* (non-Javadoc)
174      * @see org.apache.jetspeed.om.page.Fragment#getProperties()
175      */
176     public Map getProperties()
177     {
178         
179         return fragment.getProperties();
180     }
181 
182     /* (non-Javadoc)
183      * @see org.apache.jetspeed.om.page.Fragment#getProperty(java.lang.String)
184      */
185     public String getProperty(String propName)
186     {
187         
188         return fragment.getProperty(propName);
189     }
190 
191     /* (non-Javadoc)
192      * @see org.apache.jetspeed.om.page.Fragment#getIntProperty(java.lang.String)
193      */
194     public int getIntProperty(String propName)
195     {
196         
197         return fragment.getIntProperty(propName);
198     }
199 
200     /* (non-Javadoc)
201      * @see org.apache.jetspeed.om.page.Fragment#getFloatProperty(java.lang.String)
202      */
203     public float getFloatProperty(String propName)
204     {
205         
206         return fragment.getFloatProperty(propName);
207     }
208 
209     /* (non-Javadoc)
210      * @see org.apache.jetspeed.om.page.Fragment#getSkin()
211      */
212     public String getSkin()
213     {
214         
215         return fragment.getSkin();
216     }
217 
218     /* (non-Javadoc)
219      * @see org.apache.jetspeed.om.page.Fragment#getState()
220      */
221     public String getState()
222     {
223         
224         return fragment.getState();
225     }
226 
227     /* (non-Javadoc)
228      * @see org.apache.jetspeed.om.page.Fragment#getMode()
229      */
230     public String getMode()
231     {
232         
233         return fragment.getMode();
234     }
235 
236     /* (non-Javadoc)
237      * @see org.apache.jetspeed.om.page.Fragment#getType()
238      */
239     public String getType()
240     {
241         
242         return fragment.getType();
243     }
244 
245     /* (non-Javadoc)
246      * @see org.apache.jetspeed.om.page.Fragment#isReference()
247      */
248     public boolean isReference()
249     {
250         
251         return fragment.isReference();
252     }
253 
254     /* (non-Javadoc)
255      * @see org.apache.jetspeed.om.page.Fragment#setDecorator(java.lang.String)
256      */
257     public void setDecorator(String decoratorName)
258     {
259         
260         fragment.setDecorator(decoratorName);
261     }
262 
263     /* (non-Javadoc)
264      * @see org.apache.jetspeed.om.page.Fragment#setName(java.lang.String)
265      */
266     public void setName(String name)
267     {
268         
269         fragment.setName(name);
270     }
271 
272     /* (non-Javadoc)
273      * @see org.apache.jetspeed.om.page.Fragment#getLayoutRow()
274      */
275     public int getLayoutRow()
276     {
277         return fragment.getLayoutRow();
278     }
279     
280     /* (non-Javadoc)
281      * @see org.apache.jetspeed.om.page.Fragment#getLayoutColumn()
282      */
283     public int getLayoutColumn()
284     {
285         return fragment.getLayoutColumn();
286     }
287 
288     /* (non-Javadoc)
289      * @see org.apache.jetspeed.om.page.Fragment#getLayoutSizes()
290      */
291     public String getLayoutSizes()
292     {
293         return fragment.getLayoutSizes();
294     }
295 
296     /* (non-Javadoc)
297      * @see org.apache.jetspeed.om.page.Fragment#getLayoutX()
298      */
299     public float getLayoutX()
300     {
301         return fragment.getLayoutX();
302     }
303 
304     /* (non-Javadoc)
305      * @see org.apache.jetspeed.om.page.Fragment#getLayoutY()
306      */
307     public float getLayoutY()
308     {
309         return fragment.getLayoutY();
310     }
311 
312     /* (non-Javadoc)
313      * @see org.apache.jetspeed.om.page.Fragment#getLayoutZ()
314      */
315     public float getLayoutZ()
316     {
317         return fragment.getLayoutZ();
318     }
319 
320     /* (non-Javadoc)
321      * @see org.apache.jetspeed.om.page.Fragment#getLayoutWidth()
322      */
323     public float getLayoutWidth()
324     {
325         return fragment.getLayoutWidth();
326     }
327 
328     /* (non-Javadoc)
329      * @see org.apache.jetspeed.om.page.Fragment#getLayoutHeight()
330      */
331     public float getLayoutHeight()
332     {
333         return fragment.getLayoutHeight();
334     }
335 
336     /* (non-Javadoc)
337      * @see org.apache.jetspeed.om.page.Fragment#setLayoutRow(int)
338      */
339     public void setLayoutRow(int row)
340     {
341         fragment.setLayoutRow(row);
342     }
343     
344     /* (non-Javadoc)
345      * @see org.apache.jetspeed.om.page.Fragment#setLayoutColumn(int)
346      */
347     public void setLayoutColumn(int column)
348     {
349         fragment.setLayoutColumn(column);
350     }
351     
352     /* (non-Javadoc)
353      * @see org.apache.jetspeed.om.page.Fragment#setLayoutSizes(java.lang.String)
354      */
355     public void setLayoutSizes(String sizes)
356     {
357         fragment.setLayoutSizes(sizes);
358     }
359     
360     /* (non-Javadoc)
361      * @see org.apache.jetspeed.om.page.Fragment#setLayoutX(float)
362      */
363     public void setLayoutX(float x)
364     {
365         fragment.setLayoutX(x);
366     }
367     
368     /* (non-Javadoc)
369      * @see org.apache.jetspeed.om.page.Fragment#setLayoutY(float)
370      */
371     public void setLayoutY(float y)
372     {
373         fragment.setLayoutY(y);
374     }
375 
376     /* (non-Javadoc)
377      * @see org.apache.jetspeed.om.page.Fragment#setLayoutZ(float)
378      */
379     public void setLayoutZ(float z)
380     {
381         fragment.setLayoutZ(z);
382     }
383 
384     /* (non-Javadoc)
385      * @see org.apache.jetspeed.om.page.Fragment#setLayoutWidth(float)
386      */
387     public void setLayoutWidth(float width)
388     {
389         fragment.setLayoutWidth(width);
390     }
391 
392     /* (non-Javadoc)
393      * @see org.apache.jetspeed.om.page.Fragment#setLayoutHeight(float)
394      */
395     public void setLayoutHeight(float height)
396     {
397         fragment.setLayoutHeight(height);
398     }
399 
400     /* (non-Javadoc)
401      * @see org.apache.jetspeed.om.page.Fragment#setSkin(java.lang.String)
402      */
403     public void setSkin(String skinName)
404     {
405         
406         fragment.setSkin(skinName);
407     }
408 
409     /* (non-Javadoc)
410      * @see org.apache.jetspeed.om.page.Fragment#setState(java.lang.String)
411      */
412     public void setState(String state)
413     {
414         
415         fragment.setState(state);
416     }
417 
418     /* (non-Javadoc)
419      * @see org.apache.jetspeed.om.page.Fragment#setMode(java.lang.String)
420      */
421     public void setMode(String mode)
422     {
423         
424         fragment.setMode(mode);
425     }
426 
427     /* (non-Javadoc)
428      * @see org.apache.jetspeed.om.page.Fragment#setType(java.lang.String)
429      */
430     public void setType(String type)
431     {
432         
433         fragment.setType(type);
434     }
435 
436     /* (non-Javadoc)
437      * @see org.apache.jetspeed.om.page.BaseElement#getId()
438      */
439     public String getId()
440     {
441         
442         return fragment.getId();
443     }
444 
445     /* (non-Javadoc)
446      * @see org.apache.jetspeed.om.page.BaseElement#getShortTitle()
447      */
448     public String getShortTitle()
449     {
450         
451         return fragment.getShortTitle();
452     }
453 
454     /* (non-Javadoc)
455      * @see org.apache.jetspeed.om.page.BaseElement#getTitle()
456      */
457     public String getTitle()
458     {
459         
460         return fragment.getTitle();
461     }
462 
463     /* (non-Javadoc)
464      * @see org.apache.jetspeed.om.page.BaseElement#setShortTitle(java.lang.String)
465      */
466     public void setShortTitle(String title)
467     {
468         
469         fragment.setShortTitle(title);
470     }
471 
472     /* (non-Javadoc)
473      * @see org.apache.jetspeed.om.page.BaseElement#setTitle(java.lang.String)
474      */
475     public void setTitle(String title)
476     {
477         
478         fragment.setTitle(title);
479     }
480 
481     /* (non-Javadoc)
482      * @see org.apache.jetspeed.om.common.SecuredResource#checkAccess(java.lang.String)
483      */
484     public void checkAccess(String actions) throws SecurityException
485     {
486         
487         fragment.checkAccess(actions);
488     }
489 
490     /* (non-Javadoc)
491      * @see org.apache.jetspeed.om.common.SecuredResource#checkConstraints(java.lang.String)
492      */
493     public void checkConstraints(String actions) throws SecurityException
494     {
495         
496         fragment.checkConstraints(actions);
497     }
498 
499     /* (non-Javadoc)
500      * @see org.apache.jetspeed.om.common.SecuredResource#checkPermissions(int)
501      */
502     public void checkPermissions(int mask) throws SecurityException
503     {
504         
505         fragment.checkPermissions(mask);
506     }
507 
508     /* (non-Javadoc)
509      * @see org.apache.jetspeed.om.common.SecuredResource#getConstraintsEnabled()
510      */
511     public boolean getConstraintsEnabled()
512     {
513         
514         return fragment.getConstraintsEnabled();
515     }
516 
517     /* (non-Javadoc)
518      * @see org.apache.jetspeed.om.common.SecuredResource#getPermissionsEnabled()
519      */
520     public boolean getPermissionsEnabled()
521     {
522         
523         return fragment.getPermissionsEnabled();
524     }
525 
526     /* (non-Javadoc)
527      * @see org.apache.jetspeed.om.common.SecuredResource#getSecurityConstraints()
528      */
529     public SecurityConstraints getSecurityConstraints()
530     {
531         
532         return fragment.getSecurityConstraints();
533     }
534 
535     /* (non-Javadoc)
536      * @see org.apache.jetspeed.om.common.SecuredResource#newSecurityConstraints()
537      */
538     public SecurityConstraints newSecurityConstraints()
539     {
540         
541         return fragment.newSecurityConstraints();
542     }
543 
544     /* (non-Javadoc)
545      * @see org.apache.jetspeed.om.common.SecuredResource#newSecurityConstraint()
546      */
547     public SecurityConstraint newSecurityConstraint()
548     {
549         
550         return fragment.newSecurityConstraint();
551     }
552 
553     /* (non-Javadoc)
554      * @see org.apache.jetspeed.om.common.SecuredResource#setSecurityConstraints(org.apache.jetspeed.om.common.SecurityConstraints)
555      */
556     public void setSecurityConstraints(SecurityConstraints constraints)
557     {
558         fragment.setSecurityConstraints(constraints);
559     }
560     
561     
562     /***
563      * Checks the ContentFragment cache for a ContentFragment
564      * that matches the <code>Id</code> of this fragment.  If
565      * one is found, it returned.  If no matches are found, a new
566      * <code>ContentFragment</code> represnentive of the {@link Fragment}
567      * argument is subsequently created, stored into the cahce and returned. 
568      * 
569      * @param f
570      * @return ContentFrament
571      */
572     protected ContentFragment getContentFragment(Fragment f)
573     {
574         ContentFragment cf;
575         if(cachedFragments.containsKey(f.getId()))
576         {
577             cf = (ContentFragment) cachedFragments.get(f.getId());
578         }
579         else
580         {
581             cf = new ContentFragmentImpl(f, cachedFragments);
582             cachedFragments.put(f.getId(), cf);
583         }
584         return cf;
585     }
586     
587     
588     protected final class ContentFragmentList implements List, Serializable
589     {
590         private List baseList = fragment.getFragments();
591 
592         /* (non-Javadoc)
593          * @see java.util.List#add(int, java.lang.Object)
594          */
595         public void add(int index, Object element)
596         {
597             if (element instanceof ContentFragmentImpl)
598                 element = ((ContentFragmentImpl)element).fragment;
599             baseList.add(index, element);
600         }
601 
602         /* (non-Javadoc)
603          * @see java.util.List#add(java.lang.Object)
604          */
605         public boolean add(Object o)
606         {
607             if (o instanceof ContentFragmentImpl)
608                 o = ((ContentFragmentImpl)o).fragment;            
609             return baseList.add(o);
610         }
611 
612         /* (non-Javadoc)
613          * @see java.util.List#addAll(int, java.util.Collection)
614          */
615         public boolean addAll(int index, Collection c)
616         {
617             
618             return baseList.addAll(index, c);
619         }
620 
621         /* (non-Javadoc)
622          * @see java.util.List#addAll(java.util.Collection)
623          */
624         public boolean addAll(Collection c)
625         {
626             
627             return baseList.addAll(c);
628         }
629 
630         /* (non-Javadoc)
631          * @see java.util.List#clear()
632          */
633         public void clear()
634         {
635             
636             baseList.clear();
637         }
638 
639         /* (non-Javadoc)
640          * @see java.util.List#contains(java.lang.Object)
641          */
642         public boolean contains(Object o)
643         {
644             
645             return baseList.contains(o);
646         }
647 
648         /* (non-Javadoc)
649          * @see java.util.List#containsAll(java.util.Collection)
650          */
651         public boolean containsAll(Collection c)
652         {
653             
654             return baseList.containsAll(c);
655         }
656 
657         /* (non-Javadoc)
658          * @see java.util.List#equals(java.lang.Object)
659          */
660         public boolean equals(Object o)
661         {
662             
663             return baseList.equals(o);
664         }
665 
666         /* (non-Javadoc)
667          * @see java.util.List#get(int)
668          */
669         public Object get(int index)
670         {
671             Fragment f= (Fragment) baseList.get(index);
672             return getContentFragment(f);            
673         }
674 
675         /* (non-Javadoc)
676          * @see java.util.List#hashCode()
677          */
678         public int hashCode()
679         {
680             
681             return baseList.hashCode();
682         }
683 
684         /* (non-Javadoc)
685          * @see java.util.List#indexOf(java.lang.Object)
686          */
687         public int indexOf(Object o)
688         {
689             
690             return baseList.indexOf(o);
691         }
692 
693         /* (non-Javadoc)
694          * @see java.util.List#isEmpty()
695          */
696         public boolean isEmpty()
697         {
698             
699             return baseList.isEmpty();
700         }
701 
702         /* (non-Javadoc)
703          * @see java.util.List#iterator()
704          */
705         public Iterator iterator()
706         {
707             return duplicateList().iterator();
708         }
709 
710         /* (non-Javadoc)
711          * @see java.util.List#lastIndexOf(java.lang.Object)
712          */
713         public int lastIndexOf(Object o)
714         {
715             
716             return baseList.lastIndexOf(o);
717         }
718 
719         /* (non-Javadoc)
720          * @see java.util.List#listIterator()
721          */
722         public ListIterator listIterator()
723         {
724             return duplicateList().listIterator();
725         }
726 
727         /* (non-Javadoc)
728          * @see java.util.List#listIterator(int)
729          */
730         public ListIterator listIterator(int index)
731         {
732             return duplicateList().listIterator(index);
733         }
734 
735         /* (non-Javadoc)
736          * @see java.util.List#remove(int)
737          */
738         public Object remove(int index)
739         {
740             
741             return baseList.remove(index);
742         }
743 
744         /* (non-Javadoc)
745          * @see java.util.List#remove(java.lang.Object)
746          */
747         public boolean remove(Object o)
748         {
749             
750             return baseList.remove(o);
751         }
752 
753         /* (non-Javadoc)
754          * @see java.util.List#removeAll(java.util.Collection)
755          */
756         public boolean removeAll(Collection c)
757         {
758             
759             return baseList.removeAll(c);
760         }
761 
762         /* (non-Javadoc)
763          * @see java.util.List#retainAll(java.util.Collection)
764          */
765         public boolean retainAll(Collection c)
766         {
767             
768             return baseList.retainAll(c);
769         }
770 
771         /* (non-Javadoc)
772          * @see java.util.List#set(int, java.lang.Object)
773          */
774         public Object set(int index, Object element)
775         {
776             
777             return baseList.set(index, element);
778         }
779 
780         /* (non-Javadoc)
781          * @see java.util.List#size()
782          */
783         public int size()
784         {
785             
786             return baseList.size();
787         }
788 
789         /* (non-Javadoc)
790          * @see java.util.List#subList(int, int)
791          */
792         public List subList(int fromIndex, int toIndex)
793         {
794             return duplicateList().subList(fromIndex, toIndex);
795         }
796 
797 
798 
799         /* (non-Javadoc)
800          * @see java.util.List#toArray()
801          */
802         public Object[] toArray()
803         {
804             return duplicateList().toArray();
805         }
806 
807         /* (non-Javadoc)
808          * @see java.util.List#toArray(java.lang.Object[])
809          */
810         public Object[] toArray(Object[] a)
811         {
812               return duplicateList().toArray(a);
813         }
814         
815         private List duplicateList()
816         {            
817             List rFragList = DatabasePageManagerUtils.createList();
818             for(int i=0; i < baseList.size(); i++)
819             {                
820                 Fragment f = (Fragment)baseList.get(i);
821                 ContentFragment cf = getContentFragment(f);
822                 rFragList.add(cf);
823             }
824             return rFragList;
825         }
826         
827         
828 
829     }
830 
831     /* (non-Javadoc)
832      * @see org.apache.jetspeed.om.page.Fragment#getPreferences()
833      */
834     public List getPreferences()
835     {
836         return fragment.getPreferences();
837     }
838 
839     public Decoration getDecoration()
840     {
841         return decoration;
842     }
843     
844     /* (non-Javadoc)
845      * @see org.apache.jetspeed.om.page.Fragment#setPreferences(java.util.List)
846      */
847     public void setPreferences(List preferences)
848     {
849         fragment.setPreferences(preferences);
850     }
851 
852 
853     public void setDecoration(Decoration decoration)
854     {
855         this.decoration = decoration;
856         
857     }
858     
859 }