/*******************************************************************************
* Copyright (c) 2011 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.ws.ui.bot.test.webservice.eap;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.jboss.reddeer.common.wait.TimePeriod;
import org.jboss.reddeer.common.wait.WaitUntil;
import org.jboss.reddeer.common.wait.WaitWhile;
import org.jboss.reddeer.core.condition.JobIsRunning;
import org.jboss.reddeer.eclipse.condition.ConsoleHasText;
import org.jboss.reddeer.eclipse.ui.console.ConsoleView;
import org.jboss.reddeer.eclipse.ui.perspectives.JavaEEPerspective;
import org.jboss.reddeer.requirements.openperspective.OpenPerspectiveRequirement.OpenPerspective;
import org.jboss.reddeer.workbench.impl.editor.TextEditor;
import org.jboss.tools.ws.reddeer.ui.wizards.wst.WebServiceWizardPageBase.SliderLevel;
import org.jboss.tools.ws.ui.bot.test.uiutils.RunConfigurationsDialog;
import org.jboss.tools.ws.ui.bot.test.utils.DeploymentHelper;
import org.jboss.tools.ws.ui.bot.test.utils.ProjectHelper;
import org.jboss.tools.ws.ui.bot.test.utils.ResourceHelper;
import org.jboss.tools.ws.ui.bot.test.utils.ServersViewHelper;
import org.jboss.tools.ws.ui.bot.test.utils.WebServiceClientHelper;
import org.jboss.tools.ws.ui.bot.test.webservice.TopDownWSTest;
import org.jboss.tools.ws.ui.bot.test.webservice.WebServiceRuntime;
import org.jboss.tools.ws.ui.bot.test.webservice.WebServiceTestBase;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Test operates on creating non-trivial EAP project from wsdl file
*
* @author jlukas
*
*/
@OpenPerspective(JavaEEPerspective.class)
public class EAPFromWSDLTest extends WebServiceTestBase {
private static boolean servicePassed = false;
@Before
@Override
public void setup() {
if (!ProjectHelper.projectExists(getWsProjectName())) {
ProjectHelper.createProject(getWsProjectName());
}
if (!ProjectHelper.projectExists(getWsClientProjectName())) {
ProjectHelper.createProject(getWsClientProjectName());
}
}
@Override
protected String getWsProjectName() {
return "AreaWSProject";
}
@Override
protected String getEarProjectName() {
return getWsProjectName() + "EAR";
}
protected String getWsClientProjectName() {
return "AreaWSClientProject";
}
protected String getWsClientPackage() {
return "org.jboss.wsclient";
}
protected String getClientEarProjectName() {
return getWsClientProjectName() + "EAR";
}
@Override
protected String getWsPackage() {
return "org.jboss.ws";
}
@Override
protected String getWsName() {
return "AreaService";
}
@Override
protected SliderLevel getLevel() {
return SliderLevel.DEPLOY;
}
@Test
public void testEAPFromWSDL() {
testService();
testClient();
}
private void testService() {
topDownWS(TopDownWSTest.class.getResourceAsStream("/resources/jbossws/AreaService.wsdl"),
WebServiceRuntime.JBOSS_WS, getWsPackage(), false);
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(getWsProjectName());
IFile f = project.getFile("src/" + getWsPackage().replace(".", "/") + "/impl" + "/AreaServiceImpl.java");
/*
* workaround when package is not typed
*/
if (f == null) {
f = project.getFile("src/" + "org.tempuri.areaservice" + "/AreaServiceImpl.java");
}
String content = ResourceHelper.readFile(f);
Assert.assertNotNull(content);
Assert.assertTrue(content.contains("public class AreaServiceImpl implements AreaService {"));
Assert.assertTrue(content.contains("public float calculateRectArea(Dimensions parameters)"));
replaceContent(f, "/resources/jbossws/AreaWS.java.ws");
f = project.getFile("WebContent/WEB-INF/web.xml");
content = ResourceHelper.readFile(f);
Assert.assertNotNull(content);
Assert.assertTrue(content.contains("<servlet-class>org.jboss.ws.impl.AreaServiceImpl</servlet-class>"));
Assert.assertTrue(content.contains("<url-pattern>/AreaService</url-pattern>"));
/*
* workaround problems with generated code that require JAX-WS API 2.2
*/
jaxWsApi22RequirementWorkaround(getWsProjectName(), getWsPackage());
ServersViewHelper.runProjectOnServer(getEarProjectName());
ServersViewHelper.waitForDeployment(getEarProjectName(), getConfiguredServerName());
DeploymentHelper.assertServiceDeployed(DeploymentHelper.getWSDLUrl(getWsProjectName(), getWsName()), 10000);
servicePassed = true;
}
private void testClient() {
Assert.assertTrue("service must exist", servicePassed);
WebServiceClientHelper.createClient(getConfiguredServerName(),
DeploymentHelper.getWSDLUrl(getWsProjectName(), getWsName()), WebServiceRuntime.JBOSS_WS,
getWsClientProjectName(), getEarProjectName(), SliderLevel.DEVELOP, getWsClientPackage());
IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(getWsClientProjectName());
String pkg = "org/jboss/wsclient";
String cls = "src/" + pkg + "/AreaService.java";
Assert.assertTrue(p.getFile(cls).exists());
cls = "src/" + pkg + "/clientsample/ClientSample.java";
IFile f = p.getFile(cls);
Assert.assertTrue(f.exists());
replaceContent(f, "/resources/jbossws/clientsample.java.ws");
/*
* workaround problems with generated code that require JAX-WS API 2.2
*/
jaxWsApi22RequirementWorkaround(getWsClientProjectName(), getWsClientPackage());
runJavaApplication();
// wait until the client ends (prints the last line)
new WaitUntil(new ConsoleHasText("Call Over!"), TimePeriod.NORMAL);
ConsoleView cw = new ConsoleView();
String consoleOutput = cw.getConsoleText();
LOGGER.info("Console output: " + consoleOutput);
Assert.assertTrue(consoleOutput, consoleOutput.contains("Server said: 37.5"));
Assert.assertTrue(consoleOutput.contains("Server said: 3512.3699"));
}
private void replaceContent(IFile f, String content) {
try {
f.delete(true, new NullProgressMonitor());
} catch (CoreException ce) {
LOGGER.log(Level.WARNING, ce.getMessage(), ce);
}
InputStream is = null;
try {
is = EAPFromWSDLTest.class.getResourceAsStream(content);
f.create(is, true, new NullProgressMonitor());
} catch (CoreException ce) {
LOGGER.log(Level.WARNING, ce.getMessage(), ce);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException ioe) {
// ignore
}
}
}
try {
ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IWorkspaceRoot.DEPTH_INFINITE,
new NullProgressMonitor());
} catch (CoreException e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
}
new WaitWhile(new JobIsRunning(), TimePeriod.NORMAL);
}
/**
* @see https://community.jboss.org/message/732539#732539
*/
private void jaxWsApi22RequirementWorkaround(String projectName, String pkgName) {
final String fileName = "AreaService_Service.java";
ResourceHelper.openJavaFile(projectName, pkgName, fileName);
TextEditor editor = new TextEditor(fileName);
String text = editor.getText();
boolean putComment = false;
StringBuilder output = new StringBuilder();
for (String line : text.split(System.getProperty("line.separator"))) {
if (line.contains("This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2")) {
putComment = true;
}
if (putComment) {
output.append("//");
if (line.contains("}")) {
putComment = false;
}
}
output.append(line);
output.append(System.getProperty("line.separator"));
}
editor.setText(output.toString());
editor.save();
editor.close();
}
private void runJavaApplication() {
RunConfigurationsDialog dialog = new RunConfigurationsDialog();
dialog.open();
dialog.createNewConfiguration("Java Application");
dialog.setProjectName(getWsClientProjectName());
dialog.setClassName("org.jboss.wsclient.clientsample.ClientSample");
dialog.run();
}
}