blob: 21e55f9ab08969a03eb906e1b118b6f346bf1da1 [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.ide.impl.convert;
import com.intellij.conversion.CannotConvertException;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Conditions;
import com.intellij.openapi.util.JDOMExternalizerUtil;
import com.intellij.openapi.util.JDOMUtil;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.serialization.JDomSerializationUtil;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
* @author nik
*/
@SuppressWarnings({"unchecked"})
public class JDomConvertingUtil extends JDomSerializationUtil {
private JDomConvertingUtil() {
}
public static Document loadDocument(File file) throws CannotConvertException {
try {
return JDOMUtil.loadDocument(file);
}
catch (JDOMException e) {
throw new CannotConvertException(file.getAbsolutePath() + ": " + e.getMessage(), e);
}
catch (IOException e) {
throw new CannotConvertException(file.getAbsolutePath() + ": " + e.getMessage(), e);
}
}
public static String getOptionValue(Element element, String optionName) {
return JDOMExternalizerUtil.readField(element, optionName);
}
@Nullable
public static String getSettingsValue(@Nullable Element element) {
return element != null ? element.getAttributeValue("value") : null;
}
@Nullable
public static Element getSettingsElement(@Nullable Element element, String name) {
for (Element child : JDOMUtil.getChildren(element, "setting")) {
if (child.getAttributeValue("name").equals(name)) {
return child;
}
}
return null;
}
public static Condition<Element> createAttributeValueFilter(@NonNls final String name, @NonNls final String value) {
return createAttributeValueFilter(name, Collections.singleton(value));
}
public static Condition<Element> createAttributeValueFilter(@NonNls final String name, @NonNls final Collection<String> value) {
return new Condition<Element>() {
@Override
public boolean value(final Element element) {
return value.contains(element.getAttributeValue(name));
}
};
}
public static Condition<Element> createOptionElementFilter(@NonNls final String optionName) {
return createElementWithAttributeFilter(OPTION_ELEMENT, NAME_ATTRIBUTE, optionName);
}
public static Condition<Element> createElementWithAttributeFilter(final String elementName, final String attributeName, final String attributeValue) {
return Conditions.and(createElementNameFilter(elementName),
createAttributeValueFilter(attributeName, attributeValue));
}
public static void copyAttributes(Element from, Element to) {
final List<Attribute> attributes = from.getAttributes();
for (Attribute attribute : attributes) {
to.setAttribute(attribute.getName(), attribute.getValue());
}
}
public static void copyChildren(Element from, Element to) {
copyChildren(from, to, Conditions.<Element>alwaysTrue());
}
public static void copyChildren(Element from, Element to, Condition<Element> filter) {
final List<Element> list = from.getChildren();
for (Element element : list) {
if (filter.value(element)) {
to.addContent((Element)element.clone());
}
}
}
public static Condition<Element> createElementNameFilter(@NonNls final String elementName) {
return new Condition<Element>() {
@Override
public boolean value(final Element element) {
return elementName.equals(element.getName());
}
};
}
public static List<Element> removeChildren(final Element element, final Condition<Element> filter) {
List<Element> toRemove = new ArrayList<Element>();
final List<Element> list = element.getChildren();
for (Element e : list) {
if (filter.value(e)) {
toRemove.add(e);
}
}
for (Element e : toRemove) {
element.removeContent(e);
}
return toRemove;
}
public static Element createOptionElement(String name, String value) {
final Element element = new Element(OPTION_ELEMENT);
element.setAttribute(NAME_ATTRIBUTE, name);
element.setAttribute(VALUE_ATTRIBUTE, value);
return element;
}
public static void addChildAfter(final Element parent, final Element child, final Condition<Element> filter, boolean addFirstIfNotFound) {
List list = parent.getContent();
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
if (o instanceof Element && filter.value((Element)o)) {
if (i < list.size() - 1) {
parent.addContent(i + 1, child);
}
else {
parent.addContent(child);
}
return;
}
}
if (addFirstIfNotFound) {
parent.addContent(0, child);
}
}
@Nullable
public static Element findChild(Element parent, final Condition<Element> filter) {
final List<Element> list = parent.getChildren();
for (Element e : list) {
if (filter.value(e)) {
return e;
}
}
return null;
}
public static void removeDuplicatedOptions(final Element element) {
List<Element> children = new ArrayList<Element>(element.getChildren(OPTION_ELEMENT));
Set<String> names = new HashSet<String>();
for (Element child : children) {
if (!names.add(child.getAttributeValue(NAME_ATTRIBUTE))) {
element.removeContent(child);
}
}
}
}