Skip to content

Commit ef74274

Browse files
author
Valeriy Svydenko
authored
CHE-5350: rework Maven plugin to avoid using Everrest Websocket (eclipse-che#5527)
1 parent 00421dd commit ef74274

40 files changed

Lines changed: 1197 additions & 349 deletions

File tree

plugins/plugin-maven/che-plugin-maven-generator-archetype/pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,18 @@
3030
<groupId>com.google.code.gson</groupId>
3131
<artifactId>gson</artifactId>
3232
</dependency>
33+
<dependency>
34+
<groupId>com.google.guava</groupId>
35+
<artifactId>guava</artifactId>
36+
</dependency>
37+
<dependency>
38+
<groupId>com.google.inject</groupId>
39+
<artifactId>guice</artifactId>
40+
</dependency>
41+
<dependency>
42+
<groupId>javax.annotation</groupId>
43+
<artifactId>javax.annotation-api</artifactId>
44+
</dependency>
3345
<dependency>
3446
<groupId>javax.inject</groupId>
3547
<artifactId>javax.inject</artifactId>

plugins/plugin-maven/che-plugin-maven-generator-archetype/src/main/java/org/eclipse/che/plugin/maven/generator/archetype/ArchetypeGenerator.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,21 @@
1111
package org.eclipse.che.plugin.maven.generator.archetype;
1212

1313
import org.eclipse.che.api.core.ServerException;
14+
import org.eclipse.che.api.core.notification.EventService;
1415
import org.eclipse.che.api.core.util.AbstractLineConsumer;
1516
import org.eclipse.che.api.core.util.CommandLine;
1617
import org.eclipse.che.api.core.util.LineConsumer;
1718
import org.eclipse.che.api.core.util.ProcessUtil;
1819
import org.eclipse.che.api.core.util.ValueHolder;
1920
import org.eclipse.che.api.core.util.Watchdog;
20-
import org.eclipse.che.api.core.util.WebsocketMessageConsumer;
2121
import org.eclipse.che.ide.maven.tools.MavenArtifact;
2222
import org.eclipse.che.ide.maven.tools.MavenUtils;
2323
import org.eclipse.che.plugin.maven.shared.MavenArchetype;
2424
import org.eclipse.che.plugin.maven.shared.dto.ArchetypeOutput;
2525
import org.slf4j.Logger;
2626
import org.slf4j.LoggerFactory;
2727

28+
import javax.inject.Inject;
2829
import javax.inject.Singleton;
2930
import javax.validation.constraints.NotNull;
3031
import java.io.File;
@@ -35,7 +36,8 @@
3536
import java.util.concurrent.TimeUnit;
3637
import java.util.concurrent.TimeoutException;
3738

38-
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.MAVEN_ARCHETYPE_CHANEL_NAME;
39+
import static org.eclipse.che.plugin.maven.shared.dto.ArchetypeOutput.State.DONE;
40+
import static org.eclipse.che.plugin.maven.shared.dto.ArchetypeOutput.State.ERROR;
3941

4042
/**
4143
* Generates projects with maven-archetype-plugin.
@@ -46,6 +48,13 @@
4648
public class ArchetypeGenerator {
4749
private static final Logger LOG = LoggerFactory.getLogger(ArchetypeGenerator.class);
4850

51+
private EventService eventService;
52+
53+
@Inject
54+
public ArchetypeGenerator(EventService eventService) {
55+
this.eventService = eventService;
56+
}
57+
4958
/**
5059
* Generates a new project from the specified archetype by given maven artifact descriptor.
5160
* @param workDir
@@ -100,12 +109,13 @@ public void generateFromArchetype(@NotNull File workDir, @NotNull MavenArchetype
100109
*/
101110
private void execute(String[] commandLine, File workDir) throws TimeoutException, IOException, InterruptedException {
102111
ProcessBuilder pb = new ProcessBuilder(commandLine).redirectErrorStream(true).directory(workDir);
103-
WebsocketMessageConsumer<ArchetypeOutput> websocketMessageConsumer = new WebsocketMessageConsumer(MAVEN_ARCHETYPE_CHANEL_NAME);
104-
websocketMessageConsumer.consume(new ArchetypeOutputImpl("Start Project generation", ArchetypeOutput.State.START));
112+
113+
eventService.publish(new ArchetypeOutputImpl("Start Project generation", ArchetypeOutput.State.START));
114+
105115
LineConsumer lineConsumer = new AbstractLineConsumer() {
106116
@Override
107117
public void writeLine(String line) throws IOException {
108-
websocketMessageConsumer.consume(new ArchetypeOutputImpl(line, ArchetypeOutput.State.IN_PROGRESS));
118+
eventService.publish(new ArchetypeOutputImpl(line, ArchetypeOutput.State.IN_PROGRESS));
109119
}
110120
};
111121

@@ -122,14 +132,14 @@ public void writeLine(String line) throws IOException {
122132
// consume logs until process ends
123133
ProcessUtil.process(process, lineConsumer);
124134
process.waitFor();
125-
websocketMessageConsumer.consume(new ArchetypeOutputImpl("Done", ArchetypeOutput.State.DONE));
135+
eventService.publish(new ArchetypeOutputImpl("Done", DONE));
126136
if (isTimeoutExceeded.get()) {
127137
LOG.error("Generation project time expired : command-line " + Arrays.toString(commandLine));
128-
websocketMessageConsumer.consume(new ArchetypeOutputImpl("Generation project time expired", ArchetypeOutput.State.ERROR));
138+
eventService.publish(new ArchetypeOutputImpl("Generation project time expired", ERROR));
129139
throw new TimeoutException();
130140
} else if (process.exitValue() != 0) {
131141
LOG.error("Generation project fail : command-line " + Arrays.toString(commandLine));
132-
websocketMessageConsumer.consume(new ArchetypeOutputImpl("Generation project occurs error", ArchetypeOutput.State.ERROR));
142+
eventService.publish(new ArchetypeOutputImpl("Generation project occurs error", ERROR));
133143
throw new IOException("Process failed. Exit code " + process.exitValue() + " command-line : " + Arrays.toString(commandLine));
134144
}
135145
} finally {

plugins/plugin-maven/che-plugin-maven-generator-archetype/src/main/java/org/eclipse/che/plugin/maven/generator/archetype/ArchetypeOutputImpl.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@
1313
import org.eclipse.che.plugin.maven.shared.dto.ArchetypeOutput;
1414

1515
/**
16+
* Describes information about output object of maven archetype project generation.
1617
*
1718
* @author Vitalii Parfonov
1819
*/
1920
public class ArchetypeOutputImpl implements ArchetypeOutput {
20-
21-
2221
private String output;
23-
2422
private State state;
2523

2624
public ArchetypeOutputImpl(String output, State state) {
@@ -37,4 +35,14 @@ public String getOutput() {
3735
public State getState() {
3836
return state;
3937
}
38+
39+
@Override
40+
public void setOutput(String output) {
41+
this.output = output;
42+
}
43+
44+
@Override
45+
public void setState(State state) {
46+
this.state = state;
47+
}
4048
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2012-2017 Codenvy, S.A.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v1.0
5+
* which accompanies this distribution, and is available at
6+
* http://www.eclipse.org/legal/epl-v10.html
7+
*
8+
* Contributors:
9+
* Codenvy, S.A. - initial API and implementation
10+
*******************************************************************************/
11+
package org.eclipse.che.plugin.maven.generator.archetype;
12+
13+
import com.google.inject.Singleton;
14+
15+
import org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerConfigurator;
16+
import org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter;
17+
import org.eclipse.che.api.core.notification.EventService;
18+
import org.eclipse.che.api.core.notification.EventSubscriber;
19+
import org.eclipse.che.dto.server.DtoFactory;
20+
import org.eclipse.che.plugin.maven.shared.dto.ArchetypeOutput;
21+
22+
import javax.annotation.PostConstruct;
23+
import javax.annotation.PreDestroy;
24+
import javax.inject.Inject;
25+
import java.util.Set;
26+
27+
import static com.google.common.collect.Sets.newConcurrentHashSet;
28+
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.MAVEN_ARCHETYPE_CHANEL_OUTPUT;
29+
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.MAVEN_ARCHETYPE_CHANEL_SUBSCRIBE;
30+
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.MAVEN_ARCHETYPE_CHANEL_UNSUBSCRIBE;
31+
32+
/**
33+
* Mechanism which sends events of maven archetype generation by using JSON RPC to the client.
34+
*/
35+
@Singleton
36+
public class MavenArchetypeJsonRpcMessenger implements EventSubscriber<ArchetypeOutput> {
37+
private final Set<String> endpointIds = newConcurrentHashSet();
38+
private EventService eventService;
39+
private RequestTransmitter transmitter;
40+
41+
@Inject
42+
public MavenArchetypeJsonRpcMessenger(EventService eventService, RequestTransmitter transmitter) {
43+
this.eventService = eventService;
44+
this.transmitter = transmitter;
45+
}
46+
47+
@PostConstruct
48+
private void subscribe() {
49+
eventService.subscribe(this);
50+
}
51+
52+
@PreDestroy
53+
private void unsubscribe() {
54+
eventService.unsubscribe(this);
55+
}
56+
57+
@Inject
58+
private void configureHandlers(RequestHandlerConfigurator configurator) {
59+
configurator.newConfiguration()
60+
.methodName(MAVEN_ARCHETYPE_CHANEL_SUBSCRIBE)
61+
.noParams()
62+
.noResult()
63+
.withConsumer(endpointIds::add);
64+
65+
configurator.newConfiguration()
66+
.methodName(MAVEN_ARCHETYPE_CHANEL_UNSUBSCRIBE)
67+
.noParams()
68+
.noResult()
69+
.withConsumer(endpointIds::remove);
70+
}
71+
72+
@Override
73+
public void onEvent(ArchetypeOutput event) {
74+
ArchetypeOutput archetypeOutput = DtoFactory.newDto(ArchetypeOutput.class);
75+
archetypeOutput.setOutput(event.getOutput());
76+
archetypeOutput.setState(event.getState());
77+
78+
endpointIds.forEach(it -> transmitter.newRequest()
79+
.endpointId(it)
80+
.methodName(MAVEN_ARCHETYPE_CHANEL_OUTPUT)
81+
.paramsAsDto(archetypeOutput)
82+
.sendAndSkipResult());
83+
}
84+
}

plugins/plugin-maven/che-plugin-maven-generator-archetype/src/test/java/org/eclipse/che/plugin/maven/generator/archetype/ArchetypeGeneratorTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
*******************************************************************************/
1111
package org.eclipse.che.plugin.maven.generator.archetype;
1212

13+
import org.eclipse.che.api.core.notification.EventService;
1314
import org.eclipse.che.commons.lang.NameGenerator;
1415
import org.eclipse.che.ide.maven.tools.MavenArtifact;
1516
import org.eclipse.che.plugin.maven.shared.MavenArchetype;
@@ -26,6 +27,7 @@
2627
import static org.mockito.Mockito.when;
2728

2829
/**
30+
* Test for {@link ArchetypeGenerator}
2931
*
3032
* @author Vitalii Parfonov
3133
*/
@@ -36,11 +38,12 @@ public class ArchetypeGeneratorTest {
3638
@Ignore
3739
public void generateFromArchetype() throws Exception {
3840
MavenArchetype mavenArchetype = mock(MavenArchetype.class);
41+
EventService eventService = mock(EventService.class);
3942
when(mavenArchetype.getArtifactId()).thenReturn("tomee-webapp-archetype");
4043
when(mavenArchetype.getGroupId()).thenReturn("org.apache.openejb.maven");
4144
when(mavenArchetype.getVersion()).thenReturn("1.7.1");
4245
File workDir = Files.createTempDirectory("workDir").toFile();
43-
ArchetypeGenerator archetypeGenerator = new ArchetypeGenerator();
46+
ArchetypeGenerator archetypeGenerator = new ArchetypeGenerator(eventService);
4447
String artifactId = NameGenerator.generate("artifactId", 5);
4548
String groupId = NameGenerator.generate("groupId", 5);
4649
MavenArtifact mavenArtifact = new MavenArtifact();

0 commit comments

Comments
 (0)