blob: 3846d9c87416bbf58731c65fc91dbe226229765e [file] [log] [blame]
/*
* Copyright 2000-2014 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.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PathMacroManager;
import com.intellij.openapi.options.BaseSchemeProcessor;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.text.StringUtil;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Parent;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
abstract public class ToolsProcessor<T extends Tool> extends BaseSchemeProcessor<ToolsGroup<T>> {
@NonNls private static final String TOOL_SET = "toolSet";
@NonNls private static final String TOOL = "tool";
@NonNls private static final String ATTRIBUTE_NAME = "name";
@NonNls private static final String NAME = ATTRIBUTE_NAME;
@NonNls private static final String DESCRIPTION = "description";
@NonNls private static final String SHOW_IN_MAIN_MENU = "showInMainMenu";
@NonNls private static final String SHOW_IN_EDITOR = "showInEditor";
@NonNls private static final String SHOW_IN_PROJECT = "showInProject";
@NonNls private static final String SHOW_IN_SEARCH_POPUP = "showInSearchPopup";
@NonNls private static final String DISABLED = "disabled";
@NonNls private static final String USE_CONSOLE = "useConsole";
@NonNls private static final String SHOW_CONSOLE_ON_STDOUT = "showConsoleOnStdOut";
@NonNls private static final String SHOW_CONSOLE_ON_STDERR = "showConsoleOnStdErr";
@NonNls private static final String SYNCHRONIZE_AFTER_EXECUTION = "synchronizeAfterRun";
@NonNls private static final String EXEC = "exec";
@NonNls private static final String WORKING_DIRECTORY = "WORKING_DIRECTORY";
@NonNls private static final String COMMAND = "COMMAND";
@NonNls private static final String PARAMETERS = "PARAMETERS";
@NonNls private static final String FILTER = "filter";
@NonNls private static final String ELEMENT_OPTION = "option";
@NonNls private static final String ATTRIBUTE_VALUE = "value";
@NonNls private static final String APPLICATION_HOME_MACRO = "$APPLICATION_HOME_DIR$";
@Override
public ToolsGroup<T> readScheme(@NotNull final Document document) throws InvalidDataException, IOException, JDOMException {
Element root = document.getRootElement();
if (root == null || !TOOL_SET.equals(root.getName())) {
throw new InvalidDataException();
}
String attrName = root.getAttributeValue(ATTRIBUTE_NAME);
String groupName = StringUtil.isEmpty(attrName)? Tool.DEFAULT_GROUP_NAME : attrName;
ToolsGroup<T> result = createToolsGroup(groupName);
final PathMacroManager macroManager = PathMacroManager.getInstance(ApplicationManager.getApplication());
for (final Object o : root.getChildren(TOOL)) {
Element element = (Element)o;
T tool = createTool();
readToolAttributes(element, tool);
Element exec = element.getChild(EXEC);
if (exec != null) {
for (final Object o1 : exec.getChildren(ELEMENT_OPTION)) {
Element optionElement = (Element)o1;
String name = optionElement.getAttributeValue(ATTRIBUTE_NAME);
String value = optionElement.getAttributeValue(ATTRIBUTE_VALUE);
if (WORKING_DIRECTORY.equals(name)) {
if (value != null) {
final String replace = macroManager.expandPath(value).replace('/', File.separatorChar);
tool.setWorkingDirectory(replace);
}
}
if (COMMAND.equals(name)) {
tool.setProgram(macroManager.expandPath(ToolManager.convertString(value)));
}
if (PARAMETERS.equals(name)) {
tool.setParameters(macroManager.expandPath(ToolManager.convertString(value)));
}
}
}
for (final Object o2 : element.getChildren(FILTER)) {
Element childNode = (Element)o2;
FilterInfo filterInfo = new FilterInfo();
filterInfo.readExternal(childNode);
tool.addOutputFilter(filterInfo);
}
tool.setGroup(groupName);
result.addElement(tool);
}
return result;
}
protected void readToolAttributes(Element element, T tool) {
tool.setName(ToolManager.convertString(element.getAttributeValue(NAME)));
tool.setDescription(ToolManager.convertString(element.getAttributeValue(DESCRIPTION)));
tool.setShownInMainMenu(Boolean.valueOf(element.getAttributeValue(SHOW_IN_MAIN_MENU)).booleanValue());
tool.setShownInEditor(Boolean.valueOf(element.getAttributeValue(SHOW_IN_EDITOR)).booleanValue());
tool.setShownInProjectViews(Boolean.valueOf(element.getAttributeValue(SHOW_IN_PROJECT)).booleanValue());
tool.setShownInSearchResultsPopup(Boolean.valueOf(element.getAttributeValue(SHOW_IN_SEARCH_POPUP)).booleanValue());
tool.setEnabled(!Boolean.valueOf(element.getAttributeValue(DISABLED)).booleanValue());
tool.setUseConsole(Boolean.valueOf(element.getAttributeValue(USE_CONSOLE)).booleanValue());
tool.setShowConsoleOnStdOut(Boolean.valueOf(element.getAttributeValue(SHOW_CONSOLE_ON_STDOUT)).booleanValue());
tool.setShowConsoleOnStdErr(Boolean.valueOf(element.getAttributeValue(SHOW_CONSOLE_ON_STDERR)).booleanValue());
tool.setFilesSynchronizedAfterRun(Boolean.valueOf(element.getAttributeValue(SYNCHRONIZE_AFTER_EXECUTION)).booleanValue());
}
protected abstract ToolsGroup<T> createToolsGroup(String groupName);
protected abstract T createTool();
@Override
public Element writeScheme(@NotNull final ToolsGroup<T> scheme) throws WriteExternalException {
Element groupElement = new Element(TOOL_SET);
if (scheme.getName() != null) {
groupElement.setAttribute(ATTRIBUTE_NAME, scheme.getName());
}
for (T tool : scheme.getElements()) {
saveTool(tool, groupElement);
}
return groupElement;
}
@Override
public boolean shouldBeSaved(@NotNull final ToolsGroup scheme) {
return true;
}
private void saveTool(T tool, Element groupElement) {
Element element = new Element(TOOL);
if (tool.getName() != null) {
element.setAttribute(NAME, tool.getName());
}
if (tool.getDescription() != null) {
element.setAttribute(DESCRIPTION, tool.getDescription());
}
saveToolAttributes(tool, element);
Element taskElement = new Element(EXEC);
final PathMacroManager macroManager = PathMacroManager.getInstance(ApplicationManager.getApplication());
Element option = new Element(ELEMENT_OPTION);
taskElement.addContent(option);
option.setAttribute(ATTRIBUTE_NAME, COMMAND);
if (tool.getProgram() != null) {
option.setAttribute(ATTRIBUTE_VALUE, macroManager.collapsePath(tool.getProgram()));
}
option = new Element(ELEMENT_OPTION);
taskElement.addContent(option);
option.setAttribute(ATTRIBUTE_NAME, PARAMETERS);
if (tool.getParameters() != null) {
option.setAttribute(ATTRIBUTE_VALUE, macroManager.collapsePath(tool.getParameters()));
}
option = new Element(ELEMENT_OPTION);
taskElement.addContent(option);
option.setAttribute(ATTRIBUTE_NAME, WORKING_DIRECTORY);
if (tool.getWorkingDirectory() != null) {
option.setAttribute(ATTRIBUTE_VALUE, macroManager.collapsePath(tool.getWorkingDirectory()).replace(File.separatorChar, '/'));
}
element.addContent(taskElement);
FilterInfo[] filters = tool.getOutputFilters();
for (FilterInfo filter : filters) {
Element filterElement = new Element(FILTER);
filter.writeExternal(filterElement);
element.addContent(filterElement);
}
groupElement.addContent(element);
}
protected void saveToolAttributes(T tool, Element element) {
element.setAttribute(SHOW_IN_MAIN_MENU, Boolean.toString(tool.isShownInMainMenu()));
element.setAttribute(SHOW_IN_EDITOR, Boolean.toString(tool.isShownInEditor()));
element.setAttribute(SHOW_IN_PROJECT, Boolean.toString(tool.isShownInProjectViews()));
element.setAttribute(SHOW_IN_SEARCH_POPUP, Boolean.toString(tool.isShownInSearchResultsPopup()));
element.setAttribute(DISABLED, Boolean.toString(!tool.isEnabled()));
element.setAttribute(USE_CONSOLE, Boolean.toString(tool.isUseConsole()));
element.setAttribute(SHOW_CONSOLE_ON_STDOUT, Boolean.toString(tool.isShowConsoleOnStdOut()));
element.setAttribute(SHOW_CONSOLE_ON_STDERR, Boolean.toString(tool.isShowConsoleOnStdErr()));
element.setAttribute(SYNCHRONIZE_AFTER_EXECUTION, Boolean.toString(tool.synchronizeAfterExecution()));
}
}