Package org.jberet.support.io

Source Code of org.jberet.support.io.XmlFactoryObjectFactory

/*
* Copyright (c) 2014 Red Hat, Inc. and/or its affiliates.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Cheng Fang - Initial API and implementation
*/

package org.jberet.support.io;

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;

import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
import com.fasterxml.jackson.dataformat.xml.XmlFactory;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.jberet.support._private.SupportLogger;

/**
* An implementation of {@code javax.naming.spi.ObjectFactory} that produces instance of
* {@code com.fasterxml.jackson.dataformat.xml.XmlFactory}. This class can be used to create a custom JNDI resource
* in an application server. See wildfly.home/docs/schema/jboss-as-naming_2_0.xsd for more details.
*/
public final class XmlFactoryObjectFactory implements ObjectFactory {
    private volatile XmlFactory xmlFactoryCached;

    /**
     * Gets an instance of {@code com.fasterxml.jackson.dataformat.xml.XmlFactory} based on the resource configuration in the
     * application server. The parameter {@code environment} contains XmlFactory configuration properties, and accepts
     * the following properties:
     * <ul>
     * <li>inputDecorator: fully-qualified name of a class that extends {@code com.fasterxml.jackson.core.io.InputDecorator}</li>
     * <li>outputDecorator: fully-qualified name of a class that extends {@code com.fasterxml.jackson.core.io.OutputDecorator}</li>
     * <li>xmlTextElementName: </li>
     * <li>defaultUseWrapper:</li>
     * </ul>
     *
     * @param obj         the JNDI name of {@code com.fasterxml.jackson.dataformat.xml.XmlFactory} resource
     * @param name        always null
     * @param nameCtx     always null
     * @param environment a {@code Hashtable} of configuration properties
     * @return an instance of {@code com.fasterxml.jackson.dataformat.xml.XmlFactory}
     * @throws Exception any exception occurred
     */
    @Override
    public Object getObjectInstance(final Object obj,
                                    final Name name,
                                    final Context nameCtx,
                                    final Hashtable<?, ?> environment) throws Exception {
        XmlFactory xmlFactory = xmlFactoryCached;
        if (xmlFactory == null) {
            synchronized (this) {
                xmlFactory = xmlFactoryCached;
                if (xmlFactory == null) {
                    xmlFactoryCached = xmlFactory = new XmlFactory();
                }

                JacksonXmlModule xmlModule = null;
                NoMappingJsonFactoryObjectFactory.configureInputDecoratorAndOutputDecorator(xmlFactory, environment);

                final Object xmlTextElementName = environment.get("xmlTextElementName");
                if (xmlTextElementName != null) {
                    xmlModule = new JacksonXmlModule();
                    xmlModule.setXMLTextElementName((String) xmlTextElementName);
                }

                final Object defaultUseWrapper = environment.get("defaultUseWrapper");
                if (defaultUseWrapper != null) {
                    if (defaultUseWrapper.equals("false")) {
                        if (xmlModule == null) {
                            xmlModule = new JacksonXmlModule();
                        }
                        xmlModule.setDefaultUseWrapper(false);
                    } else if (defaultUseWrapper.equals("true")) {
                        //default value is already true, so nothing to do
                    } else {
                        throw SupportLogger.LOGGER.invalidReaderWriterProperty(null, (String) defaultUseWrapper, "defaultUseWrapper");
                    }
                }

                final XmlMapper xmlMapper = xmlModule == null ? new XmlMapper(xmlFactory) : new XmlMapper(xmlFactory, xmlModule);
                xmlFactory.setCodec(xmlMapper);
            }
        }
        return xmlFactory;
    }
}
TOP

Related Classes of org.jberet.support.io.XmlFactoryObjectFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.