001 /*
002 * Licensed under the Apache License, Version 2.0 (the "License");
003 * you may not use this file except in compliance with the License.
004 * You may obtain a copy of the License at
005 *
006 * http://www.apache.org/licenses/LICENSE-2.0
007 *
008 * Unless required by applicable law or agreed to in writing, software
009 * distributed under the License is distributed on an "AS IS" BASIS,
010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
011 * See the License for the specific language governing permissions and
012 * limitations under the License.
013 */
014 package org.apache.commons.classscan.bcel;
015
016 import java.util.Set;
017
018 import org.apache.bcel.classfile.AnnotationEntry;
019 import org.apache.bcel.classfile.ElementValuePair;
020 import org.apache.commons.classscan.builtin.ClassNameHelper;
021 import org.apache.commons.classscan.spi.model.SpiMetaAnnotation;
022 import org.apache.commons.classscan.spi.model.SpiMetaClassLoader;
023 import org.apache.commons.classscan.util.NameSet;
024
025 public class BcelAnnotation implements SpiMetaAnnotation {
026
027 private final String name;
028 private final NameSet<SpiProperty> properties;
029
030 public BcelAnnotation(AnnotationEntry annotation) {
031 name = ClassNameHelper.internalToCanonicalName(annotation.getAnnotationType());
032
033 ElementValuePair[] elementValuePairs = annotation.getElementValuePairs();
034 if (elementValuePairs.length == 0) {
035 properties = NameSet.emptyNameSet();
036 }
037 else {
038 properties = new NameSet<SpiProperty>(fillMapAndArray(elementValuePairs));
039 }
040 }
041
042 @Override
043 public boolean resolve(SpiMetaClassLoader classLoader) {
044 return properties.resolve(classLoader);
045 }
046
047 private SpiProperty[] fillMapAndArray(ElementValuePair[] evPairs) {
048 SpiProperty[] values = new SpiProperty[evPairs.length];
049 for (int i = 0; i < evPairs.length; ++i) {
050 values[i] = new BcelProperty(evPairs[i]);
051 }
052 return values;
053 }
054
055 @Override
056 public String getName() {
057 return name;
058 }
059
060 @Override
061 public Set<? extends Property> getProperties() {
062 return properties;
063 }
064
065 @Override
066 public Property getProperty(String propertyName) {
067 return properties.getValue(propertyName);
068 }
069 }