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.gen.variableBuilder;
017
018import com.sun.codemodel.JExpr;
019import com.sun.codemodel.JExpression;
020import com.sun.codemodel.JInvocation;
021import org.androidtransfuse.gen.ClassGenerationUtil;
022import org.androidtransfuse.gen.InjectionBuilderContext;
023import org.androidtransfuse.gen.InjectionExpressionBuilder;
024import org.androidtransfuse.gen.variableDecorator.TypedExpressionFactory;
025import org.androidtransfuse.model.InjectionNode;
026import org.androidtransfuse.model.TypedExpression;
027import org.androidtransfuse.util.ExtraUtil;
028
029import javax.inject.Inject;
030import javax.inject.Named;
031
032/**
033 * @author John Ericksen
034 */
035public class ExtraValuableBuilder extends ConsistentTypeVariableBuilder {
036
037    private static final String GET_INTENT = "getIntent";
038    private static final String GET_EXTRAS = "getExtras";
039
040    private final boolean wrapped;
041    private final String extraId;
042    private final InjectionNode activityInjectionNode;
043    private final InjectionExpressionBuilder injectionExpressionBuilder;
044    private final boolean nullable;
045    private final ClassGenerationUtil generationUtil;
046
047    @Inject
048    public ExtraValuableBuilder(/*@Assisted*/ String extraId,
049                                /*@Assisted*/ InjectionNode activityInjectionNode,
050                                /*@Assisted("nullable")*/ @Named("nullable") boolean nullable,
051                                /*@Assisted("wrapped")*/ @Named("wrapped") boolean wrapped,
052                                InjectionExpressionBuilder injectionExpressionBuilder,
053                                ClassGenerationUtil generationUtil,
054                                TypedExpressionFactory typedExpressionFactory) {
055        super(Object.class, typedExpressionFactory);
056        this.extraId = extraId;
057        this.activityInjectionNode = activityInjectionNode;
058        this.injectionExpressionBuilder = injectionExpressionBuilder;
059        this.nullable = nullable;
060        this.generationUtil = generationUtil;
061        this.wrapped = wrapped;
062    }
063
064    @Override
065    public JExpression buildExpression(InjectionBuilderContext injectionBuilderContext, InjectionNode injectionNode) {
066        TypedExpression contextVar = injectionExpressionBuilder.buildVariable(injectionBuilderContext, activityInjectionNode);
067
068        JInvocation getExtraInvocation = generationUtil.ref(ExtraUtil.class)
069                .staticInvoke(ExtraUtil.GET_EXTRA)
070                .arg(contextVar.getExpression().invoke(GET_INTENT).invoke(GET_EXTRAS))
071                .arg(JExpr.lit(extraId))
072                .arg(JExpr.lit(nullable));
073
074        if (wrapped) {
075            getExtraInvocation = ((JExpression) JExpr.cast(generationUtil.ref("org.parceler.ParcelWrapper"),
076                    getExtraInvocation)).invoke("getParcel");
077        }
078
079        return getExtraInvocation;
080    }
081}