org.panlab.tgw.resources.PTMResource.java Source code

Java tutorial

Introduction

Here is the source code for org.panlab.tgw.resources.PTMResource.java

Source

/**
 *  Copyright 2010, Konstantinos Koutsopoulos (k.koutsopoulos@yahoo.gr), Nikos Mouratidis (nmouratid@teemail.gr)
 *
 *  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.
 */

package org.panlab.tgw.resources;

import org.panlab.tgw.Notification;
import org.panlab.ptm.t1.*;
import org.panlab.ptm.t1.types.ProvisioningResponse;
import org.panlab.tgw.util.*;
import java.net.URL;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ws.rs.*;
import org.panlab.tgw.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 *
 * @author kkoutso
 * 
 */
// The Java class will be hosted at the URI path "/dummy"
@Path("/{ptmid}/{resourceid}")
public class PTMResource {
    private static Log log = LogFactory.getLog(PTMResource.class);

    static int classIndex = 0;
    int j = 0;
    public static final Hashtable<String, String> m_ids = new Hashtable<String, String>();

    public PTMResource() {
        j = classIndex++;
    }

    public static String createError(String errorInfo, String ra_id, String type) {
        log.info(XMLUtil.xmlHeader + "<" + type + " status=\"FAIL\" code=\"410\"><uuid type=\"string\">" + ra_id
                + "</uuid><info>" + errorInfo + "</info></" + type + ">");
        return XMLUtil.xmlHeader + "<" + type + " status=\"FAIL\" code=\"410\"><uuid type=\"string\">" + ra_id
                + "</uuid><info>" + errorInfo + "</info></" + type + ">";
    }

    public static String createOK(String ra_id, String type) {
        log.info(XMLUtil.xmlHeader + "<" + type + " status=\"SUCCESS\">"
                + (ra_id != null ? "<uuid type=\"string\">" + ra_id + "</uuid>" : "") + "</" + type + ">");
        return XMLUtil.xmlHeader + "<" + type + " status=\"SUCCESS\">"
                + (ra_id != null ? "<uuid type=\"string\">" + ra_id + "</uuid>" : "") + "</" + type + ">";
    }

    private String createOK(String ra_id, String type, String request_id) {
        log.info(XMLUtil.xmlHeader + "<" + type + " status=\"SUCCESS\"  requestId=\"" + request_id + "\">"
                + (ra_id != null ? "<uuid type=\"string\">" + ra_id + "</uuid>" : "") + "</" + type + ">");
        return XMLUtil.xmlHeader + "<" + type + " status=\"SUCCESS\"  requestId=\"" + request_id + "\">"
                + (ra_id != null ? "<uuid type=\"string\">" + ra_id + "</uuid>" : "") + "</" + type + ">";
    }

