001/**
002 * Copyright 2013 John Ericksen
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *    http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.androidtransfuse.analysis.astAnalyzer;
017
018import org.androidtransfuse.adapter.ASTField;
019import org.androidtransfuse.adapter.ASTType;
020import org.androidtransfuse.analysis.AnalysisContext;
021import org.androidtransfuse.analysis.InjectionPointFactory;
022import org.androidtransfuse.annotations.NonConfigurationInstance;
023import org.androidtransfuse.model.InjectionNode;
024
025import javax.inject.Inject;
026
027/**
028 * Analysis class to identify nonConfiguration Instances(NCI).  This analysis triggers the given NCI to be defined as
029 * a field in the containing component.  This field is then used in the generated onRetainNonConfigurationInstance() and
030 * getLastNonConfigurationInstance() methods.
031 *
032 * @author John Ericksen
033 */
034public class NonConfigurationAnalysis extends ASTAnalysisAdaptor {
035
036    private final InjectionPointFactory injectionPointFactory;
037
038    @Inject
039    public NonConfigurationAnalysis(InjectionPointFactory injectionPointFactory) {
040        this.injectionPointFactory = injectionPointFactory;
041    }
042
043    @Override
044    public void analyzeField(InjectionNode injectionNode, ASTType concreteType, ASTField astField, AnalysisContext context) {
045
046        if(astField.isAnnotated(NonConfigurationInstance.class)){
047            NonConfigurationAspect aspect = buildAspect(injectionNode);
048            aspect.add(injectionPointFactory.buildInjectionPoint(injectionNode.getASTType(), concreteType, astField, context));
049
050            if (!injectionNode.containsAspect(ASTInjectionAspect.class)) {
051                injectionNode.addAspect(ASTInjectionAspect.class, new ASTInjectionAspect());
052            }
053
054            injectionNode.getAspect(ASTInjectionAspect.class).setAssignmentType(ASTInjectionAspect.InjectionAssignmentType.FIELD);
055        }
056    }
057
058    private NonConfigurationAspect buildAspect(InjectionNode injectionNode){
059        if(!injectionNode.containsAspect(NonConfigurationAspect.class)){
060            injectionNode.addAspect(new NonConfigurationAspect());
061        }
062        return injectionNode.getAspect(NonConfigurationAspect.class);
063    }
064}