﻿/*
 * Copyright 2001-2008 The Apache Software 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.
 *
 */
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml.Serialization;

namespace org.apache.juddi.jaxb
{
    /// <summary>
    /// This is for printing UDDI v3 spec data objects only
    /// @author <a href="mailto:alexoree@apache.org">Alex O'Ree</a>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public  class PrintUDDI<T>
    {
        public  String print(Object j)
        {
            try
            {
                XmlSerializer xs = new XmlSerializer(typeof(T));
                StringWriter sw = new StringWriter();
                xs.Serialize(sw, j);
                return sw.ToString();
            }
            catch (Exception ex)
            {
                String err = "";
                while (ex != null)
                {
                    err += ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine;
                    ex = ex.InnerException;
                }
                return err;
            }
        }

        public T createObject(String data)
        {
            try
            {
                XmlSerializer xs = new XmlSerializer(typeof(T));
                StringReader sw = new StringReader(data);
                object j = xs.Deserialize(sw);
                return (T)j;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
