/*******************************************************************************
* Copyright (c) 2010-2013 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.deltaspike.ui.bot.test;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import org.jboss.ide.eclipse.as.reddeer.server.requirement.ServerReqType;
import org.jboss.ide.eclipse.as.reddeer.server.requirement.ServerRequirement;
import org.jboss.ide.eclipse.as.reddeer.server.requirement.ServerRequirement.JBossServer;
import org.jboss.reddeer.common.logging.Logger;
import org.jboss.reddeer.common.matcher.RegexMatcher;
import org.jboss.reddeer.common.wait.AbstractWait;
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.core.condition.ShellWithTextIsActive;
import org.jboss.reddeer.core.matcher.WithTextMatcher;
import org.jboss.reddeer.eclipse.core.resources.Project;
import org.jboss.reddeer.eclipse.jdt.ui.ProjectExplorer;
import org.jboss.reddeer.eclipse.ui.dialogs.ExplorerItemPropertyDialog;
import org.jboss.reddeer.eclipse.ui.dialogs.PropertyDialog;
import org.jboss.reddeer.eclipse.ui.perspectives.JavaEEPerspective;
import org.jboss.reddeer.eclipse.ui.problems.ProblemsView;
import org.jboss.reddeer.eclipse.wst.common.project.facet.ui.RuntimesPropertyPage;
import org.jboss.reddeer.requirements.cleanworkspace.CleanWorkspaceRequirement.CleanWorkspace;
import org.jboss.reddeer.requirements.openperspective.OpenPerspectiveRequirement.OpenPerspective;
import org.jboss.reddeer.requirements.server.ServerReqState;
import org.jboss.reddeer.swt.impl.button.LabeledCheckBox;
import org.jboss.reddeer.swt.impl.button.PushButton;
import org.jboss.reddeer.swt.impl.menu.ContextMenu;
import org.jboss.reddeer.swt.impl.menu.ShellMenu;
import org.jboss.reddeer.workbench.handler.EditorHandler;
import org.jboss.reddeer.workbench.impl.editor.TextEditor;
import org.jboss.reddeer.workbench.ui.dialogs.WorkbenchPreferenceDialog;
import org.jboss.tools.cdi.reddeer.cdi.ui.preferences.CDISettingsPreferencePage;
import org.jboss.tools.common.reddeer.preferences.SourceLookupPreferencePage;
import org.jboss.tools.common.reddeer.preferences.SourceLookupPreferencePage.SourceAttachmentEnum;
import org.jboss.tools.deltaspike.ui.bot.test.condition.SpecificProblemExists;
import org.jboss.tools.maven.reddeer.wizards.MavenImportWizard;
import org.jboss.tools.maven.reddeer.wizards.MavenImportWizardFirstPage;
import org.junit.BeforeClass;
@CleanWorkspace
@OpenPerspective(JavaEEPerspective.class)
@JBossServer(state = ServerReqState.PRESENT, type = ServerReqType.WILDFLY10x)
public class DeltaspikeTestBase {
private static final Logger log = Logger.getLogger(DeltaspikeTestBase.class);
protected static final ProblemsView problemsView = new ProblemsView();
@BeforeClass
public static void disableSourceLookup() {
WorkbenchPreferenceDialog preferenceDialog = new WorkbenchPreferenceDialog();
preferenceDialog.open();
SourceLookupPreferencePage sp = new SourceLookupPreferencePage();
preferenceDialog.select(sp);
sp.setSourceAttachment(SourceAttachmentEnum.NEVER);
preferenceDialog.ok();
}
/**
* Import project, configure project to use given target platform and check
* if CDI support is enabled. If isn't, then enable CDI support and
* revalidate project.
*
* @param projectName
* Project to import
* @param sr
* The target platform which should be used
*/
protected static void importDeltaspikeProject(String projectName, ServerRequirement sr) {
try {
importMavenProject(projectName);
} catch (IOException e) {
e.printStackTrace();
fail("Unable to import " + projectName);
}
ProjectExplorer pe = new ProjectExplorer();
pe.open();
Project explorerItem = pe.getProject(projectName);
PropertyDialog dialog = new ExplorerItemPropertyDialog(explorerItem);
RuntimesPropertyPage runtimePage = new RuntimesPropertyPage();
CDISettingsPreferencePage cdiPage = new CDISettingsPreferencePage();
String targetRuntime = sr.getRuntimeNameLabelText(sr.getConfig());
dialog.open();
dialog.select(runtimePage);
runtimePage.selectRuntime(targetRuntime);
dialog.select(cdiPage);
if (!cdiPage.isCDISupport()) {
log.warn("CDI support is disabled! CDI should be enabled automatically after project import.");
log.warn("Enabling CDI support for '%s' project.", projectName);
cdiPage.toggleCDISupport(true);
}
dialog.ok();
new WaitWhile(new JobIsRunning(), TimePeriod.LONG);
pe.getProject(projectName).select();
new ContextMenu("Validate").select();
new WaitWhile(new JobIsRunning(), TimePeriod.LONG);
}
public static void importMavenProject(String projectName) throws IOException {
try {
final Path sourceFolder = new File("target/classes/prj/" + projectName).toPath();
File dir = new File("target/copies/" + projectName);
if (dir.exists()) {
deleteDir(dir);
}
final Path destFolder = dir.toPath();
Files.walkFileTree(sourceFolder, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs)
throws IOException {
Files.createDirectories(destFolder.resolve(sourceFolder.relativize(dir)));
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
Files.copy(file, destFolder.resolve(sourceFolder.relativize(file)));
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
fail("Unable to find pom " + projectName);
}
String pomPath = "target/copies/" + projectName;
MavenImportWizard importWizard = new MavenImportWizard();
importWizard.open();
new MavenImportWizardFirstPage().importProject((new File(pomPath)).getCanonicalPath(), false);
}
private static boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
fail("Unable to delete " + dir);
}
}
}
return dir.delete();
}
protected void insertIntoFile(String projectName, String packageName, String bean, int line, int column,
String insertedText) {
openClass(projectName, packageName, bean);
TextEditor e = new TextEditor(bean);
e.insertText(line, column, insertedText);
// SWTBotEclipseEditor editor = bot.activeEditor().toTextEditor();
// editor.insertText(line, column, insertedText);
e.save();
}
protected void replaceInEditor(String projectName, String packageName, String bean, String target,
String replacement, boolean save) {
openClass(projectName, packageName, bean);
replaceInEditor(target, replacement, save);
}
protected void replaceInEditor(String target, String replacement, boolean save) {
TextEditor e = new TextEditor();
// eclipseEditor.selectRange(0, 0, eclipseEditor.getText().length());
e.setText(e.getText().replace(target + (replacement.equals("") ? System.getProperty("line.separator") : ""),
replacement));
if (save)
e.save();
}
protected void annotateBean(String projectName, String packageName, String bean, int line, int column,
String annotation) {
insertIntoFile(projectName, packageName, bean, line, column, annotation);
new WaitUntil(new SpecificProblemExists(new RegexMatcher(".*cannot be resolved.*")), TimePeriod.NORMAL);
TextEditor e = new TextEditor();
new ShellMenu(new WithTextMatcher("Source"), new RegexMatcher("Organize Imports.*")).select();
e.save();
}
protected void openClass(String projectName, String packageName, String classFullName) {
ProjectExplorer pe = new ProjectExplorer();
pe.open();
pe.getProject(projectName).getProjectItem("Java Resources", "src", packageName, classFullName).open();
}
protected static void cleanProjects() {
new ShellMenu(new WithTextMatcher("Project"), new RegexMatcher("Clean.*")).select();
new WaitUntil(new ShellWithTextIsActive("Clean"));
new PushButton("OK").click();
new WaitWhile(new ShellWithTextIsActive("Clean"));
new WaitWhile(new JobIsRunning());
}
protected void deleteAllProjects() {
EditorHandler.getInstance().closeAll(false);
ProjectExplorer pe = new ProjectExplorer();
pe.open();
for (Project p : pe.getProjects()) {
try {
org.jboss.reddeer.direct.project.Project.delete(p.getName(), true, true);
} catch (Exception ex) {
AbstractWait.sleep(TimePeriod.NORMAL);
if (!p.getTreeItem().isDisposed()) {
org.jboss.reddeer.direct.project.Project.delete(p.getName(), true, true);
}
}
}
}
}