All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codehaus.plexus.util.xml.XmlUtil Maven / Gradle / Ivy

package org.codehaus.plexus.util.xml;

/*
 * Copyright The Codehaus Foundation.
 *
 * 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.
 */

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

import org.codehaus.plexus.util.xml.pull.MXParser;
import org.codehaus.plexus.util.xml.pull.XmlPullParser;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;

/**
 * Common XML utilities methods.
 *
 * @author Vincent Siveton
 *
 * @since 1.5.7
 */
public class XmlUtil {
    /** The default line indenter size i.e. 2. */
    public static final int DEFAULT_INDENTATION_SIZE = 2;

    /** The default line separator ("\n" on UNIX) */
    public static final String DEFAULT_LINE_SEPARATOR = System.getProperty("line.separator");

    /**
     * Determines if a given File shall be handled as XML.
     *
     * @param f not null file
     * @return true if the given file has XML content, false otherwise.
     */
    public static boolean isXml(File f) {
        if (f == null) {
            throw new IllegalArgumentException("f could not be null.");
        }

        if (!f.isFile()) {
            throw new IllegalArgumentException("The file '" + f.getAbsolutePath() + "' is not a file.");
        }

        try (Reader reader = new XmlStreamReader(f)) {
            XmlPullParser parser = new MXParser();
            parser.setInput(reader);
            parser.nextToken();
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * Pretty format the input reader. For instance, the following input:
     *
     * 
     * <div><b>content</b></div>
     * 
* * becomes * *
     * <div>
     *   <b>content</b>
     * </div>
     * 
* * @param reader not null * @param writer not null * @throws IOException if any or invalid xml content * @see #prettyFormat(Reader, Writer, int, String) */ public static void prettyFormat(Reader reader, Writer writer) throws IOException { prettyFormat(reader, writer, DEFAULT_INDENTATION_SIZE, DEFAULT_LINE_SEPARATOR); } /** * Pretty format the input reader. For instance, the following input: * *
     * <div><b>content</b></div>
     * 
* * becomes * *
     * <div>
     *   <b>content</b>
     * </div>
     * 
* * @param reader not null * @param writer not null * @param indentSize positive number for the indentation * @param lineSeparator the wanted line separator * @throws IOException if any or invalid xml content */ public static void prettyFormat(Reader reader, Writer writer, int indentSize, String lineSeparator) throws IOException { if (reader == null) { throw new IllegalArgumentException("The reader is null"); } if (writer == null) { throw new IllegalArgumentException("The writer is null"); } if (indentSize < 0) { indentSize = 0; } PrettyPrintXMLWriter xmlWriter = new PrettyPrintXMLWriter(writer); xmlWriter.setLineIndenter(StringUtils.repeat(" ", indentSize)); xmlWriter.setLineSeparator(lineSeparator); XmlPullParser parser = new MXParser(); try { parser.setInput(reader); prettyFormatInternal(parser, xmlWriter); } catch (XmlPullParserException e) { throw new IOException("Unable to parse the XML: " + e.getMessage()); } } /** * Pretty format the input stream. For instance, the following input: * *
     * <div><b>content</b></div>
     * 
* * becomes * *
     * <div>
     *   <b>content</b>
     * </div>
     * 
* * @param is not null * @param os not null * @throws IOException if any or invalid xml content * @see #prettyFormat(InputStream, OutputStream, int, String) */ public static void prettyFormat(InputStream is, OutputStream os) throws IOException { prettyFormat(is, os, DEFAULT_INDENTATION_SIZE, DEFAULT_LINE_SEPARATOR); } /** * Pretty format the input stream. For instance, the following input: * *
     * <div><b>content</b></div>
     * 
* * becomes * *
     * <div>
     *   <b>content</b>
     * </div>
     * 
* * @param is not null * @param os not null * @param indentSize positive number for the indentation * @param lineSeparator the wanted line separator * @throws IOException if any or invalid xml content */ public static void prettyFormat(InputStream is, OutputStream os, int indentSize, String lineSeparator) throws IOException { if (is == null) { throw new IllegalArgumentException("The is is null"); } if (os == null) { throw new IllegalArgumentException("The os is null"); } if (indentSize < 0) { indentSize = 0; } try (InputStream input = is; Writer writer = new OutputStreamWriter(os)) { final PrettyPrintXMLWriter xmlWriter = new PrettyPrintXMLWriter(writer); xmlWriter.setLineIndenter(StringUtils.repeat(" ", indentSize)); xmlWriter.setLineSeparator(lineSeparator); final XmlPullParser parser = new MXParser(); parser.setInput(input, null); prettyFormatInternal(parser, xmlWriter); } catch (XmlPullParserException e) { throw new IOException("Unable to parse the XML: " + e.getMessage()); } } /** * @param parser not null * @param writer not null * @throws XmlPullParserException if any * @throws IOException if any */ private static void prettyFormatInternal(XmlPullParser parser, PrettyPrintXMLWriter writer) throws XmlPullParserException, IOException { boolean hasTag = false; boolean hasComment = false; int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG) { hasTag = true; if (hasComment) { writer.writeText(writer.getLineIndenter()); hasComment = false; } writer.startElement(parser.getName()); for (int i = 0; i < parser.getAttributeCount(); i++) { String key = parser.getAttributeName(i); String value = parser.getAttributeValue(i); writer.addAttribute(key, value); } } else if (eventType == XmlPullParser.TEXT) { String text = parser.getText(); if (!text.trim().equals("")) { text = StringUtils.removeDuplicateWhitespace(text); writer.writeText(text); } } else if (eventType == XmlPullParser.END_TAG) { hasTag = false; writer.endElement(); } else if (eventType == XmlPullParser.COMMENT) { hasComment = true; if (!hasTag) { writer.writeMarkup(writer.getLineSeparator()); for (int i = 0; i < writer.getDepth(); i++) { writer.writeMarkup(writer.getLineIndenter()); } } writer.writeMarkup(""); if (!hasTag) { writer.writeMarkup(writer.getLineSeparator()); for (int i = 0; i < writer.getDepth() - 1; i++) { writer.writeMarkup(writer.getLineIndenter()); } } } else if (eventType == XmlPullParser.DOCDECL) { writer.writeMarkup(""); writer.endOfLine(); } else if (eventType == XmlPullParser.PROCESSING_INSTRUCTION) { writer.writeMarkup(""); writer.endOfLine(); } else if (eventType == XmlPullParser.CDSECT) { writer.writeMarkup(""); } else if (eventType == XmlPullParser.ENTITY_REF) { writer.writeMarkup("&" + parser.getName() + ";"); } eventType = parser.nextToken(); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy