org.renci.ahab.libndl.ndl.ManifestLoader.java Source code

Java tutorial

Introduction

Here is the source code for org.renci.ahab.libndl.ndl.ManifestLoader.java

Source

/*
* Copyright (c) 2011 RENCI/UNC Chapel Hill 
*
* @author Ilia Baldine
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
* and/or hardware specification (the "Work") to deal in the Work without restriction, including 
* without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
* sell copies of the Work, and to permit persons to whom the Work is furnished to do so, subject to 
* the following conditions:  
* The above copyright notice and this permission notice shall be included in all copies or 
* substantial portions of the Work.  
*
* THE WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
* OUT OF OR IN CONNECTION WITH THE WORK OR THE USE OR OTHER DEALINGS 
* IN THE WORK.
*/
package org.renci.ahab.libndl.ndl;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.renci.ahab.libndl.LIBNDL;
import org.renci.ahab.libndl.Slice;
import org.renci.ahab.libndl.SliceGraph;
import org.renci.ahab.libndl.resources.manifest.LinkConnection;
import org.renci.ahab.libndl.resources.manifest.ManifestResource;
import org.renci.ahab.libndl.resources.request.ComputeNode;
import org.renci.ahab.libndl.resources.request.Interface;
import org.renci.ahab.libndl.resources.request.Node;
import org.renci.ahab.libndl.resources.request.RequestResource;
import org.renci.ahab.libndl.resources.request.StitchPort;
import org.renci.ahab.libndl.resources.request.StorageNode;

import orca.ndl.INdlManifestModelListener;
import orca.ndl.NdlCommons;
import orca.ndl.NdlManifestParser;
import orca.ndl.NdlRequestParser;

import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.Resource;

import edu.uci.ics.jung.graph.SparseMultigraph;

/**
 * Class for loading manifests
 * @author ibaldin
 *
 */
public class ManifestLoader extends NDLLoader implements INdlManifestModelListener {
    private SliceGraph sliceGraph;
    private ExistingSliceModel ndlModel;

    public ManifestLoader(SliceGraph sliceGraph, ExistingSliceModel ndlModel) {
        LIBNDL.logger().debug("new ManifestLoader");
        this.sliceGraph = sliceGraph;
        this.ndlModel = ndlModel;
    }

    public NdlManifestParser load(String rdf) {
        NdlManifestParser nmp = null;
        try {
            LIBNDL.logger().debug("About to parse manifest");

            // parse as manifest
            nmp = new NdlManifestParser(rdf, this);

            nmp.processManifest();
            //nmp.freeModel();         
            //manifest.setManifestTerm(creationTime, expirationTime);

        } catch (Exception e) {
            LIBNDL.logger().debug("Excpetion: parsing request part of manifest" + e);
        }
        return nmp;
    }

    /* Callbacks for Manifest mode */
    public void ndlInterface(Resource l, OntModel om, Resource conn, Resource node, String ip, String mask) {
        // TODO Auto-generated method stub
        String printStr = "ndlManifest_Interface: \n\tName: " + l;
        printStr += "\n\tconn: " + conn;
        printStr += "\n\tnode: " + node;
        LIBNDL.logger().debug(printStr);
    }

    public void ndlNetworkConnection(Resource l, OntModel om, long bandwidth, long latency,
            List<Resource> interfaces) {

        //should be sliceGraph.add... and/or manifestGraph.add...
        //manifest.addNetworkConnection(l.toString());

        String printStr = "ndlManifest_NetworkConnection: \n\tName: " + l.toString() + " (" + l.getLocalName()
                + ")";
        printStr += "\n\tInterfaces:";
        for (Resource r : interfaces) {
            printStr += "\n\t\t " + r;
        }

        LIBNDL.logger().debug(printStr);
    }

    public void ndlParseComplete() {
        String printStr = "ndlManifest_ParseComplete";
        LIBNDL.logger().debug(printStr);
    }

    public void ndlReservation(Resource i, OntModel m) {
        // TODO Auto-generated method stub
        String printStr = "ndlManifest_Reservation: \n\tName: " + i;
        printStr += ", sliceState(Manifest:ndlReservation) = " + NdlCommons.getGeniSliceStateName(i);
        LIBNDL.logger().debug(printStr);

    }

    public void ndlReservationTermDuration(Resource d, OntModel m, int years, int months, int days, int hours,
            int minutes, int seconds) {
        // TODO Auto-generated method stub
        String printStr = "ndlManifest_ReservationTermDuration: \n\tName: " + d;
        LIBNDL.logger().debug(printStr);
    }

    public void ndlReservationResources(List<Resource> r, OntModel m) {
        // TODO Auto-generated method stub
        String printStr = "ndlManifest_ReservationResources: \n\tName: " + r;
        LIBNDL.logger().debug(printStr);
    }

    public void ndlReservationStart(Literal s, OntModel m, Date start) {
        // TODO Auto generated method stub
        String printStr = "ndlManifest_ReservationStart: \n\tName: " + s;
        LIBNDL.logger().debug(printStr);
    }

    public void ndlReservationEnd(Literal e, OntModel m, Date end) {
        // TODO Auto-generated method stub
        String printStr = "ndlManifest_ReservationEnd: \n\tNameg.: " + e;
        LIBNDL.logger().debug(printStr);
    }// parse as request

    public void ndlNodeDependencies(Resource ni, OntModel m, Set<Resource> dependencies) {
        // TODO Auto-generated method stub
        String printStr = "ndlManifest_NodeDependencies: \n\tName: " + ni;
        LIBNDL.logger().debug(printStr);
    }

    public void ndlSlice(Resource sl, OntModel m) {
        // TODO Auto-generated method stub
        String printStr = "ndlManifest_Slice: \n\tName: " + sl;
        printStr += ", sliceState(manifest) = " + NdlCommons.getGeniSliceStateName(sl);
        LIBNDL.logger().debug(printStr);
    }

