/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.actions;
import com.eviware.soapui.impl.WorkspaceImpl;
import com.eviware.soapui.impl.rest.RestService;
import com.eviware.soapui.impl.rest.RestServiceFactory;
import com.eviware.soapui.impl.rest.support.WadlImporter;
import com.eviware.soapui.impl.support.definition.support.InvalidDefinitionException;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.project.Project;
import com.eviware.soapui.support.MessageSupport;
import com.eviware.soapui.support.ModelItemNamer;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.action.support.AbstractSoapUIAction;
import com.eviware.x.form.XFormDialog;
import com.eviware.x.form.support.ADialogBuilder;
import com.eviware.x.form.support.AField;
import com.eviware.x.form.support.AForm;
import java.io.File;
import java.util.List;
/**
* Action class to create new Generic project.
*
* @author Ole.Matzura
*/
public class NewWadlProjectAction extends AbstractSoapUIAction<WorkspaceImpl> {
public static final String SOAPUI_ACTION_ID = "NewWadlProjectAction";
public static final String DEFAULT_PROJECT_NAME = "REST Project";
private XFormDialog dialog;
public static final MessageSupport messages = MessageSupport.getMessages(NewWadlProjectAction.class);
public NewWadlProjectAction() {
super(messages.get("Title"), messages.get("Description"));
}
public void perform(WorkspaceImpl workspace, Object param) {
if (dialog == null) {
dialog = ADialogBuilder.buildDialog(Form.class);
}
if (param instanceof String) {
dialog.setValue(Form.INITIALWADL, param.toString());
} else {
dialog.setValue(Form.INITIALWADL, "");
}
while (dialog.show()) {
WsdlProject project = null;
try {
String projectName = createProjectName(dialog.getFormField(Form.INITIALWADL).getValue(), workspace.getProjectList());
if (projectName.length() == 0) {
UISupport.showErrorMessage(messages.get("MissingProjectNameError"));
} else {
project = workspace.createProject(projectName, null);
if (project != null) {
UISupport.select(project);
String url = dialog.getValue(Form.INITIALWADL).trim();
if (url.length() > 0) {
if (new File(url).exists()) {
url = new File(url).toURI().toURL().toString();
}
if (url.toUpperCase().endsWith("WADL")) {
importWadl(project, url);
}
}
showDeepestEditor(project);
break;
}
}
} catch (InvalidDefinitionException ex) {
ex.show();
} catch (Exception ex) {
UISupport.showErrorMessage(ex);
if (project != null) {
workspace.removeProject(project);
}
}
}
}
private void showDeepestEditor(WsdlProject project) {
ModelItem item = findLeafItem(project);
if (item != null) {
UISupport.select(item);
UISupport.showDesktopPanel(item);
}
}
private ModelItem findLeafItem(ModelItem item) {
if (item.getChildren().isEmpty()) {
return item;
}
return findLeafItem(item.getChildren().get(0));
}
public String createProjectName(String filePath, List<? extends Project> projectList) {
if (StringUtils.hasContent(filePath)) {
String projectName = filePath;
int ix = projectName.lastIndexOf('.');
if (ix > 0) {
projectName = projectName.substring(0, ix);
}
ix = projectName.lastIndexOf('/');
if (ix == -1) {
ix = projectName.lastIndexOf('\\');
}
if (ix != -1) {
projectName = projectName.substring(ix + 1);
}
if (!StringUtils.isNullOrEmpty(projectName)) {
return projectName;
}
}
return ModelItemNamer.createName(DEFAULT_PROJECT_NAME, projectList);
}
private void importWadl(WsdlProject project, String url) {
RestService restService = (RestService) project
.addNewInterface(project.getName(), RestServiceFactory.REST_TYPE);
UISupport.select(restService);
try {
new WadlImporter(restService).initFromWadl(url);
} catch (Exception e) {
UISupport.showErrorMessage(e);
}
}
@AForm(name = "Form.Title", description = "Form.Description", helpUrl = HelpUrls.NEW_WADL_PROJECT_HELP_URL, icon = UISupport.TOOL_ICON_PATH)
public interface Form {
@AField(description = "Form.InitialWadl.Description", type = AField.AFieldType.FILE)
public final static String INITIALWADL = messages.get("Form.InitialWadl.Label");
}
}