View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.view.facelets.tag.ui;
20  
21  import java.beans.Introspector;
22  import java.beans.PropertyDescriptor;
23  import java.util.HashSet;
24  import java.util.Map;
25  import java.util.Set;
26  
27  import javax.faces.component.UIComponent;
28  import javax.faces.view.facelets.ComponentConfig;
29  import javax.faces.view.facelets.ComponentHandler;
30  import javax.faces.view.facelets.FaceletContext;
31  import javax.faces.view.facelets.MetaRuleset;
32  import javax.faces.view.facelets.Metadata;
33  import javax.faces.view.facelets.TagAttribute;
34  
35  /**
36   * Facelet alternative to c:forEach or h:dataTable
37   *
38   */
39  public class RepeatHandler extends ComponentHandler
40  {
41      
42      public RepeatHandler(ComponentConfig config)
43      {
44          super(config);
45      }
46  
47      protected MetaRuleset createMetaRuleset(Class type)
48      {
49          MetaRuleset meta = super.createMetaRuleset(type);
50  
51          if (!UILibrary.Namespace.equals(this.tag.getNamespace()))
52          {
53              meta.add(new TagMetaData(type));
54          }
55  
56          meta.alias("class", "styleClass");
57  
58          return meta;
59      }
60  
61      private class TagMetaData extends Metadata
62      {
63          private final String[] _attrs;
64  
65          public TagMetaData(Class<?> type)
66          {
67              Set<String> names = new HashSet<String>();
68              for (TagAttribute attribute : tag.getAttributes().getAll())
69              {
70                  if ("class".equals(attribute.getLocalName()))
71                  {
72                      names.add("styleClass");
73                  }
74                  else
75                  {
76                      names.add(attribute.getLocalName());
77                  }
78              }
79              
80              try
81              {
82                  for (PropertyDescriptor descriptor : Introspector.getBeanInfo(type).getPropertyDescriptors())
83                  {
84                      if (descriptor.getWriteMethod() != null)
85                      {
86                          names.remove(descriptor.getName());
87                      }
88                  }
89              }
90              catch (Exception e)
91              {
92                  // do nothing
93              }
94              
95              _attrs = names.toArray(new String[names.size()]);
96          }
97  
98          public void applyMetadata(FaceletContext ctx, Object instance)
99          {
100             UIComponent component = (UIComponent) instance;
101             Map<String, Object> attrs = component.getAttributes();
102             attrs.put("alias.element", tag.getQName());
103             if (_attrs.length > 0)
104             {
105                 attrs.put("alias.attributes", _attrs);
106             }
107         }
108     }
109 }