blob: 667c432c8cf63080171ed7579f559ff65bf5eac3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.ws.internal.consumption.ui.widgets;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import org.eclipse.jst.j2ee.webservice.internal.wsdd.impl.WsddFactoryImpl;
import org.eclipse.jst.j2ee.webservice.wsdd.Handler;
import org.eclipse.jst.j2ee.webservice.wsdd.PortComponent;
import org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription;
import org.eclipse.jst.j2ee.webservice.wsdd.WsddFactory;
import org.eclipse.jst.j2ee.webservice.wsdd.WsddResource;
import org.eclipse.jst.ws.internal.consumption.ui.widgets.object.HandlerTableItem;
import org.eclipse.wst.command.internal.provisional.env.core.SimpleCommand;
import org.eclipse.wst.command.internal.provisional.env.core.common.Environment;
import org.eclipse.wst.command.internal.provisional.env.core.common.SimpleStatus;
import org.eclipse.wst.command.internal.provisional.env.core.common.Status;
import org.eclipse.wst.common.internal.emf.utilities.EtoolsCopyUtility;
/*
* Provide a way to externalize the edited fields and create new handlers
*
*/
public class ServiceHandlersWidgetOutputCommand extends SimpleCommand {
private List handlerTableItems;
private WebServiceDescription wsDescription_;
private WsddResource wsddResource_;
private Hashtable wsDescToHandlers_;
private Hashtable serviceDescNameToDescObj_;
public Status execute(Environment env) {
Status status = new SimpleStatus("");
try {
Enumeration e = wsDescToHandlers_.keys();
while (e.hasMoreElements()) {
Hashtable wsPortsTable = new Hashtable();
Hashtable wsPortToHandlerTable = new Hashtable();
String serviceDescName = (String) e.nextElement();
// load PortName -> PortComponent table
WebServiceDescription wsDescription_ = (WebServiceDescription) serviceDescNameToDescObj_.get(serviceDescName);
if (wsDescription_ != null) {
List wsPorts = wsDescription_.getPortComponents();
for (int k = 0; k < wsPorts.size(); k++) {
PortComponent port = (PortComponent) wsPorts.get(k);
wsPortsTable.put(port.getPortComponentName(), port);
wsPortToHandlerTable.put(port.getPortComponentName(), new ArrayList());
}
}
List handlerTableItems = (List) wsDescToHandlers_.get(serviceDescName);
if (handlerTableItems != null) {
WsddFactory wsddFactory = new WsddFactoryImpl();
//form port components tables first
for (int i = 0; i < handlerTableItems.size(); i++) {
HandlerTableItem hti = (HandlerTableItem) handlerTableItems.get(i);
PortComponent wsPort = (PortComponent) hti.getPort();
if (wsPort == null) {
//find it
if (wsPortsTable.get(hti.getPortName()) != null)
wsPort = (PortComponent) wsPortsTable.get(hti.getPortName());
else {
// create it; should not get into here
wsPort = wsddFactory.createPortComponent();
wsPort.setPortComponentName(hti.getPortName());
wsPortsTable.put(wsPort.getPortComponentName(), wsPort);
}
}
wsPortToHandlerTable.put(wsPort.getPortComponentName(), new ArrayList());
}
// form Handler and ports table
for (int i = 0; i < handlerTableItems.size(); i++) {
HandlerTableItem hti = (HandlerTableItem) handlerTableItems.get(i);
String portName = hti.getPortName();
PortComponent port = (PortComponent) wsPortsTable.get(portName);
if (port == null) return status;
List existingHandlers = port.getHandlers();
Object handler = hti.getHandler();
if (!existingHandlers.contains(handler)) {
// create it
Handler newHandler = wsddFactory.createHandler();
newHandler.setHandlerName(hti.getHandlerName());
newHandler.setHandlerClass(hti.getHandlerClassName());
((List) wsPortToHandlerTable.get(portName)).add(newHandler);
}
else if (handler instanceof Handler) {
// clone it
EtoolsCopyUtility copyUtil = new EtoolsCopyUtility();
copyUtil.setCopyAdapters(true);
Handler clonedHandler = (Handler) copyUtil.copy((Handler) handler);
((List) wsPortToHandlerTable.get(portName)).add(clonedHandler);
}
}
}
// remove existing handlers from ports
removeExistingHandlers(wsPortsTable, wsPortToHandlerTable);
// add ports to wsDescription
addPortsToDescriptions(wsPortsTable, wsDescription_);
// add handlers to ports
addHandlersToPorts(wsPortsTable, wsPortToHandlerTable);
}
if (wsddResource_ != null) {
wsddResource_.save(new HashMap());
}
}
catch (Exception e) {
//status = new
e.printStackTrace();
}
return status;
}
private void removeExistingHandlers(Hashtable portsTable, Hashtable portsToHandlersTable) {
try {
int key = 0;
Enumeration ports = portsToHandlersTable.keys();
while (ports.hasMoreElements()) {
String portName = (String) ports.nextElement();
Object port = portsTable.get(portName);
if (port != null && port instanceof PortComponent) {
List handlers = ((PortComponent) port).getHandlers();
handlers.clear();
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
private void addPortsToDescriptions(Hashtable portsTable, WebServiceDescription wsDescription_) {
try {
Enumeration ports = portsTable.keys();
while (ports.hasMoreElements()) {
String portName = (String) ports.nextElement();
// newly edited port
Object port = portsTable.get(portName);
// existing port
List emfPorts = wsDescription_.getPortComponents();
if (!emfPorts.contains(port) && port != null && port instanceof PortComponent) {
emfPorts.add((PortComponent) port);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
private void addHandlersToPorts(Hashtable portsTable, Hashtable portsToHandlersTable) {
try {
int key = 0;
Enumeration ports = portsToHandlersTable.keys();
while (ports.hasMoreElements()) {
String portName = (String) ports.nextElement();
Object port = portsTable.get(portName);
if (port != null && port instanceof PortComponent) {
List handlers = (List) portsToHandlersTable.get(portName);
List modelHandlers = ((PortComponent) port).getHandlers();
modelHandlers.addAll(handlers);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param handlerTableItems
* The handlerTableItems to set.
*/
public void setHandlersList(List handlerTableItems) {
this.handlerTableItems = handlerTableItems;
}
public void setWsDescToHandlers(Hashtable wsDescToHandlers) {
this.wsDescToHandlers_ = wsDescToHandlers;
}
// public void setWsDescription(WebServiceDescription wsDesc) {
// this.wsDescription_ = wsDesc;
// }
public void setWsddResource(WsddResource wsddRes) {
this.wsddResource_ = wsddRes;
}
public void setServiceDescNameToDescObj(Hashtable serviceDescNameToDescObj) {
this.serviceDescNameToDescObj_ = serviceDescNameToDescObj;
}
}