This commit is contained in:
Vladimir Krivosheev
2016-07-07 17:31:00 +02:00
parent c8391848f5
commit bb3c970c40
3 changed files with 40 additions and 73 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -46,6 +46,7 @@ public abstract class ActionRunner {
return result.throwException().getResultObject();
}
@Deprecated
public static void runInsideReadAction(@NotNull final InterruptibleRunnable runnable) throws Exception {
ApplicationManager.getApplication().runReadAction(new ThrowableComputable<Void, Exception>() {
@Override
@@ -53,7 +53,6 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.ActionRunner;
import com.intellij.util.EventDispatcher;
import com.intellij.util.StringSetSpinAllocator;
import com.intellij.util.concurrency.Semaphore;
@@ -89,7 +88,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
@Nullable
public String get(final AbstractPropertyContainer container) {
if (!container.hasProperty(this)) return null;
AntConfiguration antConfiguration = AntConfigurationImpl.INSTANCE.get(container);
AntConfiguration antConfiguration = INSTANCE.get(container);
return ProjectRootManager.getInstance(antConfiguration.getProject()).getProjectSdkName();
}
@@ -145,7 +144,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
daemon.restart();
}
else {
SwingUtilities.invokeLater(() -> daemon.restart());
SwingUtilities.invokeLater(daemon::restart);
}
}
});
@@ -172,19 +171,42 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
public Element getState() {
try {
final Element e = new Element("state");
writeExternal(e);
return e;
final Element state = new Element("state");
getProperties().writeExternal(state);
ApplicationManager.getApplication().runReadAction(() -> {
for (final AntBuildFileBase buildFile : getBuildFiles()) {
final Element element = new Element(BUILD_FILE);
element.setAttribute(URL, buildFile.getVirtualFile().getUrl());
buildFile.writeProperties(element);
saveEvents(element, buildFile);
state.addContent(element);
}
final List<VirtualFile> files = new ArrayList<VirtualFile>(myAntFileToContextFileMap.keySet());
// sort in order to minimize changes
Collections.sort(files, (o1, o2) -> o1.getUrl().compareTo(o2.getUrl()));
for (VirtualFile file : files) {
final Element element = new Element(CONTEXT_MAPPING);
final VirtualFile contextFile = myAntFileToContextFileMap.get(file);
element.setAttribute(URL, file.getUrl());
element.setAttribute(CONTEXT, contextFile.getUrl());
state.addContent(element);
}
});
return state;
}
catch (WriteExternalException e1) {
LOG.error(e1);
return null;
catch (WriteExternalException e) {
LOG.error(e);
}
return null;
}
public void loadState(Element state) {
try {
readExternal(state);
myIsInitialized = Boolean.FALSE;
myAntWorkspaceConfiguration.loadFromProjectSettings(state);
getProperties().readExternal(state);
runWhenInitialized(() -> loadBuildFileProjectProperties(state));
}
catch (InvalidDataException e) {
LOG.error(e);
@@ -348,17 +370,6 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
}
}
public void handleTargetRename(String oldTargetName, String newTargetName) {
synchronized (myEventToTargetMap) {
for (Map.Entry<ExecutionEvent, Pair<AntBuildFile, String>> entry : myEventToTargetMap.entrySet()) {
final Pair<AntBuildFile, String> pair = entry.getValue();
if (pair != null && Comparing.equal(pair.getSecond(), oldTargetName)) {
entry.setValue(Pair.create(pair.getFirst(), newTargetName));
}
}
}
}
public void updateBuildFile(final AntBuildFile buildFile) {
incModificationCount();
myEventDispatcher.getMulticaster().buildFileChanged(buildFile);
@@ -387,57 +398,12 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
return getModel(buildFile);
}
private void readExternal(final Element parentNode) throws InvalidDataException {
myIsInitialized = Boolean.FALSE;
myAntWorkspaceConfiguration.loadFromProjectSettings(parentNode);
getProperties().readExternal(parentNode);
runWhenInitialized(() -> loadBuildFileProjectProperties(parentNode));
}
private void runWhenInitialized(final Runnable runnable) {
if (getProject().isInitialized()) {
ApplicationManager.getApplication().runReadAction(() -> runnable.run());
ApplicationManager.getApplication().runReadAction(runnable);
}
else {
myStartupManager.runWhenProjectIsInitialized(() -> runnable.run());
}
}
private void writeExternal(final Element parentNode) throws WriteExternalException {
getProperties().writeExternal(parentNode);
try {
ActionRunner.runInsideReadAction(new ActionRunner.InterruptibleRunnable() {
public void run() throws WriteExternalException {
for (final AntBuildFileBase buildFile : getBuildFiles()) {
final Element element = new Element(BUILD_FILE);
element.setAttribute(URL, buildFile.getVirtualFile().getUrl());
buildFile.writeProperties(element);
saveEvents(element, buildFile);
parentNode.addContent(element);
}
final List<VirtualFile> files = new ArrayList<VirtualFile>(myAntFileToContextFileMap.keySet());
// sort in order to minimize changes
Collections.sort(files, (o1, o2) -> o1.getUrl().compareTo(o2.getUrl()));
for (VirtualFile file : files) {
final Element element = new Element(CONTEXT_MAPPING);
final VirtualFile contextFile = myAntFileToContextFileMap.get(file);
element.setAttribute(URL, file.getUrl());
element.setAttribute(CONTEXT, contextFile.getUrl());
parentNode.addContent(element);
}
}
});
}
catch (WriteExternalException e) {
LOG.error(e);
throw e;
}
catch (RuntimeException e) {
LOG.error(e);
throw e;
}
catch (Exception e) {
LOG.error(e);
myStartupManager.runWhenProjectIsInitialized(runnable);
}
}
@@ -607,7 +573,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
}
public static boolean executeTargetSynchronously(final DataContext dataContext, final AntBuildTarget target) {
return executeTargetSynchronously(dataContext, target, Collections.<BuildFileProperty>emptyList());
return executeTargetSynchronously(dataContext, target, Collections.emptyList());
}
public static boolean executeTargetSynchronously(final DataContext dataContext, final AntBuildTarget target, final List<BuildFileProperty> additionalProperties) {
@@ -831,7 +797,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis
if (!app.isDispatchThread() || task.isHeadless()) {
// for headless tasks we need to ensure async execution.
// Otherwise calls to AntConfiguration.getInstance() from the task will cause SOE
app.invokeLater(() -> task.queue(), ModalityState.any());
app.invokeLater(task::queue, ModalityState.any());
}
else {
task.queue();
@@ -182,8 +182,8 @@ ant.inspections.display.name=Ant inspections
ant.duplicate.targets.inspection=Duplicate targets
ant.duplicate.imported.targets.inspection=Duplicate targets in imported files
ant.missing.properties.file.inspection=Missing properties file
register.ant.build.progress=Registering Ant build file ''{0}''...
loading.ant.config.progress=Loading Ant configuration...
register.ant.build.progress=Registering Ant Build File ''{0}''...
loading.ant.config.progress=Loading Ant Configuration...
intention.configure.highlighting.family.name=Configure highlighting
intention.configure.highlighting.text=Configure highlighting
build.file.properties.maximum.stack.size.label=Maximum &stack size (Mb):