1. Project Clover database Tue Dec 20 2016 21:24:09 CET
  2. Package org.xwiki.rendering.internal.listener.descriptor

File DefaultListenerDescriptorManager.java

 

Coverage histogram

../../../../../../img/srcFileCovDistChart10.png
0% of files have more coverage

Code metrics

22
40
4
1
164
89
19
0.47
10
4
4.75

Classes

Class Line # Actions
DefaultListenerDescriptorManager 43 40 0% 19 3
0.9545454495.5%
 

Contributing tests

This file is covered by 2 tests. .

Source view

1    /*
2    * See the NOTICE file distributed with this work for additional
3    * information regarding copyright ownership.
4    *
5    * This is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU Lesser General Public License as
7    * published by the Free Software Foundation; either version 2.1 of
8    * the License, or (at your option) any later version.
9    *
10    * This software is distributed in the hope that it will be useful,
11    * but WITHOUT ANY WARRANTY; without even the implied warranty of
12    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13    * Lesser General Public License for more details.
14    *
15    * You should have received a copy of the GNU Lesser General Public
16    * License along with this software; if not, write to the Free
17    * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18    * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
19    */
20    package org.xwiki.rendering.internal.listener.descriptor;
21   
22    import java.lang.reflect.Method;
23    import java.lang.reflect.Type;
24    import java.util.Map;
25    import java.util.concurrent.ConcurrentHashMap;
26   
27    import javax.inject.Singleton;
28   
29    import org.xwiki.component.annotation.Component;
30    import org.xwiki.component.util.ReflectionUtils;
31    import org.xwiki.rendering.listener.descriptor.ListenerDescriptor;
32    import org.xwiki.rendering.listener.descriptor.ListenerDescriptorManager;
33    import org.xwiki.rendering.listener.descriptor.ListenerElement;
34   
35    /**
36    * Default implementation of {@link ListenerDescriptorManager}.
37    *
38    * @version $Id: 98e828505ce6f155fbed0cb13f24e67e93782c7d $
39    * @since 3.3M1
40    */
41    @Component
42    @Singleton
 
43    public class DefaultListenerDescriptorManager implements ListenerDescriptorManager
44    {
45    /**
46    * The prefix of the begin events.
47    */
48    private static final String PREFIX_BEGIN = "begin";
49   
50    /**
51    * The prefix of the end events.
52    */
53    private static final String PREFIX_END = "end";
54   
55    /**
56    * The prefix of the on events.
57    */
58    private static final String PREFIX_ON = "on";
59   
60    /**
61    * The descriptors.
62    */
63    private Map<Class<?>, ListenerDescriptor> descriptors = new ConcurrentHashMap<Class<?>, ListenerDescriptor>();
64   
 
65  4 toggle @Override
66    public ListenerDescriptor getListenerDescriptor(Class<?> type)
67    {
68  4 ListenerDescriptor descriptor = this.descriptors.get(type);
69  4 if (descriptor == null) {
70  2 descriptor = createDescriptor(type);
71  2 this.descriptors.put(type, descriptor);
72    }
73   
74  4 return descriptor;
75    }
76   
77    /**
78    * @param type the class of the listener
79    * @return the descriptor of the listener
80    */
 
81  2 toggle public ListenerDescriptor createDescriptor(Class<?> type)
82    {
83  2 ListenerDescriptor descriptor = new ListenerDescriptor();
84   
85  2 for (Method method : ReflectionUtils.getTypeClass(type).getMethods()) {
86  122 String methodName = method.getName();
87   
88  122 String elementName;
89  122 if (methodName.startsWith(PREFIX_BEGIN)) {
90  40 elementName = methodName.substring(PREFIX_BEGIN.length(), methodName.length());
91  82 } else if (methodName.startsWith(PREFIX_END)) {
92  40 elementName = methodName.substring(PREFIX_END.length(), methodName.length());
93  42 } else if (methodName.startsWith(PREFIX_ON)) {
94  22 elementName = methodName.substring(PREFIX_ON.length(), methodName.length());
95    } else {
96  20 elementName = null;
97    }
98   
99  122 if (elementName != null) {
100  102 elementName =
101    Character.toLowerCase(elementName.charAt(0)) + elementName.substring(1, elementName.length());
102   
103  102 addElement(elementName, descriptor, method);
104    }
105   
106    }
107   
108  2 return descriptor;
109    }
110   
111    /**
112    * @param elementName the name of the element
113    * @param descriptor the descriptor in which to add the element
114    * @param method the method associated to the element
115    */
 
116  102 toggle private void addElement(String elementName, ListenerDescriptor descriptor, Method method)
117    {
118  102 String lowerElementName = elementName.toLowerCase();
119   
120  102 ListenerElement element = descriptor.getElements().get(lowerElementName);
121   
122  102 Type[] methodTypes = method.getGenericParameterTypes();
123    // TODO: add support for multiple methods
124  102 if (element == null || methodTypes.length > element.getParameters().size()) {
125  62 element = new ListenerElement(elementName);
126   
127  62 element.getParameters().clear();
128  62 for (Type parameterType : method.getGenericParameterTypes()) {
129  84 element.getParameters().add(parameterType);
130    }
131   
132  62 descriptor.getElements().put(lowerElementName, element);
133    }
134   
135  102 addMethod(element, method);
136    }
137   
138    /**
139    * @param element the element
140    * @param method the method to add to the element
141    */
 
142  102 toggle private void addMethod(ListenerElement element, Method method)
143    {
144  102 String methodName = method.getName();
145  102 Type[] methodTypes = method.getGenericParameterTypes();
146   
147  102 if (methodName.startsWith(PREFIX_BEGIN)) {
148  40 if (element.getBeginMethod() == null
149    || element.getBeginMethod().getGenericParameterTypes().length < methodTypes.length) {
150  40 element.setBeginMethod(method);
151    }
152  62 } else if (methodName.startsWith(PREFIX_END)) {
153  40 if (element.getEndMethod() == null
154    || element.getEndMethod().getGenericParameterTypes().length < methodTypes.length) {
155  40 element.setEndMethod(method);
156    }
157    } else {
158  22 if (element.getOnMethod() == null
159    || element.getOnMethod().getGenericParameterTypes().length < methodTypes.length) {
160  22 element.setOnMethod(method);
161    }
162    }
163    }
164    }