/* * 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 createAttributeValueFilter(@NonNls final String name, @NonNls final String value) { return createAttributeValueFilter(name, Collections.singleton(value)); } public static Condition createAttributeValueFilter(@NonNls final String name, @NonNls final Collection value) { return new Condition() { @Override public boolean value(final Element element) { return value.contains(element.getAttributeValue(name)); } }; } public static Condition createOptionElementFilter(@NonNls final String optionName) { return createElementWithAttributeFilter(OPTION_ELEMENT, NAME_ATTRIBUTE, optionName); } public static Condition 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 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.alwaysTrue()); } public static void copyChildren(Element from, Element to, Condition filter) { final List list = from.getChildren(); for (Element element : list) { if (filter.value(element)) { to.addContent((Element)element.clone()); } } } public static Condition createElementNameFilter(@NonNls final String elementName) { return new Condition() { @Override public boolean value(final Element element) { return elementName.equals(element.getName()); } }; } public static List removeChildren(final Element element, final Condition filter) { List toRemove = new ArrayList(); final List 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 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 filter) { final List list = parent.getChildren(); for (Element e : list) { if (filter.value(e)) { return e; } } return null; } public static void removeDuplicatedOptions(final Element element) { List children = new ArrayList(element.getChildren(OPTION_ELEMENT)); Set names = new HashSet(); for (Element child : children) { if (!names.add(child.getAttributeValue(NAME_ATTRIBUTE))) { element.removeContent(child); } } } }