Package org.ngrinder.script.handler

Source Code of org.ngrinder.script.handler.GroovyMavenProjectScriptHandler

/*
* 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.ngrinder.script.handler;

import static org.ngrinder.common.util.CollectionUtils.buildMap;
import static org.ngrinder.common.util.CollectionUtils.newArrayList;
import static org.ngrinder.common.util.CollectionUtils.newHashMap;
import static org.ngrinder.common.util.ExceptionUtils.processException;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.cli.MavenCli;
import org.ngrinder.common.util.PathUtils;
import org.ngrinder.common.util.PropertiesWrapper;
import org.ngrinder.common.util.UrlUtils;
import org.ngrinder.model.User;
import org.ngrinder.script.model.FileCategory;
import org.ngrinder.script.model.FileEntry;
import org.ngrinder.script.model.FileType;
import org.ngrinder.script.repository.FileEntryRepository;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import org.tmatesoft.svn.core.wc.SVNRevision;

/**
* Groovy Maven project {@link ScriptHandler}.
*
* @author JunHo Yoon
* @since 3.2
*/
@Component
public class GroovyMavenProjectScriptHandler extends GroovyScriptHandler implements ProjectHandler {

  /**
   * Constructor.
   */
  public GroovyMavenProjectScriptHandler() {
    super("groovy_maven", "", "Groovy Maven Project", "groovy");
  }

  private static final String RESOURCES = "/src/main/resources/";
  private static final String JAVA = "/src/main/java/";
  private static final String GROOVY = "/src/main/groovy/";
  private static final String LIB = "/lib/";

  @Override
  public boolean canHandle(FileEntry fileEntry) {
    if (fileEntry.getCreatedUser() == null) {
      return false;
    }
    String path = fileEntry.getPath();
    if (!FilenameUtils.isExtension(path, "groovy")) {
      return false;

    }
    //noinspection SimplifiableIfStatement
    if (!path.contains(JAVA) && !path.contains(GROOVY)) {
      return false;
    }

    return getFileEntryRepository().hasOne(fileEntry.getCreatedUser(), getBasePath(path) + "/pom.xml");
  }

  @Override
  public Integer displayOrder() {
    return 400;
  }

  @Override
  protected Integer order() {
    return 200;
  }

  @Override
  public List<FileEntry> getLibAndResourceEntries(User user, FileEntry scriptEntry, long revision) {
    List<FileEntry> fileList = newArrayList();
    String basePath = getBasePath(scriptEntry);
    FileEntryRepository fileEntryRepository = getFileEntryRepository();
    for (FileEntry eachFileEntry : fileEntryRepository.findAll(user, basePath + RESOURCES, revision, true)) {
      FileType fileType = eachFileEntry.getFileType();
      if (fileType.isResourceDistributable()) {
        fileList.add(eachFileEntry);
      }
    }

    for (FileEntry eachFileEntry : fileEntryRepository.findAll(user, basePath + JAVA, revision, true)) {
      FileType fileType = eachFileEntry.getFileType();

      if (fileType.isLibDistributable() && !eachFileEntry.getPath().equals(scriptEntry.getPath())) {
        fileList.add(eachFileEntry);
      }
    }

    for (FileEntry eachFileEntry : fileEntryRepository.findAll(user, basePath + GROOVY, revision, true)) {
      FileType fileType = eachFileEntry.getFileType();
      if (fileType.isLibDistributable() && !eachFileEntry.getPath().equals(scriptEntry.getPath())) {
        fileList.add(eachFileEntry);
      }
    }

    for (FileEntry eachFileEntry : fileEntryRepository.findAll(user, basePath + LIB, revision, true)) {
      FileType fileType = eachFileEntry.getFileType();
      if (fileType.isLibDistributable()) {
        fileList.add(eachFileEntry);
      }
    }
    fileList.add(fileEntryRepository.findOne(user, basePath + "/pom.xml", SVNRevision.create(revision)));
    return fileList;
  }

  @Override
  protected String calcDistSubPath(String basePath, FileEntry each) {
    String calcDistSubPath = super.calcDistSubPath(basePath, each);
    if (calcDistSubPath.startsWith(JAVA)) {
      return calcDistSubPath.substring(JAVA.length() - 1);
    } else if (calcDistSubPath.startsWith(GROOVY)) {
      return calcDistSubPath.substring(GROOVY.length() - 1);
    } else if (calcDistSubPath.startsWith(RESOURCES)) {
      return calcDistSubPath.substring(RESOURCES.length() - 1);
    }
    return calcDistSubPath;
  }

