de.itomig.itoplib.GetItopData.java Source code

Java tutorial

Introduction

Here is the source code for de.itomig.itoplib.GetItopData.java

Source

// Copyright (C) 2011-2013 ITOMIG GmbH
//
//   This file is part of iTopMobile.
//
//   iTopMobile is free software; you can redistribute it and/or modify   
//   it under the terms of the GNU General Public License as published by
//   the Free Software Foundation, either version 3 of the License, or
//   (at your option) any later version.
//
//   iTopMobile is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//   GNU General Public License for more details.
//
//   You should have received a copy of the GNU General Public License
//   along with iTopMobile. If not, see <http://www.gnu.org/licenses/>

package de.itomig.itoplib;

import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import de.itomig.itoplib.cmdb.ItopTicket;
import de.itomig.itoplib.cmdb.Organization;
import de.itomig.itoplib.cmdb.Person;
import de.itomig.itoplib.cmdb.XmlResult;
import android.net.http.AndroidHttpClient;
import android.util.Log;
import static de.itomig.itoplib.ItopConfig.*;

public class GetItopData {

    private static ArrayList<ItopTicket> tickets = new ArrayList<ItopTicket>();
    private static ArrayList<Person> persons = new ArrayList<Person>();
    private static ArrayList<Organization> organizations = new ArrayList<Organization>();

    // called from AsyncTask - therefor no UI context, no Toast possible from
    // here.
    public static ArrayList<ItopTicket> getTicketsFromItopServer(String selectExpression) throws Exception {

        XmlResult result = getDataFromItopServer(selectExpression);

        if (result.error == "") {
            // Parse the data
            tickets = parseTicketDoc(result.doc);
            return tickets;
        } else {
            tickets.clear();
            tickets.add(new ItopTicket(ERROR, result.error, "", "3", ""));

            return null;
        }

    }

    private static String createUrlWithCredentials(String expr) {
        String url = ItopConfig.getItopUrl();
        String cred = ItopConfig.getItopCredentials();
        return url + "/webservices/export.php?" + cred + "&expression=" + expr + "&format=xml&no_localize=1";
    }

    private static ArrayList<ItopTicket> parseTicketDoc(Document doc) {
        // assemble new ArrayList of tickets.
        tickets.clear();
        Element root = doc.getDocumentElement();

        // look for UserRequest
        NodeList items = root.getElementsByTagName("UserRequest");
        for (int i = 0; i < items.getLength(); i++) {
            tickets.add(parseTicketNode("UserRequest", items.item(i)));
        }

        // look for Incident
        items = root.getElementsByTagName("Incident");
        for (int i = 0; i < items.getLength(); i++) {
            tickets.add(parseTicketNode("Incident", items.item(i)));
        }

        return tickets; // UserRequests and Incidents
    }

    private static ItopTicket parseTicketNode(String type, Node item) {
        // ticket node can be Incident oder UserRequest
        ItopTicket ticket = new ItopTicket(type);
        NodeList properties = item.getChildNodes();
        for (int j = 0; j < properties.getLength(); j++) {
            Node property = properties.item(j);
            String name = property.getNodeName();
            if (name.equalsIgnoreCase("ref")) {
                ticket.setRef(property.getFirstChild().getNodeValue().trim());
            } else if (name.equalsIgnoreCase("title")) {
                ticket.setTitle(getConcatNodeValues(property));
            } else if (name.equalsIgnoreCase("priority")) {
                ticket.setPriority(property.getFirstChild().getNodeValue().trim());
            } else if (name.equalsIgnoreCase("description")) {
                ticket.setDescription(getConcatNodeValues(property));
            } else if (name.equalsIgnoreCase("start_date")) {
                ticket.setStartDate(property.getFirstChild().getNodeValue().trim());
            } else if (name.equalsIgnoreCase("tto_escalation_deadline")) {
                ticket.setTtoEscalationDate(getConcatNodeValues(property));
            } else if (name.equalsIgnoreCase("caller_id")) {
                ticket.setCallerID(property.getFirstChild().getNodeValue().trim());
            } else if (name.equalsIgnoreCase("agent_id")) {
                ticket.setAgentID(property.getFirstChild().getNodeValue().trim());
            } else if (name.equalsIgnoreCase("status")) {
                ticket.setStatus(property.getFirstChild().getNodeValue().trim());
            } else if (name.equalsIgnoreCase("last_update")) {
                ticket.setLastUpdate(getConcatNodeValues(property));
            } else if (name.equalsIgnoreCase("ticket_log")) { // itop 1.2
                ticket.setTicketLog(getConcatNodeValues(property));
            } else if (name.equalsIgnoreCase("public_log")) { // itop 2.0
                ticket.setTicketLog(getConcatNodeValues(property));
            }
        }
        return ticket;

    }

