com.enonic.cms.core.xslt.base.BaseXsltProcessor.java Source code

Java tutorial

Introduction

Here is the source code for com.enonic.cms.core.xslt.base.BaseXsltProcessor.java

Source

/*
 * Copyright 2000-2013 Enonic AS
 * http://www.enonic.com/license
 */

package com.enonic.cms.core.xslt.base;

import java.io.StringWriter;
import java.io.Writer;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamResult;

import com.google.common.io.Closeables;

import com.enonic.cms.core.xslt.XsltProcessor;
import com.enonic.cms.core.xslt.XsltProcessorErrors;
import com.enonic.cms.core.xslt.XsltProcessorException;

public abstract class BaseXsltProcessor implements XsltProcessor {
    protected final Transformer transformer;

    public BaseXsltProcessor(final Transformer transformer) {
        this.transformer = transformer;
    }

    @Override
    public final String getOutputMethod() {
        return this.transformer.getOutputProperty(OutputKeys.METHOD);
    }

    @Override
    public final String getOutputMediaType() {
        return this.transformer.getOutputProperty(OutputKeys.MEDIA_TYPE);
    }

    @Override
    public final String getOutputEncoding() {
        return this.transformer.getOutputProperty(OutputKeys.ENCODING);
    }

    @Override
    public final void setOmitXmlDecl(boolean omitXmlDecl) {
        this.transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, omitXmlDecl ? "yes" : "no");
    }

    @Override
    public final String getContentType() {
        StringBuilder contentType = new StringBuilder();
        String outputMediaType = getOutputMediaType();
        if (outputMediaType != null) {
            contentType.append(outputMediaType);
        } else {
            String outputMethod = getOutputMethod();
            if ("xml".equals(outputMethod)) {
                contentType.append("text/xml");
            } else if ("html".equals(outputMethod) || "xhtml".equals(outputMethod)) {
                contentType.append("text/html");
            } else {
                contentType.append("text/plain");
            }
        }

        String outputEncoding = getOutputEncoding();
        contentType.append("; charset=");
        contentType.append(outputEncoding != null ? outputEncoding : "utf-8");
        return contentType.toString();
    }

    @Override
    public final String process(final Source xml) throws XsltProcessorException {
        StringWriter writer = new StringWriter();

        try {
            process(xml, writer);
        } finally {
            Closeables.closeQuietly(writer);
        }

        return writer.toString();
    }

    @Override
    public final void process(final Source xml, final Result result) throws XsltProcessorException {
        final XsltProcessorErrors errors = new XsltProcessorErrors();

        try {
            this.transformer.setErrorListener(errors);
            this.transformer.transform(xml, result);

            if (errors.hasErrors()) {
                throw new XsltProcessorException(errors);
            }
        } catch (final TransformerException e) {
            throw new XsltProcessorException(e, errors);
        }
    }

    private void process(final Source xml, final Writer writer) throws XsltProcessorException {
        final StreamResult result = new StreamResult(writer);
        process(xml, result);
    }

    @Override
    public void setParameter(final String name, final Object value) {
        if (value == null) {
            return;
        }

        if (value instanceof Boolean) {
            setBooleanParameter(name, (Boolean) value);
        } else if (value instanceof Float) {
            setFloatParameter(name, (Float) value);
        } else if (value instanceof Double) {
            setDoubleParameter(name, (Double) value);
        } else if (value instanceof Number) {
            setLongParameter(name, ((Number) value).longValue());
        } else {
            setStringParameter(name, value.toString());
        }
    }

    private void setBooleanParameter(final String name, final boolean value) {
        this.transformer.setParameter(name, value);
    }

    private void setFloatParameter(final String name, final float value) {
        this.transformer.setParameter(name, value);
    }

    private void setDoubleParameter(final String name, final double value) {
        this.transformer.setParameter(name, value);
    }

    private void setLongParameter(final String name, final long value) {
        this.transformer.setParameter(name, value);
    }

    private void setStringParameter(final String name, final String value) {
        this.transformer.setParameter(name, createUntypedAtomicValue(value));
    }

    protected abstract Object createUntypedAtomicValue(String value);
}