Package org.apache.beehive.controls.runtime.generator.apt

Source Code of org.apache.beehive.controls.runtime.generator.apt.ControlAnnotationProcessor

/*
* 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.
*
* $Header:$
*/
package org.apache.beehive.controls.runtime.generator.apt;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.declaration.AnnotationTypeDeclaration;
import com.sun.mirror.declaration.Declaration;

import org.apache.beehive.controls.api.bean.ControlExtension;
import org.apache.beehive.controls.api.bean.ControlImplementation;
import org.apache.beehive.controls.api.bean.ControlInterface;
import org.apache.beehive.controls.api.properties.PropertySet;

import org.apache.beehive.controls.runtime.generator.*;

public class ControlAnnotationProcessor extends TwoPhaseAnnotationProcessor
{
    public ControlAnnotationProcessor(Set<AnnotationTypeDeclaration> atds,
                                      AnnotationProcessorEnvironment env)
    {
        super(atds, env);
    }

    @Override
    public void check(Declaration decl)
    {
        AnnotationProcessorEnvironment env = getAnnotationProcessorEnvironment();
        Generator genClass = null;
        if (decl.getAnnotation(ControlInterface.class) != null)
        {
            genClass = new AptControlInterface(decl, this);
        }
        else if (decl.getAnnotation(ControlExtension.class) != null)
        {
            genClass = new AptControlInterface(decl, this);

            // When a control extension is declared, values may be assigned to
            // the properties of the parent controls.  The property constraint
            // validator is called here to ensure all values assigned satisfy any
            // constraints declared in the properties.
            try
            {
                AnnotationConstraintAptValidator.validate(decl);
            }
            catch (IllegalArgumentException iae)
            {
                printError(decl, "propertyset.illegal.argument.error", iae.getMessage());
            }
           
        }
        else if (decl.getAnnotation(ControlImplementation.class) != null)
        {
            genClass = new AptControlImplementation(decl, this);
        }
        else if (decl.getAnnotation(PropertySet.class) != null)
        {
            new AptPropertySet(null, decl, this);
        }

        if ( genClass != null && !hasErrors() )
        {
            try
            {
                List<GeneratorOutput> genList = genClass.getCheckOutput(env.getFiler());
                if (genList == null || genList.size() == 0)
                    return;

                for (GeneratorOutput genOut : genList)
                {
                    getGenerator().generate(genOut);
                }
            }
            catch (IOException ioe)
            {
                throw new CodeGenerationException("Code generation failure: ", ioe);
            }
        }
    }

    @Override
    public void generate(Declaration decl)
    {
        AnnotationProcessorEnvironment env = getAnnotationProcessorEnvironment();
        Generator genClass = null;
        if (decl.getAnnotation(ControlInterface.class) != null)
        {
            genClass = new AptControlInterface(decl, this);
        }
        if (decl.getAnnotation(ControlExtension.class) != null)
        {
            genClass = new AptControlInterface(decl, this);
        }
        else if (decl.getAnnotation(ControlImplementation.class) != null)
        {
            genClass = new AptControlImplementation(decl, this);
        }
       
        if ( genClass != null )
        {
            try
            {
                List<GeneratorOutput> genList = genClass.getGenerateOutput(env.getFiler());
                if (genList == null || genList.size() == 0)
                    return;

                for (GeneratorOutput genOut : genList)
                {
                    getGenerator().generate(genOut);
                }
            }
            catch (IOException ioe)
            {
                throw new CodeGenerationException("Code generation failure: ", ioe);
            }
        }
    }

    /**
     * Returns the CodeGenerator instance supporting this processor, instantiating a new
     * generator instance if necessary.
     */
    protected CodeGenerator getGenerator()
    {
        if (_generator == null)
        {
            //
            // Locate the class that wraps the Velocity code generation process
            //
            AnnotationProcessorEnvironment env = getAnnotationProcessorEnvironment();

            try
            {
                _generator = new VelocityGenerator(env);
            }
            catch (Exception e)
            {
                throw new CodeGenerationException("Unable to create code generator", e);
            }
        }
        return _generator;
    }

    HashMap<Declaration, Generator> _typeMap = new HashMap<Declaration,Generator>();
    CodeGenerator _generator;
}
TOP

Related Classes of org.apache.beehive.controls.runtime.generator.apt.ControlAnnotationProcessor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.