/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.foundation.ws.action;
import java.io.File;
import java.util.Enumeration;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.dataimporter.DataImporter;
import org.openflexo.dataimporter.DataImporterLoader.KnownDataImporter;
import org.openflexo.foundation.FlexoEditor;
import org.openflexo.foundation.FlexoException;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.InvalidArgumentException;
import org.openflexo.foundation.action.FlexoActionType;
import org.openflexo.foundation.dm.DMEntity;
import org.openflexo.foundation.dm.DMPackage;
import org.openflexo.foundation.dm.DMProperty;
import org.openflexo.foundation.dm.DMType;
import org.openflexo.foundation.dm.JDKRepository;
import org.openflexo.foundation.dm.WSDLRepository;
import org.openflexo.foundation.rm.FlexoProject;
import org.openflexo.foundation.wkf.FlexoProcess;
import org.openflexo.foundation.wkf.ws.PortRegistery;
import org.openflexo.foundation.wkf.ws.ServiceInterface;
import org.openflexo.foundation.ws.ExternalWSService;
import org.openflexo.foundation.ws.FlexoWSLibrary;
import org.openflexo.foundation.ws.InternalWSService;
import org.openflexo.foundation.ws.WSFolder;
import org.openflexo.foundation.ws.WSObject;
import org.openflexo.foundation.ws.WSService;
import org.openflexo.localization.FlexoLocalization;
public class CreateNewWebService extends AbstractCreateNewWebService<CreateNewWebService> {
private static final Logger logger = Logger.getLogger(CreateNewWebService.class.getPackage().getName());
public static final String INTERNAL_WS = "INTERNAL_WS";
public static final String EXTERNAL_WS = "EXTERNAL_WS";
public static FlexoActionType<CreateNewWebService, WSObject, WSObject> actionType = new FlexoActionType<CreateNewWebService, WSObject, WSObject>(
"ws_add_webservice...", FlexoActionType.newMenu, FlexoActionType.defaultGroup, FlexoActionType.ADD_ACTION_TYPE) {
/**
* Factory method
*/
@Override
public CreateNewWebService makeNewAction(WSObject focusedObject, Vector<WSObject> globalSelection, FlexoEditor editor) {
return new CreateNewWebService(focusedObject, globalSelection, editor);
}
@Override
public boolean isVisibleForSelection(WSObject object, Vector<WSObject> globalSelection) {
return KnownDataImporter.WSDL_IMPORTER.isAvailable();
}
@Override
public boolean isEnabledForSelection(WSObject object, Vector<WSObject> globalSelection) {
return true;
}
};
static {
FlexoModelObject.addActionForClass(actionType, FlexoWSLibrary.class);
FlexoModelObject.addActionForClass(actionType, WSFolder.class);
FlexoModelObject.addActionForClass(actionType, ExternalWSService.class);
FlexoModelObject.addActionForClass(actionType, InternalWSService.class);
}
CreateNewWebService(WSObject focusedObject, Vector<WSObject> globalSelection, FlexoEditor editor) {
super(actionType, focusedObject, globalSelection, editor);
}
protected CreateNewWebService(FlexoActionType<CreateNewWebService, WSObject, WSObject> anActionType, WSObject focusedObject,
Vector<WSObject> globalSelection, FlexoEditor editor) {
super(anActionType, focusedObject, globalSelection, editor);
}
private String _newWebServiceName;
private PortRegistery _portRegistry;
private File _wsdlFile;
private FlexoProject _project;
private ServiceInterface _serviceInterface;
@Override
public String getNewWebServiceName() {
return _newWebServiceName;
}
@Override
public void setNewWebServiceName(String name) {
_newWebServiceName = name;
}
@Override
public File getWsdlFile() {
return _wsdlFile;
}
@Override
public void setWsdlFile(File file) {
_wsdlFile = file;
}
@Override
public FlexoProject getProject() {
return _project;
}
@Override
public void setProject(FlexoProject project) {
_project = project;
}
/*
* For export, either we specify a
*/
@Override
public PortRegistery getPortRegistry() {
return _portRegistry;
}
@Override
public void setPortRegistry(PortRegistery a) {
_portRegistry = a;
}
@Override
public ServiceInterface getServiceInterface() {
return _serviceInterface;
}
@Override
public void setServiceInterface(ServiceInterface a) {
_serviceInterface = a;
}
@Override
public FlexoProcess getFlexoProcess() {
if (getServiceInterface() != null) {
return getServiceInterface().getProcess();
}
if (getPortRegistry() != null) {
return getPortRegistry().getProcess();
}
return null;
}
private FlexoWSLibrary getWSLibrary() {
return getProject().getFlexoWSLibrary();
}
private String _webServiceType;
@Override
public String getWebServiceType() {
return _webServiceType;
}
@Override
public void setWebServiceType(String type) {
_webServiceType = type;
}
private WSService _newWebService = null;
@Override
public WSService getNewWebService() {
return _newWebService;
}
@Override
protected void doAction(Object context) throws FlexoException {
logger.info("CREATE EXTERNAL WebService");
if (_webServiceType.equals(CreateNewWebService.EXTERNAL_WS)) {
logger.info("Importing from WSDL...");
DataImporter wsdlImporter = KnownDataImporter.WSDL_IMPORTER.getImporter();
if (wsdlImporter != null) {
Object[] params = new Object[2];
params[0] = getNewWebServiceName();
params[1] = this;
makeFlexoProgress(FlexoLocalization.localizedForKey("importing") + " " + getWsdlFile().getName(), 4);
_newWebService = (WSService) wsdlImporter.importInProject(getProject(), getWsdlFile(), params);
hideFlexoProgress();
} else {
logger.warning("Sorry, data importer " + KnownDataImporter.WSDL_IMPORTER.getClassName() + " not found ");
}
logger.info("Importing from WSDL... DONE.");
} else if (_webServiceType.equals(CreateNewWebService.INTERNAL_WS)) {
logger.info("EXPORT FLEXO PROCESS AS WEBSERVICE");
makeFlexoProgress(FlexoLocalization.localizedForKey("exporting") + " " + getFlexoProcess().getName(), 4);
// _newWebService = (WSService)wsdlImporter.importInProject(getProject(),getWsdlFile(),params);
// 1. Get/Create internal service group
_newWebService = getProject().getFlexoWSLibrary().getInternalWSServiceNamed(getNewWebServiceName());
if (_newWebService == null) {
_newWebService = getWSLibrary().createInternalWSService(getNewWebServiceName());
_newWebService = getWSLibrary().addInternalWSServiceNamed((InternalWSService) _newWebService);
}
// 2. add ServiceInterface to the group
if (getServiceInterface() != null) {
if (logger.isLoggable(Level.INFO)) {
logger.info("adding ServiceInterface:" + getServiceInterface().getName());
}
_newWebService.addServiceInterfaceAsPortType(getServiceInterface());
} else if (getPortRegistry() != null) {
if (logger.isLoggable(Level.INFO)) {
logger.info("adding portRegistry:" + getPortRegistry().getName());
}
ServiceInterface si = getFlexoProcess().addServiceInterface(getNewWebServiceName());
si = ServiceInterface.copyPortsFromRegistry(si, getPortRegistry());
_newWebService.addServiceInterfaceAsPortType(si);
setServiceInterface(si);
} else {
throw new InvalidArgumentException("Incorrect Argument: missing ServiceInterface or PortRegistery",
"ws_no_service_interface_specified");
}
/*
* No more Copy //3. if subprocess is defined with WSDLRepository's data, it's ok. // else refactoring: duplicate data in all
* messageDefinitionBinding // and copy them in a WSDLRepository .
*
*
*
* Vector ports = getFlexoProcess().getPortRegistery().getAllPorts(); if(ports==null) return; Enumeration en = ports.elements();
* while (en.hasMoreElements()) { FlexoPort port = (FlexoPort)en.nextElement(); Vector entries = new Vector();
* if(port.isInPort()){ System.out.println("inport"); AbstractInPort inport=(AbstractInPort)port; entries.addAll(
* inport.getInputMessageDefinition().getEntries() ); } if(port.isOutPort()){ System.out.println("outport"); OutputPort
* outport=(OutputPort)port; entries.addAll(outport.getOutputMessageDefinition().getEntries()); } if(entries!=null){
* System.out.println("enumeration on entries"); Enumeration en1 = entries.elements(); while (en1.hasMoreElements()) {
* MessageEntry entry = (MessageEntry)en1.nextElement(); DMEntity type = entry.getType(); System.out.println("Entry:"+
* entry.getVariableName()+ " type:"+ entry.getType());
*
* if( type.getRepository() instanceof JDKRepository){ // do nothing. } else{ System.out.println("duplicating"); // duplicate
* repository entry into a the WSDLRepository of this WSService. WSRepository wsRep =
* _newWebService.getWSRepositoryNamed(getNewWebServiceName()); WSDLRepository repo = null; if(wsRep==null){ repo =
* WSDLRepository.createNewWSDLRepository(getNewWebServiceName(),getProject().getDataModel(),null,getFlexoProgress());
* _newWebService.addRepository(repo); } else repo = wsRep.getWSDLRepository();
*
* DMEntity newType = copyEntity(type, repo); entry.setType(newType);
*
* } } }
*
* }
*/
hideFlexoProgress();
}
}
private DMEntity copyEntity(DMEntity entity, WSDLRepository toRep) {
// 0. Check if the entity has no been already duplicated.
if (toRep.getDMEntity(entity.getEntityPackageName(), entity.getName()) != null) {
return toRep.getDMEntity(entity.getEntityPackageName(), entity.getName());
}
System.out.println("Copying entity:" + entity.getName());
// 1. if has a parent entity, copy parent entity.
DMEntity newParent = null;
if (entity.getParentBaseEntity() != null) {
newParent = copyEntity(entity.getParentBaseEntity(), toRep);
}
// 2. copy entity;
DMPackage fromPack = entity.getPackage();
DMPackage toPack = toRep.getPackageWithName(fromPack.getName());
if (toPack == null) {
toPack = toRep.createPackage(fromPack.getName());
}
DMEntity newEntity = new DMEntity(toPack.getDMModel(), entity.getName(), toPack.getName(), entity.getName(),
DMType.makeResolvedDMType(newParent));
toPack.getRepository().registerEntity(newEntity);
// 3. copy properties
Enumeration en = entity.getProperties().keys();
while (en.hasMoreElements()) {
DMProperty property = entity.getProperty((String) en.nextElement());
DMEntity propertyType = null;
if (property != null) {
// 1. duplicate propertyType. is a complexType not in the wsdl repository...
propertyType = property.getType().getBaseEntity();
if (propertyType != null) {
if (!propertyType.getRepository().equals(toRep) && !(propertyType.getRepository() instanceof JDKRepository)) {
// copy entity's property
propertyType = copyEntity(propertyType, toRep);
}
}
}
DMProperty newProperty = new DMProperty(entity.getDMModel(), property.getName(), DMType.makeResolvedDMType(propertyType),
property.getCardinality(), property.getIsReadOnly(), property.getIsSettable(), property.getImplementationType());
newEntity.registerProperty(newProperty, false);
}
return newEntity;
}
}