/*
* Copyright 2009 Werner Guttmann
*
* Licensed 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.castor.core.annotationprocessing;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.castor.core.nature.BaseNature;
/**
* Base implementation class to be used for implementing {@link AnnotationProcessingService}s.
*
* @see AnnotationProcessingService
* @author Alexander Eibner, Peter Schmidt
* @since 1.3.1
*/
public class BaseTargetAwareAnnotationProcessingService extends
BaseAnnotationProcessingService implements
TargetAwareAnnotationProcessingService {
/**
* List of target aware annotation processors.
*/
private Map<Class<? extends Annotation>, TargetAwareAnnotationProcessor> _taAnnotationProcessorMap = new HashMap<Class<? extends Annotation>, TargetAwareAnnotationProcessor>();
/**
* {@inheritDoc}
*
* @see org.castor.annotationprocessing.AnnotationProcessingService#
* addAnnotationProcessor(AnnotationProcessor)
*/
public void addAnnotationProcessor(
final TargetAwareAnnotationProcessor taAnnotationProcessor) {
if (taAnnotationProcessor != null) {
_taAnnotationProcessorMap.put(taAnnotationProcessor
.forAnnotationClass(), taAnnotationProcessor);
}
}
/**
* {@inheritDoc}
*
* @see org.castor.core.annotationprocessing.TargetAwareAnnotationProcessingService#getAllAnnotationProcessors()
*/
public Set<AnnotationProcessor> getAllAnnotationProcessors() {
Set<AnnotationProcessor> result = new HashSet<AnnotationProcessor>(
super.getAnnotationProcessors());
result.addAll(this._taAnnotationProcessorMap.values());
return result;
}
/**
* {@inheritDoc}
*
* @see org.castor.core.annotationprocessing.TargetAwareAnnotationProcessingService#getTargetAwareAnnotationProcessors()
*/
public Set<TargetAwareAnnotationProcessor> getTargetAwareAnnotationProcessors() {
Set<TargetAwareAnnotationProcessor> result = new HashSet<TargetAwareAnnotationProcessor>(
this._taAnnotationProcessorMap.values());
return result;
}
/**
* {@inheritDoc}
*
* @see org.castor.core.annotationprocessing.TargetAwareAnnotationProcessingService#processAnnotation(org.castor.core.nature.BaseNature,
* java.lang.annotation.Annotation, java.lang.reflect.AnnotatedElement)
*/
public <I extends BaseNature, A extends Annotation> boolean processAnnotation(
I info, A annotation, AnnotatedElement target) throws AnnotationTargetException {
boolean processed = false;
TargetAwareAnnotationProcessor annotationProcessor = _taAnnotationProcessorMap
.get(annotation.annotationType());
if (annotationProcessor != null) {
processed = annotationProcessor.processAnnotation(info, annotation,
target);
}
return processed;
}
/**
* {@inheritDoc}
*
* @see org.castor.core.annotationprocessing.TargetAwareAnnotationProcessingService#processAnnotations(org.castor.core.nature.BaseNature,
* java.lang.annotation.Annotation[],
* java.lang.reflect.AnnotatedElement)
*/
public <I extends BaseNature> Annotation[] processAnnotations(I info,
Annotation[] annotations, AnnotatedElement target) throws AnnotationTargetException {
ArrayList<Annotation> unprocessed = new ArrayList<Annotation>();
for (int i = 0; i < annotations.length; i++) {
if (processAnnotation(info, annotations[i], target) == false) {
unprocessed.add(annotations[i]);
}
}
Annotation[] arrReturn = new Annotation[unprocessed.size()];
return unprocessed.toArray(arrReturn);
}
/**
* This method acts like it's super method, but also tries to process the
* annotation with the {@link TargetAwareAnnotationProcessor}s.
* {@inheritDoc}
*
* @see org.castor.core.annotationprocessing.BaseAnnotationProcessingService#processAnnotation(org.castor.core.nature.BaseNature,
* java.lang.annotation.Annotation)
*/
@Override
public <I extends BaseNature, A extends Annotation> boolean processAnnotation(
I info, A annotation) {
boolean superReturn = super.processAnnotation(info, annotation);
if (!superReturn) {
boolean processed = false;
AnnotationProcessor annotationProcessor = _taAnnotationProcessorMap
.get(annotation.annotationType());
if (annotationProcessor != null) {
processed = annotationProcessor.processAnnotation(info,
annotation);
}
return processed;
}
return superReturn;
}
/**
* This method acts like it's super method, but also tries to process the
* annotations with the {@link TargetAwareAnnotationProcessor}s.
* {@inheritDoc}
*
* @see org.castor.core.annotationprocessing.BaseAnnotationProcessingService#processAnnotations(org.castor.core.nature.BaseNature,
* java.lang.annotation.Annotation)
*/
@Override
public <I extends BaseNature> Annotation[] processAnnotations(I info,
Annotation[] annotations) {
Annotation[] superUnprocessed = super.processAnnotations(info,
annotations);
ArrayList<Annotation> unprocessed = new ArrayList<Annotation>();
for (int i = 0; i < superUnprocessed.length; i++) {
if (processAnnotation(info, superUnprocessed[i]) == false) {
unprocessed.add(superUnprocessed[i]);
}
}
Annotation[] arrReturn = new Annotation[unprocessed.size()];
return unprocessed.toArray(arrReturn);
}
}