| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.felix.scrplugin.description; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * A <code>ClassDescription</code> is describing the found annotations |
| * of a class. |
| * Its basically used as a wrapper to hold all the various annotations |
| * found in a class. This description only contains the annotations |
| * found in the current class, but not in any superclass. |
| * The annotations are available as descriptions. |
| * @see ComponentDescription |
| * @see ServiceDescription |
| * @see ReferenceDescription |
| * @see PropertyDescription |
| */ |
| public class ClassDescription { |
| |
| /** All descriptions. */ |
| final List<AbstractDescription> descriptions = new ArrayList<AbstractDescription>(); |
| |
| /** The corresponding class. */ |
| private final Class<?> describedClass; |
| |
| /** The source (file) of the class or any other location information. */ |
| private final String source; |
| |
| /** |
| * Create a new class description |
| */ |
| public ClassDescription(final Class<?> describedClass, final String source) { |
| this.describedClass = describedClass; |
| this.source = source; |
| } |
| |
| /** |
| * Get the associated class. |
| * @return The associated class. |
| */ |
| public Class<?> getDescribedClass() { |
| return this.describedClass; |
| } |
| |
| /** |
| * Get the location information like the source file etc. |
| * @return The location information. |
| */ |
| public String getSource() { |
| return this.source; |
| } |
| |
| /** |
| * Add a new description |
| */ |
| public void add(final AbstractDescription desc) { |
| this.descriptions.add(desc); |
| desc.setSource(this.source); |
| } |
| |
| /** |
| * Get all descriptions of that type. |
| * @param descType The description class. |
| * @return A list of found descriptions or the empty array. |
| */ |
| @SuppressWarnings("unchecked") |
| public <T extends AbstractDescription> List<T> getDescriptions(final Class<T> descType) { |
| final List<T> result = new ArrayList<T>(); |
| for(final AbstractDescription desc : descriptions) { |
| if ( descType.isAssignableFrom(desc.getClass()) ) { |
| result.add((T) desc); |
| } |
| } |
| return result; |
| } |
| |
| /** |
| * Get the first description of that type |
| * @param descType The description class |
| * @return THe first description or <code>null</code> |
| */ |
| public <T extends AbstractDescription> T getDescription(final Class<T> descType) { |
| final List<T> result = this.getDescriptions(descType); |
| if ( result.size() > 0 ) { |
| return result.get(0); |
| } |
| return null; |
| } |
| |
| @Override |
| public String toString() { |
| return "ClassDescription [descriptions=" + descriptions |
| + ", describedClass=" + describedClass + ", source=" + source |
| + "]"; |
| } |
| |
| public ClassDescription clone() { |
| final ClassDescription cd = new ClassDescription(this.describedClass, this.source); |
| for(final AbstractDescription ad : this.descriptions) { |
| cd.add(ad.clone()); |
| } |
| return cd; |
| } |
| } |