/*
* Copyright (c) 2014-2015 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 javax.batch.api.BatchProperty;
import javax.inject.Inject;
import javax.naming.InitialContext;
import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
import com.fasterxml.jackson.dataformat.xml.XmlFactory;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
/**
* Base class for {@link org.jberet.support.io.XmlItemReader} and {@link org.jberet.support.io.XmlItemWriter}.
*
* @see XmlItemReader
* @see XmlItemWriter
* @since 1.0.2
*/
public abstract class XmlItemReaderWriterBase extends ItemReaderWriterBase {
/**
* JNDI lookup name for {@code com.fasterxml.jackson.dataformat.xml.XmlFactory}, which is used for constructing
* {@link com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser} in {@link org.jberet.support.io.XmlItemReader} and
* {@link com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator} in {@link org.jberet.support.io.XmlItemWriter}.
* Optional property and defaults to null. When this property is specified, its value is used to look up an
* instance of {@code com.fasterxml.jackson.dataformat.xml.XmlFactory}, which is typically created and
* administrated externally (e.g., inside application server). Otherwise, a new instance of
* {@code com.fasterxml.jackson.dataformat.xml.XmlFactory} is created instead of lookup.
*
* @see XmlFactoryObjectFactory
*/
@Inject
@BatchProperty
protected String xmlFactoryLookup;
/**
* A comma-separated list of Jackson datatype module type ids that extend {@code com.fasterxml.jackson.databind.Module}.
* These modules will be registered with {@link #xmlMapper}. For example,
* <p/>
* <pre>
* com.fasterxml.jackson.datatype.joda.JodaModule, com.fasterxml.jackson.datatype.jsr353.JSR353Module, com.fasterxml.jackson.datatype.jsr310.JSR310Module
* </pre>
*
* @see JsonItemReaderWriterBase#customDataTypeModules
*/
@Inject
@BatchProperty
protected String customDataTypeModules;
protected JacksonXmlModule xmlModule;
protected XmlFactory xmlFactory;
protected XmlMapper xmlMapper;
/**
* Initializes {@link #xmlModule}, if needed by job xml configuration.
*/
protected abstract void initXmlModule();
/**
* Initializes {@link #xmlFactory} field, which may be instantiated or obtained from other part of the application.
*/
protected void initXmlFactory() throws Exception {
if (xmlFactoryLookup != null) {
xmlFactory = InitialContext.doLookup(xmlFactoryLookup);
xmlMapper = (XmlMapper) xmlFactory.getCodec();
} else {
initXmlModule();
xmlFactory = new XmlFactory();
xmlMapper = xmlModule == null ? new XmlMapper(xmlFactory) : new XmlMapper(xmlFactory, xmlModule);
xmlFactory.setCodec(xmlMapper);
}
MappingJsonFactoryObjectFactory.configureCustomSerializersAndDeserializers(xmlMapper, null, null, customDataTypeModules, getClass().getClassLoader());
}
}