/* * Copyright (C) 2011 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.codegen.builder.impl; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.enterprise.util.TypeLiteral; import org.jboss.errai.codegen.DefModifiers; import org.jboss.errai.codegen.DefParameters; import org.jboss.errai.codegen.Modifier; import org.jboss.errai.codegen.ThrowsDeclaration; import org.jboss.errai.codegen.builder.BlockBuilder; import org.jboss.errai.codegen.builder.MethodBlockBuilder; import org.jboss.errai.codegen.builder.MethodBuildCallback; import org.jboss.errai.codegen.builder.MethodCommentBuilder; import org.jboss.errai.codegen.literal.LiteralFactory; import org.jboss.errai.codegen.meta.MetaClass; import org.jboss.errai.codegen.meta.MetaClassFactory; /** * @author Christian Sadilek <csadilek@redhat.com> * @author Mike Brock <cbrock@redhat.com> */ public class MethodBlockBuilderImpl<T> extends BlockBuilderImpl<T> implements MethodCommentBuilder<T> { protected String methodComment; protected ThrowsDeclaration throwsDeclaration = ThrowsDeclaration.none(); protected final MethodBuildCallback<T> callback; protected DefParameters defParameters; protected final DefModifiers modifiers = new DefModifiers(); protected final List<Annotation> annotations = new ArrayList<Annotation>(); public MethodBlockBuilderImpl(final MethodBuildCallback<T> callback) { super(null); this.callback = callback; } @Override public MethodBlockBuilder<T> methodComment(final String comment) { methodComment = comment; return this; } @Override public MethodBlockBuilder<T> annotatedWith(final Annotation... annotations) { Arrays.stream(annotations).forEach(a -> this.annotations.add(a)); return this; } @Override public MethodBlockBuilder<T> throws_(final Class<? extends Throwable>... exceptionTypes) { throwsDeclaration = ThrowsDeclaration.of(exceptionTypes); return this; } @Override public MethodBlockBuilder<T> throws_(final MetaClass... exceptions) { throwsDeclaration = ThrowsDeclaration.of(exceptions); return this; } @Override public MethodBlockBuilder<T> modifiers(final Modifier... modifiers) { for (final Modifier m : modifiers) { switch (m) { case Transient: case Volatile: throw new RuntimeException("illegal modifier for method: " + m); default: this.modifiers.addModifiers(m); } } return this; } @Override public MethodBlockBuilder<T> parameters(final DefParameters parms) { defParameters = parms; return this; } @Override public MethodBlockBuilder<T> parameters(final Class<?>... parms) { defParameters = DefParameters.fromTypeArray(MetaClassFactory.fromClassArray(parms)) ; return this; } @Override public MethodBlockBuilder<T> parameters(final MetaClass... parms) { defParameters = DefParameters.fromTypeArray(parms); return this; } @Override public MethodBlockBuilder<T> parameters(final Object... parms) { final List<MetaClass> p = new ArrayList<MetaClass>(); for (final Object o : parms) { LiteralFactory.getLiteral(o); if (o instanceof MetaClass) { p.add((MetaClass) o); } else if (o instanceof Class<?>) { p.add(MetaClassFactory.get((Class<?>) o)); } else if (o instanceof TypeLiteral) { p.add(MetaClassFactory.get((TypeLiteral) o)); } } defParameters = DefParameters.fromTypeArray(p.toArray(new MetaClass[p.size()])); return this; } @Override public BlockBuilder<T> body() { return this; } @Override public T finish() { if (callback != null) { return callback.callback(blockStatement, defParameters, modifiers, throwsDeclaration, annotations, methodComment); } return null; } }