/* * 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.codegen.gwt.test; import java.io.File; import java.util.ArrayList; import java.util.List; import org.jboss.errai.common.metadata.RebindUtils; import com.google.gwt.core.ext.GeneratorContext; import com.google.gwt.core.ext.typeinfo.TypeOracle; import com.google.gwt.dev.javac.testing.GeneratorContextBuilder; import com.google.gwt.dev.javac.testing.JavaSource; import com.google.gwt.dev.javac.testing.Source; /** * A factory that helps create a mock TypeOracle that knows about a certain * collection of classes. * * @author Mike Brock * @author Jonathan Fuerth <jfuerth@redhat.com> */ public final class MockacleFactory { private static final Source MVEL_NULL_TYPE = new JavaSource("org.mvel2.util.NullType") { @Override public String getSource() { return "package org.mvel2.util;" + "public class NullType {}"; } }; private final File pathToTestFiles; private final List<Source> sourceFilesToAdd = new ArrayList<Source>(); /** * Creates a new type oracle factory that can load classes whose source is * rooted at the given directory. * * @param sourceDir * The root directory for the tree of .java files that will be loaded * into the mock TypeOracle. Must exist and must be a directory. */ public MockacleFactory(File sourceDir) { if (!sourceDir.exists()) { throw new IllegalArgumentException("Source location " + sourceDir.getAbsolutePath() + " does not exist"); } if (!sourceDir.isDirectory()) { throw new IllegalArgumentException("Source location " + sourceDir.getAbsolutePath() + " is not a directory"); } pathToTestFiles = sourceDir; sourceFilesToAdd.add(MVEL_NULL_TYPE); } public void addTestClass(final String fqcn) { sourceFilesToAdd.add(new JavaSource(fqcn) { // @Override // public String getPath() { // return getRelativePathToClassFromName(fqcn); // } @Override public String getSource() { return RebindUtils.readFileToString(new File(pathToTestFiles, getPath())); } }); } public TypeOracle generateMockacle() { final GeneratorContextBuilder contextBuilder = GeneratorContextBuilder.newCoreBasedBuilder(); for (final Source source : sourceFilesToAdd) { contextBuilder.add(source); } final GeneratorContext context = contextBuilder.buildGeneratorContext(); return context.getTypeOracle(); } private static String getPackageFromFQCN(final String fqcn) { final int index = fqcn.lastIndexOf('.'); if (index == -1) { return ""; } else { return fqcn.substring(0, index); } } private static String getNameFromFQCN(final String fqcn) { final int index = fqcn.lastIndexOf('.'); if (index == -1) { return fqcn; } else { return fqcn.substring(index + 1); } } private static String getRelativePathToClassFromName(final String fqcn) { return fqcn.replaceAll("\\.", "/") + ".java"; } private String getFullyQualifiedPathToClassFromName(final String fqcn) { return new File(pathToTestFiles, getPackageFromFQCN(fqcn)).getAbsolutePath(); } }