//
// This file is part of the OpenNMS(R) Application.
//
// OpenNMS(R) is Copyright (C) 2002-2003 The OpenNMS Group, Inc.  All rights reserved.
// OpenNMS(R) is a derivative work, containing both original code, included code and modified
// code that was published under the GNU General Public License. Copyrights for modified 
// and included code are below.
//
// OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
//
// Copyright (C) 1999-2001 Oculan Corp.  All rights reserved.
//
// This program 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 2 of the License, or
// (at your option) any later version.
//
// This program 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 this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// For more information contact:
//      OpenNMS Licensing       <license@opennms.org>
//      http://www.opennms.org/
//      http://www.opennms.com/
//

package org.opennms.web.performance;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.opennms.core.resource.Vault;
import org.opennms.web.MissingParameterException;
import org.opennms.web.Util;

public class AddInterfaceToURLServlet extends HttpServlet {
    protected PerformanceModel model;

    protected String chooseInterfaceUrl;

    public void init() throws ServletException {
        ServletConfig config = this.getServletConfig();

        this.chooseInterfaceUrl = config.getInitParameter("chooseInterfaceUrl");
        if (this.chooseInterfaceUrl == null) {
            throw new ServletException("chooseInterfaceUrl is a required init parameter");
        }

        try {
            this.model = new PerformanceModel(Vault.getHomeDir());
        } catch (Exception e) {
            throw new ServletException("Could not initialize the PerformanceModel", e);
        }
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String nodeId = request.getParameter("node");
	String domain = request.getParameter("domain");
        String endUrl = request.getParameter("endUrl");
	ArrayList intfs;

        if (endUrl == null) {
            throw new MissingParameterException("endUrl", new String[] { "node", "endUrl" });
        }

        // should return an empty array if no queryable interfaces available

        if (nodeId != null) {
            intfs = this.model.getQueryableInterfacesForNode(nodeId);
            this.log("DEBUG: Found these interfaces for node " + nodeId + ":");
        } else if (domain != null) {
            intfs = this.model.getQueryableInterfacesForDomain(domain);
            this.log("DEBUG: Found these interfaces for domain " + domain + ":");
        } else {
            throw new MissingParameterException("node or domain", new String[] { "node or domain", "endUrl" });
        }

        if (intfs == null) {
            // shouldn't ever happen, but just in case
            this.log("DEBUG: Error: No interfaces found");
            throw new ServletException("Unexpected value: a null array");
        }

	for (Iterator i = intfs.iterator(); i.hasNext(); ) {
            this.log("DEBUG: interface: " + (String) i.next());
        }
        this.log("DEBUG: No more interfaces");


        String[] ignores = new String[] { "endUrl" };

        switch (intfs.size()) {
        case 0: {
            // there are no queryable interfaces, but there must be node
            // information otherwise the given nodeid would never have
            // been chooseable from the UI, so we'll just send request
            // on to only graph the node information
            HashMap additions = new HashMap();
            additions.put("resource", "");
            additions.put("resourceType", "node");
            String queryString = Util.makeQueryString(request, ignores);

            // this is a servlet context-relative URL (ie external URL), so
            // we have to add the base URL; the base URL contains a trailing
            // slash, so I do not add one here
            response.sendRedirect(Util.calculateUrlBase(request) + endUrl + "?" + queryString);
            break;
        }

        case 1: {
          if (this.model.getQueries(Integer.parseInt(nodeId)).length > 0) {
            // redirect to the chooseInterfaceUrl
            String queryString = Util.makeQueryString(request);
            response.sendRedirect(Util.calculateUrlBase(request)
				  + this.chooseInterfaceUrl + "?"
				  + queryString);

            // this is a sibling URL, so no base URL is needed
          } else {
            // add the interface, and redirect to end url
            HashMap additions = new HashMap();
            additions.put("resource", intfs.get(0));
            additions.put("resourceType", "interface");

            String queryString = Util.makeQueryString(request, additions, ignores);

            // this is a servlet context-relative URL (ie external URL), so
            // we have to add the base URL; the base URL contains a trailing
            // slash, so I do not add one here
            response.sendRedirect(Util.calculateUrlBase(request) + endUrl + "?"
				  + queryString);
          }	    
	  break;
        }

        default: {
            // redirect to the chooseInterfaceUrl
            String queryString = Util.makeQueryString(request);

            // this is a sibling URL, so no base URL is needed
            response.sendRedirect(Util.calculateUrlBase(request)
				  + this.chooseInterfaceUrl + "?"
				  + queryString);
            break;
        }
        }
    }
}

@@ -4537,16 +4537,27 @@
 request,
+ additions,
  ignores
@@ -5046,59 +5046,421 @@
     
-String queryString = Util.makeQueryString(request);
+HashMap additions = new HashMap();%0A            additions.put(%22resource%22, %22%22);%0A            additions.put(%22resourceType%22, %22node%22);%0A            String queryString = Util.makeQueryString(request, additions, ignores);%0A%0A            // this is a servlet context-relative URL (ie external URL), so%0A            // we have to add the base URL; the base URL contains a trailing%0A            // slash, so I do not add one here
 %0A   
@@ -5524,37 +5524,14 @@
 est)
-%0A%09%09%09%09  + this.chooseInterface
+ + end
 Url 
@@ -5527,38 +5527,32 @@
 ) + endUrl + %22?%22
-%0A%09%09%09%09 
  + queryString);
@@ -5555,72 +5555,8 @@
 ng);
-%0A%0A            // this is a sibling URL, so no base URL is needed
 %0A   

Fix case where a node has no queryable interfaces and node-level data.