    public void ndlBroadcastConnection(Resource bl, OntModel om, long bandwidth, List<Resource> interfaces) {
        // TODO Auto-generated method stub
        String printStr = "ndlManifest_BroadcastConnection: ************* SHOULD NEVER HAPPEN ******************* \n\tName: "
                + bl;
        printStr += "\n\tInterfaces:";
        for (Resource r : interfaces) {
            printStr += "\n\t\t " + r;
        }
        LIBNDL.logger().debug(printStr);
    }

    public void ndlManifest(Resource i, OntModel m) {
        String printStr = "ndlManifest_Manifest: \n\tName: " + i;
        printStr += ", sliceState = " + NdlCommons.getGeniSliceStateName(i);
        LIBNDL.logger().debug(printStr);

    }

    public void ndlLinkConnection(Resource l, OntModel m, List<Resource> interfaces, Resource parent) {// parse as request

        String printStr = "ndlManifest_LinkConnection: \n\tNameg.: " + l + "\n\tparent: " + parent;
        printStr += "\n\tInterfaces:";
        for (Resource r : interfaces) {
            printStr += "\n\t\t " + r;
        }
        LIBNDL.logger().debug(printStr);

        //should be sliceGraph and/or manifestGraph
        //LinkConnection lc = manifest.addLinkConnection(l.toString());
        //lc.setModelResource(l);      
    }

    public void ndlCrossConnect(Resource c, OntModel m, long bw, String label, List<Resource> interfaces,
            Resource parent) {
        //should be sliceGraph and/or manifestGraph
        //manifest.addCrossConnect(c.toString());

        String printStr = "ndlManifest_CrossConnect: \n\tName: " + c + "\n\tparent: " + parent;
        printStr += "\n\tInterfaces:";
        for (Resource r : interfaces) {
            printStr += "\n\t\t " + r;
        }
        LIBNDL.logger().debug(printStr);
    }

    public void ndlNetworkConnectionPath(Resource c, OntModel m, List<List<Resource>> path, List<Resource> roots) {
        // TODO Auto-generated method stub
        String printStr = "ndlManifest_NetworkConnectionPath: \n\tName: " + c;
        LIBNDL.logger().debug(printStr);

    }

    public void ndlNode(Resource ce, OntModel om, Resource ceClass, List<Resource> interfaces) {
        LIBNDL.logger().debug(
                "\n\n\n #################################### Processing Node ############################################## \n\n\n");
        if (ce == null)
            return;
        String printStr = "ndlManifest_Node: (" + ceClass + ")\n\tName: " + ce + " (" + ce.getLocalName() + ")";
        printStr += ", state = " + NdlCommons.getResourceStateAsString(ce);
        printStr += "\n\tInterfaces:";
        for (Resource r : interfaces) {
            printStr += "\n\t\t " + r;
        }
        LIBNDL.logger().debug(printStr);

        if (NdlCommons.isStitchingNodeInManifest(ce)) {
            //if(NdlCommons.isStitchingNode(ce)){
            LIBNDL.logger().debug(
                    "\n\n\n ************************************** FOUND STITCHPORT NODE *************************************** \n\n\n");
            LIBNDL.logger().debug("Found a stitchport");
            String label = NdlCommons.getLayerLabelLiteral(interfaces.get(0));
            String port = NdlCommons.getLinkTo(interfaces.get(0)).toString();
            long bandwidth = 10000000;
            StitchPort newStitchport = this.sliceGraph.buildStitchPort(getPrettyName(ce), label, port, bandwidth);

            ndlModel.mapSliceResource2ModelResource(newStitchport, ce);

            return;
        }
        if (NdlCommons.isNetworkStorage(ce)) {
            LIBNDL.logger().debug(
                    "\n\n\n ************************************** FOUND STORAGE NODE *************************************** \n\n\n");
            LIBNDL.logger().debug("Found a storage node, returning");
            StorageNode newStorageNode = this.sliceGraph.buildStorageNode(getPrettyName(ce));
            ndlModel.mapSliceResource2ModelResource(newStorageNode, ce);

            return;
        }

        //Only handle compute nodes for now.
        if ((ceClass.equals(NdlCommons.computeElementClass) || ceClass.equals(NdlCommons.serverCloudClass))) {
            LIBNDL.logger().debug(
                    "\n\n\n ************************************** FOUND COMPUTE NODE *************************************** \n\n\n");
            ComputeNode newNode = this.sliceGraph.buildComputeNode(getPrettyName(ce));
            ndlModel.mapSliceResource2ModelResource(newNode, ce);

            newNode.setPostBootScript(NdlCommons.getPostBootScript(ce));

            //LIBNDL.logger().debug("modelNode: " + ndlModel.getModelResource(newNode).getLocalName());
            //String groupUrl = NdlCommons.getRequestGroupURLProperty(ce);
            //LIBNDL.logger().debug("NdlCommons.getRequestGroupURLProperty: " + groupUrl);
            //String nodeUrl = ce.getURI();
            //LIBNDL.logger().debug("ce.getURI(): " + nodeUrl);
            return;
        }

    }

    // sometimes getLocalName is not good enough
    // so we strip off orca name space and call it a day
    private String getTrueName(Resource r) {
        if (r == null)
            return null;

        return StringUtils.removeStart(r.getURI(), NdlCommons.ORCA_NS);
    }

    private String getPrettyName(Resource r) {
        String rname = getTrueName(r);
        int ind = rname.indexOf('#');
        if (ind > 0) {
            rname = rname.substring(ind + 1);
        }
        return rname;
    }

