package act.app; /*- * #%L * ACT Framework * %% * Copyright (C) 2014 - 2017 ActFramework * %% * 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. * #L% */ import act.Act; import act.plugin.Plugin; import org.osgl.$; import org.osgl.exception.NotAppliedException; import org.osgl.util.IO; import java.io.File; import java.util.List; /** * Common implementation of {@link ProjectLayoutProbe} * by inspecting a certain application build file, e.g. pom.xml for maven * based application */ public class BuildFileProbe extends ProjectLayoutProbe { public interface BuildFileNameProvider { String buildFileName(); } public static abstract class FileParser extends $.F1<File, ProjectLayout> implements BuildFileNameProvider, Plugin { @Override public ProjectLayout apply(File file) throws NotAppliedException, $.Break { return parse(file); } @Override public void register() { Act.mode().appScanner().register(new BuildFileProbe(this)); } protected abstract ProjectLayout parse(File file); } public static abstract class StringParser extends $.F1<String, ProjectLayout> implements BuildFileNameProvider, Plugin { @Override public ProjectLayout apply(String s) throws NotAppliedException, $.Break { return parse(s); } @Override public void register() { Act.mode().appScanner().register(new BuildFileProbe(this)); } protected abstract ProjectLayout parse(String fileContent); } public static abstract class LinesParser extends $.F1<List<String>, ProjectLayout> implements BuildFileNameProvider, Plugin { @Override public ProjectLayout apply(List<String> lines) throws NotAppliedException, $.Break { return parse(lines); } @Override public void register() { Act.mode().appScanner().register(new BuildFileProbe(this)); } protected abstract ProjectLayout parse(List<String> lines); } private String buildFileName; private FileParser fileParser = null; private StringParser stringParser = null; private LinesParser linesParser = null; public BuildFileProbe(FileParser fp) { buildFileName = fp.buildFileName(); fileParser = fp; } public BuildFileProbe(StringParser sp) { buildFileName = sp.buildFileName(); stringParser = sp; } public BuildFileProbe(LinesParser lp) { buildFileName = lp.buildFileName(); linesParser = lp; } public String buildFileName() { return buildFileName; } @Override public ProjectLayout probe(File appBase) { File buildFile = new File(appBase, buildFileName); if (buildFile.exists() && buildFile.canRead()) { if (null != fileParser) { return fileParser.parse(buildFile); } else if (null != stringParser) { return stringParser.parse(IO.readContentAsString(buildFile)); } else if (null != linesParser) { return linesParser.parse(IO.readLines(buildFile)); } assert false; } return null; } }