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.processor;
017
018import com.sun.codemodel.JDefinedClass;
019import org.androidtransfuse.adapter.ASTType;
020import org.androidtransfuse.analysis.repository.InjectionNodeBuilderRepository;
021import org.androidtransfuse.analysis.repository.InjectionNodeBuilderRepositoryFactory;
022import org.androidtransfuse.gen.FactoriesGenerator;
023import org.androidtransfuse.gen.variableBuilder.VariableInjectionBuilderFactory;
024import org.androidtransfuse.transaction.AbstractCompletionTransactionWorker;
025
026import javax.inject.Inject;
027import javax.inject.Provider;
028import java.util.Map;
029
030/**
031 * @author John Ericksen
032 */
033public class FactoriesTransactionWorker extends AbstractCompletionTransactionWorker<Map<Provider<ASTType>, JDefinedClass>, Void> {
034
035    private final FactoriesGenerator factoriesGenerator;
036    private final InjectionNodeBuilderRepositoryFactory injectionNodeBuilders;
037    private final VariableInjectionBuilderFactory variableInjectionBuilderFactory;
038    private final Provider<InjectionNodeBuilderRepository> injectionNodeBuilderRepositoryProvider;
039
040    @Inject
041    public FactoriesTransactionWorker(FactoriesGenerator factoriesGenerator,
042                                      InjectionNodeBuilderRepositoryFactory injectionNodeBuilders,
043                                      VariableInjectionBuilderFactory variableInjectionBuilderFactory,
044                                      Provider<InjectionNodeBuilderRepository> injectionNodeBuilderRepositoryProvider) {
045        this.factoriesGenerator = factoriesGenerator;
046        this.injectionNodeBuilders = injectionNodeBuilders;
047        this.variableInjectionBuilderFactory = variableInjectionBuilderFactory;
048        this.injectionNodeBuilderRepositoryProvider = injectionNodeBuilderRepositoryProvider;
049    }
050
051    @Override
052    public Void innerRun(Map<Provider<ASTType>, JDefinedClass> aggregate) {
053
054        //register factory configuration
055        InjectionNodeBuilderRepository repository = injectionNodeBuilderRepositoryProvider.get();
056        for (Provider<ASTType> typeProvider : aggregate.keySet()) {
057            ASTType type = typeProvider.get();
058
059            repository.putType(type, variableInjectionBuilderFactory.buildFactoryNodeBuilder(type));
060        }
061
062        injectionNodeBuilders.addModuleRepository(repository);
063
064
065        //setup Factories class
066        factoriesGenerator.generate(aggregate);
067
068        return null;
069    }
070}