
package uk.co.wingpath.modbusgui;

import java.io.*;
import java.util.*;
import java.util.List;
import uk.co.wingpath.event.*;
import uk.co.wingpath.util.*;
import uk.co.wingpath.modbus.*;
import uk.co.wingpath.xml.*;

public final class DeviceIdXml
{
    private DeviceIdXml ()
    {
    }

    public static void save (Xml.Saver saver, DeviceId di)
        throws IOException
    {
        for (Integer id : di.getIds ())
        {
            saver.startTag ("object");
            saver.saveValue ("id", id, 16);
            String name = di.getName (id);
            if (!name.equals (""))
                saver.saveValue ("name", name);
            saver.saveValue ("value", di.get (id));
            saver.endTag ("object");
        }
    }

    public static Xml.Loader getXmlLoader (Xml.Receiver<DeviceId> receiver)
    {
        return new XmlLoader (receiver);
    }

    private static class XmlLoader
        extends Xml.AbstractLoader
    {
        private final Xml.Receiver<DeviceId> receiver;
        private DeviceId deviceId;

        XmlLoader (Xml.Receiver<DeviceId> receiver)
        {
            this.receiver = receiver;
            deviceId = new DeviceId ();
        }

        @Override
        public Xml.Loader startChild (String tag)
        {
            if (tag.equalsIgnoreCase ("object"))
            {
                return new Xml.AbstractLoader ()
                {
                    int id = -1;
                    String name = "";
                    String value = "";

                    @Override
                    public Xml.Loader startChild (String tag)
                    {
                        if (tag.equalsIgnoreCase ("id"))
                        {
                            return new Xml.IntegerLoader (0, 255, 16,
                                new Xml.Receiver<Integer> ()
                                {
                                    public void receive (Integer value)
                                    {
                                        id = value;
                                    }
                                });
                        }
                        if (tag.equalsIgnoreCase ("name"))
                        {
                            return new Xml.StringLoader (
                                new Xml.Receiver<String> ()
                                {
                                    public void receive (String value)
                                        throws ValueException
                                    {
                                        name = value;
                                    }
                                });
                        }
                        if (tag.equalsIgnoreCase ("value"))
                        {
                            return new Xml.StringLoader (
                                new Xml.Receiver<String> ()
                                {
                                    public void receive (String val)
                                        throws ValueException
                                    {
                                        value = val;
                                    }
                                });
                        }
                        return null;
                    }

                    @Override
                    public void end (String val)
                        throws ValueException
                    {
                        if (!val.equals (""))
                            throw new ValueException ("Value not allowed");
                        if (id >= 0)
                        {
                            deviceId.put (id, value);
                            deviceId.setName (id, name);
                        }
                    }
                };
            }
            return null;
        }

        @Override
        public void end (String value)
            throws ValueException
        {
            if (!value.equals (""))
                throw new ValueException ("Value not allowed");
            receiver.receive (deviceId);
        }
    }
}


