/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.usergrid.chop.plugin; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStream; import java.util.Date; import java.util.Properties; import org.apache.maven.project.DefaultMavenProjectHelper; import org.codehaus.plexus.util.FileUtils; import org.apache.usergrid.chop.api.CoordinatorFig; import org.apache.usergrid.chop.api.Project; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProjectHelper; @Mojo( name = "runner", requiresDependencyResolution = ResolutionScope.TEST, requiresDependencyCollection = ResolutionScope.TEST ) public class RunnerMojo extends MainMojo { @Component private MavenProjectHelper projectHelper; @SuppressWarnings( "UnusedDeclaration" ) public RunnerMojo() { } protected RunnerMojo( MainMojo mojo ) { this.username = mojo.username; this.password = mojo.password; this.endpoint = mojo.endpoint; this.testPackageBase = mojo.testPackageBase; this.certStorePassphrase = mojo.certStorePassphrase; this.failIfCommitNecessary = mojo.failIfCommitNecessary; this.localRepository = mojo.localRepository; this.plugin = mojo.plugin; this.project = mojo.project; this.runnerCount = mojo.runnerCount; this.finalName = mojo.finalName; } @Override public void execute() throws MojoExecutionException { String gitConfigDirectory = Utils.getGitConfigFolder( getProjectBaseDirectory() ); String commitId = Utils.getLastCommitUuid( gitConfigDirectory ); if ( failIfCommitNecessary && Utils.isCommitNecessary( gitConfigDirectory ) ) { String failMsg = "There are modified sources, commit changes before calling the plugin or set " + "failIfCommitNecessary parameter as false in your plugin configuration field inside the pom.xml"; throw new MojoExecutionException( failMsg ); } try { String timeStamp = Utils.getTimestamp( new Date() ); // Extract the original chop-runner.jar file which should be in the local repository String runnerJarPath = getRunnerInLocalRepo(); String extractedRunnerPath = getExtractedRunnerPath(); if ( FileUtils.fileExists( extractedRunnerPath ) ) { FileUtils.cleanDirectory( extractedRunnerPath ); } else { FileUtils.mkdir( extractedRunnerPath ); } Utils.extractJar( new File( runnerJarPath ), extractedRunnerPath ); // Copy caller project jar and its dependency jars to topmost runner folder File libPathFile = new File( extractedRunnerPath ); String projectTestOutputJar = getProjectTestOutputJarPath(); if ( ! FileUtils.fileExists( projectTestOutputJar ) ) { throw new MojoExecutionException( "Project Test Jar could not be found. Make sure you use 'test-jar'" + " goal of the 'maven-jar-plugin' in your project's pom" ); } FileUtils.copyFileToDirectory( new File( getProjectOutputJarPath() ), libPathFile ); FileUtils.copyFileToDirectory( new File( projectTestOutputJar ), libPathFile ); Utils.copyArtifactsTo( this.project, extractedRunnerPath ); boolean successfullyCopiedResourceFiles = Utils.copyResourcesTo( this.project, extractedRunnerPath ); if ( successfullyCopiedResourceFiles ){ // Create project.properties file InputStream inputStream; Properties prop = new Properties(); String configPropertiesFilePath = extractedRunnerPath + "project.properties"; if ( FileUtils.fileExists( configPropertiesFilePath ) ) { // Existing project.properties of chop-runner inputStream = new FileInputStream( configPropertiesFilePath ); prop.load( inputStream ); inputStream.close(); } // If exists, properties in this file can overwrite the ones from chop-runner if ( getClass().getResource( "project.properties" ) != null ) { inputStream = getClass().getResourceAsStream( "project.properties" ); Properties propCurrent = new Properties(); propCurrent.load( inputStream ); inputStream.close(); String key; while ( propCurrent.propertyNames().hasMoreElements() ) { key = propCurrent.propertyNames().nextElement().toString(); prop.setProperty( key, propCurrent.getProperty( key ) ); } } // Insert all properties acquired in runtime and overwrite existing ones String gitUrl = Utils.getGitRemoteUrl( gitConfigDirectory ); String md5 = Utils.getMD5( timeStamp, commitId ); prop.setProperty( Project.GIT_UUID_KEY, commitId ); prop.setProperty( Project.GIT_URL_KEY, gitUrl ); prop.setProperty( Project.CREATE_TIMESTAMP_KEY, timeStamp ); prop.setProperty( Project.GROUP_ID_KEY, this.project.getGroupId() ); prop.setProperty( Project.ARTIFACT_ID_KEY, this.project.getArtifactId() ); prop.setProperty( Project.PROJECT_VERSION_KEY, this.project.getVersion() ); prop.setProperty( Project.TEST_PACKAGE_BASE, testPackageBase ); prop.setProperty( Project.MD5_KEY, md5 ); prop.setProperty( CoordinatorFig.USERNAME, username ); prop.setProperty( CoordinatorFig.PASSWORD, password ); prop.setProperty( CoordinatorFig.ENDPOINT, endpoint ); String uuid = commitId.substring( 0, CHARS_OF_UUID/2 ) + commitId.substring( commitId.length() - CHARS_OF_UUID/2 ); prop.setProperty( Project.LOAD_KEY, TESTS_PATH + '/' + uuid + '/' + RUNNER_JAR ); prop.setProperty( Project.LOAD_TIME_KEY, String.valueOf( System.currentTimeMillis() ) ); prop.setProperty( Project.CHOP_VERSION_KEY, plugin.getVersion() ); // Save the newly formed properties file under project.properties FileUtils.mkdir( configPropertiesFilePath.substring( 0, configPropertiesFilePath.lastIndexOf( '/' ) ) ); FileWriter writer = new FileWriter( configPropertiesFilePath ); prop.store( writer, "Generated with chop:runner" ); // Create the final runner file String finalPath = getRunnerFile().getAbsolutePath(); File finalFile = new File( finalPath ); Utils.archiveWar( finalFile, extractedRunnerPath ); // Attempt to attach the runner file with the chop classifier if ( projectHelper == null ) { projectHelper = new DefaultMavenProjectHelper(); } projectHelper.attachArtifact( project, finalFile, "chop" ); } else{ throw new MojoExecutionException( "There is no resource folder inside the project" ); } } catch ( MojoExecutionException e ) { throw e; } catch ( Exception e ) { e.printStackTrace(); throw new MojoExecutionException( "Error while executing plugin", e ); } } }