/*******************************************************************************
 * Copyright (c) 2010-2014 SAP AG and others.
 * 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:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.skalli.core.extension.info;

import java.io.IOException;

import org.eclipse.skalli.model.ext.commons.InfoExtension;
import org.eclipse.skalli.services.extension.rest.RestConverterBase;

import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class InfoConverter extends RestConverterBase<InfoExtension> {

    public static final String API_VERSION = "1.0"; //$NON-NLS-1$
    public static final String NAMESPACE = "http://www.eclipse.org/skalli/2010/API/Extension-Info"; //$NON-NLS-1$

    public InfoConverter() {
        super(InfoExtension.class);
    }

    @SuppressWarnings("nls")
    @Override
    protected void marshal(InfoExtension extension) throws IOException {
        writer
          .pair("homepage", extension.getPageUrl())
          .collection("mailingLists", "mailingList", extension.getMailingLists());
    }

    @Override
    protected InfoExtension unmarshal() throws IOException {
        return unmarshal(new InfoExtension());
    }

    @SuppressWarnings("nls")
    private InfoExtension unmarshal(InfoExtension ext) throws IOException {
        while (reader.hasMore()) {
            if (reader.isKey("homepage")) {
                ext.setPageUrl(reader.valueString());
            } else if (reader.isKey("mailingLists")) {
                ext.setMailingLists(reader.collection("mailingList"));
            }
        }
        return ext;
    }

    @Deprecated
    public InfoConverter(String host) {
        super(InfoExtension.class, "info", host); //$NON-NLS-1$
    }

    @Deprecated
    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        InfoExtension info = (InfoExtension) source;
        writeNode(writer, "homepage", info.getPageUrl()); //$NON-NLS-1$
        writeNode(writer, "mailingLists", "mailingList", info.getMailingLists()); //$NON-NLS-1$ //$NON-NLS-2$
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        return iterateNodes(null, reader, context);
    }

    private InfoExtension iterateNodes(InfoExtension ext, HierarchicalStreamReader reader,
            UnmarshallingContext context) {
        if (ext == null) {
            ext = new InfoExtension();
        }

        while (reader.hasMoreChildren()) {
            reader.moveDown();

            String field = reader.getNodeName();
            String value = reader.getValue();

            if ("mailingLists".equals(field) && reader.hasMoreChildren()) { //$NON-NLS-1$
                iterateNodes(ext, reader, context);
            } else if ("mailingList".equals(field)) { //$NON-NLS-1$
                ext.addMailingList(value);
            } else if ("homepage".equals(field)) { //$NON-NLS-1$
                ext.setPageUrl(value);
            }

            reader.moveUp();
        }
        return ext;
    }

    @Override
    public String getApiVersion() {
        return API_VERSION;
    }

    @Override
    public String getNamespace() {
        return NAMESPACE;
    }

    @Override
    public String getXsdFileName() {
        return "extension-info.xsd"; //$NON-NLS-1$
    }

}
