diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000..7a73a41bfdf76 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/IDispatcher.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/IDispatcher.java new file mode 100644 index 0000000000000..762655e012b06 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/IDispatcher.java @@ -0,0 +1,8 @@ +package org.gradle.api.internal.distribute; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +interface IDispatcher { + +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Agent.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Agent.java new file mode 100644 index 0000000000000..492cfd8b7b8dc --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Agent.java @@ -0,0 +1,10 @@ +package org.gradle.api.internal.distribute.agent; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class Agent { + private String id; + private String ip; + private String name; +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/AgentClient.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/AgentClient.java new file mode 100644 index 0000000000000..2eba13a521024 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/AgentClient.java @@ -0,0 +1,11 @@ +package org.gradle.api.internal.distribute.agent; + +/** + * Created by nls on 2019/4/21. + */ +public interface AgentClient { + + int getAliveAgentCount(); + + int getCanUseAgentCount(); +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/DefaultAgentClient.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/DefaultAgentClient.java new file mode 100644 index 0000000000000..ed27152824c15 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/DefaultAgentClient.java @@ -0,0 +1,15 @@ +package org.gradle.api.internal.distribute.agent; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class DefaultAgentClient implements AgentClient { + + public int getAliveAgentCount() { + return 0; + } + + public int getCanUseAgentCount() { + return 0; + } +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/LocalMonitor.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/LocalMonitor.java new file mode 100644 index 0000000000000..2dba1e5549371 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/LocalMonitor.java @@ -0,0 +1,9 @@ +package org.gradle.api.internal.distribute.agent; + +/** + * Created by nls on 2019/4/21. + * Nothing. + */ + public class LocalMonitor { + + } \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Serverconfig.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Serverconfig.java new file mode 100644 index 0000000000000..5ea8172eaa345 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Serverconfig.java @@ -0,0 +1,8 @@ +package org.gradle.api.internal.distribute.agent; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class ServerConfig { + +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java new file mode 100644 index 0000000000000..812c87abbd578 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java @@ -0,0 +1,40 @@ + +package org.gradle.api.internal.distribute.compile; + +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.gradle.api.internal.distribute.agent.AgentClient; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class CompileDispatcher { + + private AgentClient agentClient; + private IFactory iFactory; + private DispatchTaskTrack taskTrack; + // private Map> + + public CompileDispatcher(AgentClient client, IFactory iFactory) { + this.agentClient = client; + this.iFactory = iFactory; + } + + public boolean dispatch(Map> recompileClass) { + int agentCount = agentClient.getCanUseAgentCount(); + int count = 0; + Iterator>> it = recompileClass.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry> entry = it.next(); + DispatchTask task = iFactory.create(entry.getKey(), entry.getValue()); + taskTrack.runTask(task); + if (++count > agentCount) { + break; + } + it.remove(); + } + return true; + } +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTask.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTask.java new file mode 100644 index 0000000000000..20abbd7fbf786 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTask.java @@ -0,0 +1,13 @@ +package org.gradle.api.internal.distribute.compile; + +import java.util.Set; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class DispatchTask { + + public DispatchTask(String file, Set classes) { + + } +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskFactory.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskFactory.java new file mode 100644 index 0000000000000..c2722da8c3885 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskFactory.java @@ -0,0 +1,14 @@ +package org.gradle.api.internal.distribute.compile; + +import java.util.Set; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class DispatchTaskFactory implements IFactory { + + @Override + public DispatchTask create(String file, Set classes) { + return new DispatchTask(file, classes); + } +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskTrack.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskTrack.java new file mode 100644 index 0000000000000..f09217ec5716d --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskTrack.java @@ -0,0 +1,18 @@ + +package org.gradle.api.internal.distribute.compile; + +import org.gradle.api.internal.distribute.agent.AgentClient; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class DispatchTaskTrack { + + public DispatchTaskTrack(AgentClient agent) { + + } + + public void runTask(DispatchTask task) { + + } +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/IFactory.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/IFactory.java new file mode 100644 index 0000000000000..c40b08df1887c --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/IFactory.java @@ -0,0 +1,11 @@ +package org.gradle.api.internal.distribute.compile; + +import java.util.Set; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public interface IFactory { + + DispatchTask create(String file, Set classes); +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/AbsProtocol.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/AbsProtocol.java new file mode 100644 index 0000000000000..998f9904d4293 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/AbsProtocol.java @@ -0,0 +1,10 @@ +package org.gradle.api.internal.distribute.protocol; + +/** + * Created by nls on 2019/4/21. Nothing. + */ + +public abstract class AbsProtocol implements IProtocol { + + public abstract int getCommand(); +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/IProtocol.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/IProtocol.java new file mode 100644 index 0000000000000..aaa43740cbd1d --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/IProtocol.java @@ -0,0 +1,12 @@ + +package org.gradle.api.internal.distribute.protocol; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public interface IProtocol { + + boolean decode(byte[] data); + + byte[] encode(); +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/ProtocolHeader.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/ProtocolHeader.java new file mode 100644 index 0000000000000..632cc2a400b8c --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/ProtocolHeader.java @@ -0,0 +1,9 @@ + +package org.gradle.api.internal.distribute.protocol; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class ProtocolHeader { + +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/tasks/DistributeCompiler.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/tasks/DistributeCompiler.java new file mode 100644 index 0000000000000..f94e0475ce515 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/tasks/DistributeCompiler.java @@ -0,0 +1,48 @@ + +package org.gradle.api.internal.distribute.tasks; + +import org.gradle.language.base.internal.compile.Compiler; +import org.gradle.api.internal.tasks.compile.JavaCompileSpec; +import org.gradle.api.internal.tasks.compile.incremental.jar.JarClasspathSnapshot; +import org.gradle.api.internal.tasks.compile.incremental.jar.PreviousCompilation; +import org.gradle.api.internal.tasks.compile.incremental.jar.JarClasspathSnapshotProvider; +import org.gradle.api.internal.tasks.compile.incremental.RecompilationSpecProvider; +import org.gradle.api.internal.tasks.compile.incremental.recomp.RecompilationSpec; +import org.gradle.api.tasks.incremental.IncrementalTaskInputs; +import org.gradle.api.tasks.WorkResult; +import org.gradle.internal.time.Time; +import org.gradle.internal.time.Timer; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class DistributeCompiler implements Compiler { + + private final IncrementalTaskInputs inputs; + private final Compiler delegate; + private final PreviousCompilation previousCompilation; + private final RecompilationSpecProvider recompilationSpecProvider; + private final JarClasspathSnapshotProvider jarClasspathSnapshotProvider; + + public DistributeCompiler(IncrementalTaskInputs inputs, Compiler delegate, + PreviousCompilation previousCompilation, JarClasspathSnapshotProvider jarClasspathSnapshotProvider, + RecompilationSpecProvider recompilationSpecProvider) { + this.inputs = inputs; + this.delegate = delegate; + this.previousCompilation = previousCompilation; + this.recompilationSpecProvider = recompilationSpecProvider; + this.jarClasspathSnapshotProvider = jarClasspathSnapshotProvider; + } + + @Override + public WorkResult execute(JavaCompileSpec spec) { + Timer clock = Time.startTimer(); + JarClasspathSnapshot jarClasspathSnapshot = jarClasspathSnapshotProvider + .getJarClasspathSnapshot(spec.getCompileClasspath()); + RecompilationSpec recompilationSpec = recompilationSpecProvider.provideRecompilationSpec(inputs, + previousCompilation, jarClasspathSnapshot); + + return delegate.execute(spec); + } + +} diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/JavaChangeProcessor.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/JavaChangeProcessor.java index 65be2bc1b0d5e..254c22f127dd6 100644 --- a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/JavaChangeProcessor.java +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/JavaChangeProcessor.java @@ -41,5 +41,6 @@ public void processChange(InputFileDetails input, RecompilationSpec spec) { return; } spec.getClassNames().addAll(actualDependents.getDependentClasses()); + spec.addReCompileClass(className, actualDependents.getDependentClasses()); } } diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java index 72c9d38c5f252..d30bd29030475 100644 --- a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java @@ -18,11 +18,15 @@ import java.io.File; import java.util.Collection; +import java.util.HashMap; import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; public class RecompilationSpec { private final Collection classesToCompile = new NormalizingClassNamesSet(); + private final Map> classesToCompileGroup = new HashMap<>(); private String fullRebuildCause; public Collection getClassNames() { @@ -38,14 +42,37 @@ public String getFullRebuildCause() { } public void setFullRebuildCause(String description, File file) { - fullRebuildCause = description != null? description : "'" + file.getName() + "' was changed"; + fullRebuildCause = description != null ? description : "'" + file.getName() + "' was changed"; + } + + public void addReCompileClass(String file, Set sets) { + LinkedHashSet classSet = classesToCompileGroup.get(file); + if (classSet == null) { + classSet = LinkedHashSet<>(); + classesToCompileGroup.put(file,classSet); + } + for (String cn : sets) { + classSet.add(NormalizingClassNames(cn)); + } + } + + public Map> getAllReCompileClass() { + return classesToCompileGroup; + } + + private String NormalizingClassNames(String className) { + int idx = className.indexOf('$'); + if (idx > 0) { + className = className.substring(0, idx); + } + return className; } private static class NormalizingClassNamesSet extends LinkedHashSet { @Override public boolean add(String className) { int idx = className.indexOf('$'); - if (idx>0) { + if (idx > 0) { className = className.substring(0, idx); } return super.add(className);