summaryrefslogtreecommitdiffstats
path: root/openecomp-be/tools/compile-helper-plugin
diff options
context:
space:
mode:
Diffstat (limited to 'openecomp-be/tools/compile-helper-plugin')
-rw-r--r--openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/BuildHelper.java58
-rw-r--r--openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/BuildState.java72
-rw-r--r--openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/Constants.java5
-rw-r--r--openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/InitializationHelperMojo.java5
-rw-r--r--openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/PreCompileHelperMojo.java44
5 files changed, 151 insertions, 33 deletions
diff --git a/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/BuildHelper.java b/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/BuildHelper.java
index 681e5f71bd..1b1278d797 100644
--- a/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/BuildHelper.java
+++ b/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/BuildHelper.java
@@ -16,9 +16,13 @@
package org.openecomp.sdc.onboarding;
+import static org.openecomp.sdc.onboarding.Constants.CHECKSUM;
+import static org.openecomp.sdc.onboarding.Constants.COLON;
+import static org.openecomp.sdc.onboarding.Constants.DOT;
import static org.openecomp.sdc.onboarding.Constants.JAVA_EXT;
import static org.openecomp.sdc.onboarding.Constants.UNICORN;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -40,16 +44,44 @@ import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
import java.util.stream.Collectors;
import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
class BuildHelper {
+ private static Log logger;
+
+ private static Map<String, String> store = new HashMap<>();
+
private BuildHelper() {
// donot remove.
}
+ static void setLogger(Log log) {
+ logger = log;
+ }
+
+ static String getSnapshotSignature(File snapshotFile, String moduleCoordinate, String version) {
+ String key = moduleCoordinate + ":" + version;
+ String signature = store.get(key);
+ if (signature != null) {
+ return signature;
+ }
+ try {
+ signature = new String(fetchSnapshotSignature(snapshotFile, version));
+ store.put(key, signature);
+ return signature;
+ } catch (IOException ioe) {
+ logger.debug(ioe);
+ return version;
+ }
+
+ }
+
static long getChecksum(File file, String fileType) {
try {
return readSources(file, fileType).hashCode();
@@ -76,8 +108,7 @@ class BuildHelper {
if (file.exists()) {
List<File> list = Files.walk(Paths.get(file.getAbsolutePath()))
.filter(JAVA_EXT.equals(fileType) ? BuildHelper::isRegularJavaFile :
- Files::isRegularFile).map(p -> p.toFile())
- .collect(Collectors.toList());
+ Files::isRegularFile).map(Path::toFile).collect(Collectors.toList());
source.putAll(ForkJoinPool.commonPool()
.invoke(new FileReadTask(list.toArray(new File[0]), file.getAbsolutePath())));
}
@@ -143,7 +174,8 @@ class BuildHelper {
static Optional<String> getArtifactPathInLocalRepo(String repoPath, MavenProject project, byte[] sourceChecksum)
throws MojoFailureException {
-
+ store.put(project.getGroupId() + COLON + project.getArtifactId() + COLON + project.getVersion(),
+ new String(sourceChecksum));
URI uri = null;
try {
uri = new URI(repoPath + (project.getGroupId().replace('.', '/')) + '/' + project.getArtifactId() + '/'
@@ -155,9 +187,8 @@ class BuildHelper {
File[] list = f.listFiles(t -> t.getName().equals(project.getArtifactId() + "-" + project.getVersion() + "."
+ project.getPackaging()));
if (list != null && list.length > 0) {
- File checksumFile = new File(list[0].getParentFile(), project.getBuild().getFinalName() + "." + UNICORN);
try {
- if (checksumFile.exists() && Arrays.equals(sourceChecksum, Files.readAllBytes(checksumFile.toPath()))) {
+ if (Arrays.equals(sourceChecksum, fetchSnapshotSignature(list[0], project.getVersion()))) {
return Optional.of(list[0].getAbsolutePath());
}
} catch (IOException e) {
@@ -167,12 +198,27 @@ class BuildHelper {
return Optional.empty();
}
+ private static byte[] fetchSnapshotSignature(File file, String version) throws IOException {
+ byte[] data = Files.readAllBytes(file.toPath());
+ try (ByteArrayInputStream bais = new ByteArrayInputStream(data);
+ JarInputStream jis = new JarInputStream(bais)) {
+ JarEntry entry = null;
+ while ((entry = jis.getNextJarEntry()) != null) {
+ if (entry.getName().equals(UNICORN + DOT + CHECKSUM)) {
+ byte[] sigStore = new byte[1024];
+ return new String(sigStore, 0, jis.read(sigStore, 0, 1024)).getBytes();
+ }
+ }
+ }
+ return version.getBytes();
+ }
+
static <T> Optional<T> readState(String fileName, Class<T> clazz) {
try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
ObjectInputStream ois = new ObjectInputStream(is)) {
return Optional.of(clazz.cast(ois.readObject()));
} catch (Exception ignored) {
- //ignore. it is taken care.
+ logger.debug(ignored);
return Optional.empty();
}
}
diff --git a/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/BuildState.java b/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/BuildState.java
index ead6e7b755..1ce60a636c 100644
--- a/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/BuildState.java
+++ b/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/BuildState.java
@@ -28,9 +28,13 @@ import static org.openecomp.sdc.onboarding.Constants.RESOURCE_BUILD_DATA;
import static org.openecomp.sdc.onboarding.Constants.SKIP_MAIN_SOURCE_COMPILE;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.nio.file.Paths;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -39,36 +43,59 @@ import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
public class BuildState {
+ private static final String SHUTDOWN_TIME = "shutdownTime";
+
private static Map<String, Map> compileDataStore = new HashMap<>();
private static Map<String, Object> moduleBuildData = new HashMap<>();
private static Map<String, Object> resourceBuildData = new HashMap<>();
private static Map<String, Artifact> artifacts = new HashMap<>();
private static Set<String> executeTestsIfDependsOnStore = new HashSet<>();
private static Set<String> pmdExecutedInRun = new HashSet<>();
+ private static File stateFileLocation =
+ new File(Paths.get(System.getProperties().getProperty("java.io.tmpdir")).toFile(), "compileState.dat");
private static File compileStateFile;
private MavenProject project;
private String compileStateFilePath;
+ private static Log logger;
static {
initializeStore();
Optional<HashMap> masterStore = readState("compile.dat", HashMap.class);
compileDataStore = masterStore.isPresent() ? masterStore.get() : compileDataStore;
+ if (stateFileLocation.exists()) {
+ HashMap dat = loadState(stateFileLocation);
+ if (swapStates((HashMap<?, ?>) compileDataStore, dat)) {
+ compileDataStore = dat;
+ }
+ }
+ }
+
+ private static void setLogger(Log log) {
+ logger = log;
}
- void init() {
+ void init(Log log) {
+ setLogger(log);
artifacts.clear();
for (Artifact artifact : project.getArtifacts()) {
if (artifact.isSnapshot() && JAR.equals(artifact.getType())) {
artifacts.put(artifact.getGroupId() + ":" + artifact.getArtifactId(), artifact);
}
}
- compileStateFile =
- getCompileStateFile(compileStateFilePath.substring(0, compileStateFilePath.indexOf('/')), project);
+ if (compileStateFile == null) {
+ setCompileStateFile(
+ getCompileStateFile(compileStateFilePath.substring(0, compileStateFilePath.indexOf('/')), project));
+ }
+ }
+
+ private static void setCompileStateFile(File file) {
+ compileStateFile = file;
}
static void initializeStore() {
@@ -124,12 +151,13 @@ public class BuildState {
Long lastTime = Long.class.cast(compileDataStore.get(FULL_BUILD_DATA).put(moduleCoordinates, buildTime));
try {
if (lastTime == null || !lastTime.equals(buildTime)) {
- if (!project.getProperties().containsKey(SKIP_MAIN_SOURCE_COMPILE)) {
+ boolean skipMainCompile = project.getProperties().containsKey(SKIP_MAIN_SOURCE_COMPILE);
+ if (!skipMainCompile) {
writeCompileState();
}
}
} catch (IOException ignored) {
- // ignored. No need to handle. System will take care.
+ logger.debug(ignored);
}
}
@@ -140,7 +168,7 @@ public class BuildState {
compileDataStore.get(FULL_RESOURCE_BUILD_DATA).put(moduleCoordinates, buildTime);
writeCompileState();
} catch (IOException ignored) {
- // ignored. No need to handle. System will take care.
+ logger.debug(ignored);
}
}
}
@@ -182,7 +210,7 @@ public class BuildState {
ObjectOutputStream ois = new ObjectOutputStream(fos)) {
ois.writeObject(dataToSave);
} catch (IOException ignored) {
- //ignored. do nothing. system will take care.
+ logger.debug(ignored);
}
}
}
@@ -209,10 +237,11 @@ public class BuildState {
boolean isCompileMust(String moduleCoordinates, Collection<String> dependencies) {
for (String d : dependencies) {
if (artifacts.containsKey(d) && JAR.equals(artifacts.get(d).getType())) {
- if (artifacts.get(d).getVersion().equals(project.getVersion()) && getBuildTime(d) == 0) {
- System.out.println(ANSI_YELLOW + "[WARNING:]" + "You have module[" + d
- + "] not locally compiled even once, please compile your project once daily from root to have reliable build results."
- + ANSI_COLOR_RESET);
+ boolean versionEqual = artifacts.get(d).getVersion().equals(project.getVersion());
+ if (versionEqual && getBuildTime(d) == 0) {
+ logger.warn(ANSI_YELLOW + "[WARNING:]" + "You have module[" + d
+ + "] not locally compiled even once, please compile your project once daily from root to have reliable build results."
+ + ANSI_COLOR_RESET);
return true;
}
}
@@ -248,4 +277,25 @@ public class BuildState {
return false;
}
+ private static HashMap loadState(File file) {
+ try (InputStream is = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(is)) {
+ return HashMap.class.cast(ois.readObject());
+ } catch (Exception e) {
+ logger.debug(e);
+ return new HashMap<>();
+ }
+ }
+
+ private static boolean swapStates(HashMap repo, HashMap last) {
+ Long repoTime = repo.get(SHUTDOWN_TIME) == null ? 0 : (Long) repo.get(SHUTDOWN_TIME);
+ Long lastTime = last.get(SHUTDOWN_TIME) == null ? 0 : (Long) last.get(SHUTDOWN_TIME);
+ long repoBuildNumber = repoTime / 1000;
+ long lastBuildNumber = lastTime / 1000;
+ if (repoBuildNumber != lastBuildNumber) {
+ return false;
+ }
+ return Long.compare(repoTime, lastTime) < 0;
+ }
+
+
}
diff --git a/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/Constants.java b/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/Constants.java
index fb69cce3cb..195b356377 100644
--- a/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/Constants.java
+++ b/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/Constants.java
@@ -22,7 +22,6 @@ public class Constants {
public static final String UNICORN = "unicorn";
public static final String EMPTY_STRING = "";
public static final String PREFIX = System.getProperties().contains(UNICORN) ? EMPTY_STRING : UNICORN;
- ;
public static final String JACOCO_SKIP = "jacoco.skip";
public static final String FORK_COUNT = "fork.count";
public static final String FORK_MODE = "fork.mode";
@@ -39,8 +38,10 @@ public class Constants {
public static final String SKIP_MAIN_SOURCE_COMPILE = PREFIX + "skipMainSourceCompile";
public static final String SKIP_TEST_SOURCE_COMPILE = PREFIX + "skipTestSourceCompile";
public static final String MAIN_CHECKSUM = "mainChecksum";
+ public static final String CHECKSUM = "checksum";
public static final String TEST_CHECKSUM = "testChecksum";
public static final String RESOURCE_CHECKSUM = "resourceChecksum";
+ public static final String TEST_RESOURCE_CHECKSUM = "testResourceChecksum";
public static final String MAIN_SOURCE_CHECKSUM = "mainSourceChecksum";
public static final String TEST_SOURCE_CHECKSUM = "testSourceChecksum";
public static final String GENERATED_SOURCE_CHECKSUM = "generatedSourceChecksum";
@@ -65,4 +66,6 @@ public class Constants {
private Constants() {
}
+
+
}
diff --git a/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/InitializationHelperMojo.java b/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/InitializationHelperMojo.java
index 9aa48b2174..42ddc657db 100644
--- a/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/InitializationHelperMojo.java
+++ b/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/InitializationHelperMojo.java
@@ -64,12 +64,15 @@ public class InitializationHelperMojo extends AbstractMojo {
project.getProperties().setProperty(SKIP_PMD, Boolean.TRUE.toString());
if (System.getProperties().containsKey(UNICORN)) {
- buildState.init();
+ buildState.init(getLog());
+ BuildHelper.setLogger(getLog());
} else {
project.getProperties().setProperty("skipMainSourceCompile", Boolean.FALSE.toString());
project.getProperties().setProperty("skipTestSourceCompile", Boolean.FALSE.toString());
}
+
}
+
}
diff --git a/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/PreCompileHelperMojo.java b/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/PreCompileHelperMojo.java
index 59242715d2..e97b172b84 100644
--- a/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/PreCompileHelperMojo.java
+++ b/openecomp-be/tools/compile-helper-plugin/src/main/java/org/openecomp/sdc/onboarding/PreCompileHelperMojo.java
@@ -18,9 +18,11 @@ package org.openecomp.sdc.onboarding;
import static org.openecomp.sdc.onboarding.BuildHelper.getArtifactPathInLocalRepo;
import static org.openecomp.sdc.onboarding.BuildHelper.getChecksum;
+import static org.openecomp.sdc.onboarding.BuildHelper.getSnapshotSignature;
import static org.openecomp.sdc.onboarding.BuildHelper.getSourceChecksum;
import static org.openecomp.sdc.onboarding.BuildHelper.readState;
import static org.openecomp.sdc.onboarding.Constants.ANY_EXT;
+import static org.openecomp.sdc.onboarding.Constants.CHECKSUM;
import static org.openecomp.sdc.onboarding.Constants.COLON;
import static org.openecomp.sdc.onboarding.Constants.DOT;
import static org.openecomp.sdc.onboarding.Constants.EMPTY_JAR;
@@ -47,6 +49,7 @@ import static org.openecomp.sdc.onboarding.Constants.SKIP_TEST_SOURCE_COMPILE;
import static org.openecomp.sdc.onboarding.Constants.TEST;
import static org.openecomp.sdc.onboarding.Constants.TEST_CHECKSUM;
import static org.openecomp.sdc.onboarding.Constants.TEST_ONLY;
+import static org.openecomp.sdc.onboarding.Constants.TEST_RESOURCE_CHECKSUM;
import static org.openecomp.sdc.onboarding.Constants.TEST_RESOURCE_ONLY;
import static org.openecomp.sdc.onboarding.Constants.TEST_SOURCE_CHECKSUM;
import static org.openecomp.sdc.onboarding.Constants.UNICORN;
@@ -120,6 +123,7 @@ public class PreCompileHelperMojo extends AbstractMojo {
private long mainChecksum = 0;
private long testChecksum = 0;
private long resourceChecksum = 0;
+ private long testResourceChecksum = 0;
Optional<String> artifactPath;
static {
@@ -139,9 +143,10 @@ public class PreCompileHelperMojo extends AbstractMojo {
return;
}
resourceChecksum = getChecksum(mainResourceLocation, ANY_EXT);
+ testResourceChecksum = getChecksum(testResourceLocation, ANY_EXT);
project.getProperties().setProperty(RESOURCE_CHECKSUM, String.valueOf(resourceChecksum));
+ project.getProperties().setProperty(TEST_RESOURCE_CHECKSUM, String.valueOf(testResourceChecksum));
byte[] sourceChecksum = calculateChecksum(mainChecksum, resourceChecksum).getBytes();
- boolean instrumented = isCurrentModuleInstrumented();
artifactPath = getArtifactPathInLocalRepo(session.getLocalRepository().getUrl(), project, sourceChecksum);
boolean isFirstBuild = buildState.getBuildTime(moduleCoordinates) == 0 || !artifactPath.isPresent();
@@ -150,7 +155,11 @@ public class PreCompileHelperMojo extends AbstractMojo {
Map<String, Object> lastTimeModuleBuildData = buildState.readModuleBuildData();
resourceBuildData = getCurrentResourceBuildData();
Map<String, Object> lastTimeResourceBuildData = buildState.readResourceBuildData();
-
+ generateSyncAlert(lastTimeResourceBuildData != null && (
+ !resourceBuildData.get(MAIN).equals(lastTimeResourceBuildData.get(MAIN)) || !resourceBuildData.get(TEST)
+ .equals(lastTimeResourceBuildData
+ .get(TEST)
+ .toString())));
boolean buildDataSameWithPreviousBuild =
isBuildDataSameWithPreviousBuild(lastTimeModuleBuildData, moduleBuildData);
boolean resourceMainBuildDataSameWithPreviousBuild =
@@ -163,6 +172,7 @@ public class PreCompileHelperMojo extends AbstractMojo {
boolean testToBeCompiled =
lastTimeModuleBuildData == null || !moduleBuildData.get(TEST).equals(lastTimeModuleBuildData.get(TEST));
+ final boolean instrumented = isCurrentModuleInstrumented();
setMainBuildAttribute(mainToBeCompiled, testToBeCompiled);
generateSignature(sourceChecksum);
setTestBuild(resourceDataSame, resourceMainBuildDataSameWithPreviousBuild, testToBeCompiled, mainToBeCompiled);
@@ -182,9 +192,9 @@ public class PreCompileHelperMojo extends AbstractMojo {
private void generateSignature(byte[] sourceChecksum) {
try {
- Paths.get(project.getBuild().getDirectory()).toFile().mkdirs();
- Files.write(Paths.get(project.getBuild().getDirectory(), project.getBuild().getFinalName() + DOT + UNICORN),
- sourceChecksum, StandardOpenOption.CREATE);
+ Paths.get(project.getBuild().getOutputDirectory()).toFile().mkdirs();
+ Files.write(Paths.get(project.getBuild().getOutputDirectory(), UNICORN + DOT + CHECKSUM), sourceChecksum,
+ StandardOpenOption.CREATE);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
@@ -323,7 +333,7 @@ public class PreCompileHelperMojo extends AbstractMojo {
}
}
- private Map<String, Object> getCurrentModuleBuildData() {
+ private Map<String, Object> getCurrentModuleBuildData() throws MojoExecutionException {
Map<String, Object> moduleBuildData = new HashMap<>();
moduleBuildData.put(MAIN, new HashMap<String, String>());
moduleBuildData.put(TEST, new HashMap<String, String>());
@@ -339,18 +349,16 @@ public class PreCompileHelperMojo extends AbstractMojo {
return moduleBuildData;
}
for (Artifact dependency : project.getArtifacts()) {
- String fileNme = dependency.getFile().getName();
+ String version = dependency.isSnapshot() ? getSnapshotSignature(dependency.getFile(),
+ dependency.getGroupId() + COLON + dependency.getArtifactId(), dependency.getVersion()) :
+ dependency.getVersion();
if (excludeDependencies.contains(dependency.getScope())) {
HashMap.class.cast(moduleBuildData.get(TEST))
- .put(dependency.getGroupId() + COLON + dependency.getArtifactId(),
- fileNme.endsWith(dependency.getVersion() + DOT + JAR) ? dependency.getVersion() :
- fileNme);
+ .put(dependency.getGroupId() + COLON + dependency.getArtifactId(), version);
continue;
}
HashMap.class.cast(moduleBuildData.get(MAIN))
- .put(dependency.getGroupId() + COLON + dependency.getArtifactId(),
- fileNme.endsWith(dependency.getVersion() + DOT + JAR) ? dependency.getVersion() :
- fileNme);
+ .put(dependency.getGroupId() + COLON + dependency.getArtifactId(), version);
}
return moduleBuildData;
}
@@ -408,7 +416,7 @@ public class PreCompileHelperMojo extends AbstractMojo {
private Map<String, Object> getCurrentResourceBuildData() {
HashMap<String, Object> resourceBuildStateData = new HashMap<>();
resourceBuildStateData.put(MAIN, project.getProperties().getProperty(RESOURCE_CHECKSUM));
- resourceBuildStateData.put(TEST, getChecksum(testResourceLocation, ANY_EXT));
+ resourceBuildStateData.put(TEST, project.getProperties().getProperty(TEST_RESOURCE_CHECKSUM));
resourceBuildStateData.put("dependency", getDependencies().hashCode());
return resourceBuildStateData;
}
@@ -445,6 +453,14 @@ public class PreCompileHelperMojo extends AbstractMojo {
if (!checksum.equals(checksumMap.get(moduleCoordinates)) || isPMDMandatory(project.getArtifacts())) {
project.getProperties().setProperty(SKIP_PMD, Boolean.FALSE.toString());
BuildState.recordPMDRun(moduleCoordinates);
+ generateSyncAlert(!checksum.equals(checksumMap.get(moduleCoordinates)));
+ }
+ }
+
+ private void generateSyncAlert(boolean required) {
+ if (required) {
+ getLog().warn(
+ "\u001B[33m\u001B[1m UNICORN Alert!!! Source code in version control system for this module is different than your local one. \u001B[0m");
}
}
}