<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<span class="sourceLineNo">009</span> *<a name="line.9"></a>
<span class="sourceLineNo">010</span> *   http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing,<a name="line.12"></a>
<span class="sourceLineNo">013</span> * software distributed under the License is distributed on an<a name="line.13"></a>
<span class="sourceLineNo">014</span> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.14"></a>
<span class="sourceLineNo">015</span> * KIND, either express or implied.  See the License for the<a name="line.15"></a>
<span class="sourceLineNo">016</span> * specific language governing permissions and limitations<a name="line.16"></a>
<span class="sourceLineNo">017</span> * under the License.<a name="line.17"></a>
<span class="sourceLineNo">018</span> */<a name="line.18"></a>
<span class="sourceLineNo">019</span><a name="line.19"></a>
<span class="sourceLineNo">020</span>package org.apache.felix.ipojo.manipulation;<a name="line.20"></a>
<span class="sourceLineNo">021</span><a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.util.*;<a name="line.22"></a>
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.objectweb.asm.AnnotationVisitor;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.objectweb.asm.ClassVisitor;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.objectweb.asm.FieldVisitor;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.objectweb.asm.Label;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.objectweb.asm.MethodVisitor;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.objectweb.asm.Opcodes;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.objectweb.asm.Type;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.objectweb.asm.commons.EmptyVisitor;<a name="line.31"></a>
<span class="sourceLineNo">032</span><a name="line.32"></a>
<span class="sourceLineNo">033</span>/**<a name="line.33"></a>
<span class="sourceLineNo">034</span> * Checks that a POJO is already manipulated or not.<a name="line.34"></a>
<span class="sourceLineNo">035</span> * Moreover it allows to get manipulation data about this class.<a name="line.35"></a>
<span class="sourceLineNo">036</span> * @author &lt;a href="mailto:dev@felix.apache.org"&gt;Felix Project Team&lt;/a&gt;<a name="line.36"></a>
<span class="sourceLineNo">037</span> */<a name="line.37"></a>
<span class="sourceLineNo">038</span>public class ClassChecker extends EmptyVisitor implements ClassVisitor, Opcodes {<a name="line.38"></a>
<span class="sourceLineNo">039</span><a name="line.39"></a>
<span class="sourceLineNo">040</span>    /**<a name="line.40"></a>
<span class="sourceLineNo">041</span>     * True if the class is already manipulated.<a name="line.41"></a>
<span class="sourceLineNo">042</span>     */<a name="line.42"></a>
<span class="sourceLineNo">043</span>    private boolean m_isAlreadyManipulated = false;<a name="line.43"></a>
<span class="sourceLineNo">044</span><a name="line.44"></a>
<span class="sourceLineNo">045</span>    /**<a name="line.45"></a>
<span class="sourceLineNo">046</span>     * Interfaces implemented by the component.<a name="line.46"></a>
<span class="sourceLineNo">047</span>     */<a name="line.47"></a>
<span class="sourceLineNo">048</span>    private List&lt;String&gt; m_itfs = new ArrayList&lt;String&gt;();<a name="line.48"></a>
<span class="sourceLineNo">049</span><a name="line.49"></a>
<span class="sourceLineNo">050</span>    /**<a name="line.50"></a>
<span class="sourceLineNo">051</span>     * Field map [field name, type] discovered in the component class.<a name="line.51"></a>
<span class="sourceLineNo">052</span>     */<a name="line.52"></a>
<span class="sourceLineNo">053</span>    private Map&lt;String, String&gt; m_fields = new TreeMap&lt;String, String&gt;();<a name="line.53"></a>
<span class="sourceLineNo">054</span><a name="line.54"></a>
<span class="sourceLineNo">055</span>    /**<a name="line.55"></a>
<span class="sourceLineNo">056</span>     * Method List of method descriptor discovered in the component class.<a name="line.56"></a>
<span class="sourceLineNo">057</span>     */<a name="line.57"></a>
<span class="sourceLineNo">058</span>    private List&lt;MethodDescriptor&gt; m_methods = new ArrayList&lt;MethodDescriptor&gt;();<a name="line.58"></a>
<span class="sourceLineNo">059</span><a name="line.59"></a>
<span class="sourceLineNo">060</span>    /**<a name="line.60"></a>
<span class="sourceLineNo">061</span>     * Super class if not java.lang.Object.<a name="line.61"></a>
<span class="sourceLineNo">062</span>     */<a name="line.62"></a>
<span class="sourceLineNo">063</span>    private String m_superClass;<a name="line.63"></a>
<span class="sourceLineNo">064</span><a name="line.64"></a>
<span class="sourceLineNo">065</span>    /**<a name="line.65"></a>
<span class="sourceLineNo">066</span>     * Class name.<a name="line.66"></a>
<span class="sourceLineNo">067</span>     */<a name="line.67"></a>
<span class="sourceLineNo">068</span>    private String m_className;<a name="line.68"></a>
<span class="sourceLineNo">069</span><a name="line.69"></a>
<span class="sourceLineNo">070</span>    /**<a name="line.70"></a>
<span class="sourceLineNo">071</span>     * List of visited inner class owned by the implementation class.<a name="line.71"></a>
<span class="sourceLineNo">072</span>     */<a name="line.72"></a>
<span class="sourceLineNo">073</span>    private Map&lt;String, List&lt;MethodDescriptor&gt;&gt; m_inners = new LinkedHashMap&lt;String, List&lt;MethodDescriptor&gt;&gt;();<a name="line.73"></a>
<span class="sourceLineNo">074</span><a name="line.74"></a>
<span class="sourceLineNo">075</span>    /**<a name="line.75"></a>
<span class="sourceLineNo">076</span>     * &lt;code&gt;true&lt;/code&gt; if the class supports annotations.<a name="line.76"></a>
<span class="sourceLineNo">077</span>     * This enables the analysis of the code to find and moves annotations.<a name="line.77"></a>
<span class="sourceLineNo">078</span>     */<a name="line.78"></a>
<span class="sourceLineNo">079</span>    private boolean m_supportAnnotation = false;<a name="line.79"></a>
<span class="sourceLineNo">080</span><a name="line.80"></a>
<span class="sourceLineNo">081</span>    /**<a name="line.81"></a>
<span class="sourceLineNo">082</span>     * Class Version.<a name="line.82"></a>
<span class="sourceLineNo">083</span>     * Used to determine the frame format.<a name="line.83"></a>
<span class="sourceLineNo">084</span>     */<a name="line.84"></a>
<span class="sourceLineNo">085</span>    private int m_classVersion;<a name="line.85"></a>
<span class="sourceLineNo">086</span><a name="line.86"></a>
<span class="sourceLineNo">087</span>    /**<a name="line.87"></a>
<span class="sourceLineNo">088</span>     * Check if the _cm field already exists.<a name="line.88"></a>
<span class="sourceLineNo">089</span>     * Update the field list.<a name="line.89"></a>
<span class="sourceLineNo">090</span>     * @param access : access of the field<a name="line.90"></a>
<span class="sourceLineNo">091</span>     * @param name : name of the field<a name="line.91"></a>
<span class="sourceLineNo">092</span>     * @param desc : description of the field<a name="line.92"></a>
<span class="sourceLineNo">093</span>     * @param signature : signature of the field<a name="line.93"></a>
<span class="sourceLineNo">094</span>     * @param value : value of the field (for static field only)<a name="line.94"></a>
<span class="sourceLineNo">095</span>     * @return the field visitor<a name="line.95"></a>
<span class="sourceLineNo">096</span>     * @see org.objectweb.asm.ClassVisitor#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object)<a name="line.96"></a>
<span class="sourceLineNo">097</span>     */<a name="line.97"></a>
<span class="sourceLineNo">098</span>    public FieldVisitor visitField(int access, String name, String desc,<a name="line.98"></a>
<span class="sourceLineNo">099</span>            String signature, Object value) {<a name="line.99"></a>
<span class="sourceLineNo">100</span>        if (name.equals(MethodCreator.IM_FIELD)<a name="line.100"></a>
<span class="sourceLineNo">101</span>                &amp;&amp; desc.equals("Lorg/apache/felix/ipojo/InstanceManager;")) {<a name="line.101"></a>
<span class="sourceLineNo">102</span>            m_isAlreadyManipulated = true;<a name="line.102"></a>
<span class="sourceLineNo">103</span>        } else if (name.startsWith("class$")) { // Does not add class$* field generated by 'x.class'<a name="line.103"></a>
<span class="sourceLineNo">104</span>            return null;<a name="line.104"></a>
<span class="sourceLineNo">105</span>        } else if ((access &amp; ACC_STATIC) == ACC_STATIC) {<a name="line.105"></a>
<span class="sourceLineNo">106</span>            return null;<a name="line.106"></a>
<span class="sourceLineNo">107</span>        }<a name="line.107"></a>
<span class="sourceLineNo">108</span><a name="line.108"></a>
<span class="sourceLineNo">109</span>        if (isManipulatedField(name)) {<a name="line.109"></a>
<span class="sourceLineNo">110</span>            return null;<a name="line.110"></a>
<span class="sourceLineNo">111</span>        }<a name="line.111"></a>
<span class="sourceLineNo">112</span><a name="line.112"></a>
<span class="sourceLineNo">113</span>        Type type = Type.getType(desc);<a name="line.113"></a>
<span class="sourceLineNo">114</span>        if (type.getSort() == Type.ARRAY) {<a name="line.114"></a>
<span class="sourceLineNo">115</span>            if (type.getInternalName().startsWith("L")) {<a name="line.115"></a>
<span class="sourceLineNo">116</span>                String internalType = type.getInternalName().substring(1);<a name="line.116"></a>
<span class="sourceLineNo">117</span>                String nameType = internalType.replace('/', '.');<a name="line.117"></a>
<span class="sourceLineNo">118</span>                m_fields.put(name, nameType + "[]");<a name="line.118"></a>
<span class="sourceLineNo">119</span>            } else {<a name="line.119"></a>
<span class="sourceLineNo">120</span>                String nameType = type.getClassName().substring(0,<a name="line.120"></a>
<span class="sourceLineNo">121</span>                        type.getClassName().length() - 2);<a name="line.121"></a>
<span class="sourceLineNo">122</span>                m_fields.put(name, nameType + "[]");<a name="line.122"></a>
<span class="sourceLineNo">123</span>            }<a name="line.123"></a>
<span class="sourceLineNo">124</span>        } else {<a name="line.124"></a>
<span class="sourceLineNo">125</span>            m_fields.put(name, type.getClassName());<a name="line.125"></a>
<span class="sourceLineNo">126</span>        }<a name="line.126"></a>
<span class="sourceLineNo">127</span><a name="line.127"></a>
<span class="sourceLineNo">128</span>        return null;<a name="line.128"></a>
<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
<span class="sourceLineNo">130</span><a name="line.130"></a>
<span class="sourceLineNo">131</span>    private boolean isManipulatedField(String name) {<a name="line.131"></a>
<span class="sourceLineNo">132</span>        return ((MethodCreator.IM_FIELD.equals(name))<a name="line.132"></a>
<span class="sourceLineNo">133</span>                || (name.startsWith(MethodCreator.FIELD_FLAG_PREFIX))<a name="line.133"></a>
<span class="sourceLineNo">134</span>                || (name.startsWith(MethodCreator.METHOD_FLAG_PREFIX)));<a name="line.134"></a>
<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
<span class="sourceLineNo">136</span><a name="line.136"></a>
<span class="sourceLineNo">137</span>    /**<a name="line.137"></a>
<span class="sourceLineNo">138</span>     * Add the inner class to the list of inner class to manipulate.<a name="line.138"></a>
<span class="sourceLineNo">139</span>     * The method checks that the inner class is really owned by the implementation class.<a name="line.139"></a>
<span class="sourceLineNo">140</span>     * @param name inner class qualified name<a name="line.140"></a>
<span class="sourceLineNo">141</span>     * @param outerName outer class name (may be null for anonymous class)<a name="line.141"></a>
<span class="sourceLineNo">142</span>     * @param innerName inner class simple (i.e. short) name<a name="line.142"></a>
<span class="sourceLineNo">143</span>     * @param access inner class visibility<a name="line.143"></a>
<span class="sourceLineNo">144</span>     * @see org.objectweb.asm.commons.EmptyVisitor#visitInnerClass(java.lang.String, java.lang.String, java.lang.String, int)<a name="line.144"></a>
<span class="sourceLineNo">145</span>     */<a name="line.145"></a>
<span class="sourceLineNo">146</span>    public void visitInnerClass(String name, String outerName, String innerName, int access) {<a name="line.146"></a>
<span class="sourceLineNo">147</span>        if (m_className.equals(outerName)  || outerName == null) { // Anonymous classes does not have an outer class.<a name="line.147"></a>
<span class="sourceLineNo">148</span>            // Do not include inner static class<a name="line.148"></a>
<span class="sourceLineNo">149</span>            if (! ((access &amp; ACC_STATIC) == ACC_STATIC)) {<a name="line.149"></a>
<span class="sourceLineNo">150</span>                m_inners.put(name, new ArrayList&lt;MethodDescriptor&gt;());<a name="line.150"></a>
<span class="sourceLineNo">151</span>            }<a name="line.151"></a>
<span class="sourceLineNo">152</span>        }<a name="line.152"></a>
<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
<span class="sourceLineNo">154</span><a name="line.154"></a>
<span class="sourceLineNo">155</span><a name="line.155"></a>
<span class="sourceLineNo">156</span>    /**<a name="line.156"></a>
<span class="sourceLineNo">157</span>     * Check if the class was already manipulated.<a name="line.157"></a>
<span class="sourceLineNo">158</span>     * @return true if the class is already manipulated.<a name="line.158"></a>
<span class="sourceLineNo">159</span>     */<a name="line.159"></a>
<span class="sourceLineNo">160</span>    public boolean isAlreadyManipulated() {<a name="line.160"></a>
<span class="sourceLineNo">161</span>        return m_isAlreadyManipulated;<a name="line.161"></a>
<span class="sourceLineNo">162</span>    }<a name="line.162"></a>
<span class="sourceLineNo">163</span><a name="line.163"></a>
<span class="sourceLineNo">164</span>    /**<a name="line.164"></a>
<span class="sourceLineNo">165</span>     * Gets the extracted class version<a name="line.165"></a>
<span class="sourceLineNo">166</span>     * @return the class version.<a name="line.166"></a>
<span class="sourceLineNo">167</span>     */<a name="line.167"></a>
<span class="sourceLineNo">168</span>    public int getClassVersion() {<a name="line.168"></a>
<span class="sourceLineNo">169</span>        return m_classVersion;<a name="line.169"></a>
<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
<span class="sourceLineNo">171</span><a name="line.171"></a>
<span class="sourceLineNo">172</span>    /**<a name="line.172"></a>
<span class="sourceLineNo">173</span>     * Visit the class.<a name="line.173"></a>
<span class="sourceLineNo">174</span>     * Update the implemented interface list.<a name="line.174"></a>
<span class="sourceLineNo">175</span>     * @param version : version of the class<a name="line.175"></a>
<span class="sourceLineNo">176</span>     * @param access : access of the class<a name="line.176"></a>
<span class="sourceLineNo">177</span>     * @param name : name of the class<a name="line.177"></a>
<span class="sourceLineNo">178</span>     * @param signature : signature of the class<a name="line.178"></a>
<span class="sourceLineNo">179</span>     * @param superName : super class of the class<a name="line.179"></a>
<span class="sourceLineNo">180</span>     * @param interfaces : implemented interfaces.<a name="line.180"></a>
<span class="sourceLineNo">181</span>     * @see org.objectweb.asm.ClassVisitor#visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])<a name="line.181"></a>
<span class="sourceLineNo">182</span>     */<a name="line.182"></a>
<span class="sourceLineNo">183</span>    public void visit(int version, int access, String name, String signature,<a name="line.183"></a>
<span class="sourceLineNo">184</span>            String superName, String[] interfaces) {<a name="line.184"></a>
<span class="sourceLineNo">185</span><a name="line.185"></a>
<span class="sourceLineNo">186</span>        m_classVersion = version;<a name="line.186"></a>
<span class="sourceLineNo">187</span>        m_supportAnnotation = version &gt; V1_4 &amp;&amp; version &lt; V1_1;<a name="line.187"></a>
<span class="sourceLineNo">188</span><a name="line.188"></a>
<span class="sourceLineNo">189</span>        if (! superName.equals("java/lang/Object")) {<a name="line.189"></a>
<span class="sourceLineNo">190</span>            m_superClass = superName.replace('/', '.');<a name="line.190"></a>
<span class="sourceLineNo">191</span>        }<a name="line.191"></a>
<span class="sourceLineNo">192</span><a name="line.192"></a>
<span class="sourceLineNo">193</span>        for (String anInterface : interfaces) {<a name="line.193"></a>
<span class="sourceLineNo">194</span>            if (!anInterface.equals("org/apache/felix/ipojo/Pojo")) {<a name="line.194"></a>
<span class="sourceLineNo">195</span>                m_itfs.add(anInterface.replace('/', '.'));<a name="line.195"></a>
<span class="sourceLineNo">196</span>            }<a name="line.196"></a>
<span class="sourceLineNo">197</span>        }<a name="line.197"></a>
<span class="sourceLineNo">198</span><a name="line.198"></a>
<span class="sourceLineNo">199</span>        m_className = name;<a name="line.199"></a>
<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
<span class="sourceLineNo">201</span><a name="line.201"></a>
<span class="sourceLineNo">202</span>    /**<a name="line.202"></a>
<span class="sourceLineNo">203</span>     * Visit a method.<a name="line.203"></a>
<span class="sourceLineNo">204</span>     * Update the method list (except if it init or clinit.<a name="line.204"></a>
<span class="sourceLineNo">205</span>     * @param  access - the method's access flags (see Opcodes). This parameter also indicates if the method is synthetic and/or deprecated.<a name="line.205"></a>
<span class="sourceLineNo">206</span>     * @param name - the method's name.<a name="line.206"></a>
<span class="sourceLineNo">207</span>     * @param desc - the method's descriptor (see Type).<a name="line.207"></a>
<span class="sourceLineNo">208</span>     * @param signature - the method's signature. May be null if the method parameters, return type and exceptions do not use generic types.<a name="line.208"></a>
<span class="sourceLineNo">209</span>     * @param exceptions - the internal names of the method's exception classes (see getInternalName). May be null.<a name="line.209"></a>
<span class="sourceLineNo">210</span>     * @return nothing.<a name="line.210"></a>
<span class="sourceLineNo">211</span>     * @see org.objectweb.asm.ClassVisitor#visitMethod(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])<a name="line.211"></a>
<span class="sourceLineNo">212</span>     */<a name="line.212"></a>
<span class="sourceLineNo">213</span>    public MethodVisitor visitMethod(int access, String name, String desc,<a name="line.213"></a>
<span class="sourceLineNo">214</span>            String signature, String[] exceptions) {<a name="line.214"></a>
<span class="sourceLineNo">215</span>        if (!name.equals("&lt;clinit&gt;")) {<a name="line.215"></a>
<span class="sourceLineNo">216</span><a name="line.216"></a>
<span class="sourceLineNo">217</span>            if (name.equals("&lt;init&gt;")) {<a name="line.217"></a>
<span class="sourceLineNo">218</span>                if (!isGeneratedConstructor(name, desc)) {<a name="line.218"></a>
<span class="sourceLineNo">219</span>                    final MethodDescriptor md = new MethodDescriptor("$init", desc, (access &amp; ACC_STATIC) == ACC_STATIC);<a name="line.219"></a>
<span class="sourceLineNo">220</span>                    m_methods.add(md);<a name="line.220"></a>
<span class="sourceLineNo">221</span>                    return new MethodInfoCollector(md);<a name="line.221"></a>
<span class="sourceLineNo">222</span>                }<a name="line.222"></a>
<span class="sourceLineNo">223</span>            } else {<a name="line.223"></a>
<span class="sourceLineNo">224</span>                // no constructors.<a name="line.224"></a>
<span class="sourceLineNo">225</span>                if (!isGeneratedMethod(name, desc)) {<a name="line.225"></a>
<span class="sourceLineNo">226</span>                    final MethodDescriptor md = new MethodDescriptor(name, desc, (access &amp; ACC_STATIC) == ACC_STATIC);<a name="line.226"></a>
<span class="sourceLineNo">227</span>                    m_methods.add(md);<a name="line.227"></a>
<span class="sourceLineNo">228</span>                    return new MethodInfoCollector(md);<a name="line.228"></a>
<span class="sourceLineNo">229</span>                }<a name="line.229"></a>
<span class="sourceLineNo">230</span>            }<a name="line.230"></a>
<span class="sourceLineNo">231</span><a name="line.231"></a>
<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
<span class="sourceLineNo">233</span><a name="line.233"></a>
<span class="sourceLineNo">234</span>        if (name.equals("&lt;clinit&gt;")) {<a name="line.234"></a>
<span class="sourceLineNo">235</span>            return new InnerClassAssignedToStaticFieldDetector();<a name="line.235"></a>
<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
<span class="sourceLineNo">237</span><a name="line.237"></a>
<span class="sourceLineNo">238</span>        return null;<a name="line.238"></a>
<span class="sourceLineNo">239</span>    }<a name="line.239"></a>
<span class="sourceLineNo">240</span><a name="line.240"></a>
<span class="sourceLineNo">241</span>    public static boolean isGeneratedConstructor(String name, String desc) {<a name="line.241"></a>
<span class="sourceLineNo">242</span>        return ("&lt;init&gt;".equals(name) &amp;&amp; isFirstArgumentInstanceManager(desc));<a name="line.242"></a>
<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
<span class="sourceLineNo">244</span><a name="line.244"></a>
<span class="sourceLineNo">245</span>    public static boolean isFirstArgumentInstanceManager(String desc) {<a name="line.245"></a>
<span class="sourceLineNo">246</span>        Type[] types = Type.getArgumentTypes(desc);<a name="line.246"></a>
<span class="sourceLineNo">247</span>        return types != null &amp;&amp; (types.length &gt;= 1)<a name="line.247"></a>
<span class="sourceLineNo">248</span>                &amp;&amp; Type.getType("Lorg/apache/felix/ipojo/InstanceManager;").equals(types[0]);<a name="line.248"></a>
<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
<span class="sourceLineNo">250</span><a name="line.250"></a>
<span class="sourceLineNo">251</span>    public static boolean isGeneratedMethod(String name, String desc) {<a name="line.251"></a>
<span class="sourceLineNo">252</span>        return isGetterMethod(name, desc)<a name="line.252"></a>
<span class="sourceLineNo">253</span>                || isSetterMethod(name, desc)<a name="line.253"></a>
<span class="sourceLineNo">254</span>                || isSetInstanceManagerMethod(name)<a name="line.254"></a>
<span class="sourceLineNo">255</span>                || isGetComponentInstanceMethod(name, desc)<a name="line.255"></a>
<span class="sourceLineNo">256</span>                || isManipulatedMethod(name);<a name="line.256"></a>
<span class="sourceLineNo">257</span>    }<a name="line.257"></a>
<span class="sourceLineNo">258</span><a name="line.258"></a>
<span class="sourceLineNo">259</span>    private static boolean isGetterMethod(String name, String desc) {<a name="line.259"></a>
<span class="sourceLineNo">260</span>        // TYPE __getXXX()<a name="line.260"></a>
<span class="sourceLineNo">261</span>        Type[] arguments = Type.getArgumentTypes(desc);<a name="line.261"></a>
<span class="sourceLineNo">262</span>        return (name.startsWith("__get")<a name="line.262"></a>
<span class="sourceLineNo">263</span>                &amp;&amp; (arguments.length == 0)<a name="line.263"></a>
<span class="sourceLineNo">264</span>                &amp;&amp; !Type.VOID_TYPE.equals(Type.getReturnType(desc)));<a name="line.264"></a>
<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
<span class="sourceLineNo">266</span><a name="line.266"></a>
<span class="sourceLineNo">267</span>    private static boolean isSetterMethod(String name, String desc) {<a name="line.267"></a>
<span class="sourceLineNo">268</span>        // void __setXXX(TYPE)<a name="line.268"></a>
<span class="sourceLineNo">269</span>        Type[] arguments = Type.getArgumentTypes(desc);<a name="line.269"></a>
<span class="sourceLineNo">270</span>        return (name.startsWith("__set")<a name="line.270"></a>
<span class="sourceLineNo">271</span>                &amp;&amp; (arguments.length == 1)<a name="line.271"></a>
<span class="sourceLineNo">272</span>                &amp;&amp; Type.VOID_TYPE.equals(Type.getReturnType(desc)));<a name="line.272"></a>
<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
<span class="sourceLineNo">274</span><a name="line.274"></a>
<span class="sourceLineNo">275</span>    private static boolean isSetInstanceManagerMethod(String name) {<a name="line.275"></a>
<span class="sourceLineNo">276</span>        return name.startsWith("_setInstanceManager");<a name="line.276"></a>
<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
<span class="sourceLineNo">278</span><a name="line.278"></a>
<span class="sourceLineNo">279</span>    private static boolean isGetComponentInstanceMethod(String name, String desc) {<a name="line.279"></a>
<span class="sourceLineNo">280</span>        return (name.startsWith("getComponentInstance")<a name="line.280"></a>
<span class="sourceLineNo">281</span>                &amp;&amp; Type.getType("Lorg/apache/felix/ipojo/ComponentInstance;").equals(Type.getReturnType(desc)));<a name="line.281"></a>
<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
<span class="sourceLineNo">283</span><a name="line.283"></a>
<span class="sourceLineNo">284</span>    private static boolean isManipulatedMethod(String name) {<a name="line.284"></a>
<span class="sourceLineNo">285</span>        return (name.startsWith(MethodCreator.PREFIX));<a name="line.285"></a>
<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
<span class="sourceLineNo">287</span><a name="line.287"></a>
<span class="sourceLineNo">288</span>    /**<a name="line.288"></a>
<span class="sourceLineNo">289</span>     * Get collected interfaces.<a name="line.289"></a>
<span class="sourceLineNo">290</span>     * @return the interfaces implemented by the component class.<a name="line.290"></a>
<span class="sourceLineNo">291</span>     */<a name="line.291"></a>
<span class="sourceLineNo">292</span>    public List&lt;String&gt; getInterfaces() {<a name="line.292"></a>
<span class="sourceLineNo">293</span>        return m_itfs;<a name="line.293"></a>
<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
<span class="sourceLineNo">295</span><a name="line.295"></a>
<span class="sourceLineNo">296</span>    /**<a name="line.296"></a>
<span class="sourceLineNo">297</span>     * Get collected fields.<a name="line.297"></a>
<span class="sourceLineNo">298</span>     * @return the field map [field_name, type].<a name="line.298"></a>
<span class="sourceLineNo">299</span>     */<a name="line.299"></a>
<span class="sourceLineNo">300</span>    public Map&lt;String, String&gt; getFields() {<a name="line.300"></a>
<span class="sourceLineNo">301</span>        return m_fields;<a name="line.301"></a>
<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
<span class="sourceLineNo">303</span><a name="line.303"></a>
<span class="sourceLineNo">304</span>    /**<a name="line.304"></a>
<span class="sourceLineNo">305</span>     * Get collected methods.<a name="line.305"></a>
<span class="sourceLineNo">306</span>     * @return the method list of [method, signature].<a name="line.306"></a>
<span class="sourceLineNo">307</span>     */<a name="line.307"></a>
<span class="sourceLineNo">308</span>    public List&lt;MethodDescriptor&gt; getMethods() {<a name="line.308"></a>
<span class="sourceLineNo">309</span>        return m_methods;<a name="line.309"></a>
<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
<span class="sourceLineNo">311</span><a name="line.311"></a>
<span class="sourceLineNo">312</span>    public String getSuperClass() {<a name="line.312"></a>
<span class="sourceLineNo">313</span>        return m_superClass;<a name="line.313"></a>
<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
<span class="sourceLineNo">315</span><a name="line.315"></a>
<span class="sourceLineNo">316</span>    public Collection&lt;String&gt; getInnerClasses() {<a name="line.316"></a>
<span class="sourceLineNo">317</span>        return m_inners.keySet();<a name="line.317"></a>
<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
<span class="sourceLineNo">319</span><a name="line.319"></a>
<span class="sourceLineNo">320</span>    public Map&lt;String, List&lt;MethodDescriptor&gt;&gt; getInnerClassesAndMethods() {<a name="line.320"></a>
<span class="sourceLineNo">321</span>        return m_inners;<a name="line.321"></a>
<span class="sourceLineNo">322</span>    }<a name="line.322"></a>
<span class="sourceLineNo">323</span><a name="line.323"></a>
<span class="sourceLineNo">324</span>    public String getClassName() {<a name="line.324"></a>
<span class="sourceLineNo">325</span>        return m_className;<a name="line.325"></a>
<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
<span class="sourceLineNo">327</span><a name="line.327"></a>
<span class="sourceLineNo">328</span>    /**<a name="line.328"></a>
<span class="sourceLineNo">329</span>     * This class collects annotations in a method.<a name="line.329"></a>
<span class="sourceLineNo">330</span>     * This class creates an {@link AnnotationDescriptor}<a name="line.330"></a>
<span class="sourceLineNo">331</span>     * if an annotation is found during the visit.<a name="line.331"></a>
<span class="sourceLineNo">332</span>     * It also collects local variables definition.<a name="line.332"></a>
<span class="sourceLineNo">333</span>     *  @author &lt;a href="mailto:dev@felix.apache.org"&gt;Felix Project Team&lt;/a&gt;<a name="line.333"></a>
<span class="sourceLineNo">334</span>     */<a name="line.334"></a>
<span class="sourceLineNo">335</span>    private final class MethodInfoCollector extends EmptyVisitor {<a name="line.335"></a>
<span class="sourceLineNo">336</span>        /**<a name="line.336"></a>
<span class="sourceLineNo">337</span>         * The method descriptor of the visited method.<a name="line.337"></a>
<span class="sourceLineNo">338</span>         */<a name="line.338"></a>
<span class="sourceLineNo">339</span>        private MethodDescriptor m_method;<a name="line.339"></a>
<span class="sourceLineNo">340</span><a name="line.340"></a>
<span class="sourceLineNo">341</span>        /**<a name="line.341"></a>
<span class="sourceLineNo">342</span>         * Creates an annotation collector.<a name="line.342"></a>
<span class="sourceLineNo">343</span>         * @param md the method descriptor of the visited method.<a name="line.343"></a>
<span class="sourceLineNo">344</span>         */<a name="line.344"></a>
<span class="sourceLineNo">345</span>        private MethodInfoCollector(MethodDescriptor md) {<a name="line.345"></a>
<span class="sourceLineNo">346</span>            m_method = md;<a name="line.346"></a>
<span class="sourceLineNo">347</span>        }<a name="line.347"></a>
<span class="sourceLineNo">348</span><a name="line.348"></a>
<span class="sourceLineNo">349</span>        /**<a name="line.349"></a>
<span class="sourceLineNo">350</span>         * Visits an annotation.<a name="line.350"></a>
<span class="sourceLineNo">351</span>         * This class checks the visibility. If the annotation is visible,<a name="line.351"></a>
<span class="sourceLineNo">352</span>         * creates the {@link AnnotationDescriptor} corresponding to this annotation<a name="line.352"></a>
<span class="sourceLineNo">353</span>         * to visit this annotation. This {@link AnnotationDescriptor} is added to<a name="line.353"></a>
<span class="sourceLineNo">354</span>         * the {@link MethodDescriptor} of the visited method.<a name="line.354"></a>
<span class="sourceLineNo">355</span>         * @param name the name of the annotation<a name="line.355"></a>
<span class="sourceLineNo">356</span>         * @param visible is the annotation visible at runtime<a name="line.356"></a>
<span class="sourceLineNo">357</span>         * @return the {@link AnnotationDescriptor} to visit this annotation or<a name="line.357"></a>
<span class="sourceLineNo">358</span>         * &lt;code&gt;null&lt;/code&gt; if the annotation is not visible.<a name="line.358"></a>
<span class="sourceLineNo">359</span>         * @see org.objectweb.asm.commons.EmptyVisitor#visitAnnotation(java.lang.String, boolean)<a name="line.359"></a>
<span class="sourceLineNo">360</span>         */<a name="line.360"></a>
<span class="sourceLineNo">361</span>        public AnnotationVisitor visitAnnotation(String name, boolean visible) {<a name="line.361"></a>
<span class="sourceLineNo">362</span>            if (visible) {<a name="line.362"></a>
<span class="sourceLineNo">363</span>                AnnotationDescriptor ann = new AnnotationDescriptor(name, visible);<a name="line.363"></a>
<span class="sourceLineNo">364</span>                m_method.addAnnotation(ann);<a name="line.364"></a>
<span class="sourceLineNo">365</span>                return ann;<a name="line.365"></a>
<span class="sourceLineNo">366</span>            }<a name="line.366"></a>
<span class="sourceLineNo">367</span>            return null;<a name="line.367"></a>
<span class="sourceLineNo">368</span>        }<a name="line.368"></a>
<span class="sourceLineNo">369</span>        <a name="line.369"></a>
<span class="sourceLineNo">370</span>        public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {<a name="line.370"></a>
<span class="sourceLineNo">371</span>            m_method.addLocalVariable(name, desc, signature, index);<a name="line.371"></a>
<span class="sourceLineNo">372</span>        }<a name="line.372"></a>
<span class="sourceLineNo">373</span><a name="line.373"></a>
<span class="sourceLineNo">374</span>        public void visitEnd() {<a name="line.374"></a>
<span class="sourceLineNo">375</span>            m_method.end();<a name="line.375"></a>
<span class="sourceLineNo">376</span>        }<a name="line.376"></a>
<span class="sourceLineNo">377</span><a name="line.377"></a>
<span class="sourceLineNo">378</span>        public AnnotationVisitor visitParameterAnnotation(int id,<a name="line.378"></a>
<span class="sourceLineNo">379</span>                String name, boolean visible) {<a name="line.379"></a>
<span class="sourceLineNo">380</span>            if (visible) {<a name="line.380"></a>
<span class="sourceLineNo">381</span>                AnnotationDescriptor ann = new AnnotationDescriptor(name, visible);<a name="line.381"></a>
<span class="sourceLineNo">382</span>                m_method.addParameterAnnotation(id, ann);<a name="line.382"></a>
<span class="sourceLineNo">383</span>                return ann;<a name="line.383"></a>
<span class="sourceLineNo">384</span>            }<a name="line.384"></a>
<span class="sourceLineNo">385</span>            <a name="line.385"></a>
<span class="sourceLineNo">386</span>            /*<a name="line.386"></a>
<span class="sourceLineNo">387</span>             * It is harmless to keep injected parameter annotations on original constructor<a name="line.387"></a>
<span class="sourceLineNo">388</span>             * for correct property resolution in case of re-manipulation<a name="line.388"></a>
<span class="sourceLineNo">389</span>             */<a name="line.389"></a>
<span class="sourceLineNo">390</span>            if(m_method.getName().equals("$init"))<a name="line.390"></a>
<span class="sourceLineNo">391</span>            {<a name="line.391"></a>
<span class="sourceLineNo">392</span>                AnnotationDescriptor ann = new AnnotationDescriptor(name, visible);<a name="line.392"></a>
<span class="sourceLineNo">393</span>                m_method.addParameterAnnotation(id, ann);<a name="line.393"></a>
<span class="sourceLineNo">394</span>                return ann;<a name="line.394"></a>
<span class="sourceLineNo">395</span>            }<a name="line.395"></a>
<span class="sourceLineNo">396</span>            <a name="line.396"></a>
<span class="sourceLineNo">397</span>            return null;<a name="line.397"></a>
<span class="sourceLineNo">398</span>        }<a name="line.398"></a>
<span class="sourceLineNo">399</span><a name="line.399"></a>
<span class="sourceLineNo">400</span><a name="line.400"></a>
<span class="sourceLineNo">401</span>    }<a name="line.401"></a>
<span class="sourceLineNo">402</span><a name="line.402"></a>
<span class="sourceLineNo">403</span>    /**<a name="line.403"></a>
<span class="sourceLineNo">404</span>     * Describes a method or constructor annotation.<a name="line.404"></a>
<span class="sourceLineNo">405</span>     * This allows creating a copy of the annotations found in the original class<a name="line.405"></a>
<span class="sourceLineNo">406</span>     * to move them on inserted method. This class implements an<a name="line.406"></a>
<span class="sourceLineNo">407</span>     * {@link AnnotationVisitor} in order to create the copy.<a name="line.407"></a>
<span class="sourceLineNo">408</span>     * This class contains a &lt;code&gt;visit&lt;/code&gt; method re-injecting the<a name="line.408"></a>
<span class="sourceLineNo">409</span>     * annotation in the generated method.<a name="line.409"></a>
<span class="sourceLineNo">410</span>     * @author &lt;a href="mailto:dev@felix.apache.org"&gt;Felix Project Team&lt;/a&gt;<a name="line.410"></a>
<span class="sourceLineNo">411</span>     */<a name="line.411"></a>
<span class="sourceLineNo">412</span>    public class AnnotationDescriptor implements AnnotationVisitor {<a name="line.412"></a>
<span class="sourceLineNo">413</span>        /**<a name="line.413"></a>
<span class="sourceLineNo">414</span>         * The name of the annotation.<a name="line.414"></a>
<span class="sourceLineNo">415</span>         */<a name="line.415"></a>
<span class="sourceLineNo">416</span>        private String m_name;<a name="line.416"></a>
<span class="sourceLineNo">417</span>        /**<a name="line.417"></a>
<span class="sourceLineNo">418</span>         * Is the annotation visible at runtime?<a name="line.418"></a>
<span class="sourceLineNo">419</span>         */<a name="line.419"></a>
<span class="sourceLineNo">420</span>        private boolean m_visible;<a name="line.420"></a>
<span class="sourceLineNo">421</span>        /**<a name="line.421"></a>
<span class="sourceLineNo">422</span>         * The description of the annotation.<a name="line.422"></a>
<span class="sourceLineNo">423</span>         * This attribute is set only for nested annotations.<a name="line.423"></a>
<span class="sourceLineNo">424</span>         */<a name="line.424"></a>
<span class="sourceLineNo">425</span>        private String m_desc;<a name="line.425"></a>
<span class="sourceLineNo">426</span>        /**<a name="line.426"></a>
<span class="sourceLineNo">427</span>         * The list of 'simple' attributes.<a name="line.427"></a>
<span class="sourceLineNo">428</span>         */<a name="line.428"></a>
<span class="sourceLineNo">429</span>        private List&lt;SimpleAttribute&gt; m_simples = new ArrayList&lt;SimpleAttribute&gt;(0);<a name="line.429"></a>
<span class="sourceLineNo">430</span>        /**<a name="line.430"></a>
<span class="sourceLineNo">431</span>         * The list of attribute containing an<a name="line.431"></a>
<span class="sourceLineNo">432</span>         * enumeration value.<a name="line.432"></a>
<span class="sourceLineNo">433</span>         */<a name="line.433"></a>
<span class="sourceLineNo">434</span>        private List&lt;EnumAttribute&gt; m_enums = new ArrayList&lt;EnumAttribute&gt;(0);<a name="line.434"></a>
<span class="sourceLineNo">435</span>        /**<a name="line.435"></a>
<span class="sourceLineNo">436</span>         * The list of attribute which are<a name="line.436"></a>
<span class="sourceLineNo">437</span>         * annotations.<a name="line.437"></a>
<span class="sourceLineNo">438</span>         */<a name="line.438"></a>
<span class="sourceLineNo">439</span>        private List&lt;AnnotationDescriptor&gt; m_nested = new ArrayList&lt;AnnotationDescriptor&gt;(0);<a name="line.439"></a>
<span class="sourceLineNo">440</span>        /**<a name="line.440"></a>
<span class="sourceLineNo">441</span>         * The list of attribute which are<a name="line.441"></a>
<span class="sourceLineNo">442</span>         * arrays.<a name="line.442"></a>
<span class="sourceLineNo">443</span>         */<a name="line.443"></a>
<span class="sourceLineNo">444</span>        private List&lt;ArrayAttribute&gt; m_arrays = new ArrayList&lt;ArrayAttribute&gt;(0);<a name="line.444"></a>
<span class="sourceLineNo">445</span><a name="line.445"></a>
<span class="sourceLineNo">446</span><a name="line.446"></a>
<span class="sourceLineNo">447</span>        /**<a name="line.447"></a>
<span class="sourceLineNo">448</span>         * Creates an annotation descriptor.<a name="line.448"></a>
<span class="sourceLineNo">449</span>         * This constructor is used for 'root' annotations.<a name="line.449"></a>
<span class="sourceLineNo">450</span>         * @param name the name of the  annotation<a name="line.450"></a>
<span class="sourceLineNo">451</span>         * @param visible the visibility of the annotation at runtime<a name="line.451"></a>
<span class="sourceLineNo">452</span>         */<a name="line.452"></a>
<span class="sourceLineNo">453</span>        public AnnotationDescriptor(String name, boolean visible) {<a name="line.453"></a>
<span class="sourceLineNo">454</span>            m_name = name;<a name="line.454"></a>
<span class="sourceLineNo">455</span>            m_visible = visible;<a name="line.455"></a>
<span class="sourceLineNo">456</span>        }<a name="line.456"></a>
<span class="sourceLineNo">457</span><a name="line.457"></a>
<span class="sourceLineNo">458</span>        /**<a name="line.458"></a>
<span class="sourceLineNo">459</span>         * Creates an annotation descriptor.<a name="line.459"></a>
<span class="sourceLineNo">460</span>         * This constructor is used for nested annotations.<a name="line.460"></a>
<span class="sourceLineNo">461</span>         * @param name the name of the  annotation<a name="line.461"></a>
<span class="sourceLineNo">462</span>         * @param desc the descriptor of the annotation<a name="line.462"></a>
<span class="sourceLineNo">463</span>         */<a name="line.463"></a>
<span class="sourceLineNo">464</span>        public AnnotationDescriptor(String name, String desc) {<a name="line.464"></a>
<span class="sourceLineNo">465</span>            m_name = name;<a name="line.465"></a>
<span class="sourceLineNo">466</span>            m_visible = true;<a name="line.466"></a>
<span class="sourceLineNo">467</span>            m_desc = desc;<a name="line.467"></a>
<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
<span class="sourceLineNo">469</span><a name="line.469"></a>
<span class="sourceLineNo">470</span><a name="line.470"></a>
<span class="sourceLineNo">471</span>        /**<a name="line.471"></a>
<span class="sourceLineNo">472</span>         * Visits a simple attribute.<a name="line.472"></a>
<span class="sourceLineNo">473</span>         * @param arg0 the attribute name<a name="line.473"></a>
<span class="sourceLineNo">474</span>         * @param arg1 the attribute value<a name="line.474"></a>
<span class="sourceLineNo">475</span>         * @see org.objectweb.asm.AnnotationVisitor#visit(java.lang.String, java.lang.Object)<a name="line.475"></a>
<span class="sourceLineNo">476</span>         */<a name="line.476"></a>
<span class="sourceLineNo">477</span>        public void visit(String arg0, Object arg1) {<a name="line.477"></a>
<span class="sourceLineNo">478</span>            m_simples.add(new SimpleAttribute(arg0, arg1));<a name="line.478"></a>
<span class="sourceLineNo">479</span>        }<a name="line.479"></a>
<span class="sourceLineNo">480</span><a name="line.480"></a>
<span class="sourceLineNo">481</span><a name="line.481"></a>
<span class="sourceLineNo">482</span>        /**<a name="line.482"></a>
<span class="sourceLineNo">483</span>         * Visits a nested annotation.<a name="line.483"></a>
<span class="sourceLineNo">484</span>         * @param arg0 the attribute name<a name="line.484"></a>
<span class="sourceLineNo">485</span>         * @param arg1 the annotation descriptor<a name="line.485"></a>
<span class="sourceLineNo">486</span>         * @return the annotation visitor parsing the nested annotation<a name="line.486"></a>
<span class="sourceLineNo">487</span>         * @see org.objectweb.asm.AnnotationVisitor#visitAnnotation(java.lang.String, java.lang.String)<a name="line.487"></a>
<span class="sourceLineNo">488</span>         */<a name="line.488"></a>
<span class="sourceLineNo">489</span>        public AnnotationVisitor visitAnnotation(String arg0, String arg1) {<a name="line.489"></a>
<span class="sourceLineNo">490</span>            AnnotationDescriptor ad = new AnnotationDescriptor(arg0, arg1);<a name="line.490"></a>
<span class="sourceLineNo">491</span>            m_nested.add(ad);<a name="line.491"></a>
<span class="sourceLineNo">492</span>            return ad;<a name="line.492"></a>
<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
<span class="sourceLineNo">494</span><a name="line.494"></a>
<span class="sourceLineNo">495</span><a name="line.495"></a>
<span class="sourceLineNo">496</span>        /**<a name="line.496"></a>
<span class="sourceLineNo">497</span>         * Visits an array attribute.<a name="line.497"></a>
<span class="sourceLineNo">498</span>         * @param arg0 the name of the attribute<a name="line.498"></a>
<span class="sourceLineNo">499</span>         * @return the annotation visitor parsing the content of the array,<a name="line.499"></a>
<span class="sourceLineNo">500</span>         * uses a specific {@link ArrayAttribute} to parse this array<a name="line.500"></a>
<span class="sourceLineNo">501</span>         * @see org.objectweb.asm.AnnotationVisitor#visitArray(java.lang.String)<a name="line.501"></a>
<span class="sourceLineNo">502</span>         */<a name="line.502"></a>
<span class="sourceLineNo">503</span>        public AnnotationVisitor visitArray(String arg0) {<a name="line.503"></a>
<span class="sourceLineNo">504</span>            ArrayAttribute aa = new ArrayAttribute(arg0);<a name="line.504"></a>
<span class="sourceLineNo">505</span>            m_arrays.add(aa);<a name="line.505"></a>
<span class="sourceLineNo">506</span>            return aa;<a name="line.506"></a>
<span class="sourceLineNo">507</span>        }<a name="line.507"></a>
<span class="sourceLineNo">508</span><a name="line.508"></a>
<span class="sourceLineNo">509</span><a name="line.509"></a>
<span class="sourceLineNo">510</span>        /**<a name="line.510"></a>
<span class="sourceLineNo">511</span>         * End of the visit.<a name="line.511"></a>
<span class="sourceLineNo">512</span>         * @see org.objectweb.asm.AnnotationVisitor#visitEnd()<a name="line.512"></a>
<span class="sourceLineNo">513</span>         */<a name="line.513"></a>
<span class="sourceLineNo">514</span>        public void visitEnd() { }<a name="line.514"></a>
<span class="sourceLineNo">515</span><a name="line.515"></a>
<span class="sourceLineNo">516</span><a name="line.516"></a>
<span class="sourceLineNo">517</span>        /**<a name="line.517"></a>
<span class="sourceLineNo">518</span>         * Visits an enumeration attribute.<a name="line.518"></a>
<span class="sourceLineNo">519</span>         * @param arg0 the attribute name<a name="line.519"></a>
<span class="sourceLineNo">520</span>         * @param arg1 the enumeration descriptor<a name="line.520"></a>
<span class="sourceLineNo">521</span>         * @param arg2 the attribute value<a name="line.521"></a>
<span class="sourceLineNo">522</span>         * @see org.objectweb.asm.AnnotationVisitor#visitEnum(java.lang.String, java.lang.String, java.lang.String)<a name="line.522"></a>
<span class="sourceLineNo">523</span>         */<a name="line.523"></a>
<span class="sourceLineNo">524</span>        public void visitEnum(String arg0, String arg1, String arg2) {<a name="line.524"></a>
<span class="sourceLineNo">525</span>            m_enums.add(new EnumAttribute(arg0, arg1, arg2));<a name="line.525"></a>
<span class="sourceLineNo">526</span>        }<a name="line.526"></a>
<span class="sourceLineNo">527</span><a name="line.527"></a>
<span class="sourceLineNo">528</span>        /**<a name="line.528"></a>
<span class="sourceLineNo">529</span>         * Methods allowing to recreate the visited (stored) annotation<a name="line.529"></a>
<span class="sourceLineNo">530</span>         * into the destination method.<a name="line.530"></a>
<span class="sourceLineNo">531</span>         * This method recreate the annotations itself and any other<a name="line.531"></a>
<span class="sourceLineNo">532</span>         * attributes.<a name="line.532"></a>
<span class="sourceLineNo">533</span>         * @param mv the method visitor visiting the destination method.<a name="line.533"></a>
<span class="sourceLineNo">534</span>         */<a name="line.534"></a>
<span class="sourceLineNo">535</span>        public void visitAnnotation(MethodVisitor mv) {<a name="line.535"></a>
<span class="sourceLineNo">536</span>            AnnotationVisitor av = mv.visitAnnotation(m_name, m_visible);<a name="line.536"></a>
<span class="sourceLineNo">537</span>            for (int i = 0; i &lt; m_simples.size(); i++) {<a name="line.537"></a>
<span class="sourceLineNo">538</span>                m_simples.get(i).visit(av);<a name="line.538"></a>
<span class="sourceLineNo">539</span>            }<a name="line.539"></a>
<span class="sourceLineNo">540</span>            for (int i = 0; i &lt; m_enums.size(); i++) {<a name="line.540"></a>
<span class="sourceLineNo">541</span>                m_enums.get(i).visit(av);<a name="line.541"></a>
<span class="sourceLineNo">542</span>            }<a name="line.542"></a>
<span class="sourceLineNo">543</span>            for (int i = 0; i &lt; m_nested.size(); i++) {<a name="line.543"></a>
<span class="sourceLineNo">544</span>                m_nested.get(i).visit(av);<a name="line.544"></a>
<span class="sourceLineNo">545</span>            }<a name="line.545"></a>
<span class="sourceLineNo">546</span>            for (int i = 0; i &lt; m_arrays.size(); i++) {<a name="line.546"></a>
<span class="sourceLineNo">547</span>                m_arrays.get(i).visit(av);<a name="line.547"></a>
<span class="sourceLineNo">548</span>            }<a name="line.548"></a>
<span class="sourceLineNo">549</span>            av.visitEnd();<a name="line.549"></a>
<span class="sourceLineNo">550</span>        }<a name="line.550"></a>
<span class="sourceLineNo">551</span><a name="line.551"></a>
<span class="sourceLineNo">552</span>        /**<a name="line.552"></a>
<span class="sourceLineNo">553</span>         * Methods allowing to recreate the visited (stored) parameter annotations<a name="line.553"></a>
<span class="sourceLineNo">554</span>         * into the destination method.<a name="line.554"></a>
<span class="sourceLineNo">555</span>         * This method recreate the annotations itself and any other<a name="line.555"></a>
<span class="sourceLineNo">556</span>         * attributes.<a name="line.556"></a>
<span class="sourceLineNo">557</span>         * @param id the paramter id<a name="line.557"></a>
<span class="sourceLineNo">558</span>         * @param mv the method visitor visiting the destination method.<a name="line.558"></a>
<span class="sourceLineNo">559</span>         */<a name="line.559"></a>
<span class="sourceLineNo">560</span>        public void visitParameterAnnotation(int id, MethodVisitor mv) {<a name="line.560"></a>
<span class="sourceLineNo">561</span>            AnnotationVisitor av = mv.visitParameterAnnotation(id, m_name, m_visible);<a name="line.561"></a>
<span class="sourceLineNo">562</span>            for (int i = 0; i &lt; m_simples.size(); i++) {<a name="line.562"></a>
<span class="sourceLineNo">563</span>                m_simples.get(i).visit(av);<a name="line.563"></a>
<span class="sourceLineNo">564</span>            }<a name="line.564"></a>
<span class="sourceLineNo">565</span>            for (int i = 0; i &lt; m_enums.size(); i++) {<a name="line.565"></a>
<span class="sourceLineNo">566</span>                m_enums.get(i).visit(av);<a name="line.566"></a>
<span class="sourceLineNo">567</span>            }<a name="line.567"></a>
<span class="sourceLineNo">568</span>            for (int i = 0; i &lt; m_nested.size(); i++) {<a name="line.568"></a>
<span class="sourceLineNo">569</span>                m_nested.get(i).visit(av);<a name="line.569"></a>
<span class="sourceLineNo">570</span>            }<a name="line.570"></a>
<span class="sourceLineNo">571</span>            for (int i = 0; i &lt; m_arrays.size(); i++) {<a name="line.571"></a>
<span class="sourceLineNo">572</span>                m_arrays.get(i).visit(av);<a name="line.572"></a>
<span class="sourceLineNo">573</span>            }<a name="line.573"></a>
<span class="sourceLineNo">574</span>            av.visitEnd();<a name="line.574"></a>
<span class="sourceLineNo">575</span>        }<a name="line.575"></a>
<span class="sourceLineNo">576</span><a name="line.576"></a>
<span class="sourceLineNo">577</span>        /**<a name="line.577"></a>
<span class="sourceLineNo">578</span>         * Method allowing to recreate the visited (stored) annotation<a name="line.578"></a>
<span class="sourceLineNo">579</span>         * into the destination annotation. This method is used only<a name="line.579"></a>
<span class="sourceLineNo">580</span>         * for nested annotation.<a name="line.580"></a>
<span class="sourceLineNo">581</span>         * @param mv the annotation visitor to populate with the stored<a name="line.581"></a>
<span class="sourceLineNo">582</span>         * annotation<a name="line.582"></a>
<span class="sourceLineNo">583</span>         */<a name="line.583"></a>
<span class="sourceLineNo">584</span>        public void visit(AnnotationVisitor mv) {<a name="line.584"></a>
<span class="sourceLineNo">585</span>            AnnotationVisitor av = mv.visitAnnotation(m_name, m_desc);<a name="line.585"></a>
<span class="sourceLineNo">586</span>            for (int i = 0; i &lt; m_simples.size(); i++) {<a name="line.586"></a>
<span class="sourceLineNo">587</span>                m_simples.get(i).visit(av);<a name="line.587"></a>
<span class="sourceLineNo">588</span>            }<a name="line.588"></a>
<span class="sourceLineNo">589</span>            for (int i = 0; i &lt; m_enums.size(); i++) {<a name="line.589"></a>
<span class="sourceLineNo">590</span>                m_enums.get(i).visit(av);<a name="line.590"></a>
<span class="sourceLineNo">591</span>            }<a name="line.591"></a>
<span class="sourceLineNo">592</span>            for (int i = 0; i &lt; m_nested.size(); i++) {<a name="line.592"></a>
<span class="sourceLineNo">593</span>                m_nested.get(i).visit(av);<a name="line.593"></a>
<span class="sourceLineNo">594</span>            }<a name="line.594"></a>
<span class="sourceLineNo">595</span>            for (int i = 0; i &lt; m_arrays.size(); i++) {<a name="line.595"></a>
<span class="sourceLineNo">596</span>                m_arrays.get(i).visit(av);<a name="line.596"></a>
<span class="sourceLineNo">597</span>            }<a name="line.597"></a>
<span class="sourceLineNo">598</span>            av.visitEnd();<a name="line.598"></a>
<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
<span class="sourceLineNo">600</span><a name="line.600"></a>
<span class="sourceLineNo">601</span><a name="line.601"></a>
<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
<span class="sourceLineNo">603</span><a name="line.603"></a>
<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
<span class="sourceLineNo">605</span>     * Describes an array attribute.<a name="line.605"></a>
<span class="sourceLineNo">606</span>     * This class is able to visit an annotation array attribute, and to<a name="line.606"></a>
<span class="sourceLineNo">607</span>     * recreate this array on another annotation.<a name="line.607"></a>
<span class="sourceLineNo">608</span>     * @author &lt;a href="mailto:dev@felix.apache.org"&gt;Felix Project Team&lt;/a&gt;<a name="line.608"></a>
<span class="sourceLineNo">609</span>     */<a name="line.609"></a>
<span class="sourceLineNo">610</span>    public class ArrayAttribute implements AnnotationVisitor {<a name="line.610"></a>
<span class="sourceLineNo">611</span>        /**<a name="line.611"></a>
<span class="sourceLineNo">612</span>         * The name of the attribute.<a name="line.612"></a>
<span class="sourceLineNo">613</span>         */<a name="line.613"></a>
<span class="sourceLineNo">614</span>        private String m_name;<a name="line.614"></a>
<span class="sourceLineNo">615</span>        /**<a name="line.615"></a>
<span class="sourceLineNo">616</span>         * The content of the parsed array.<a name="line.616"></a>
<span class="sourceLineNo">617</span>         */<a name="line.617"></a>
<span class="sourceLineNo">618</span>        private List&lt;Object&gt; m_content = new ArrayList&lt;Object&gt;();<a name="line.618"></a>
<span class="sourceLineNo">619</span><a name="line.619"></a>
<span class="sourceLineNo">620</span>        /**<a name="line.620"></a>
<span class="sourceLineNo">621</span>         * Creates an array attribute.<a name="line.621"></a>
<span class="sourceLineNo">622</span>         * @param name the name of the attribute.<a name="line.622"></a>
<span class="sourceLineNo">623</span>         */<a name="line.623"></a>
<span class="sourceLineNo">624</span>        public ArrayAttribute(String name) {<a name="line.624"></a>
<span class="sourceLineNo">625</span>            m_name = name;<a name="line.625"></a>
<span class="sourceLineNo">626</span>        }<a name="line.626"></a>
<span class="sourceLineNo">627</span><a name="line.627"></a>
<span class="sourceLineNo">628</span>        /**<a name="line.628"></a>
<span class="sourceLineNo">629</span>         * Visits the content of the array. This method is called for<a name="line.629"></a>
<span class="sourceLineNo">630</span>         * simple values.<a name="line.630"></a>
<span class="sourceLineNo">631</span>         * @param arg0 &lt;code&gt;null&lt;/code&gt;<a name="line.631"></a>
<span class="sourceLineNo">632</span>         * @param arg1 the value<a name="line.632"></a>
<span class="sourceLineNo">633</span>         * @see org.objectweb.asm.AnnotationVisitor#visit(java.lang.String, java.lang.Object)<a name="line.633"></a>
<span class="sourceLineNo">634</span>         */<a name="line.634"></a>
<span class="sourceLineNo">635</span>        public void visit(String arg0, Object arg1) {<a name="line.635"></a>
<span class="sourceLineNo">636</span>            m_content.add(arg1);<a name="line.636"></a>
<span class="sourceLineNo">637</span>        }<a name="line.637"></a>
<span class="sourceLineNo">638</span><a name="line.638"></a>
<span class="sourceLineNo">639</span>        /**<a name="line.639"></a>
<span class="sourceLineNo">640</span>         * Visits the content of the array. This method is called for<a name="line.640"></a>
<span class="sourceLineNo">641</span>         * nested annotations (annotations contained in the array).<a name="line.641"></a>
<span class="sourceLineNo">642</span>         * @param arg0 &lt;code&gt;null&lt;/code&gt;<a name="line.642"></a>
<span class="sourceLineNo">643</span>         * @param arg1 the annotation descriptor<a name="line.643"></a>
<span class="sourceLineNo">644</span>         * @return an {@link AnnotationDescriptor} which creates a copy of<a name="line.644"></a>
<span class="sourceLineNo">645</span>         * the contained annotation.<a name="line.645"></a>
<span class="sourceLineNo">646</span>         * @see org.objectweb.asm.AnnotationVisitor#visitAnnotation(String, String)<a name="line.646"></a>
<span class="sourceLineNo">647</span>         */<a name="line.647"></a>
<span class="sourceLineNo">648</span>        public AnnotationVisitor visitAnnotation(String arg0, String arg1) {<a name="line.648"></a>
<span class="sourceLineNo">649</span>            AnnotationDescriptor ad = new AnnotationDescriptor(null, arg1);<a name="line.649"></a>
<span class="sourceLineNo">650</span>            m_content.add(ad);<a name="line.650"></a>
<span class="sourceLineNo">651</span>            return ad;<a name="line.651"></a>
<span class="sourceLineNo">652</span>        }<a name="line.652"></a>
<span class="sourceLineNo">653</span><a name="line.653"></a>
<span class="sourceLineNo">654</span>        /**<a name="line.654"></a>
<span class="sourceLineNo">655</span>         * Visits the content of the array. This method is called for<a name="line.655"></a>
<span class="sourceLineNo">656</span>         * nested arrays (arrays contained in the array).<a name="line.656"></a>
<span class="sourceLineNo">657</span>         * @param arg0 &lt;code&gt;null&lt;/code&gt;<a name="line.657"></a>
<span class="sourceLineNo">658</span>         * @return an {@link AnnotationVisitor} which creates a copy of<a name="line.658"></a>
<span class="sourceLineNo">659</span>         * the contained array.<a name="line.659"></a>
<span class="sourceLineNo">660</span>         * @see org.objectweb.asm.AnnotationVisitor#visitArray(String)<a name="line.660"></a>
<span class="sourceLineNo">661</span>         */<a name="line.661"></a>
<span class="sourceLineNo">662</span>        public AnnotationVisitor visitArray(String arg0) {<a name="line.662"></a>
<span class="sourceLineNo">663</span>            ArrayAttribute aa = new ArrayAttribute(null);<a name="line.663"></a>
<span class="sourceLineNo">664</span>            m_content.add(aa);<a name="line.664"></a>
<span class="sourceLineNo">665</span>            return aa;<a name="line.665"></a>
<span class="sourceLineNo">666</span>        }<a name="line.666"></a>
<span class="sourceLineNo">667</span><a name="line.667"></a>
<span class="sourceLineNo">668</span>        /**<a name="line.668"></a>
<span class="sourceLineNo">669</span>         * End of the array attribute visit.<a name="line.669"></a>
<span class="sourceLineNo">670</span>         * @see org.objectweb.asm.AnnotationVisitor#visitEnd()<a name="line.670"></a>
<span class="sourceLineNo">671</span>         */<a name="line.671"></a>
<span class="sourceLineNo">672</span>        public void visitEnd() {  }<a name="line.672"></a>
<span class="sourceLineNo">673</span><a name="line.673"></a>
<span class="sourceLineNo">674</span>        /**<a name="line.674"></a>
<span class="sourceLineNo">675</span>         * Visits the content of the array. This method is called for<a name="line.675"></a>
<span class="sourceLineNo">676</span>         * enumeration values.<a name="line.676"></a>
<span class="sourceLineNo">677</span>         * @param arg0 &lt;code&gt;null&lt;/code&gt;<a name="line.677"></a>
<span class="sourceLineNo">678</span>         * @param arg1 the enumeration descriptor<a name="line.678"></a>
<span class="sourceLineNo">679</span>         * @param arg2 the value<a name="line.679"></a>
<span class="sourceLineNo">680</span>         * @see org.objectweb.asm.AnnotationVisitor#visitEnum(String, String, String)<a name="line.680"></a>
<span class="sourceLineNo">681</span>         */<a name="line.681"></a>
<span class="sourceLineNo">682</span>        public void visitEnum(String arg0, String arg1, String arg2) {<a name="line.682"></a>
<span class="sourceLineNo">683</span>            EnumAttribute ea = new EnumAttribute(null, arg1, arg2);<a name="line.683"></a>
<span class="sourceLineNo">684</span>            m_content.add(ea);<a name="line.684"></a>
<span class="sourceLineNo">685</span>        }<a name="line.685"></a>
<span class="sourceLineNo">686</span><a name="line.686"></a>
<span class="sourceLineNo">687</span>        /**<a name="line.687"></a>
<span class="sourceLineNo">688</span>         * Recreates the visited array attribute. This method<a name="line.688"></a>
<span class="sourceLineNo">689</span>         * handle the generation of the object embedded in the<a name="line.689"></a>
<span class="sourceLineNo">690</span>         * array.<a name="line.690"></a>
<span class="sourceLineNo">691</span>         * @param av the annotation visitor on which the array attribute<a name="line.691"></a>
<span class="sourceLineNo">692</span>         * needs to be injected.<a name="line.692"></a>
<span class="sourceLineNo">693</span>         */<a name="line.693"></a>
<span class="sourceLineNo">694</span>        public void visit(AnnotationVisitor av) {<a name="line.694"></a>
<span class="sourceLineNo">695</span>            AnnotationVisitor content = av.visitArray(m_name);<a name="line.695"></a>
<span class="sourceLineNo">696</span>            for (int i = 0; i &lt; m_content.size(); i++) {<a name="line.696"></a>
<span class="sourceLineNo">697</span>                Object component = m_content.get(i);<a name="line.697"></a>
<span class="sourceLineNo">698</span>                if (component instanceof AnnotationDescriptor) {<a name="line.698"></a>
<span class="sourceLineNo">699</span>                    ((AnnotationDescriptor) component).visit(content);<a name="line.699"></a>
<span class="sourceLineNo">700</span>                } else if (component instanceof EnumAttribute) {<a name="line.700"></a>
<span class="sourceLineNo">701</span>                    ((EnumAttribute) component).visit(content);<a name="line.701"></a>
<span class="sourceLineNo">702</span>                } else if (component instanceof ArrayAttribute) {<a name="line.702"></a>
<span class="sourceLineNo">703</span>                    ((ArrayAttribute) component).visit(content);<a name="line.703"></a>
<span class="sourceLineNo">704</span>                } else { // Simple<a name="line.704"></a>
<span class="sourceLineNo">705</span>                    content.visit(null, component);<a name="line.705"></a>
<span class="sourceLineNo">706</span>                }<a name="line.706"></a>
<span class="sourceLineNo">707</span>            }<a name="line.707"></a>
<span class="sourceLineNo">708</span>            content.visitEnd();<a name="line.708"></a>
<span class="sourceLineNo">709</span>        }<a name="line.709"></a>
<span class="sourceLineNo">710</span><a name="line.710"></a>
<span class="sourceLineNo">711</span>    }<a name="line.711"></a>
<span class="sourceLineNo">712</span><a name="line.712"></a>
<span class="sourceLineNo">713</span>    /**<a name="line.713"></a>
<span class="sourceLineNo">714</span>     * Describes a simple attribute.<a name="line.714"></a>
<span class="sourceLineNo">715</span>     * This class is able to visit an annotation simple attribute, and to<a name="line.715"></a>
<span class="sourceLineNo">716</span>     * recreate this attribute on another annotation.<a name="line.716"></a>
<span class="sourceLineNo">717</span>     * @author &lt;a href="mailto:dev@felix.apache.org"&gt;Felix Project Team&lt;/a&gt;<a name="line.717"></a>
<span class="sourceLineNo">718</span>     */<a name="line.718"></a>
<span class="sourceLineNo">719</span>    public static final class SimpleAttribute {<a name="line.719"></a>
<span class="sourceLineNo">720</span>        /**<a name="line.720"></a>
<span class="sourceLineNo">721</span>         * The name of the attribute.<a name="line.721"></a>
<span class="sourceLineNo">722</span>         */<a name="line.722"></a>
<span class="sourceLineNo">723</span>        private String m_name;<a name="line.723"></a>
<span class="sourceLineNo">724</span>        /**<a name="line.724"></a>
<span class="sourceLineNo">725</span>         * The value of the attribute.<a name="line.725"></a>
<span class="sourceLineNo">726</span>         */<a name="line.726"></a>
<span class="sourceLineNo">727</span>        private Object m_value;<a name="line.727"></a>
<span class="sourceLineNo">728</span><a name="line.728"></a>
<span class="sourceLineNo">729</span>        /**<a name="line.729"></a>
<span class="sourceLineNo">730</span>         * Creates a simple attribute.<a name="line.730"></a>
<span class="sourceLineNo">731</span>         * @param name the name of the attribute<a name="line.731"></a>
<span class="sourceLineNo">732</span>         * @param object the value of the attribute<a name="line.732"></a>
<span class="sourceLineNo">733</span>         */<a name="line.733"></a>
<span class="sourceLineNo">734</span>        private SimpleAttribute(String name, Object object) {<a name="line.734"></a>
<span class="sourceLineNo">735</span>            m_name = name;<a name="line.735"></a>
<span class="sourceLineNo">736</span>            m_value = object;<a name="line.736"></a>
<span class="sourceLineNo">737</span>        }<a name="line.737"></a>
<span class="sourceLineNo">738</span><a name="line.738"></a>
<span class="sourceLineNo">739</span>        /**<a name="line.739"></a>
<span class="sourceLineNo">740</span>         * Recreates the attribute on the given annotation.<a name="line.740"></a>
<span class="sourceLineNo">741</span>         * @param visitor the visitor on which the attribute needs<a name="line.741"></a>
<span class="sourceLineNo">742</span>         * to be injected.<a name="line.742"></a>
<span class="sourceLineNo">743</span>         */<a name="line.743"></a>
<span class="sourceLineNo">744</span>        public void visit(AnnotationVisitor visitor) {<a name="line.744"></a>
<span class="sourceLineNo">745</span>            visitor.visit(m_name, m_value);<a name="line.745"></a>
<span class="sourceLineNo">746</span>        }<a name="line.746"></a>
<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
<span class="sourceLineNo">748</span><a name="line.748"></a>
<span class="sourceLineNo">749</span>    /**<a name="line.749"></a>
<span class="sourceLineNo">750</span>     * Describes an attribute. The value of this attribute is an enumerated<a name="line.750"></a>
<span class="sourceLineNo">751</span>     * value.<a name="line.751"></a>
<span class="sourceLineNo">752</span>     * This class is able to visit an annotation enumeration attribute, and to<a name="line.752"></a>
<span class="sourceLineNo">753</span>     * recreate this attribute on another annotation.<a name="line.753"></a>
<span class="sourceLineNo">754</span>     * @author &lt;a href="mailto:dev@felix.apache.org"&gt;Felix Project Team&lt;/a&gt;<a name="line.754"></a>
<span class="sourceLineNo">755</span>     */<a name="line.755"></a>
<span class="sourceLineNo">756</span>    public static final class EnumAttribute {<a name="line.756"></a>
<span class="sourceLineNo">757</span>        /**<a name="line.757"></a>
<span class="sourceLineNo">758</span>         * The name of the attribute.<a name="line.758"></a>
<span class="sourceLineNo">759</span>         */<a name="line.759"></a>
<span class="sourceLineNo">760</span>        private String m_name;<a name="line.760"></a>
<span class="sourceLineNo">761</span>        /**<a name="line.761"></a>
<span class="sourceLineNo">762</span>         * The descriptor of the enumeration.<a name="line.762"></a>
<span class="sourceLineNo">763</span>         */<a name="line.763"></a>
<span class="sourceLineNo">764</span>        private String m_desc;<a name="line.764"></a>
<span class="sourceLineNo">765</span>        /**<a name="line.765"></a>
<span class="sourceLineNo">766</span>         * The value of the attribute.<a name="line.766"></a>
<span class="sourceLineNo">767</span>         */<a name="line.767"></a>
<span class="sourceLineNo">768</span>        private String m_value;<a name="line.768"></a>
<span class="sourceLineNo">769</span><a name="line.769"></a>
<span class="sourceLineNo">770</span>        /**<a name="line.770"></a>
<span class="sourceLineNo">771</span>         * Creates a enumeration attribute.<a name="line.771"></a>
<span class="sourceLineNo">772</span>         * @param name the name of the attribute.<a name="line.772"></a>
<span class="sourceLineNo">773</span>         * @param desc the descriptor of the {@link Enum}<a name="line.773"></a>
<span class="sourceLineNo">774</span>         * @param value the enumerated value<a name="line.774"></a>
<span class="sourceLineNo">775</span>         */<a name="line.775"></a>
<span class="sourceLineNo">776</span>        private EnumAttribute(String name, String desc, String value) {<a name="line.776"></a>
<span class="sourceLineNo">777</span>            m_name = name;<a name="line.777"></a>
<span class="sourceLineNo">778</span>            m_value = value;<a name="line.778"></a>
<span class="sourceLineNo">779</span>            m_desc = desc;<a name="line.779"></a>
<span class="sourceLineNo">780</span>        }<a name="line.780"></a>
<span class="sourceLineNo">781</span><a name="line.781"></a>
<span class="sourceLineNo">782</span>        /**<a name="line.782"></a>
<span class="sourceLineNo">783</span>         * Recreates the attribute on the given annotation.<a name="line.783"></a>
<span class="sourceLineNo">784</span>         * @param visitor the visitor on which the attribute needs<a name="line.784"></a>
<span class="sourceLineNo">785</span>         * to be injected.<a name="line.785"></a>
<span class="sourceLineNo">786</span>         */<a name="line.786"></a>
<span class="sourceLineNo">787</span>        public void visit(AnnotationVisitor visitor) {<a name="line.787"></a>
<span class="sourceLineNo">788</span>            visitor.visitEnum(m_name, m_desc, m_value);<a name="line.788"></a>
<span class="sourceLineNo">789</span>        }<a name="line.789"></a>
<span class="sourceLineNo">790</span><a name="line.790"></a>
<span class="sourceLineNo">791</span>    }<a name="line.791"></a>
<span class="sourceLineNo">792</span><a name="line.792"></a>
<span class="sourceLineNo">793</span><a name="line.793"></a>
<span class="sourceLineNo">794</span>    /**<a name="line.794"></a>
<span class="sourceLineNo">795</span>     * Class required to detect inner classes assigned to static field and thus must not be manipulated (FELIX-4347).<a name="line.795"></a>
<span class="sourceLineNo">796</span>     * If an inner class is assigned to a static field, it must not be manipulated.<a name="line.796"></a>
<span class="sourceLineNo">797</span>     *<a name="line.797"></a>
<span class="sourceLineNo">798</span>     * However notice that this is only useful when AspectJ is used, because aspectJ is changing the 'staticity' of<a name="line.798"></a>
<span class="sourceLineNo">799</span>     * the inner class.<a name="line.799"></a>
<span class="sourceLineNo">800</span>     */<a name="line.800"></a>
<span class="sourceLineNo">801</span>    private class InnerClassAssignedToStaticFieldDetector extends EmptyVisitor implements MethodVisitor {<a name="line.801"></a>
<span class="sourceLineNo">802</span><a name="line.802"></a>
<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
<span class="sourceLineNo">804</span>        public void visitTypeInsn(int opcode, String type) {<a name="line.804"></a>
<span class="sourceLineNo">805</span>            if (opcode == NEW  &amp;&amp; m_inners.containsKey(type)) {<a name="line.805"></a>
<span class="sourceLineNo">806</span>                m_inners.remove(type);<a name="line.806"></a>
<span class="sourceLineNo">807</span>            }<a name="line.807"></a>
<span class="sourceLineNo">808</span>        }<a name="line.808"></a>
<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
<span class="sourceLineNo">810</span>}<a name="line.810"></a>




























































</pre>
</div>
</body>
</html>
