diff --git a/daemon/src/main/java/org/mvndaemon/mvnd/daemon/ClientDispatcher.java b/daemon/src/main/java/org/mvndaemon/mvnd/daemon/ClientDispatcher.java index eec22859..c8b00825 100644 --- a/daemon/src/main/java/org/mvndaemon/mvnd/daemon/ClientDispatcher.java +++ b/daemon/src/main/java/org/mvndaemon/mvnd/daemon/ClientDispatcher.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; import org.apache.maven.execution.ExecutionEvent; import org.apache.maven.execution.MavenSession; @@ -78,16 +79,26 @@ public class ClientDispatcher extends BuildEventListener { throw new IllegalStateException("Could not compute the 90th percentile of the projects length from " + projects); } - public void projectStarted(ExecutionEvent event) { - queue.add(Message.projectStarted(event.getProject().getArtifactId())); + private final Map projects = new ConcurrentHashMap<>(); + + public void projectStarted(String projectId) { + projects.put(projectId, Boolean.TRUE); + queue.add(Message.projectStarted(projectId)); } public void projectLogMessage(String projectId, String event) { + if (projectId != null) { + Boolean b = projects.get(projectId); + if (b != Boolean.TRUE) { + } + } queue.add(projectId == null ? Message.log(trimTrailingEols(event)) : Message.log(projectId, trimTrailingEols(event))); } - public void projectFinished(ExecutionEvent event) { - queue.add(Message.projectStopped(event.getProject().getArtifactId())); + @Override + public void projectFinished(String projectId) { + projects.put(projectId, Boolean.FALSE); + queue.add(Message.projectStopped(projectId)); } public void mojoStarted(ExecutionEvent event) { diff --git a/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/BuildEventListener.java b/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/BuildEventListener.java index 32396a6e..99810d2c 100644 --- a/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/BuildEventListener.java +++ b/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/BuildEventListener.java @@ -27,13 +27,13 @@ public abstract class BuildEventListener { public void sessionStarted(ExecutionEvent event) { } - public void projectStarted(ExecutionEvent event) { + public void projectStarted(String projectId) { } public void projectLogMessage(String projectId, String event) { } - public void projectFinished(ExecutionEvent event) { + public void projectFinished(String projectId) { } public void mojoStarted(ExecutionEvent event) { @@ -64,11 +64,11 @@ public abstract class BuildEventListener { public abstract void sessionStarted(ExecutionEvent event); - public abstract void projectStarted(ExecutionEvent event); + public abstract void projectStarted(String projectId); public abstract void projectLogMessage(String projectId, String event); - public abstract void projectFinished(ExecutionEvent event); + public abstract void projectFinished(String projectId); public abstract void mojoStarted(ExecutionEvent event); diff --git a/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/LoggingExecutionListener.java b/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/LoggingExecutionListener.java index 6a0b5061..2ebed7d5 100644 --- a/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/LoggingExecutionListener.java +++ b/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/LoggingExecutionListener.java @@ -50,7 +50,7 @@ public class LoggingExecutionListener implements ExecutionListener { @Override public void projectStarted(ExecutionEvent event) { setMdc(event); - buildEventListener.projectStarted(event); + buildEventListener.projectStarted(event.getProject().getArtifactId()); delegate.projectStarted(event); } @@ -58,21 +58,21 @@ public class LoggingExecutionListener implements ExecutionListener { public void projectSucceeded(ExecutionEvent event) { setMdc(event); delegate.projectSucceeded(event); - buildEventListener.projectFinished(event); + buildEventListener.projectFinished(event.getProject().getArtifactId()); } @Override public void projectFailed(ExecutionEvent event) { setMdc(event); delegate.projectFailed(event); - buildEventListener.projectFinished(event); + buildEventListener.projectFinished(event.getProject().getArtifactId()); } @Override public void projectSkipped(ExecutionEvent event) { setMdc(event); delegate.projectSkipped(event); - buildEventListener.projectFinished(event); + buildEventListener.projectFinished(event.getProject().getArtifactId()); } @Override @@ -104,23 +104,25 @@ public class LoggingExecutionListener implements ExecutionListener { public void forkStarted(ExecutionEvent event) { setMdc(event); delegate.forkStarted(event); + ProjectBuildLogAppender.setForkingProjectId(event.getProject().getArtifactId()); } @Override public void forkSucceeded(ExecutionEvent event) { - setMdc(event); delegate.forkSucceeded(event); + ProjectBuildLogAppender.setForkingProjectId(null); } @Override public void forkFailed(ExecutionEvent event) { - setMdc(event); delegate.forkFailed(event); + ProjectBuildLogAppender.setForkingProjectId(null); } @Override public void forkedProjectStarted(ExecutionEvent event) { setMdc(event); + buildEventListener.projectStarted(ProjectBuildLogAppender.getProjectId()); delegate.forkedProjectStarted(event); } @@ -128,12 +130,16 @@ public class LoggingExecutionListener implements ExecutionListener { public void forkedProjectSucceeded(ExecutionEvent event) { setMdc(event); delegate.forkedProjectSucceeded(event); + buildEventListener.projectFinished(ProjectBuildLogAppender.getProjectId()); + ProjectBuildLogAppender.setProjectId(null); } @Override public void forkedProjectFailed(ExecutionEvent event) { setMdc(event); delegate.forkedProjectFailed(event); + buildEventListener.projectFinished(ProjectBuildLogAppender.getProjectId()); + ProjectBuildLogAppender.setProjectId(null); } private void setMdc(ExecutionEvent event) { diff --git a/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/ProjectBuildLogAppender.java b/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/ProjectBuildLogAppender.java index bd718199..16f086c6 100644 --- a/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/ProjectBuildLogAppender.java +++ b/daemon/src/main/java/org/mvndaemon/mvnd/logging/smart/ProjectBuildLogAppender.java @@ -35,12 +35,21 @@ public class ProjectBuildLogAppender extends AppenderBase impleme private static final String KEY_PROJECT_ID = "maven.project.id"; private static final ThreadLocal PROJECT_ID = new InheritableThreadLocal<>(); + private static final ThreadLocal FORKING_PROJECT_ID = new InheritableThreadLocal<>(); public static String getProjectId() { return PROJECT_ID.get(); } public static void setProjectId(String projectId) { + String forkingProjectId = FORKING_PROJECT_ID.get(); + if (forkingProjectId != null) { + if (projectId != null) { + projectId = forkingProjectId + "/" + projectId; + } else { + projectId = forkingProjectId; + } + } if (projectId != null) { PROJECT_ID.set(projectId); MDC.put(KEY_PROJECT_ID, projectId); @@ -50,6 +59,14 @@ public class ProjectBuildLogAppender extends AppenderBase impleme } } + public static void setForkingProjectId(String forkingProjectId) { + if (forkingProjectId != null) { + FORKING_PROJECT_ID.set(forkingProjectId); + } else { + FORKING_PROJECT_ID.remove(); + } + } + public static void updateMdc() { String id = getProjectId(); if (id != null) { @@ -92,8 +109,7 @@ public class ProjectBuildLogAppender extends AppenderBase impleme @Override protected void append(ILoggingEvent event) { - Map mdc = event.getMDCPropertyMap(); - String projectId = mdc != null ? mdc.get(KEY_PROJECT_ID) : null; + String projectId = event.getMDCPropertyMap().get(KEY_PROJECT_ID); buildEventListener.projectLogMessage(projectId, layout.doLayout(event)); } diff --git a/integration-tests/src/test/java/org/mvndaemon/mvnd/it/ForkedTest.java b/integration-tests/src/test/java/org/mvndaemon/mvnd/it/ForkedTest.java new file mode 100644 index 00000000..51a580f1 --- /dev/null +++ b/integration-tests/src/test/java/org/mvndaemon/mvnd/it/ForkedTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2019 the original author or authors. + * + * 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.mvndaemon.mvnd.it; + +import java.io.IOException; +import javax.inject.Inject; +import org.junit.jupiter.api.Test; +import org.mvndaemon.mvnd.assertj.TestClientOutput; +import org.mvndaemon.mvnd.client.Client; +import org.mvndaemon.mvnd.client.DaemonParameters; +import org.mvndaemon.mvnd.junit.MvndTest; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@MvndTest(projectDir = "src/test/projects/forked") +public class ForkedTest { + + @Inject + Client client; + + @Inject + DaemonParameters parameters; + + @Test + void cleanInstall() throws IOException, InterruptedException { + + final TestClientOutput output = new TestClientOutput(); + client.execute(output, "clean", "verify", "-e", "-B").assertSuccess(); + assertTrue(output.messagesToString() + .contains( + "ProjectLogMessage{projectId='forked/forked-mod1', message='[INFO] Forking forked-mod1 0.0.1-SNAPSHOT'}")); + + } +} diff --git a/integration-tests/src/test/projects/forked/.mvn/maven.config b/integration-tests/src/test/projects/forked/.mvn/maven.config new file mode 100644 index 00000000..4230c241 --- /dev/null +++ b/integration-tests/src/test/projects/forked/.mvn/maven.config @@ -0,0 +1,3 @@ +-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 +-Dmaven.wagon.http.retryHandler.requestSentEnabled=true +-Dmaven.wagon.http.retryHandler.count=10 diff --git a/integration-tests/src/test/projects/forked/mod1/pom.xml b/integration-tests/src/test/projects/forked/mod1/pom.xml new file mode 100644 index 00000000..1e7b5da2 --- /dev/null +++ b/integration-tests/src/test/projects/forked/mod1/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + org.mvndaemon.mvnd.test.forked + forked + 0.0.1-SNAPSHOT + ../pom.xml + + + forked-mod1 + + \ No newline at end of file diff --git a/integration-tests/src/test/projects/forked/mod1/src/main/java/org/mvndaemon/mvnd/test/forked/mod1/Greeting.java b/integration-tests/src/test/projects/forked/mod1/src/main/java/org/mvndaemon/mvnd/test/forked/mod1/Greeting.java new file mode 100644 index 00000000..b589babc --- /dev/null +++ b/integration-tests/src/test/projects/forked/mod1/src/main/java/org/mvndaemon/mvnd/test/forked/mod1/Greeting.java @@ -0,0 +1,22 @@ +/* + * Copyright 2019 the original author or authors. + * + * 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.mvndaemon.mvnd.test.forked.mod1; + +public interface Greeting { + + public String greet(); + +} diff --git a/integration-tests/src/test/projects/forked/mod2/pom.xml b/integration-tests/src/test/projects/forked/mod2/pom.xml new file mode 100644 index 00000000..98a8ec12 --- /dev/null +++ b/integration-tests/src/test/projects/forked/mod2/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + org.mvndaemon.mvnd.test.forked + forked + 0.0.1-SNAPSHOT + ../pom.xml + + + forked-mod2 + + \ No newline at end of file diff --git a/integration-tests/src/test/projects/forked/mod2/src/main/java/org/mvndaemon/mvnd/test/forked/mod2/Hi.java b/integration-tests/src/test/projects/forked/mod2/src/main/java/org/mvndaemon/mvnd/test/forked/mod2/Hi.java new file mode 100644 index 00000000..54e27314 --- /dev/null +++ b/integration-tests/src/test/projects/forked/mod2/src/main/java/org/mvndaemon/mvnd/test/forked/mod2/Hi.java @@ -0,0 +1,24 @@ +/* + * Copyright 2019 the original author or authors. + * + * 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.mvndaemon.mvnd.test.forked.mod2; + +public class Hi { + + public String greet() { + return "Hi"; + } + +} diff --git a/integration-tests/src/test/projects/forked/pom.xml b/integration-tests/src/test/projects/forked/pom.xml new file mode 100644 index 00000000..6fe5e08e --- /dev/null +++ b/integration-tests/src/test/projects/forked/pom.xml @@ -0,0 +1,92 @@ + + + + 4.0.0 + org.mvndaemon.mvnd.test.forked + forked + 0.0.1-SNAPSHOT + pom + + + UTF-8 + 1.8 + 1.8 + + 2.5 + 3.8.0 + 2.4 + 2.6 + 2.22.2 + + + + mod1 + mod2 + + + + + + + org.apache.maven.plugins + maven-clean-plugin + ${maven-clean-plugin.version} + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + org.apache.maven.plugins + maven-install-plugin + ${maven-install-plugin.version} + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + + + + maven-javadoc-plugin + 3.2.0 + + + aggregate-jar + + aggregate-jar + + package + false + + + + + + + \ No newline at end of file