/*
* Copyright (C) 2015 Red Hat, Inc. and/or its affiliates.
*
* 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.jboss.errai.ioc.rebind.ioc.bootstrapper;
import static org.jboss.errai.codegen.util.Stmt.castTo;
import static org.jboss.errai.codegen.util.Stmt.loadLiteral;
import static org.jboss.errai.codegen.util.Stmt.loadVariable;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Qualifier;
import org.jboss.errai.codegen.Statement;
import org.jboss.errai.codegen.builder.ContextualStatementBuilder;
import org.jboss.errai.codegen.meta.HasAnnotations;
import org.jboss.errai.codegen.meta.MetaClass;
import org.jboss.errai.codegen.meta.MetaField;
import org.jboss.errai.codegen.meta.MetaMethod;
import org.jboss.errai.codegen.util.Stmt;
import org.jboss.errai.ioc.client.container.Factory;
import org.jboss.errai.ioc.rebind.ioc.injector.api.FactoryController;
/**
* Some useful methods for generating code to inject dependencies in {@link Factory factories}.
*
* @author Max Barkley <mbarkley@redhat.com>
*/
public class InjectUtil {
public static Statement invokePublicOrPrivateMethod(final FactoryController controller, final MetaMethod method, final Statement... params) {
if (method.isPublic()) {
return loadVariable("instance").invoke(method, (Object[]) params);
} else {
return controller.exposedMethodStmt(method, params);
}
}
public static List<Annotation> extractQualifiers(final HasAnnotations annotated) {
final List<Annotation> qualifiers = new ArrayList<Annotation>();
for (final Annotation anno : annotated.getAnnotations()) {
if (anno.annotationType().isAnnotationPresent(Qualifier.class)) {
qualifiers.add(anno);
}
}
return qualifiers;
}
public static ContextualStatementBuilder getPublicOrPrivateFieldValue(final FactoryController controller, final MetaField field) {
if (field.isPublic()) {
return loadVariable("instance").loadField(field);
} else {
return controller.exposedFieldStmt(field);
}
}
/**
* Generates code to call
* {@link Factory#getReferenceAs(Object, String, Class)} for an instance in
* {@link Factory#createInstance(org.jboss.errai.ioc.client.container.ContextManager)}
* and
* {@link Factory#destroyInstance(Object, org.jboss.errai.ioc.client.container.ContextManager)}
* methods.
*/
public static ContextualStatementBuilder constructGetReference(final String name, final Class<?> refType) {
// This cast is for the benefit of codegen, which is sometimes unable to
// identify the value for the type parameter of Factory.getReferenceAs.
return castTo(refType, loadVariable("thisInstance").invoke("getReferenceAs", loadVariable("instance"), name, refType));
}
/**
* Generates code to call
* {@link Factory#getReferenceAs(Object, String, Class)} for an instance in
* {@link Factory#createInstance(org.jboss.errai.ioc.client.container.ContextManager)}
* and
* {@link Factory#destroyInstance(Object, org.jboss.errai.ioc.client.container.ContextManager)}
* methods.
*/
public static ContextualStatementBuilder constructGetReference(final String name, final MetaClass refType) {
// This cast is for the benefit of codegen, which is sometimes unable to
// identify the value for the type parameter of Factory.getReferenceAs.
return castTo(refType, loadVariable("thisInstance").invoke("getReferenceAs", loadVariable("instance"), name, loadLiteral(refType)));
}
/**
* Generates code to call {@link Factory#setReference(Object, String, Object)}
* for an instance in the
* {@link Factory#createInstance(org.jboss.errai.ioc.client.container.ContextManager)}
* method.
*/
public static ContextualStatementBuilder constructSetReference(final String name, final Statement value) {
return loadVariable("thisInstance").invoke("setReference", Stmt.loadVariable("instance"), name, value);
}
}