  @Override
  protected void prepareDistMore(Long testId, User user, FileEntry script, File distDir,
                                 PropertiesWrapper properties, ProcessingResultPrintStream processingResult) {
    String pomPathInSVN = PathUtils.join(getBasePath(script), "pom.xml");
    MavenCli cli = new MavenCli();
    processingResult.println("\nCopy dependencies by running 'mvn dependency:copy-dependencies"
        + " -DoutputDirectory=./lib -DexcludeScope=provided'");

    int result = cli.doMain(new String[]{ // goal specification
        "dependency:copy-dependencies", // run dependency goal
        "-DoutputDirectory=./lib", // to the lib folder
        "-DexcludeScope=provided" // but exclude the provided
        // library
    }, distDir.getAbsolutePath(), processingResult, processingResult);
    boolean success = (result == 0);
    if (success) {
      processingResult.printf("\nDependencies in %s was copied.\n", pomPathInSVN);
      LOGGER.info("Dependencies in {} is copied into {}/lib folder", pomPathInSVN, distDir.getAbsolutePath());
    } else {
      processingResult.printf("\nDependencies copy in %s is failed.\n", pomPathInSVN);
      LOGGER.info("Dependencies copy in {} is failed.", pomPathInSVN);
    }
    // Then it's not necessary to include pom.xml anymore.
    FileUtils.deleteQuietly(new File(distDir, "pom.xml"));
    processingResult.setSuccess(result == 0);
  }

  @Override
  public boolean prepareScriptEnv(User user, String path, String fileName, String name, // LF
                                  String url, boolean createLib) {
    path = PathUtils.join(path, fileName);
    try {
      // Create Dir entry
      createBaseDirectory(user, path);
      // Create each template entries
      createFileEntries(user, path, name, url);
      if (createLib) {
        createLibraryDirectory(user, path);
      }
    } catch (IOException e) {
      throw processException("Error while patching script_template", e);
    }
    return false;
  }

  private void createLibraryDirectory(User user, String path) {
    FileEntry fileEntry = new FileEntry();
    fileEntry.setPath(path + "/lib");
    fileEntry.setFileType(FileType.DIR);
    fileEntry.setDescription("put private libraries here");
    getFileEntryRepository().save(user, fileEntry, null);
  }

  private void createFileEntries(User user, String path, String name, String url) throws IOException {
    File scriptTemplateDir;
    scriptTemplateDir = new ClassPathResource("/script_template/" + getKey()).getFile();
    for (File each : FileUtils.listFiles(scriptTemplateDir, null, true)) {
      try {
        String subpath = each.getPath().substring(scriptTemplateDir.getPath().length());
        String fileContent = FileUtils.readFileToString(each, "UTF8");
        fileContent = fileContent.replace("${userName}", user.getUserName());
        fileContent = fileContent.replace("${name}", name);
        fileContent = fileContent.replace("${url}", url);
        FileEntry fileEntry = new FileEntry();
        fileEntry.setContent(fileContent);
        fileEntry.setPath(FilenameUtils.normalize(PathUtils.join(path, subpath), true));
        fileEntry.setDescription("create groovy maven project");
        String hostName = UrlUtils.getHost(url);
        if (StringUtils.isNotEmpty(hostName)
            && fileEntry.getFileType().getFileCategory() == FileCategory.SCRIPT) {
          Map<String, String> properties = newHashMap();
          properties.put("targetHosts", UrlUtils.getHost(url));
          fileEntry.setProperties(properties);
        }
        getFileEntryRepository().save(user, fileEntry, "UTF8");
      } catch (IOException e) {
        throw processException("Error while saving " + each.getName(), e);
      }
    }
  }

  private void createBaseDirectory(User user, String path) {
    FileEntry dirEntry = new FileEntry();
    dirEntry.setPath(path);
    // Make it eclipse default folder ignored.
    dirEntry.setProperties(buildMap("svn:ignore", ".project\n.classpath\n.settings\ntarget"));
    dirEntry.setFileType(FileType.DIR);
    dirEntry.setDescription("create groovy maven project");
    getFileEntryRepository().save(user, dirEntry, null);
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.ngrinder.script.handler.ScriptHandler#getBasePath(java.lang.String)
   */
  @Override
  public String getBasePath(String path) {
    if (path.contains(JAVA)) {
      return path.substring(0, path.lastIndexOf(JAVA));
    } else {
      return path.substring(0, path.lastIndexOf(GROOVY));
    }
  }

  @Override
  public String getScriptExecutePath(String path) {
    if (path.contains(JAVA)) {
      return path.substring(path.lastIndexOf(JAVA) + JAVA.length());
    } else {
      return path.substring(path.lastIndexOf(GROOVY) + GROOVY.length());
    }
  }

  @Override
  public FileEntry getDefaultQuickTestFilePath(String path) {
    FileEntry fileEntry = new FileEntry();
    fileEntry.setPath(path + JAVA + "TestRunner.groovy");
    return fileEntry;
  }

}
TOP

Related Classes of org.ngrinder.script.handler.GroovyMavenProjectScriptHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.