/**
* License Agreement.
*
* Rich Faces - Natural Ajax for Java Server Faces (JSF)
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.richfaces.cdk.apt;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.el.ELContext;
import javax.faces.component.UIComponent;
import javax.lang.model.element.Name;
import org.richfaces.cdk.CdkClassLoader;
import org.richfaces.cdk.CdkTestBase;
import org.richfaces.cdk.FileManager;
import org.richfaces.cdk.Generator;
import org.richfaces.cdk.LibraryBuilder;
import org.richfaces.cdk.Logger;
import org.richfaces.cdk.MockController;
import org.richfaces.cdk.Source;
import org.richfaces.cdk.SourceFileManagerImpl;
import org.richfaces.cdk.SourceImpl;
import org.richfaces.cdk.Sources;
import org.richfaces.cdk.annotations.JsfComponent;
import org.richfaces.cdk.apt.processors.ComponentProcessor;
import org.richfaces.cdk.model.ComponentModel;
import com.google.common.collect.ImmutableList;
import com.google.inject.Binder;
import com.google.inject.Inject;
import com.google.inject.Injector;
/**
* @author akolonitsky
* @since Jan 14, 2010
*/
public abstract class AnnotationProcessorTestBase extends CdkTestBase {
protected static final class TestName implements Name {
private final String name;
public TestName(String name) {
this.name = name;
}
@Override
public char charAt(int index) {
return name.charAt(index);
}
@Override
public boolean contentEquals(CharSequence cs) {
// TODO Auto-generated method stub
return name.equals(cs);
}
@Override
public int length() {
return name.length();
}
@Override
public CharSequence subSequence(int start, int end) {
return name.substring(start, end);
}
@Override
public String toString() {
return name;
}
}
protected static final String FOO_BAR = "foo.Bar";
@Inject
protected Logger log;
@Inject
@Source(Sources.JAVA_SOURCES)
protected FileManager sources;
@Inject
protected MockController mockController;
@Inject
private Injector injector;
@Override
public void configure(Binder binder) {
super.configure(binder);
try {
CdkClassLoader cdkClassLoader = createClassLoader();
binder.bind(CdkClassLoader.class).toInstance(cdkClassLoader);
List<File> sourceFiles = new ArrayList<File>();
for (String src : sources()) {
sourceFiles.add(getJavaFile(src));
}
binder.bind(FileManager.class).annotatedWith(new SourceImpl(Sources.JAVA_SOURCES))
.toInstance(new SourceFileManagerImpl(sourceFiles, null /* this.testSourceDirectory */));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected CdkClassLoader createClassLoader() {
try {
return new CdkClassLoader(ImmutableList.of(getLibraryFile("test.source.properties"),
getLibraryFile(ComponentModel.class), getLibraryFile(ELContext.class), getLibraryFile(JsfComponent.class),
getLibraryFile(UIComponent.class)), this.getClass().getClassLoader());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
protected void process(String javaFilePath) throws Exception {
Generator generator = new Generator();
generator.setLoader(createClassLoader());
generator.addSources(Sources.JAVA_SOURCES, ImmutableList.of(getJavaFile(javaFilePath)), null);
generator.init();
injector.injectMembers(new ComponentProcessor());
LibraryBuilder builder = injector.getInstance(LibraryBuilder.class);
builder.build();
}
protected abstract Iterable<String> sources();
}