/*
 * JOnAS: Java(TM) Open Application Server
 * Copyright (C) 2005 Bull S.A.
 * Contact: jonas-team@objectweb.org
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
 * USA
 *
 * --------------------------------------------------------------------------
 * $Id$
 * --------------------------------------------------------------------------
 */

package org.objectweb.jonas.webapp.jonasadmin.service.webservice;

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

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

import org.allesta.wsabi.j2ee.Handler;
import org.allesta.wsabi.j2ee.PortComponent;
import org.allesta.wsabi.j2ee.WebServiceDescription;
import org.allesta.wsabi.j2ee.provider.GenericDomainCapableProvider;
import org.allesta.wsabi.j2ee.provider.jonas.JonasProvider;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.objectweb.jonas.webapp.jonasadmin.JonasBaseAction;
import org.objectweb.jonas.webapp.jonasadmin.WhereAreYou;

/**
 * @author Vivek Lakshmanan
 */

public class HandlersDetailsAction extends JonasBaseAction {

	public ActionForward executeAction(ActionMapping p_Mapping,
			ActionForm p_Form, HttpServletRequest p_Request,
			HttpServletResponse p_Response) throws IOException,
			ServletException {
		// Id for the portcomponent selected by the user.
		String wsPCId = p_Request.getParameter("pcselect");
		// Selected web service description
		String wsdId = p_Request.getParameter("wsdselect");
		// Handler chosen by the user.
		String handlerId = p_Request.getParameter("handlerselect");

		try {
			GenericDomainCapableProvider jonasProvider = new JonasProvider();
			jonasProvider.initialize(m_WhereAreYou.getCurrentJonasServerName(),
					null);
			WebServiceDescription wsd = jonasProvider
					.getWebServiceDescription(wsdId);
			PortComponent pc = null;
			int wsdPortComponentCount = wsd.getPortComponentCount();
			// Find the port component selected by the user.
			for (int i = 0; i < wsdPortComponentCount; i++) {
				if (wsPCId.equals(((PortComponent) wsd.getPortComponent(i))
						.getId())) {
					pc = (PortComponent) wsd.getPortComponent(i);
					break;
				}
			}
			Handler handler = null;
			for (int i = 0; i < pc.getHandlerCount(); i++) {
				if (pc.getHandler(i).getId().equals(handlerId)) {
					handler = pc.getHandler(i);
				}
			}
			// HashMap to hold parameters for forwards to
			// ActionPortComponentsDetails.
			HashMap forwardMap = new HashMap();
			forwardMap.put("pcselect", wsPCId);
			forwardMap.put("wsdselect", wsdId);
			p_Request.setAttribute("paramMap", forwardMap);

			// Create ArrayLists for lists to be displayed about soap
			// headers, soap roles and init-params.
			ArrayList soapHeaders = new ArrayList();
			for (int i = 0; i < handler.getSoapHeaderCount(); i++) {
				soapHeaders.add(handler.getSoapHeader(i).toString());
			}

			ArrayList soapRoles = new ArrayList();
			for (int i = 0; i < handler.getSoapRoleCount(); i++) {
				soapRoles.add(handler.getSoapRole(i));
			}

			ArrayList initParams = new ArrayList();
			for (int i = 0; i < handler.getInitParamCount(); i++) {
				initParams.add(handler.getInitParam(i));
			}

			p_Request.setAttribute("portComponent", pc);
			p_Request.setAttribute("webServiceDescription", wsd);
			p_Request.setAttribute("handler", handler);
			p_Request.setAttribute("soapHeaders", soapHeaders);
			p_Request.setAttribute("soapRoles", soapRoles);
			p_Request.setAttribute("initParams", initParams);
			// Force the node selected in tree
			m_WhereAreYou.selectNameNode(getTreeBranchName(DEPTH_SERVER)
					+ WhereAreYou.NODE_SEPARATOR + "services"
					+ WhereAreYou.NODE_SEPARATOR + "WebService"
					+ WhereAreYou.NODE_SEPARATOR + wsd.getId()
					+ WhereAreYou.NODE_SEPARATOR + pc.getId()
					+ WhereAreYou.NODE_SEPARATOR + handler.getId(), true);

		} catch (Throwable t) {
			addGlobalError(t);
			saveErrors(p_Request, m_Errors);
			return (p_Mapping.findForward("Global Error"));
		}

		// Forward to jsp.
		return (p_Mapping.findForward("Handlers Details"));
	}

}
