psidev.psi.mi.xml.io.impl.PsimiXmlWriter253.java Source code

Java tutorial

Introduction

Here is the source code for psidev.psi.mi.xml.io.impl.PsimiXmlWriter253.java

Source

/*
 * Copyright (c) 2002 The European Bioinformatics Institute, and others.
 * All rights reserved. Please see the file LICENSE
 * in the root directory of this distribution.
 */
package psidev.psi.mi.xml.io.impl;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import psidev.psi.mi.xml.PsimiXmlWriterException;
import psidev.psi.mi.xml.converter.ConverterException;
import psidev.psi.mi.xml.converter.impl253.EntrySetConverter;
import psidev.psi.mi.xml.dao.DAOFactory;
import psidev.psi.mi.xml.dao.inMemory.InMemoryDAOFactory;
import psidev.psi.mi.xml.io.PsimiXmlWriter;
import psidev.psi.mi.xml.model.EntrySet;
import psidev.psi.mi.xml.util.PsiJaxbConverter;
import psidev.psi.mi.xml253.jaxb.ObjectFactory;

import javax.xml.bind.DatatypeConverter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.*;

/**
 * Write PSI MI data to various format.
 *
 * @author Samuel Kerrien (skerrien@ebi.ac.uk)
 * @version $Id$
 * @since <pre>07-Jun-2006</pre>
 */
public class PsimiXmlWriter253 implements PsimiXmlWriter {

    /**
     * Sets up a logger for that class.
     */
    public static final Log log = LogFactory.getLog(PsimiXmlWriter253.class);

    /////////////////////////
    // Private methods

    private Marshaller getMarshaller(psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet) throws PsimiXmlWriterException {

        try {
            // create a JAXBContext capable of handling classes generated into the jaxb package
            ClassLoader cl = ObjectFactory.class.getClassLoader();
            JAXBContext jc = JAXBContext
                    .newInstance(psidev.psi.mi.xml253.jaxb.EntrySet.class.getPackage().getName(), cl);

            // setup customized converter
            DatatypeConverter.setDatatypeConverter(new PsiJaxbConverter());

            // create and return Unmarshaller
            Marshaller marshaller = jc.createMarshaller();
            // configure marshaller
            marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, calculateSchemaLocation(jEntrySet.getLevel(),
                    jEntrySet.getVersion(), jEntrySet.getMinorVersion()));

            return marshaller;
        } catch (Exception e) {
            throw new PsimiXmlWriterException("En error occured while writing EntrySet", e);
        }
    }

    public void marshall(psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet, OutputStream os)
            throws PsimiXmlWriterException {

        if (os == null) {
            throw new IllegalArgumentException("You must give a non null otuput stream.");
        }

        try {
            // create a marshaller
            Marshaller m = getMarshaller(jEntrySet);
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            m.marshal(jEntrySet, os);
        } catch (Exception e) {
            throw new PsimiXmlWriterException("En error occured while writing EntrySet", e);
        }
    }

    public void marshall(psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet, Writer writer)
            throws PsimiXmlWriterException {

        if (writer == null) {
            throw new IllegalArgumentException("You must give a non null writer.");
        }

        try {
            // create a marshaller
            Marshaller m = getMarshaller(jEntrySet);
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            m.marshal(jEntrySet, writer);
        } catch (Exception e) {
            throw new PsimiXmlWriterException("En error occured while writing EntrySet", e);
        }
    }

    private void marshall(psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet, File file) throws PsimiXmlWriterException {
        try {
            // create a marshaller
            Marshaller m = getMarshaller(jEntrySet);

            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            m.marshal(jEntrySet, new FileWriter(file));
        } catch (Exception e) {
            throw new PsimiXmlWriterException("En error occured while writing EntrySet", e);
        }
    }

    private String marshall(psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet) throws PsimiXmlWriterException {

        Writer writer = new StringWriter(4096);

        try {
            Marshaller marshaller = getMarshaller(jEntrySet);
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.marshal(jEntrySet, writer);

            writer.close();
            return writer.toString();
        } catch (Exception e) {
            throw new PsimiXmlWriterException("En error occured while writing EntrySet", e);
        }
    }

    private psidev.psi.mi.xml253.jaxb.EntrySet convertInMemory(EntrySet mEntrySet) throws PsimiXmlWriterException {

        // create a converter
        EntrySetConverter converter = new EntrySetConverter();

        // initialise DAO
        DAOFactory dao = new InMemoryDAOFactory();
        converter.setDAOFactory(dao);

        try {
            // convert JAXB model
            psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet = converter.toJaxb(mEntrySet);

            return jEntrySet;
        } catch (Exception e) {
            throw new PsimiXmlWriterException("En error occured while writing EntrySet", e);
        }
    }

    /////////////////////////
    // public methods

    public void write(EntrySet mEntrySet, File file) throws PsimiXmlWriterException {

        if (file == null) {
            throw new IllegalArgumentException("You must give a non null file.");
        }

        if (file.exists()) {
            log.warn(file.getAbsolutePath() + " is going to be overwritten");

            if (!file.canWrite()) {
                throw new IllegalArgumentException("You must give a writeable file.");
            }
        } else {
            try {
                if (!file.createNewFile()) {
                    throw new PsimiXmlWriterException("Could not create file: " + file.getAbsolutePath());
                }
            } catch (IOException e) {
                throw new PsimiXmlWriterException("Could not create file: " + file.getAbsolutePath(), e);
            }
        }

        psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet = convertInMemory(mEntrySet);

        // marshall it to a file
        marshall(jEntrySet, file);
    }

    public void write(EntrySet mEntrySet, OutputStream os) throws PsimiXmlWriterException {
        psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet = convertInMemory(mEntrySet);

        // marshall it to a file
        marshall(jEntrySet, os);
    }

    public void write(EntrySet mEntrySet, Writer writer)
            throws IOException, ConverterException, JAXBException, PsimiXmlWriterException {
        psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet = convertInMemory(mEntrySet);

        // marshall it to a file
        marshall(jEntrySet, writer);
    }

    public void write(EntrySet mEntrySet, PrintStream ps)
            throws IOException, ConverterException, JAXBException, PsimiXmlWriterException {
        psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet = convertInMemory(mEntrySet);

        // marshall it to a file
        String xml = marshall(jEntrySet);

        ps.println(xml);
    }

    public String getAsString(EntrySet mEntrySet) throws PsimiXmlWriterException {
        psidev.psi.mi.xml253.jaxb.EntrySet jEntrySet = convertInMemory(mEntrySet);

        // marshall it to a file
        String xml = marshall(jEntrySet);

        return xml;
    }

    public static String calculateSchemaLocation(int majorVersion, int minorVersion, int bugfix) {

        String versionSuffix;

        if (majorVersion > 0 && minorVersion != 0) {
            versionSuffix = String.valueOf(majorVersion) + String.valueOf(minorVersion) + String.valueOf(bugfix);
        } else {
            versionSuffix = "253";
        }

        return "net:sf:psidev:mi http://psidev.sourceforge.net/mi/rel25/src/MIF" + versionSuffix + ".xsd";
    }
}