    // The Java method will process HTTP GET requests
    @GET // The Java method will produce content identified by the MIME Media
    // type "text/plain"
    @Produces("text/xml")
    //@Consumes("text/xml")
    public String getResource(@PathParam("ptmid") String ptmid, @PathParam("resourceid") String resourceid) {
        log.info("GET (" + j + ") /" + ptmid + "/" + resourceid);//+content);
        String type = resourceid.substring(resourceid.lastIndexOf(".") + 1, resourceid.lastIndexOf("-"));
        if (org.panlab.tgw.App.getStatus(ptmid) != 0) {
            return createError(org.panlab.tgw.App.statusText(org.panlab.tgw.App.getStatus(ptmid)), resourceid,
                    type);
        }
        try {
            T1ServiceLocator l = new T1ServiceLocator();
            T1SoapBindingStub stub = (T1SoapBindingStub) (l
                    .getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptmid))));
            ProvisioningResponse res = stub.query("default_vct", resourceid, "<get></get>", null);
            log.info(res.getConfig_data());
            return res.getConfig_data();

        } catch (Exception error) {
            error.printStackTrace();
            return createError(error.getMessage(), resourceid, type);
        }
    }

    @PUT // The Java method will produce content identified by the MIME Media
    // type "text/plain"
    @Produces("text/xml")
    @Consumes("text/xml")
    public String putResource(@PathParam("ptmid") String ptmid, @PathParam("resourceid") String resourceid,
            String content) {
        log.info("PUTTING: " + content);
        try {
            T1ServiceLocator l = new T1ServiceLocator();
            T1SoapBindingStub stub = (T1SoapBindingStub) (l
                    .getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptmid))));
            ProvisioningResponse res = stub.create("default_vct", resourceid, content, null);

            log.info(res.getStatus_code());
            log.info(res.getConfig_data());
            log.info(res.getRequest_id());
            return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<resource><statuscode>" + res.getStatus_code()
                    + "</statuscode>" + "<config>" + res.getConfig_data() + "</config>" + "<req_id>"
                    + res.getRequest_id() + "</req_id>" + "</resource>";
        } catch (Exception error) {
            error.printStackTrace();
            return "<error>" + error.getMessage() + "</error>";
        }
    }

    @POST // The Java method will produce content identified by the MIME Media
    // type "text/plain"
    @Produces("text/xml")
    @Consumes("application/x-www-form-urlencoded")
    public String postResource(@PathParam("ptmid") String ptmid, @PathParam("resourceid") String resourceid,
            String content) {
        log.info("POST (" + j + ") /" + ptmid + "/" + resourceid + " " + content);
        try {

            XMLElement tempTop = XMLUtil.getTopElement(content);
            if (org.panlab.tgw.App.getStatus(ptmid) != 0) {
                String type = tempTop.m_name;
                return createError(org.panlab.tgw.App.statusText(org.panlab.tgw.App.getStatus(ptmid)), resourceid,
                        type);
            }
            if (org.panlab.tgw.App.getRAStatus(resourceid) != 0) {
                String type = tempTop.m_name;
                return createError("RA: " + resourceid + " has reported an error", resourceid, type);
            }
            String context = XMLUtil.getXMLElement(content, "context");
            String vctid = XMLUtil.getXMLElement(context, "vctId");
            content = XMLUtil.getXMLElement(content, "configuration");
            tempTop.m_value = content;
            content = tempTop.toString();
            if (tempTop.m_name.equalsIgnoreCase("vlan")) {
                Object[] tempList = XMLUtil.getElements(content);
                if (tempList != null && tempList.length > 0) {
                    String tempid = ((XMLElement) (tempList[0])).m_value;
                    tempid = tempid.substring(0, tempid.indexOf("."));
                    ptmid = tempid;
                    resourceid = ptmid + ".top-0";
                    log.info("changed to: " + ptmid + "/" + resourceid);
                }
            }
            log.info("POST (" + j + ") /" + ptmid + "/" + resourceid + " vctID:" + vctid + " " + content);
            if (ptmid.equalsIgnoreCase("share")) {
                T1ServiceLocator l = new T1ServiceLocator();
                T1SoapBindingStub stub;
                XMLElement top = XMLUtil.getTopElement(content);
                Object elements[] = XMLUtil.getElements(content);
                log.info(top.m_name);
                if (top.m_name.equalsIgnoreCase("vpn")) {
                    int vpnsize = elements.length;
                    Hashtable<String, String> igwSettings = new Hashtable<String, String>();
                    for (int i = 0; i < elements.length; i++) {
                        XMLElement temp = (XMLElement) elements[i];
                        log.info(temp.toString());
                        if (temp.m_attribute != null) {
                            String ptm = temp.m_value.substring(0, temp.m_value.indexOf("."));
                            stub = (T1SoapBindingStub) (l.getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptm))));
                            ProvisioningResponse ref;
                            ref = stub.query(vctid, temp.m_value, "<connectivity></connectivity>", null);
                            log.info(ref.getConfig_data());
                            igwSettings.put(temp.m_value, ref.getConfig_data());
                        }
                    }
                    String vpn_id = "";
                    Enumeration<String> en = igwSettings.keys();
                    log.info("igwSettings " + igwSettings.size());
                    while (en.hasMoreElements()) {
                        String current = en.nextElement();
                        String currentdetails = igwSettings.get(current);
                        log.info(current + ": " + currentdetails);
                        while (en.hasMoreElements()) {
                            String other = en.nextElement();
                            String otherdetails = igwSettings.get(other);

                            String ptm = current.substring(0, current.indexOf("."));
                            vpn_id += current;
                            stub = (T1SoapBindingStub) (l.getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptm))));
                            ProvisioningResponse ref;
                            ref = stub.update(vctid, current, otherdetails, null);
                            log.info(ref.getStatus_code());
                            ptm = other.substring(0, other.indexOf("."));
                            vpn_id += other;
                            stub = (T1SoapBindingStub) (l.getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptm))));
                            ref = stub.update(vctid, other, currentdetails, null);
                            log.info(ref.getStatus_code());

                        }
                        igwSettings.remove(current);
                        log.info("igwSettings " + igwSettings.size());
                        en = igwSettings.keys();
                    }
                    log.info("VPN_ID: " + vpn_id);
                    return createOK(vpn_id, "vpn");
                } else
                    return createError("Share ptm expects only vlan or vpn. Check VCT design", resourceid,
                            top.m_name);

            } else {
                T1ServiceLocator l = new T1ServiceLocator();
                T1SoapBindingStub stub;
                XMLElement top = XMLUtil.getTopElement(content);
                Object elements[] = XMLUtil.getElements(content);
                String conf = "";
                Vector<String> referencedRAIDs = new Vector<String>();
                for (int i = 0; i < elements.length; i++) {
                    XMLElement temp = (XMLElement) elements[i];
                    log.info(temp.toString());
                    if (temp.m_attributes.containsKey("type")
                            && temp.m_attributes.get("type").equalsIgnoreCase("\"reference\"")) {
                        if (!(temp.m_value.equalsIgnoreCase(""))) {
                            referencedRAIDs.add(temp.m_value);
                            String ptm = temp.m_value.substring(0, temp.m_value.indexOf("."));
                            stub = (T1SoapBindingStub) (l.getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptm))));
                            ProvisioningResponse ref;
                            if (resourceid.endsWith("top-0") && top.m_name.equalsIgnoreCase("vlan"))
                                ref = stub.query(vctid, temp.m_value, "<connectivity></connectivity>", null);
                            else
                                ref = stub.query(vctid, temp.m_value, "<reference></reference>", null);

                            log.info(temp.m_value + " ref data: " + ref.getConfig_data());
                            if (resourceid.endsWith("top-0") && top.m_name.equalsIgnoreCase("vlan"))
                                elements[i] = new XMLElement("item-" + i, null, null, ref.getConfig_data());
                            else
                                elements[i] = new XMLElement(temp.m_name, null, null, ref.getConfig_data());
                        }
                    }
                    if (temp.m_value != null)
                        conf += elements[i].toString();
                }

                ProvisioningResponse res = null;
                if (top.m_attributes.containsKey("action")
                        && top.m_attributes.get("action").equalsIgnoreCase("\"update\"")) {
                    log.info(top.m_attributes.get("action"));
                    log.info("SENDING: " + conf);
                    stub = (T1SoapBindingStub) (l.getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptmid))));
                    if (top.m_attributes.containsKey("mode")
                            && top.m_attributes.get("mode").equalsIgnoreCase("\"asynchronous\""))
                        res = stub.update(vctid, resourceid, conf,
                                "https://" + System.getProperty("publicIP") + ":8070/axis/services/TeagleGW");
                    else
                        res = stub.update(vctid, resourceid, conf, null);
                    log.info("https://" + java.net.Inet4Address.getLocalHost() + ":8070/axis/services/TeagleGW");
                } else {
                    conf = "<" + top.m_name + ">" + conf + "</" + top.m_name + ">";
                    log.info("SENDING: " + conf);
                    stub = (T1SoapBindingStub) (l.getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptmid))));
                    //log.info(vctid+" "+resourceid+" "+conf);
                    if (top.m_attributes.containsKey("mode")
                            && top.m_attributes.get("mode").equalsIgnoreCase("\"asynchronous\""))
                        res = stub.create(vctid, resourceid, conf,
                                "https://62.103.214.70:8070/axis/services/TeagleGW");
                    else
                        res = stub.create(vctid, resourceid, conf, null);
                    if (res != null) {
                        if (!(res.getConfig_data().contains("FAIL")))
                            resourceid = XMLUtil.getXMLElement(res.getConfig_data(), "uuid");
                        else
                            resourceid = res.getConfig_data();
                    }
                }
                if (res != null) {
                    int referencedSize = referencedRAIDs.size();
                    if (!(top.m_attributes.containsKey("mode")) || (top.m_attributes.containsKey("mode")
                            && !(top.m_attributes.get("mode").equalsIgnoreCase("\"asynchronous\""))))
                        if (referencedSize > 0) {
                            stub = (T1SoapBindingStub) (l.getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptmid))));
                            ProvisioningResponse ref;
                            ref = stub.query(vctid, resourceid, "<reference></reference>", null);
                            conf = "<" + top.m_name + ">" + ref.getConfig_data() + "</" + top.m_name + ">";
                            log.info("The following data have to be sent to all referenced resources by "
                                    + resourceid + " :" + conf);
                            if (!org.panlab.tgw.App.CIRCULAR_REFERENCE) {
                                log.info("reverse reference disabled");
                                referencedSize = 0;
                            }
                            for (int k = 0; k < referencedSize; k++) {
                                String temp = referencedRAIDs.remove(0);
                                if (temp != null) {
                                    log.info("Updating " + temp);
                                    log.info(conf);
                                    String ptm = temp.substring(0, temp.indexOf("."));
                                    stub = (T1SoapBindingStub) (l
                                            .getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptm))));
                                    ProvisioningResponse update;
                                    update = stub.update(vctid, temp, conf, null);
                                    log.info("Updated " + temp + " :" + update.getStatus_code());
                                }
                            }
                        }
                    //String type = resourceid.substring(resourceid.lastIndexOf(".")+1,resourceid.lastIndexOf("-"));
                    String response = "";
                    if (top.m_attributes.containsKey("action")
                            && top.m_attributes.get("action").equalsIgnoreCase("\"update\"")) {
                        log.info("RETURNING conf: " + res.getConfig_data());
                        log.info("RETURNING status: " + res.getStatus_code());
                        log.info("RETURNING id: " + res.getRequest_id());
                        response = res.getStatus_code();
                    } else {
                        log.info("RETURNING conf: " + res.getConfig_data());
                        log.info("RETURNING status: " + res.getStatus_code());
                        log.info("RETURNING id: " + res.getRequest_id());
                        response = res.getConfig_data();
                    }
                    if (top.m_attributes.containsKey("mode")
                            && top.m_attributes.get("mode").equalsIgnoreCase("\"asynchronous\"")) {
                        App.async_reqs.put(res.getRequest_id(), new Notification(res.getRequest_id(), "", "", vctid,
                                "RETURN_STATUS", "MESSAGE", "", ptmid, top.m_name, referencedRAIDs));

                        return createOK(null, top.m_name/*type*/, res.getRequest_id());
                    } else {
                        m_ids.put(resourceid, vctid);
                        return createOK(resourceid, top.m_name/*type*/);
                    }
                } else {
                    //String type = resourceid.substring(resourceid.lastIndexOf(".")+1,resourceid.lastIndexOf("-"));
                    return createError("Null response from PTM", resourceid, top.m_name/*type*/);
                }

            }
        } catch (Exception error) {
            //error.printStackTrace();
            String type = resourceid.substring(resourceid.lastIndexOf(".") + 1, resourceid.lastIndexOf("-"));
            log.info("RETURNING: " + error.getMessage());
            return createError(error.getMessage(), resourceid, type);
        }
    }

    @DELETE // The Java method will produce content identified by the MIME Media
    // type "text/plain"
    @Produces("text/xml")
    //@Consumes("text/xml")
    public String deleteResource(@PathParam("ptmid") String ptmid, @PathParam("resourceid") String resourceid//,
    //            String content
    ) {
        log.info("DELETING: " + resourceid);
        try {
            if (org.panlab.tgw.App.getStatus(ptmid) != 0) {
                return createError(org.panlab.tgw.App.statusText(org.panlab.tgw.App.getStatus(ptmid)), resourceid,
                        "");
            }
            T1ServiceLocator l = new T1ServiceLocator();
            T1SoapBindingStub stub = (T1SoapBindingStub) (l
                    .getT1((URL) (org.panlab.tgw.App.ptm_indexes.get(ptmid))));

            ProvisioningResponse res = stub.delete("default_vct", resourceid, "delete", null);
            log.info(res.getConfig_data());
            return res.getConfig_data();
        } catch (Exception error) {
            log.error(error.getMessage());
            return "<error>" + error.getMessage() + "</error>";
        }
    }

}