blob: d2d80aaeb05ae5eba51c881882a51949281ddf03 [file] [log] [blame]
/*
* Copyright 2000-2013 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.
* 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 com.intellij.tools;
import com.intellij.execution.BeforeRunTask;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.util.concurrency.Semaphore;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author traff
*/
public abstract class AbstractToolBeforeRunTask<ToolBeforeRunTask extends AbstractToolBeforeRunTask, T extends Tool>
extends BeforeRunTask<ToolBeforeRunTask> {
@NonNls private final static String ACTION_ID_ATTRIBUTE = "actionId";
private static final Logger LOG = Logger.getInstance(AbstractToolBeforeRunTask.class);
protected String myToolActionId;
public AbstractToolBeforeRunTask(Key<ToolBeforeRunTask> providerId) {
super(providerId);
}
@Nullable
public String getToolActionId() {
return myToolActionId;
}
@Override
public void writeExternal(Element element) {
super.writeExternal(element);
if (myToolActionId != null) {
element.setAttribute(ACTION_ID_ATTRIBUTE, myToolActionId);
}
}
@Override
public void readExternal(Element element) {
super.readExternal(element);
myToolActionId = element.getAttributeValue(ACTION_ID_ATTRIBUTE);
}
@Override
public ToolBeforeRunTask clone() {
return (ToolBeforeRunTask)super.clone();
}
public void setToolActionId(String toolActionId) {
myToolActionId = toolActionId;
}
public boolean isExecutable() {
return myToolActionId != null;
}
public boolean execute(final DataContext context, final long executionId) {
final Semaphore targetDone = new Semaphore();
final Ref<Boolean> result = new Ref<Boolean>(false);
try {
ApplicationManager.getApplication().invokeAndWait(new Runnable() {
@Override
public void run() {
ToolAction.runTool(myToolActionId, context, null, executionId, new ProcessAdapter() {
public void startNotified(final ProcessEvent event) {
targetDone.down();
}
@Override
public void processTerminated(ProcessEvent event) {
result.set(event.getExitCode() == 0);
targetDone.up();
}
});
}
}, ModalityState.NON_MODAL);
}
catch (Exception e) {
LOG.error(e);
return false;
}
targetDone.waitFor();
return result.get();
}
@Nullable
public T findCorrespondingTool() {
if (myToolActionId == null) {
return null;
}
List<T> tools = getTools();
for (T tool : tools) {
if (myToolActionId.equals(tool.getActionId())) {
return tool;
}
}
return null;
}
protected abstract List<T> getTools();
}