diff --git a/jps/.idea/artifacts/jps_facade.xml b/jps/.idea/artifacts/jps_facade.xml
index 7806b242107d..10b7050582ff 100644
--- a/jps/.idea/artifacts/jps_facade.xml
+++ b/jps/.idea/artifacts/jps_facade.xml
@@ -1,5 +1,5 @@
-
+
$PROJECT_DIR$/out/artifacts/
diff --git a/jps/serverFacade/serverFacade.iml b/jps/serverFacade/serverFacade.iml
index 4c71b0f3e252..8a19ff686956 100644
--- a/jps/serverFacade/serverFacade.iml
+++ b/jps/serverFacade/serverFacade.iml
@@ -18,6 +18,7 @@
+
diff --git a/jps/serverFacade/src/org/jetbrains/jps/server/BuildParameters.java b/jps/serverFacade/src/org/jetbrains/jps/server/BuildParameters.java
index e6d8adad3efd..d3d844a8760a 100644
--- a/jps/serverFacade/src/org/jetbrains/jps/server/BuildParameters.java
+++ b/jps/serverFacade/src/org/jetbrains/jps/server/BuildParameters.java
@@ -1,14 +1,11 @@
package org.jetbrains.jps.server;
-import java.util.Map;
-
/**
* @author Eugene Zhuravlev
* Date: 9/10/11
*/
public class BuildParameters {
public BuildType buildType = BuildType.MAKE;
- public Map pathVariables;
public boolean useInProcessJavac = true;
public BuildParameters() {
diff --git a/jps/serverFacade/src/org/jetbrains/jps/server/Facade.java b/jps/serverFacade/src/org/jetbrains/jps/server/Facade.java
index 70657c0468d4..bd6b8641c246 100644
--- a/jps/serverFacade/src/org/jetbrains/jps/server/Facade.java
+++ b/jps/serverFacade/src/org/jetbrains/jps/server/Facade.java
@@ -1,5 +1,6 @@
package org.jetbrains.jps.server;
+import org.apache.tools.ant.BuildEvent;
import org.codehaus.gant.GantBinding;
import org.jetbrains.ether.ProjectWrapper;
import org.jetbrains.jps.Module;
@@ -7,22 +8,39 @@ import org.jetbrains.jps.Project;
import org.jetbrains.jps.listeners.BuildInfoPrinter;
import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
/**
* @author Eugene Zhuravlev
* Date: 9/10/11
+ * @noinspection UnusedDeclaration
*/
public class Facade {
+ private final Map myProjects = new HashMap();
+ private final Map myPathVariables = new ConcurrentHashMap();
+
+ public void setPathVariables(Map vars) {
+ myPathVariables.clear();
+ myPathVariables.putAll(vars);
+ }
+
+ public void clearProjectCache(String projectPath) {
+ myProjects.remove(projectPath);
+ }
public void startBuild(String projectPath, Set modules, final BuildParameters params, final MessagesConsumer consumer) throws Throwable {
- final ProjectWrapper proj = ProjectWrapper.load(new GantBinding(), projectPath, getStartupScript(params), params.pathVariables, params.buildType == BuildType.MAKE);
+ ProjectWrapper pw = myProjects.get(projectPath);
+ if (pw == null) {
+ pw = ProjectWrapper.load(new GantBinding(), projectPath, getStartupScript(), myPathVariables, true);
+ myProjects.put(projectPath, pw);
+ }
+
+ configureProject(pw, params, consumer);
List toCompile = null;
if (modules != null && modules.size() > 0) {
- for (Module m : proj.getProject().getModules().values()) {
+ for (Module m : pw.getProject().getModules().values()) {
if (modules.contains(m.getName())){
if (toCompile == null) {
toCompile = new ArrayList();
@@ -32,25 +50,13 @@ public class Facade {
}
}
- proj.getProject().getBuilder().setBuildInfoPrinter(new BuildInfoPrinter() {
- public Object printProgressMessage(Project project, String message) {
- consumer.consumeProgressMessage(message);
- return null;
- }
-
- public Object printCompilationErrors(Project project, String compilerName, String messages) {
- consumer.consumeCompilerMessage(compilerName, compilerName);
- return null;
- }
- });
-
switch (params.buildType) {
case REBUILD:
if (toCompile == null || toCompile.isEmpty()) {
- proj.rebuild();
+ pw.rebuild();
}
else {
- proj.makeModules(toCompile, new ProjectWrapper.Flags() {
+ pw.makeModules(toCompile, new ProjectWrapper.Flags() {
public boolean tests() {
return true;
}
@@ -71,7 +77,7 @@ public class Facade {
break;
case MAKE:
- proj.makeModules(toCompile, new ProjectWrapper.Flags() {
+ pw.makeModules(toCompile, new ProjectWrapper.Flags() {
public boolean tests() {
return true;
}
@@ -91,15 +97,53 @@ public class Facade {
break;
case CLEAN:
- proj.clean();
+ pw.clean();
break;
}
- proj.save();
+ pw.save();
}
- private String getStartupScript(BuildParameters params) {
- return "import org.jetbrains.jps.*\n" +
- "\n" +
+ private void configureProject(ProjectWrapper pw, BuildParameters params, final MessagesConsumer consumer) {
+ pw.getProject().getBuilder().setUseInProcessJavac(params.useInProcessJavac);
+ pw.getProject().getBuilder().setBuildInfoPrinter(new BuildInfoPrinter() {
+ public Object printProgressMessage(Project project, String message) {
+ consumer.consumeProgressMessage(message);
+ return null;
+ }
+
+ public Object printCompilationErrors(Project project, String compilerName, String messages) {
+ consumer.consumeCompilerMessage(compilerName, messages);
+ return null;
+ }
+ });
+ pw.getProject().getBinding().addBuildListener(new org.apache.tools.ant.BuildListener() {
+ public void buildStarted(BuildEvent buildEvent) {
+ }
+
+ public void buildFinished(BuildEvent buildEvent) {
+ }
+
+ public void targetStarted(BuildEvent buildEvent) {
+ }
+
+ public void targetFinished(BuildEvent buildEvent) {
+ }
+
+ public void taskStarted(BuildEvent buildEvent) {
+ }
+
+ public void taskFinished(BuildEvent buildEvent) {
+ }
+
+ public void messageLogged(BuildEvent buildEvent) {
+ consumer.consumeCompilerMessage("ANT", buildEvent.getMessage());
+ }
+ });
+ }
+
+ private String getStartupScript() {
+ return "import org.jetbrains.jps.*\n";
+ //"\n" +
//"project.createJavaSdk (\n" +
//" \"IDEA jdk\", \n" +
//" \"/home/db/develop/jetbrains/jdk1.6.0_22\", \n" +
@@ -125,7 +169,6 @@ public class Facade {
//")\n" +
//"\n" +
//"project.projectSdk = project.sdks [\"IDEA jdk\"]\n" +
- "project.builder.useInProcessJavac = " + Boolean.valueOf(params.useInProcessJavac).toString();
}
private static class InstanceHolder {