    private static String getConcatNodeValues(Node prop) {
        // behaves well for non-existing nodes and for node values which are
        // broken into several values because of special characters like '"'
        // needed for the android code - this problem only exists in
        // Android xml library and not on the PC !!
        if (prop.hasChildNodes()) { // false for optional attributes
            StringBuilder text = new StringBuilder();
            NodeList chars = prop.getChildNodes();
            for (int k = 0; k < chars.getLength(); k++) {
                text.append(chars.item(k).getNodeValue());
            }
            return text.toString().trim();
        } else {
            return (""); // return empty string if empty
        }
    }

    public static ArrayList<Organization> getOrganizationsFromItopServer(String selectExpression) {
        XmlResult result = getDataFromItopServer(selectExpression);

        if (result.error == "") {
            // Parse the data
            organizations = parseOrganizationDoc(result.doc);
            return organizations;
        } else {
            return null;
        }

    }

    public static ArrayList<Person> getPersonsFromItopServer(String selectExpression) {

        XmlResult result = getDataFromItopServer(selectExpression);

        if (result.error == "") {
            // Parse the data
            persons = parsePersonDoc(result.doc);
            return persons;
        } else {
            return null;
        }

    }

    private static ArrayList<Person> parsePersonDoc(Document doc) {
        // get the root elememt
        Element root = doc.getDocumentElement();
        NodeList items = root.getElementsByTagName("Person");

        persons.clear();
        for (int i = 0; i < items.getLength(); i++) {
            Node item = items.item(i);
            String person_id = ((Element) items.item(i)).getAttribute("id");
            NodeList properties = item.getChildNodes();

            String person_first = "";
            String person_name = "";
            String phone = "";
            String org = "0";
            for (int j = 0; j < properties.getLength(); j++) {
                Node property = properties.item(j);
                String name = property.getNodeName();
                if (name.equalsIgnoreCase("name")) {
                    person_name = getConcatNodeValues(property);
                } else if (name.equalsIgnoreCase("first_name")) {
                    person_first = getConcatNodeValues(property);
                } else if (name.equalsIgnoreCase("phone")) {
                    phone = getConcatNodeValues(property);
                } else if (name.equalsIgnoreCase("org_id")) {
                    org = getConcatNodeValues(property);
                }
            }
            // there should ALLWAYS be an id.

            int id, org_id;
            try {
                id = Integer.parseInt(person_id);
                org_id = Integer.parseInt(org);
                persons.add(new Person(id, person_first + " " + person_name, phone, org_id));
            } catch (NumberFormatException e) {
                // should never happen
                Log.e("TAG", "id of person not parseable");
            }
        }
        return persons;
    }

    private static ArrayList<Organization> parseOrganizationDoc(Document doc) {
        // get the root elememt
        Element root = doc.getDocumentElement();
        NodeList items = root.getElementsByTagName("Organization");

        organizations.clear();
        for (int i = 0; i < items.getLength(); i++) {
            Node item = items.item(i);
            String org_id = ((Element) items.item(i)).getAttribute("id");
            NodeList properties = item.getChildNodes();
            String org_name = "";
            for (int j = 0; j < properties.getLength(); j++) {
                Node property = properties.item(j);
                String name = property.getNodeName();
                if (name.equalsIgnoreCase("name")) {
                    org_name = getConcatNodeValues(property);
                }
            }
            // there should ALLWAYS be an id.

            int id;
            try {
                if (org_name != "") {
                    id = Integer.parseInt(org_id);
                    organizations.add(new Organization(id, org_name));
                } else {
                    Log.e(TAG, "no name for org with id=" + org_id);
                }
            } catch (NumberFormatException e) {
                Log.e("TAG", "id of person not parseable");
            }
        }
        return organizations;
    }

    public static XmlResult getDataFromItopServer(String selectExpression) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder;

        XmlResult x = new XmlResult();
        try {
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e1) {
            x.error = "error: " + e1.getMessage();
            return x;
        }

        AndroidHttpClient client = AndroidHttpClient.newInstance("Android");

        try {
            HttpPost request = new HttpPost();
            String req = createUrlWithCredentials(selectExpression);
            // do not log password, log only search expression
            if (debug)
                Log.i(TAG, "expr.=" + selectExpression);
            request.setURI(new URI(req));

            HttpResponse response = client.execute(request);
            String status = response.getStatusLine().toString();
            if (debug)
                Log.i(TAG, "status: " + status);

            if (status.contains("200") && status.contains("OK")) {

                // request worked fine, retrieved some data
                InputStream instream = response.getEntity().getContent();
                x.doc = builder.parse(instream);
                x.error = "";
            } else // some error in http response
            {
                Log.e(TAG, "Get data - http-ERROR: " + status);
                x.error = "http-error, status " + status;
            }

        } catch (Exception e) {
            // Toast does not work in background task
            Log.e(TAG, "Get data -  " + e.toString());
            x.error = "Get data -  " + e.toString();
        } finally {
            client.close(); // needs to be done for androidhttpclient
            if (debug)
                Log.i(TAG, "...finally.. get data finished");
        }

        return x;
    }
}