/*******************************************************************************
* Copyright (c) 2014 Salesforce.com, inc..
* 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:
* Salesforce.com, inc. - initial API and implementation
******************************************************************************/
package com.salesforce.ide.ui.wizards.components.wsdl;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import com.salesforce.ide.core.internal.components.MultiClassComponentController;
import com.salesforce.ide.core.internal.components.apex.clazz.ApexClassModel;
import com.salesforce.ide.core.internal.context.ContainerDelegate;
import com.salesforce.ide.core.model.Component;
import com.salesforce.ide.core.model.ProjectPackageList;
import com.salesforce.ide.core.project.ForceProjectException;
import com.salesforce.ide.ui.wizards.components.apex.clazz.ApexClassWizard;
import com.salesforce.ide.ui.wizards.components.apex.clazz.ApexClassWizardPage;
import com.salesforce.ide.wsdl2apex.core.CalloutException;
import com.salesforce.ide.wsdl2apex.core.Wsdl2Apex;
/**
* Wizard to create apex classes from a wsdl
*
* @author kevin.ren
*
*/
public class Wsdl2apexWizard extends Wizard implements INewWizard {
private IStructuredSelection initialSelection;
private Wsdl2apexWizardFindPage convertPage;
private Wsdl2apexWizardRenameClasses createPage;
private IWorkbench currentWorkBench;
private static final Logger logger = Logger.getLogger(ProjectPackageList.class);
private Wsdl2Apex generator;
private ProjectPackageList allPackages = null;
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
this.initialSelection = selection;
this.currentWorkBench = workbench;
this.generator = new Wsdl2Apex();
this.setForcePreviousAndNextButtons(true);
}
public Wsdl2apexWizardFindPage getConvertPage() {
return this.convertPage;
}
public Wsdl2apexWizardRenameClasses getCreatePage() {
return this.createPage;
}
public String getWsdlFileLocation() {
return this.convertPage.getWsdlFileLocation();
}
public Wsdl2Apex getApexGenerator() {
return this.generator;
}
public void addPages() {
setWindowTitle("Convert WSDL File to Apex");
this.convertPage = new Wsdl2apexWizardFindPage();
this.createPage = new Wsdl2apexWizardRenameClasses();
addPage(convertPage);
addPage(createPage);
}
@Override
public boolean canFinish() {
if (this.convertPage.getWsdlFileLocation() != null && this.convertPage.getWsdlFileLocation() != ""
&& this.convertPage.getErrorMessage() == null && this.createPage.getErrorMessage() == null) //check if all fields are filled in and completed
{
return true;
} else
return false;
}
@Override
public boolean performFinish() {
try {
getContainer().run(true, true, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
exec();
}
});
} catch (InvocationTargetException e) {
MessageDialog dialog =
new MessageDialog(null, "Error", null, e.getMessage(), MessageDialog.ERROR, new String[] { "Ok" },
0);
dialog.open();
logger.error(e.getMessage());
} catch (InterruptedException e) {
MessageDialog dialog =
new MessageDialog(null, "Error", null, e.getMessage(), MessageDialog.ERROR, new String[] { "Ok" },
0);
dialog.open();
logger.error(e.getMessage());
} catch (Exception e) {
MessageDialog dialog =
new MessageDialog(null, "Error", null, e.getMessage(), MessageDialog.ERROR, new String[] { "Ok" },
0);
dialog.open();
logger.error(e.getMessage());
}
return true;
}
public void exec() {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
ApexClassWizard a;
try {
String[] arguements = new String[1];
arguements[0] = convertPage.getAsyncTrue().toString(); //checks if we want async methods
generator.generate(arguements);
//we have all of the generated classes now
Iterator<String> ii = generator.getAllClasses().iterator();
Iterator<String> jj = generator.getAllClassNames().iterator();
allPackages =
ContainerDelegate.getInstance().getServiceLocator().getProjectService()
.getProjectPackageListInstance();
while (ii.hasNext() && jj.hasNext()) //this loop here purely for checking if the class name is already used
{
String classBody = ii.next().trim();
String className = jj.next().trim();
a = new ApexClassWizard(true, allPackages);
ApexClassWizardPage ap = new ApexClassWizardPage(a);
ApexClassModel apexClassModel = (ApexClassModel) ap.getComponentWizardModel();
a.init(currentWorkBench, initialSelection);
Component apexComponent = apexClassModel.getComponent();
apexComponent.setBodyFromTemplateString(classBody);
apexComponent.setName(className);
if (!ap.getComponentController().isNameUniqueLocalCheck()) {
throw new IOException("There is already a class named " + className);
}
}
Iterator<String> i = generator.getAllClasses().iterator();
Iterator<String> j = generator.getAllClassNames().iterator();
while (i.hasNext() && j.hasNext()) //this loop for creating apex classes by programmatically using the ApexClassWizard
{
String classBody = i.next();
String className = j.next();
a = new ApexClassWizard(true, allPackages);
ApexClassWizardPage ap = new ApexClassWizardPage(a);
ApexClassModel apexClassModel = (ApexClassModel) ap.getComponentWizardModel();
a.init(currentWorkBench, initialSelection);
Component apexComponent = apexClassModel.getComponent();
//set the body and class name of the component
apexComponent.setBodyFromTemplateString(classBody);
apexComponent.setName(className);
if (!i.hasNext() && !j.hasNext()) {
//this is the last class we are creating for this wsdl, so we want to save the packagelist to the server
MultiClassComponentController c =
(MultiClassComponentController) ap.getComponentController();
c.setShouldSaveToServer(true);
}
if (ap.getComponentController().isNameUniqueLocalCheck()) {
a.executeCreateOperation();
}
}
} catch (ForceProjectException e) {
MessageDialog dialog =
new MessageDialog(null, "Error", null, e.getMessage(), MessageDialog.ERROR,
new String[] { "Ok" }, 0);
dialog.open();
logger.error(e.getMessage());
} catch (IOException e) {
MessageDialog dialog =
new MessageDialog(null, "Error", null, e.getMessage(), MessageDialog.ERROR,
new String[] { "Ok" }, 0);
dialog.open();
logger.error(e.getMessage());
} catch (CalloutException e) {
MessageDialog dialog =
new MessageDialog(null, "Error", null, e.getMessage(), MessageDialog.ERROR,
new String[] { "Ok" }, 0);
dialog.open();
logger.error(e.getMessage());
} catch (Exception e) {
if (e.getMessage() != null) {
MessageDialog dialog =
new MessageDialog(null, "Error", null, e.getMessage(), MessageDialog.ERROR,
new String[] { "Ok" }, 0);
dialog.open();
}
logger.error(e.getMessage());
}
}
});
}
}