package com.github.linsolas.casperjsrunner.toolchain; import static com.github.linsolas.casperjsrunner.toolchain.CasperjsToolchain.KEY_CASPERJS_EXECUTABLE; import static com.github.linsolas.casperjsrunner.toolchain.CasperjsToolchain.KEY_CASPERJS_TYPE; import org.apache.maven.toolchain.MisconfiguredToolchainException; import org.apache.maven.toolchain.RequirementMatcherFactory; import org.apache.maven.toolchain.ToolchainFactory; import org.apache.maven.toolchain.ToolchainPrivate; import org.apache.maven.toolchain.model.ToolchainModel; import org.codehaus.plexus.component.annotations.Component; import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.xml.Xpp3Dom; import java.io.File; /** * Based on {@code org.apache.maven.toolchain.java.DefaultJavaToolchainFactory}. */ @Component(role = ToolchainFactory.class, hint = KEY_CASPERJS_TYPE, description = "A default factory for '" + KEY_CASPERJS_TYPE + "' toolchains") public class DefaultCasperjsToolchainFactory implements ToolchainFactory, LogEnabled { private Logger logger; @Override public ToolchainPrivate createToolchain(final ToolchainModel model) throws MisconfiguredToolchainException { if (model == null) { return null; } final DefaultCasperjsToolchain toolchain = new DefaultCasperjsToolchain(model, logger); Xpp3Dom dom = (Xpp3Dom) model.getConfiguration(); final Xpp3Dom casperjsExecutable = dom.getChild(KEY_CASPERJS_EXECUTABLE); if (casperjsExecutable == null) { throw new MisconfiguredToolchainException("CasperJS toolchain without the " + KEY_CASPERJS_EXECUTABLE + " configuration element."); } final File normal = new File(FileUtils.normalize(casperjsExecutable.getValue())); if (normal.exists()) { toolchain.setCasperjsExecutable(FileUtils.normalize(casperjsExecutable.getValue())); } else { throw new MisconfiguredToolchainException("Non-existing casperjs executable at " + normal.getAbsolutePath()); } // now populate the provides section. dom = (Xpp3Dom) model.getProvides(); final Xpp3Dom[] provides = dom.getChildren(); for (final Xpp3Dom provide : provides) { final String key = provide.getName(); final String value = provide.getValue(); if (value == null) { throw new MisconfiguredToolchainException("Provides token '" + key + "' doesn't have any value configured."); } if ("version".equals(key)) { toolchain.addProvideToken(key, RequirementMatcherFactory.createVersionMatcher(value)); } else { toolchain.addProvideToken(key, RequirementMatcherFactory.createExactMatcher(value)); } } return toolchain; } @Override public ToolchainPrivate createDefaultToolchain() { return null; } protected Logger getLogger() { return logger; } @Override public void enableLogging(final Logger l) { this.logger = l; } }