summaryrefslogblamecommitdiffstats
path: root/src/main/java/org/openslx/dnbd3/DNBD3Server.java
blob: 2b871f08bf1e4142e6f735ca8210edbaaef53cd1 (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                                


                            
                       


                           
                           




                                  

                                     

                                       


                          













































































































                                                                                                                        

 
package org.openslx.dnbd3;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.filter.Filters;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;

public class DNBD3Server {

    private static final int CMDSTOP = 0;
    private static final int CMDRELOAD = 1;
    private static final int CMDINFO = 2;
    private static final int CMDCONFIG = 3;

    private static final String HOST = "127.0.0.1";
    private static final int PORT = 5004;

    public void doReload() throws IOException {
        Socket sock = new Socket(HOST, PORT);
        sendCommand(sock, CMDRELOAD);
        sock.close();
    }

    public void doShutdown() throws IOException {
        Socket sock = new Socket(HOST, PORT);
        sendCommand(sock, CMDSTOP);
        sock.close();
    }

    public void addImage(DNBD3Image image) throws IOException {
        Socket sock = new Socket(HOST, PORT);
        sendCommand(sock, CMDCONFIG);
        OutputStream os = sock.getOutputStream();

        Element rootNode = new Element("dnbd3-server");
        Element imageNode = new Element("image");
        imageNode.setAttribute(new Attribute("group", image.getGroup()));
        imageNode.setAttribute(new Attribute("atime", image.getAtime()));
        imageNode.setAttribute(new Attribute("vid", String.valueOf(image.getVid())));
        imageNode.setAttribute(new Attribute("rid", String.valueOf(image.getRid())));
        imageNode.setAttribute(new Attribute("file", image.getPath()));
        imageNode.setAttribute(new Attribute("servers", image.getServers()));
        imageNode.setAttribute(new Attribute("cache_file", image.getCache()));
        rootNode.addContent(imageNode);
        Document doc = new Document(rootNode);
        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        outputter.output(doc, os);

        sock.close();

    }

    public List<DNBD3Image> getImages() throws IOException {
        List<DNBD3Image> images = new ArrayList<DNBD3Image>();
        Socket sock = new Socket(HOST, PORT);
        sendCommand(sock, CMDINFO);

        try {
            String group, atime, path, servers, cache;
            int vid, rid;
            InputStream is = sock.getInputStream();
            SAXBuilder builder = new SAXBuilder();
            Document document = (Document) builder.build(is);
            XPathFactory xpfac = XPathFactory.instance();
            XPathExpression<Element> xp;
            xp = xpfac.compile("//dnbd3-server/images/image", Filters.element());
            for (Element e : xp.evaluate(document)) {
                group = e.getAttributeValue("group");
                atime = e.getAttributeValue("atime");
                vid = Integer.parseInt(e.getAttributeValue("vid"));
                rid = Integer.parseInt(e.getAttributeValue("rid"));
                path = e.getAttributeValue("file");
                servers = e.getAttributeValue("servers");
                cache = e.getAttributeValue("cache_file");
                images.add(new DNBD3Image(group, atime, vid, rid, path, servers, cache));
            }

        } catch (JDOMException ex) {
            ex.printStackTrace();
        }

        sock.close();
        return images;
    }

    public List<DNBD3Client> getClients() throws IOException {
        List<DNBD3Client> clients = new ArrayList<DNBD3Client>();
        Socket sock = new Socket(HOST, PORT);
        sendCommand(sock, CMDINFO);

        try {
            String ip, image;
            InputStream is = sock.getInputStream();
            SAXBuilder builder = new SAXBuilder();
            Document document = (Document) builder.build(is);
            XPathFactory xpfac = XPathFactory.instance();
            XPathExpression<Element> xp;
            xp = xpfac.compile("//dnbd3-server/clients/client", Filters.element());
            for (Element e : xp.evaluate(document)) {
                ip = e.getAttributeValue("ip");
                image = e.getAttributeValue("file");
                clients.add(new DNBD3Client(ip, image));
            }

        } catch (JDOMException ex) {
            ex.printStackTrace();
        }

        sock.close();
        return clients;
    }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    private void sendCommand(Socket sock, int cmd) throws IOException {
        OutputStream os = sock.getOutputStream();
        DataOutputStream dos = new DataOutputStream(os);
        dos.writeInt(cmd);
    }

}