package org.perfsonar.service.measurementArchive.metadataConfig.queryGenerator;

import org.perfsonar.commons.auxiliary.AuxiliaryComponentManager;
import org.perfsonar.commons.auxiliary.ComponentNames;
import org.perfsonar.commons.auxiliary.components.logger.LoggerComponent;

import org.perfsonar.service.commons.exceptions.SystemException;
import org.perfsonar.service.commons.exceptions.RequestException;

import org.ggf.ns.nmwg.base.v2_0.Message;
import org.ggf.ns.nmwg.base.v2_0.Metadata;
import org.ggf.ns.nmwg.base.v2_0.Parameters;
import org.ggf.ns.nmwg.base.v2_0.Parameter;

import org.ggf.ns.nmwg.topology.v2_0.EndPointPair;
import org.ggf.ns.nmwg.topology.v2_0.Dst;
import org.ggf.ns.nmwg.topology.v2_0.Src;

import org.ggf.ns.nmwg.tools.traceroute.v2_0.Subject;

/**
 *
 * @author Mohammad Asif
 * Created on January 2, 2007, 1:29 PM
 */
public class TracerouteQueryGenerator implements MetadataQueryGenerator {

   // -------------------------------------- class fields
     protected LoggerComponent logger = null;

   // -------------------------------------- constructors
      public TracerouteQueryGenerator() throws SystemException {
    	try {

    		this.logger = (LoggerComponent)
            	AuxiliaryComponentManager.
                	getInstance().
                    	getComponent(ComponentNames.LOGGER);
    	} catch (SystemException e) {

            throw new SystemException(
            		"error.common.no_logger",
            		"TracerpiteQueryGenerator.constructor: "
            		+ "Cannot get logger component");

        }

    }

     /**
     *  Returns xpath query created using the information
     *  stored in Message object.
     */
    public String getMetadataQuery(Message query)
      throws SystemException, RequestException
    {

           if (query == null)
            throw new SystemException(
                    "error.ma.query",
                    "TracerouteQueryGenerator.getMetadataQuery: "
                    + "Input message is null");


        String src="" ;
        String dst            = "";
        String startTime      = "";
        String endTime        = "";
        String eventType      = "";
	String metaId         = "";

        Metadata metadata = null;
        try {
            Metadata[] metadataArray = (query.getMetadataArray());
            metadata = metadataArray[0];
            System.out.println (metadata.getId());
        } catch (Exception ex) {
            logger.error(
            		"TracerouteQueryGenerator.getMetadataQuery: "
            		+ "Unable to get metadata from the message");
            throw new RequestException(
                    "error.ma.query",
                    "TracerouteQueryGenerator.getMetadataQuery: "
                    + "Unable to get metadata from the message; "
                    + ex.toString());
        }

        if (metadata != null) {

	    metaId = metadata.getId();
            eventType = (metadata.getEventType() != null ?  metadata.getEventType().getEventType().trim() : "");

            System.out.println ("EventType: "+ eventType);

            Subject subject = (Subject) metadata.getSubject();



            EndPointPair end = subject.getEndPointPair();

            /*
            Parameters params = metadata.getParameters();

            Parameter paramStartTime = params.getParameterByName("startTime");
            Parameter paramEndTime = params.getParameterByName("endTime") ;
           */

            if (end != null) {
                src        = (end.getSourceElement()    != null ? end.getSourceElement().getValue().trim()           : "");
                dst        = (end.getDestinationElement()   != null ? end.getDestinationElement().getValue().trim()  : "");
            }

            /*
            if (paramStartTime != null)
                startTime = (paramStartTime.getParameterValue()   != null ? paramStartTime.getParameterValue().trim() : "");
            if (paramEndTime != null)
                endTime = (paramEndTime.getParameterValue()   != null ? paramEndTime.getParameterValue().trim() : "");
            */

        }

        String xQuery = "\n"
        	+ "declare namespace nmwg='http://ggf.org/ns/nmwg/base/2.0/'; "
        	+ "declare namespace traceroute='http://ggf.org/ns/nmwg/tools/traceroute/2.0/'; "
        	+ "declare namespace nmwgt='http://ggf.org/ns/nmwg/topology/2.0/'; \n\n";

        xQuery +=
            " let $res :=                               \n"
            + "    for $i in //nmwg:metadata            \n"
            + "    where 1                              \n";


        if (eventType != "")
        	 xQuery += "and $i/nmwg:parameters/nmwg:parameter[(text()='" + eventType + "' and @name='supportedEventType') "
                + "or (@value='" + eventType + "' and @name='supportedEventType')]";

        if (src != "")
            xQuery += "and $i/traceroute:subject/nmwgt:endPointPair/nmwgt:src[@value='" + src + "']";

        if (dst != "")
        	xQuery += "and $i/traceroute:subject/nmwgt:endPointPair/nmwgt:dst[@value='" + dst + "']";

        /*
        if (startTime != "")
        	xQuery += "and $i/trace:parameters/nmwg:parameter[(text()='" + startTime + "' and @name='startTime') "
        		+ "or (@value='" + startTime + "' and @name='startTime')]";
         if (endTime != "")
        	xQuery += "and $i/trace:parameters/nmwg:parameter[(text()='" + endTime + "' and @name='endTime') "
        		+ "or (@value='" + endTime + "' and @name='endTime')]";
         */

        xQuery += "\n"
            + " return $i                                   \n"
            + "                                             \n"
            + " let $metaids :=                             \n"
            + "     for $j in $res                          \n"
            + "     return fn:data($j/@id)                  \n"
            + "                                             \n"
            + " let $datas :=                               \n"
            + "     for $k in $metaids                      \n"
            + "         let $d :=                           \n"
            + "             for $l in //nmwg:data           \n"
            + "             where $l/@metadataIdRef = $k    \n"
            + "             return $l                       \n"
            + "     return $d                               \n"
            + "                                             \n"
            + " return ($res, $datas)                       \n";

        return xQuery;
    }
  • No labels