/*
* 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.forge.facet.java;
import org.jboss.errai.forge.facet.resource.AbstractFileResourceFacet;
import org.jboss.forge.addon.facets.constraints.FacetConstraint;
import org.jboss.forge.addon.parser.java.facets.JavaSourceFacet;
import org.jboss.forge.addon.parser.java.resources.JavaResource;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@FacetConstraint({ JavaSourceFacet.class })
public class GwtMockitoRunnerFacet extends AbstractFileResourceFacet {
private static final String GWT_MOCKITO_RUNNER_REL_PATH = "org/jboss/errai/GwtMockitoRunnerExtension.java";
public GwtMockitoRunnerFacet() {
}
@Override
public String getRelFilePath() {
final JavaSourceFacet sourceFacet = getProject().getFacet(JavaSourceFacet.class);
final File testSourceDirectory = sourceFacet.getTestSourceDirectory().getUnderlyingResourceObject().getAbsoluteFile();
final File projectRoot = getProject().getRootDirectory().getUnderlyingResourceObject().getAbsoluteFile();
final File absoluteResult = new File(testSourceDirectory, GWT_MOCKITO_RUNNER_REL_PATH)
.getAbsoluteFile();
return absoluteResult.getPath().replace(projectRoot.getPath(), "");
}
@Override
protected String getResourceContent() throws Exception {
return readResource("/org/jboss/errai/forge/facet/java/GwtMockitoRunnerExtension.java").toString();
}
public boolean addBlacklistedPackage(final String packageName) {
final JavaSourceFacet sourceFacet = getProject().getFacet(JavaSourceFacet.class);
final JavaResource gwtRunner = getGwtRunnerResource(sourceFacet);
final String gwtRunnerContents = gwtRunner.getContents();
final Matcher packageAddMatcher = generatePatternForPackageAddStatement(packageName).matcher(gwtRunnerContents);
if (packageAddMatcher.find()) {
return false;
}
final Pattern pattern = Pattern.compile("\\s*\n([^\\S\n]*)return\\s+blacklisted\\s*;");
final Matcher matcher = pattern.matcher(gwtRunnerContents);
if (!matcher.find()) {
throw new IllegalStateException(String.format("%s has been modified.", GWT_MOCKITO_RUNNER_REL_PATH));
}
final String updatedGwtRunnerContents = new StringBuilder(gwtRunnerContents).insert(matcher.start(),
"\n" + matcher.group(1) + "blacklisted.add(\"" + packageName + "\");").toString();
gwtRunner.setContents(updatedGwtRunnerContents);
return true;
}
private JavaResource getGwtRunnerResource(final JavaSourceFacet sourceFacet) {
return sourceFacet.getTestJavaResource(GWT_MOCKITO_RUNNER_REL_PATH);
}
public boolean removeBlacklistedPackage(final String packageName) {
final JavaSourceFacet sourceFacet = getProject().getFacet(JavaSourceFacet.class);
final JavaResource gwtRunner = getGwtRunnerResource(sourceFacet);
final String gwtRunnerContents = gwtRunner.getContents();
final Matcher matcher = generatePatternForPackageAddStatement(packageName).matcher(
gwtRunnerContents);
if (matcher.find()) {
final String updatedGwtRunnerContents = new StringBuilder(gwtRunnerContents).replace(matcher.start(),
matcher.end(), "").toString();
gwtRunner.setContents(updatedGwtRunnerContents);
return true;
}
else {
return false;
}
}
public Set<String> getBlacklistedPackages() {
final JavaSourceFacet sourceFacet = getProject().getFacet(JavaSourceFacet.class);
final JavaResource gwtRunner = getGwtRunnerResource(sourceFacet);
final String gwtRunnerContents = gwtRunner.getContents();
final Pattern pattern = Pattern.compile("blacklisted\\s*\\.\\s*add\\s*\\(\\s*(\"|')(.*?)\\1\\s*\\);");
final Matcher matcher = pattern.matcher(gwtRunnerContents);
final Set<String> packages = new HashSet<String>();
while (matcher.find()) {
packages.add(matcher.group(2));
}
return packages;
}
private Pattern generatePatternForPackageAddStatement(final String packageName) {
return Pattern.compile(
"\\s*blacklisted\\s*\\.\\s*add\\s*\\(\\s*(\"|')" + Pattern.quote(packageName) + "\\1\\s*\\);");
}
}