    /*
    // get domain name from inter-domain resource name
    private String getInterDomainName(Resource r) {
       String trueName = getTrueName(r);
           
       if (r == null)
     return null;
           
       String[] split = trueName.split("#");
       if (split.length >= 2) {
     String rem = split[1];
     String[] split1 = rem.split("/");
     return split1[0];
       }   
       return null;
    }
        
    public void ndlLinkConnection(Resource l, OntModel m,
     List<Resource> interfaces, Resource parent) {
       //System.out.println("Found link connection " + l + " connecting " + interfaces);
       assert(l != null);
           
       // ignore request items
       if (requestPhase)
     return;
           
       NDLLIB.logger().debug("Link Connection: " + l);
           
       // find what nodes it connects (should be two)
       Iterator<Resource> it = interfaces.iterator(); 
           
       String label = NdlCommons.getResourceLabel(l);
           
       if (interfaces.size() == 2) {
     NDLLIB.logger().debug("  Adding p-to-p link");
     OrcaLink ol = Manifest.getInstance().getLinkCreator().create(getPrettyName(l), NdlCommons.getResourceBandwidth(l));
     ol.setLabel(label);
        
     // maybe point-to-point link
     // the ends
     Resource if1 = it.next(), if2 = it.next();
         
     if ((if1 != null) && (if2 != null)) {
        OrcaNode if1Node = interfaceToNode.get(getTrueName(if1));
        OrcaNode if2Node = interfaceToNode.get(getTrueName(if2));
            
        if ((if1Node != null) && if1Node.equals(if2Node)) {
           // degenerate case of a node on a shared vlan
           OrcaCrossconnect oc = new OrcaCrossconnect(getPrettyName(l));
           oc.setLabel(label);
           oc.setDomain(RequestSaver.reverseLookupDomain(NdlCommons.getDomain(l)));
           nodes.put(getTrueName(l), oc);
           // save one interface
           interfaceToNode.put(getTrueName(if1), oc);
           Manifest.getInstance().getGraph().addVertex(oc);
           return;
        }
            
        // get the bandwidth of crossconnects if possible
        long bw1 = 0, bw2 = 0;
        if (if1Node instanceof OrcaCrossconnect) {
           OrcaCrossconnect oc = (OrcaCrossconnect)if1Node;
           bw1 = oc.getBandwidth();
        } 
        if (if2Node instanceof OrcaCrossconnect) {
           OrcaCrossconnect oc = (OrcaCrossconnect)if2Node;
           bw2 = oc.getBandwidth();
        }
        ol.setBandwidth(bw1 > bw2 ? bw1 : bw2);
            
        // have to be there
        if ((if1Node != null) && (if2Node != null)) {
           NDLLIB.logger().debug("  Creating a link " + ol.getName() + " from " + if1Node + " to " + if2Node);
           Manifest.getInstance().getGraph().addEdge(ol, new Pair<OrcaNode>(if1Node, if2Node), 
                 EdgeType.UNDIRECTED);
        }
     }
     // state
     ol.setState(NdlCommons.getResourceStateAsString(l));
         
     if (ol.getState() != null)
        ol.setIsResource();
         
     // reservation notice
     ol.setReservationNotice(NdlCommons.getResourceReservationNotice(l));
     links.put(getTrueName(l), ol);
       } else {         
     NDLLIB.logger().debug("  Adding multi-point crossconnect " + getTrueName(l) + " (has " + interfaces.size() + " interfaces)");
     // multi-point link
     // create a crossconnect then use interfaceToNode mapping to create links to it
     OrcaCrossconnect ml = new OrcaCrossconnect(getPrettyName(l));
        
     ml.setLabel(label);
     ml.setReservationNotice(NdlCommons.getResourceReservationNotice(l));
     ml.setState(NdlCommons.getResourceStateAsString(l));
     ml.setDomain(RequestSaver.reverseLookupDomain(NdlCommons.getDomain(l)));
        
     if (ml.getState() != null)
        ml.setIsResource();
         
     nodes.put(getTrueName(l), ml);
         
     // remember the interfaces
     while(it.hasNext()) {
        Resource intR = it.next();
        NDLLIB.logger().debug("  Remembering interface " + intR + " of " + ml);
        interfaceToNode.put(getTrueName(intR), ml);
     }
         
     // add crossconnect to the graph
     Manifest.getInstance().getGraph().addVertex(ml);
         
     // link to this later from interface information
         
     // link nodes (we've already seen them) to it
    //         for(Resource intf: interfaces) {
    //            if (interfaceToNode.get(getTrueName(intf)) != null) {
    //               NDLLIB.logger().debug("  Creating a link " + lcount + " from " + ml + " to " + interfaceToNode.get(getTrueName(intf)));
    //               OrcaLink ol = new OrcaLink("Link " + lcount++);
    //               NDLLIBManifestState.getInstance().getGraph().addEdge(ol, new Pair<OrcaNode>(ml, interfaceToNode.get(getTrueName(intf))), EdgeType.UNDIRECTED);
    //            }
    //         }
       }
    }
        
    public void ndlManifest(Resource i, OntModel m) {
       // nothing to do in this case
           
       // ignore request items
       if (requestPhase)
     return;
           
       NDLLIB.logger().debug("Manifest: " + i);
    }
        
    public void ndlInterface(Resource intf, OntModel om, Resource conn,
     Resource node, String ip, String mask) {
           
       // ignore request items
       if (requestPhase)
     return;
           
       // System.out.println("Interface " + l + " has IP/netmask" + ip + "/" + mask);
       NDLLIB.logger().debug("Interface " + intf + " between " + node + " and " + conn + " has IP/netmask " + ip + "/" + mask);
           
       if (intf == null)
     return;
       OrcaNode on = null;
       OrcaLink ol = null;
       OrcaCrossconnect crs = null;
       if (node != null)
     on = nodes.get(getTrueName(node));
           
       if (conn != null) {
     ol = links.get(getTrueName(conn));
     if (ol == null) 
        // maybe it is a crossconnect and not a link connection
        crs = (OrcaCrossconnect)nodes.get(getTrueName(conn));
       }
           
       // extract the IP address from label, if it is not set on
       // the interface in the request (basically we favor manifest
       // setting over the request because in node groups that's the
       // correct one)
       String nmInt = null;
       if (ip == null) {
     String ifIpLabel = NdlCommons.getLabelID(intf);
     // x.y.z.w/24
     if (ifIpLabel != null) {
        String[] ipnm = ifIpLabel.split("/");
        if (ipnm.length == 2) {
           ip = ipnm[0];
           nmInt = ipnm[1];
        }
     }
       } else {
     if (mask != null)
        nmInt = "" + RequestSaver.netmaskStringToInt(mask);
       }
           
       if (on != null) {
     if (ol != null) {
        on.setIp(ol, ip, nmInt);
        on.setInterfaceName(ol, getTrueName(intf));
        on.setMac(ol, NdlCommons.getAddressMAC(intf));
     } else if (crs != null) {
        if (intf.toString().matches(node.toString() + "/IP/[0-9]+")) {
           // include only interfaces that have nodename/IP/<number> format - those
           // are generated by Yufeng. 
        
           // create link from node to crossconnect and assign IP if it doesn't exist
           NDLLIB.logger().debug("  Creating a link  from " + on + " to " + crs);
           ol = Manifest.getInstance().getLinkCreator().create("Unnamed");
           Manifest.getInstance().getGraph().addEdge(ol, new Pair<OrcaNode>(on, crs), 
                 EdgeType.UNDIRECTED);
           on.setIp(ol, ip, nmInt);
           on.setMac(ol, NdlCommons.getAddressMAC(intf));
        }
     }
     else {
        // this could be a disconnected node group
        if (on instanceof OrcaComputeNode) {
           OrcaComputeNode ong = (OrcaComputeNode)on;
           ong.setInternalIp(ip, "" + RequestSaver.netmaskStringToInt(mask));
        }
     }
       }
    }
        
    public void ndlNetworkConnection(Resource l, OntModel om, long bandwidth,
     long latency, List<Resource> interfaces) {
           
       // ignore request items
       if (requestPhase)
     return;
           
       // nothing to do in this case
       NDLLIB.logger().debug("Network Connection: " + l);
        
    }
        
    public void ndlCrossConnect(Resource c, OntModel m, 
     long bw, String label, List<Resource> interfaces, Resource parent) {
           
       // ignore request items
       if (requestPhase)
     return;
           
       if (c == null)
     return;
        
       NDLLIB.logger().debug("CrossConnect: " + c);
           
       OrcaCrossconnect oc = new OrcaCrossconnect(getPrettyName(c));
       oc.setLabel(label);
           
       setCommonNodeProperties(oc, c);
           
       // later set bandwidth on adjacent links (crossconnects in NDL have
       // bandwidth but for users we'll show it on the links)
       oc.setBandwidth(bw);
           
       // process interfaces
       for (Iterator<Resource> it = interfaces.iterator(); it.hasNext();) {
     Resource intR = it.next();
     interfaceToNode.put(getTrueName(intR), oc);
       }
           
       nodes.put(getTrueName(c), oc);
           
       // add nodes to the graph
       Manifest.getInstance().getGraph().addVertex(oc);
    }
        
    public void ndlNode(Resource ce, OntModel om, Resource ceClass,
     List<Resource> interfaces) {
           
       // ignore request items
       if (requestPhase)
     return;
           
       if (ce == null)
     return;
           
       NDLLIB.logger().debug("Node: " + ce);
           
       OrcaNode newNode;
           
       if (NdlCommons.isStitchingNodeInManifest(ce)) {
     NDLLIB.logger().debug("  is a stitching port");
     OrcaStitchPort sp = new OrcaStitchPort(getPrettyName(ce));
     // get the interface (first)
     if (interfaces.size() == 1) {
        sp.setLabel(NdlCommons.getLayerLabelLiteral(interfaces.get(0)));
        if (NdlCommons.getLinkTo(interfaces.get(0)) != null)
           sp.setPort(NdlCommons.getLinkTo(interfaces.get(0)).toString());
     } 
     newNode = sp;
       } else if (NdlCommons.isNetworkStorage(ce)) {
     NDLLIB.logger().debug("  is a storage node");
     newNode = new OrcaStorageNode(getPrettyName(ce));
     newNode.setIsResource();
       } else if (NdlCommons.isMulticastDevice(ce)) {
     NDLLIB.logger().debug("  is a multicast root");
     newNode = new OrcaCrossconnect(getPrettyName(ce));
     newNode.setIsResource();
       } else {
     NDLLIB.logger().debug("  is a regular node");
     newNode = new OrcaNode(getPrettyName(ce));
       }
           
       for (Resource ii: interfaces)
     NDLLIB.logger().debug("  With interface " + ii);
           
       // set common properties
       setCommonNodeProperties(newNode, ce);
           
       // process interfaces
       for (Iterator<Resource> it = interfaces.iterator(); it.hasNext();) {
     Resource intR = it.next();
     interfaceToNode.put(getTrueName(intR), newNode);
       }
           
       // disk image
       Resource di = NdlCommons.getDiskImage(ce);
       if (di != null) {
     try {
        String imageURL = NdlCommons.getIndividualsImageURL(ce);
        String imageHash = NdlCommons.getIndividualsImageHash(ce);
        Request.getInstance().addImage(new OrcaImage(di.getLocalName(), 
              new URL(imageURL), imageHash), null);
        //newNode.setImage(di.getLocalName());
     } catch (Exception e) {
        // FIXME: ?
        ;
     }
       }
           
       nodes.put(getTrueName(ce), newNode);
           
       // add nodes to the graph
       Manifest.getInstance().getGraph().addVertex(newNode);
           
       // are there nodes hanging off of it as elements? if so, link them in
       processDomainVmElements(ce, om, newNode);
    }
        
    // add collection elements
    private void processDomainVmElements(Resource vm, OntModel om, OrcaNode parent) {
           
       // HACK - if we added real interfaces to inner nodes, we don't need link to parent
       boolean innerNodeConnected = false;
           
       for (StmtIterator vmEl = vm.listProperties(NdlCommons.collectionElementProperty); vmEl.hasNext();) {
     Resource tmpR = vmEl.next().getResource();
     OrcaNode on = new OrcaNode(getTrueName(tmpR), parent);
     nodes.put(getTrueName(tmpR), on);
     Manifest.getInstance().getGraph().addVertex(on);
     OrcaLink ol = Manifest.getInstance().getLinkCreator().create("Unnamed");
         
     // link to parent (a visual HACK)
     links.put(ol.getName(), ol);
     Manifest.getInstance().getGraph().addEdge(ol, new Pair<OrcaNode>(parent, on), 
           EdgeType.UNDIRECTED);
         
     // add various properties
     setCommonNodeProperties(on, tmpR);
         
     // process interfaces. if there is an interface that leads to
     // a link, this is an intra-domain case, so we can delete the parent later
     for (Resource intR: NdlCommons.getResourceInterfaces(tmpR)) {
        interfaceToNode.put(getTrueName(intR), on);
        // HACK: for now check that this interface connects to something
        // and is not just hanging there with IP address
        List<Resource> hasI = NdlCommons.getWhoHasInterface(intR, om);
        if (hasI.size() > 1)
           innerNodeConnected = true;
     }
       }
           
       // Hack - remove parent if nodes are linked between themselves
       if (innerNodeConnected)
     Manifest.getInstance().getGraph().removeVertex(parent);
    }
        
    // set common node properties from NDL
    private void setCommonNodeProperties(Node on, Resource nr) {
       // post boot script
       on.setPostBootScript(NdlCommons.getPostBootScript(nr));
           
       // management IP/port access
       on.setManagementAccess(NdlCommons.getNodeServices(nr));
           
       // state
       on.setState(NdlCommons.getResourceStateAsString(nr));
           
       if (on.getState() != null) {
     on.setIsResource();
       }
           
       // reservation notice
       on.setReservationNotice(NdlCommons.getResourceReservationNotice(nr));
           
       // domain
       Resource domain = NdlCommons.getDomain(nr);
       if (domain != null)
     on.setDomain(RequestSaver.reverseLookupDomain(domain));
           
       // url
       on.setUrl(nr.getURI());
           
       // group (if any)
       String groupUrl = NdlCommons.getRequestGroupURLProperty(nr);
       // group URL same as my URL means I'm a single node
       if ((groupUrl != null) &&
        groupUrl.equals(on.getUrl()))
     groupUrl = null;
       on.setGroup(groupUrl);
           
       // specific ce type
       Resource ceType = NdlCommons.getSpecificCE(nr);
       if (ceType != null)
     on.setNodeType(RequestSaver.reverseNodeTypeLookup(ceType));
           
       // substrate info if present
       if (NdlCommons.getEC2WorkerNodeId(nr) != null)
     on.setSubstrateInfo("worker", NdlCommons.getEC2WorkerNodeId(nr));
       if (NdlCommons.getEC2InstanceId(nr) != null)
     on.setSubstrateInfo("instance", NdlCommons.getEC2InstanceId(nr));
           
    }
        
    public void ndlParseComplete() {
       // ignore request items
       if (requestPhase)
     return;
           
       // nothing to do in this case
       NDLLIB.logger().debug("Parse complete.");
    }
        
    public void ndlNetworkConnectionPath(Resource c, OntModel m,
     List<List<Resource>> path, List<Resource> roots) {
        
       // ignore request items
       if (requestPhase)
     return;
        
       // nothing to do in this case
       NDLLIB.logger().debug("Network Connection Path: " + c);
       if (path != null) {
     NDLLIB.logger().debug("Printing paths");
     StringBuilder sb =  new StringBuilder();
     for (List<Resource> p: path) {
        sb.append("   Path: ");
        for (Resource r: p) {
           sb.append(r + " ");
        }
        NDLLIB.logger().debug(sb.toString());
     }
       } else 
     NDLLIB.logger().debug("   None");
    } 
        
    *//**
       * Request items - mostly ignored
       * 
       */
    /*
        
        
    public void ndlBroadcastConnection(Resource bl, OntModel om,
     long bandwidth, List<Resource> interfaces) {
    // TODO Auto-generated method stub
        
    }
        
        
    public void ndlNodeDependencies(Resource ni, OntModel m,
     Set<Resource> dependencies) {
    // TODO Auto-generated method stub
        
    }
        
        
    public void ndlReservation(Resource i, OntModel m) {
    // TODO Auto-generated method stub
        
    }
        
        
    public void ndlReservationEnd(Literal e, OntModel m, Date end) {
    expirationTime = end;
        
    }
        
        
    public void ndlReservationResources(List<Resource> r, OntModel m) {
    // TODO Auto-generated method stub
        
    }
        
        
    public void ndlReservationStart(Literal s, OntModel m, Date start) {
    creationTime = start;
        
    }
        
        
    public void ndlReservationTermDuration(Resource d, OntModel m, int years,
     int months, int days, int hours, int minutes, int seconds) {
    if (creationTime == null)
     return;
    if ((years == 0) && (months == 0) && (days == 0) && (hours == 0) && (minutes == 0) && (seconds == 0))
     return;
    Calendar cal = Calendar.getInstance();
    cal.setTime(creationTime);
    cal.add(Calendar.YEAR, years);
    cal.add(Calendar.MONTH, months);
    cal.add(Calendar.DAY_OF_YEAR, days);
    cal.add(Calendar.HOUR, hours);
    cal.add(Calendar.MINUTE, minutes);
    cal.add(Calendar.SECOND, seconds);
    expirationTime = cal.getTime();
    }
        
        
    public void ndlSlice(Resource sl, OntModel m) {
    // TODO Auto-generated method stub
        
    }
    {
        
    try {
     // parse as request
     NdlRequestParser nrp = new NdlRequestParser(s, this);
     // something wrong with request model that is part of manifest
     // some interfaces belong only to nodes, and no connections
     // for now do less strict checking so we can get IP info
     // 07/2012/ib
     nrp.doLessStrictChecking();
     nrp.processRequest();
     nrp.freeModel();
         
     // parse as manifest
     requestPhase = false;
     NdlManifestParser nmp = new NdlManifestParser(s, this);
     nmp.processManifest();   
     nmp.freeModel();         
     Manifest.getInstance().setManifestTerm(creationTime, expirationTime);
     //NDLLIBManifestState.getInstance().launchResourceStateViewer(creationTime, expirationTime);
         
    } catch (Exception e) {
    //         ExceptionDialog ed = new ExceptionDialog(NDLLIB.getInstance().getFrame(), "Exception");
    //         ed.setLocationRelativeTo(NDLLIB.getInstance().getFrame());
    //         ed.setException("Exception encountered while parsing manifest(m): ", e);
    //         ed.setVisible(true);
     return false;
    } 
    return true;
    }
        
    // sometimes getLocalName is not good enough
    // so we strip off orca name space and call it a day
    private String getTrueName(Resource r) {
    if (r == null)
     return null;
        
    return StringUtils.removeStart(r.getURI(), NdlCommons.ORCA_NS);
    }
        
    private String getPrettyName(Resource r) {
    String rname = getTrueName(r);
    int ind = rname.indexOf('#');
    if (ind > 0) {
     rname = rname.substring(ind + 1);
    }
    return rname;
    }
        
    // get domain name from inter-domain resource name
    private String getInterDomainName(Resource r) {
    String trueName = getTrueName(r);
        
    if (r == null)
     return null;
        
    String[] split = trueName.split("#");
    if (split.length >= 2) {
     String rem = split[1];
     String[] split1 = rem.split("/");
     return split1[0];
    }   
    return null;
    }
        
    public void ndlLinkConnection(Resource l, OntModel m,
     List<Resource> interfaces, Resource parent) {
    //System.out.println("Found link connection " + l + " connecting " + interfaces);
    assert(l != null);
        
    // ignore request items
    if (requestPhase)
     return;
        
    NDLLIB.logger().debug("Link Connection: " + l);
        
    // find what nodes it connects (should be two)
    Iterator<Resource> it = interfaces.iterator(); 
        
    String label = NdlCommons.getResourceLabel(l);
        
    if (interfaces.size() == 2) {
     NDLLIB.logger().debug("  Adding p-to-p link");
     OrcaLink ol = Manifest.getInstance().getLinkCreator().create(getPrettyName(l), NdlCommons.getResourceBandwidth(l));
     ol.setLabel(label);
        
     // maybe point-to-point link
     // the ends
     Resource if1 = it.next(), if2 = it.next();
         
     if ((if1 != null) && (if2 != null)) {
        OrcaNode if1Node = interfaceToNode.get(getTrueName(if1));
        OrcaNode if2Node = interfaceToNode.get(getTrueName(if2));
            
        if ((if1Node != null) && if1Node.equals(if2Node)) {
           // degenerate case of a node on a shared vlan
           OrcaCrossconnect oc = new OrcaCrossconnect(getPrettyName(l));
           oc.setLabel(label);
           oc.setDomain(RequestSaver.reverseLookupDomain(NdlCommons.getDomain(l)));
           nodes.put(getTrueName(l), oc);
           // save one interface
           interfaceToNode.put(getTrueName(if1), oc);
           Manifest.getInstance().getGraph().addVertex(oc);
           return;
        }
            
        // get the bandwidth of crossconnects if possible
        long bw1 = 0, bw2 = 0;
        if (if1Node instanceof OrcaCrossconnect) {
           OrcaCrossconnect oc = (OrcaCrossconnect)if1Node;
           bw1 = oc.getBandwidth();
        } 
        if (if2Node instanceof OrcaCrossconnect) {
           OrcaCrossconnect oc = (OrcaCrossconnect)if2Node;
           bw2 = oc.getBandwidth();
        }
        ol.setBandwidth(bw1 > bw2 ? bw1 : bw2);
            
        // have to be there
        if ((if1Node != null) && (if2Node != null)) {
           NDLLIB.logger().debug("  Creating a link " + ol.getName() + " from " + if1Node + " to " + if2Node);
           Manifest.getInstance().getGraph().addEdge(ol, new Pair<OrcaNode>(if1Node, if2Node), 
                 EdgeType.UNDIRECTED);
        }
     }
     // state
     ol.setState(NdlCommons.getResourceStateAsString(l));
         
     if (ol.getState() != null)
        ol.setIsResource();
         
     // reservation notice
     ol.setReservationNotice(NdlCommons.getResourceReservationNotice(l));
     links.put(getTrueName(l), ol);
    } else {         
     NDLLIB.logger().debug("  Adding multi-point crossconnect " + getTrueName(l) + " (has " + interfaces.size() + " interfaces)");
     // multi-point link
     // create a crossconnect then use interfaceToNode mapping to create links to it
     OrcaCrossconnect ml = new OrcaCrossconnect(getPrettyName(l));
        
     ml.setLabel(label);
     ml.setReservationNotice(NdlCommons.getResourceReservationNotice(l));
     ml.setState(NdlCommons.getResourceStateAsString(l));
     ml.setDomain(RequestSaver.reverseLookupDomain(NdlCommons.getDomain(l)));
        
     if (ml.getState() != null)
        ml.setIsResource();
         
     nodes.put(getTrueName(l), ml);
         
     // remember the interfaces
     while(it.hasNext()) {
        Resource intR = it.next();
        NDLLIB.logger().debug("  Remembering interface " + intR + " of " + ml);
        interfaceToNode.put(getTrueName(intR), ml);
     }
         
     // add crossconnect to the graph
     Manifest.getInstance().getGraph().addVertex(ml);
         
     // link to this later from interface information
         
     // link nodes (we've already seen them) to it
    //         for(Resource intf: interfaces) {
    //            if (interfaceToNode.get(getTrueName(intf)) != null) {
    //               NDLLIB.logger().debug("  Creating a link " + lcount + " from " + ml + " to " + interfaceToNode.get(getTrueName(intf)));
    //               OrcaLink ol = new OrcaLink("Link " + lcount++);
    //               NDLLIBManifestState.getInstance().getGraph().addEdge(ol, new Pair<OrcaNode>(ml, interfaceToNode.get(getTrueName(intf))), EdgeType.UNDIRECTED);
    //            }
    //         }
    }
    }
        
    public void ndlManifest(Resource i, OntModel m) {
    // nothing to do in this case
        
    // ignore request items
    if (requestPhase)
     return;
        
    NDLLIB.logger().debug("Manifest: " + i);
    }
        
    public void ndlInterface(Resource intf, OntModel om, Resource conn,
     Resource node, String ip, String mask) {
        
    // ignore request items
    if (requestPhase)
     return;
        
    // System.out.println("Interface " + l + " has IP/netmask" + ip + "/" + mask);
    NDLLIB.logger().debug("Interface " + intf + " between " + node + " and " + conn + " has IP/netmask " + ip + "/" + mask);
        
    if (intf == null)
     return;
    OrcaNode on = null;
    OrcaLink ol = null;
    OrcaCrossconnect crs = null;
    if (node != null)
     on = nodes.get(getTrueName(node));
        
    if (conn != null) {
     ol = links.get(getTrueName(conn));
     if (ol == null) 
        // maybe it is a crossconnect and not a link connection
        crs = (OrcaCrossconnect)nodes.get(getTrueName(conn));
    }
        
    // extract the IP address from label, if it is not set on
    // the interface in the request (basically we favor manifest
    // setting over the request because in node groups that's the
    // correct one)
    String nmInt = null;
    if (ip == null) {
     String ifIpLabel = NdlCommons.getLabelID(intf);
     // x.y.z.w/24
     if (ifIpLabel != null) {
        String[] ipnm = ifIpLabel.split("/");
        if (ipnm.length == 2) {
           ip = ipnm[0];
           nmInt = ipnm[1];
        }
     }
    } else {
     if (mask != null)
        nmInt = "" + RequestSaver.netmaskStringToInt(mask);
    }
        
    if (on != null) {
     if (ol != null) {
        on.setIp(ol, ip, nmInt);
        on.setInterfaceName(ol, getTrueName(intf));
        on.setMac(ol, NdlCommons.getAddressMAC(intf));
     } else if (crs != null) {
        if (intf.toString().matches(node.toString() + "/IP/[0-9]+")) {
           // include only interfaces that have nodename/IP/<number> format - those
           // are generated by Yufeng. 
        
           // create link from node to crossconnect and assign IP if it doesn't exist
           NDLLIB.logger().debug("  Creating a link  from " + on + " to " + crs);
           ol = Manifest.getInstance().getLinkCreator().create("Unnamed");
           Manifest.getInstance().getGraph().addEdge(ol, new Pair<OrcaNode>(on, crs), 
                 EdgeType.UNDIRECTED);
           on.setIp(ol, ip, nmInt);
           on.setMac(ol, NdlCommons.getAddressMAC(intf));
        }
     }
     else {
        // this could be a disconnected node group
        if (on instanceof OrcaComputeNode) {
           OrcaComputeNode ong = (OrcaComputeNode)on;
           ong.setInternalIp(ip, "" + RequestSaver.netmaskStringToInt(mask));
        }
     }
    }
    }
        
    public void ndlNetworkConnection(Resource l, OntModel om, long bandwidth,
     long latency, List<Resource> interfaces) {
        
    // ignore request items
    if (requestPhase)
     return;
        
    // nothing to do in this case
    NDLLIB.logger().debug("Network Connection: " + l);
        
    }
        
    public void ndlCrossConnect(Resource c, OntModel m, 
     long bw, String label, List<Resource> interfaces, Resource parent) {
        
    // ignore request items
    if (requestPhase)
     return;
        
    if (c == null)
     return;
        
    NDLLIB.logger().debug("CrossConnect: " + c);
        
    OrcaCrossconnect oc = new OrcaCrossconnect(getPrettyName(c));
    oc.setLabel(label);
        
    setCommonNodeProperties(oc, c);
        
    // later set bandwidth on adjacent links (crossconnects in NDL have
    // bandwidth but for users we'll show it on the links)
    oc.setBandwidth(bw);
        
    // process interfaces
    for (Iterator<Resource> it = interfaces.iterator(); it.hasNext();) {
     Resource intR = it.next();
     interfaceToNode.put(getTrueName(intR), oc);
    }
        
    nodes.put(getTrueName(c), oc);
        
    // add nodes to the graph
    Manifest.getInstance().getGraph().addVertex(oc);
    }
        
    public void ndlNode(Resource ce, OntModel om, Resource ceClass,
     List<Resource> interfaces) {
        
    // ignore request items
    if (requestPhase)
     return;
        
    if (ce == null)
     return;
        
    NDLLIB.logger().debug("Node: " + ce);
        
    OrcaNode newNode;
        
    if (NdlCommons.isStitchingNodeInManifest(ce)) {
     NDLLIB.logger().debug("  is a stitching port");
     OrcaStitchPort sp = new OrcaStitchPort(getPrettyName(ce));
     // get the interface (first)
     if (interfaces.size() == 1) {
        sp.setLabel(NdlCommons.getLayerLabelLiteral(interfaces.get(0)));
        if (NdlCommons.getLinkTo(interfaces.get(0)) != null)
           sp.setPort(NdlCommons.getLinkTo(interfaces.get(0)).toString());
     } 
     newNode = sp;
    } else if (NdlCommons.isNetworkStorage(ce)) {
     NDLLIB.logger().debug("  is a storage node");
     newNode = new OrcaStorageNode(getPrettyName(ce));
     newNode.setIsResource();
    } else if (NdlCommons.isMulticastDevice(ce)) {
     NDLLIB.logger().debug("  is a multicast root");
     newNode = new OrcaCrossconnect(getPrettyName(ce));
     newNode.setIsResource();
    } else {
     NDLLIB.logger().debug("  is a regular node");
     newNode = new OrcaNode(getPrettyName(ce));
    }
        
    for (Resource ii: interfaces)
     NDLLIB.logger().debug("  With interface " + ii);
        
    // set common properties
    setCommonNodeProperties(newNode, ce);
        
    // process interfaces
    for (Iterator<Resource> it = interfaces.iterator(); it.hasNext();) {
     Resource intR = it.next();
     interfaceToNode.put(getTrueName(intR), newNode);
    }
        
    // disk image
    Resource di = NdlCommons.getDiskImage(ce);
    if (di != null) {
     try {
        String imageURL = NdlCommons.getIndividualsImageURL(ce);
        String imageHash = NdlCommons.getIndividualsImageHash(ce);
        Request.getInstance().addImage(new OrcaImage(di.getLocalName(), 
              new URL(imageURL), imageHash), null);
        //newNode.setImage(di.getLocalName());
     } catch (Exception e) {
        // FIXME: ?
        ;
     }
    }
        
    nodes.put(getTrueName(ce), newNode);
        
    // add nodes to the graph
    Manifest.getInstance().getGraph().addVertex(newNode);
        
    // are there nodes hanging off of it as elements? if so, link them in
    processDomainVmElements(ce, om, newNode);
    }
        
    // add collection elements
    private void processDomainVmElements(Resource vm, OntModel om, OrcaNode parent) {
        
    // HACK - if we added real interfaces to inner nodes, we don't need link to parent
    boolean innerNodeConnected = false;
        
    for (StmtIterator vmEl = vm.listProperties(NdlCommons.collectionElementProperty); vmEl.hasNext();) {
     Resource tmpR = vmEl.next().getResource();
     OrcaNode on = new OrcaNode(getTrueName(tmpR), parent);
     nodes.put(getTrueName(tmpR), on);
     Manifest.getInstance().getGraph().addVertex(on);
     OrcaLink ol = Manifest.getInstance().getLinkCreator().create("Unnamed");
         
     // link to parent (a visual HACK)
     links.put(ol.getName(), ol);
     Manifest.getInstance().getGraph().addEdge(ol, new Pair<OrcaNode>(parent, on), 
           EdgeType.UNDIRECTED);
         
     // add various properties
     setCommonNodeProperties(on, tmpR);
         
     // process interfaces. if there is an interface that leads to
     // a link, this is an intra-domain case, so we can delete the parent later
     for (Resource intR: NdlCommons.getResourceInterfaces(tmpR)) {
        interfaceToNode.put(getTrueName(intR), on);
        // HACK: for now check that this interface connects to something
        // and is not just hanging there with IP address
        List<Resource> hasI = NdlCommons.getWhoHasInterface(intR, om);
        if (hasI.size() > 1)
           innerNodeConnected = true;
     }
    }
        
    // Hack - remove parent if nodes are linked between themselves
    if (innerNodeConnected)
     Manifest.getInstance().getGraph().removeVertex(parent);
    }
        
    // set common node properties from NDL
    private void setCommonNodeProperties(OrcaNode on, Resource nr) {
    // post boot script
    on.setPostBootScript(NdlCommons.getPostBootScript(nr));
        
    // management IP/port access
    on.setManagementAccess(NdlCommons.getNodeServices(nr));
        
    // state
    on.setState(NdlCommons.getResourceStateAsString(nr));
        
    if (on.getState() != null) {
     on.setIsResource();
    }
        
    // reservation notice
    on.setReservationNotice(NdlCommons.getResourceReservationNotice(nr));
        
    // domain
    Resource domain = NdlCommons.getDomain(nr);
    if (domain != null)
     on.setDomain(RequestSaver.reverseLookupDomain(domain));
        
    // url
    on.setUrl(nr.getURI());
        
    // group (if any)
    String groupUrl = NdlCommons.getRequestGroupURLProperty(nr);
    // group URL same as my URL means I'm a single node
    if ((groupUrl != null) &&
        groupUrl.equals(on.getUrl()))
     groupUrl = null;
    on.setGroup(groupUrl);
        
    // specific ce type
    Resource ceType = NdlCommons.getSpecificCE(nr);
    if (ceType != null)
     on.setNodeType(RequestSaver.reverseNodeTypeLookup(ceType));
        
    // substrate info if present
    if (NdlCommons.getEC2WorkerNodeId(nr) != null)
     on.setSubstrateInfo("worker", NdlCommons.getEC2WorkerNodeId(nr));
    if (NdlCommons.getEC2InstanceId(nr) != null)
     on.setSubstrateInfo("instance", NdlCommons.getEC2InstanceId(nr));
        
    }
        
    public void ndlParseComplete() {
    // ignore request items
    if (requestPhase)
     return;
        
    // nothing to do in this case
    NDLLIB.logger().debug("Parse complete.");
    }
        
    public void ndlNetworkConnectionPath(Resource c, OntModel m,
     List<List<Resource>> path, List<Resource> roots) {
        
    // ignore request items
    if (requestPhase)
     return;
        
    // nothing to do in this case
    NDLLIB.logger().debug("Network Connection Path: " + c);
    if (path != null) {
     NDLLIB.logger().debug("Printing paths");
     StringBuilder sb =  new StringBuilder();
     for (List<Resource> p: path) {
        sb.append("   Path: ");
        for (Resource r: p) {
           sb.append(r + " ");
        }
        NDLLIB.logger().debug(sb.toString());
     }
    } else 
     NDLLIB.logger().debug("   None");
    } 
        
    *//**
       * Request items - mostly ignored
       * 
       *//*
              
              
          public void ndlBroadcastConnection(Resource bl, OntModel om,
           long bandwidth, List<Resource> interfaces) {
          // TODO Auto-generated method stub
              
          }
              
              
          public void ndlNodeDependencies(Resource ni, OntModel m,
           Set<Resource> dependencies) {
          // TODO Auto-generated method stub
              
          }
              
              
          public void ndlReservation(Resource i, OntModel m) {
          // TODO Auto-generated method stub
              
          }
              
              
          public void ndlReservationEnd(Literal e, OntModel m, Date end) {
          expirationTime = end;
              
          }
              
              
          public void ndlReservationResources(List<Resource> r, OntModel m) {
          // TODO Auto-generated method stub
              
          }
              
              
          public void ndlReservationStart(Literal s, OntModel m, Date start) {
          creationTime = start;
              
          }
              
              
          public void ndlReservationTermDuration(Resource d, OntModel m, int years,
           int months, int days, int hours, int minutes, int seconds) {
          if (creationTime == null)
           return;
          if ((years == 0) && (months == 0) && (days == 0) && (hours == 0) && (minutes == 0) && (seconds == 0))
           return;
          Calendar cal = Calendar.getInstance();
          cal.setTime(creationTime);
          cal.add(Calendar.YEAR, years);
          cal.add(Calendar.MONTH, months);
          cal.add(Calendar.DAY_OF_YEAR, days);
          cal.add(Calendar.HOUR, hours);
          cal.add(Calendar.MINUTE, minutes);
          cal.add(Calendar.SECOND, seconds);
          expirationTime = cal.getTime();
          }
              
              
          public void ndlSlice(Resource sl, OntModel m) {
          // TODO Auto-generated method stub
              
          }
          */
}