package org.testng.eclipse.ui.util;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.testng.eclipse.util.ResourceUtil;
import org.testng.eclipse.util.SWTUtil;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Utils {
private static Composite createParent(Composite parent, boolean group) {
Composite result;
if (group) {
result = new Group(parent, SWT.SHADOW_ETCHED_OUT);
} else {
result = new Composite(parent, SWT.NONE);
}
GridLayout layout = new GridLayout();
layout.numColumns = 3;
result.setLayout(layout);
result.setLayoutData(SWTUtil.createGridData());
return result;
}
/**
* Create a line of widgets, made of:
* - A label
* - A text field
* - A browse button
* If checkKey is not null, the Control will be surrounded by a Group and enabled
* by a check box.
*/
public static Widgets createTextBrowseControl(Composite suppliedParent,
String checkKey, String labelKey,
SelectionListener buttonListener,
final SelectionListener checkListener,
ModifyListener textListener, boolean enabled)
{
final Widgets result = new Widgets();
Composite parent = createParent(suppliedParent, checkKey != null);
if (checkKey != null) {
//
// Radio
//
result.radio = new Button(parent, SWT.CHECK);
result.radio.setText(ResourceUtil.getString(checkKey));
GridData gd = new GridData();
gd.horizontalSpan = 3;
result.radio.setLayoutData(gd);
result.radio.setSelection(true);
result.radio.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
if (checkListener != null) {
checkListener.widgetDefaultSelected(e);
}
}
public void widgetSelected(SelectionEvent e) {
if (checkListener != null) {
checkListener.widgetSelected(e);
}
enableControls(result, ((Button) e.getSource()).getSelection());
}
});
}
//
// Label
//
Label label = new Label(parent, SWT.NULL);
label.setText(ResourceUtil.getString(labelKey));
//
// Text widget
//
result.text = new Text(parent, SWT.SINGLE | SWT.BORDER);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
result.text.setLayoutData(gd);
if (buttonListener == null) gd.grabExcessHorizontalSpace = true;
if (textListener != null) result.text.addModifyListener(textListener);
//
// Browse button
//
if (buttonListener != null) {
result.button = new Button(parent, SWT.PUSH);
result.button.setText(ResourceUtil.getString("TestNGMainTab.label.browse")); //$NON-NLS-1$
result.button.addSelectionListener(buttonListener);
}
enableControls(result, enabled);
return result;
}
/**
* Create a line of widgets, made of:
* - A label
* - A text field
*/
public static Widgets createStringEditorControl(Composite suppliedParent,
String labelKey, ModifyListener textListener, boolean enabled){
final Widgets result = new Widgets();
Composite parent = createParent(suppliedParent, true);
//
// Label
//
Label label = new Label(parent, SWT.NULL);
label.setText(ResourceUtil.getString(labelKey));
//
// Text widget
//
result.text = new Text(parent, SWT.SINGLE | SWT.BORDER);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
result.text.setLayoutData(gd);
if (textListener != null) result.text.addModifyListener(textListener);
enableControls(result, enabled);
return result;
}
private static void enableControls(Widgets result, boolean enabled) {
if (result.text != null) result.text.setEnabled(enabled);
if (result.button != null) result.button.setEnabled(enabled);
}
/**
* Create a line of widgets, made of:
* - A toggle
* - A label
* - A text field
* - A browse button
*/
public static Widgets createWidgetTriple(Composite parent,
String labelKey,
SelectionListener radioListener, SelectionListener buttonListener,
ModifyListener textListener)
{
Widgets result = new Widgets();
//
// Radio
//
result.radio = new Button(parent, SWT.RADIO);
result.radio.setText(ResourceUtil.getString(labelKey));
result.radio.addSelectionListener(radioListener);
//
// Text widget
//
result.text = new Text(parent, SWT.SINGLE | SWT.BORDER);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
result.text.setLayoutData(gd);
if (textListener != null) result.text.addModifyListener(textListener);
//
// Search button
//
result.button = new Button(parent, SWT.PUSH);
result.button.setText(ResourceUtil.getString("TestNGMainTab.label.browse")); //$NON-NLS-1$
result.button.addSelectionListener(buttonListener);
// Make the button bold by default so that it gets its maximu size right
// away
// TestNGPlugin.bold(result.button, true);
return result;
}
public static ITreeContentProvider getResourceContentProvider(final String extension) {
return new BaseWorkbenchContentProvider() {
@Override
public Object[] getChildren(Object element) {
Object[] children = super.getChildren(element);
List<Object> elements = new ArrayList<>();
for (Object obj : children) {
if (obj instanceof IProject) {
if (((IProject) obj).isOpen()) {
elements.add(obj);
}
}
else if (obj instanceof IFile) {
if (extension.equalsIgnoreCase(((IFile) obj).getFileExtension())) {
elements.add(obj);
}
}
else {
elements.add(obj);
}
}
return elements.toArray(new Object[elements.size()]);
}
};
}
public static String selectTemplateFile(Shell shell) {
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(shell,
new WorkbenchLabelProvider(), Utils.getResourceContentProvider("xml"));
dialog.setTitle("Select TestNG suite template file");
dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
String result = null;
dialog.open();
Object[] results = dialog.getResult();
if ((results != null) && (results.length > 0) && (results[0] instanceof IFile)) {
IFile file = (IFile) results[0];
IProject prj = file.getProject();
IPath relativePath = file.getProjectRelativePath();
String wsRelativePath = prj.getName() + "/" + relativePath;
result = "${workspace_loc:" + wsRelativePath + "}";
}
return result;
}
public static String stripDoubleQuotes(String v) {
String result = v;
int ind1 = v.indexOf("\"");
int ind2 = v.lastIndexOf("\"");
if((ind1 != -1) && (ind2 != -1) && (ind1 < ind2)) {
result = v.substring(ind1 + 1, ind2);
}
return result;
}
public static String[] split(final String string, final String sep) {
return org.testng.internal.Utils.split(string, sep);
}
public static void ppp(String s) {
System.out.println("[Utils] " + s);
}
public static String absolutePath(final String rootPath, final String sourcePath) {
File sourceFile = null;
if(null != sourcePath && !"".equals(sourcePath.trim())) {
sourceFile= new File(sourcePath);
}
if(null != sourceFile && sourceFile.isAbsolute()) {
return sourceFile.getAbsolutePath();
}
else {
String projectPrefixPath= null;
int lastSegment= rootPath.lastIndexOf('/');
return new File(rootPath, sourcePath).getAbsolutePath();
}
}
/**
* Unifies the list of files absolute paths into a single path string using the
* specified separator.
*
* @param files List<File>
* @param sep
* @return
*/
public static String toSinglePath(final List files, final String sep) {
if(null == files || files.isEmpty()) {
return "";
}
final StringBuffer buf= new StringBuffer(((File) files.get(0)).getAbsolutePath());
for(int i= 1; i < files.size(); i++) {
buf.append(sep).append(((File) files.get(i)).getAbsolutePath());
}
return buf.toString();
}
public static class WidgetPair {
public Text text;
public Button button;
}
public static class Widgets extends WidgetPair {
public Button radio;
}
/**
* Collection<List<String>>
*/
public static List<String> uniqueMergeList(Collection<List<String>> collection) {
Set<String> uniques = new HashSet<>();
for(List<String> l : collection) {
uniques.addAll(l);
}
return new ArrayList<>(uniques);
}
/**
* Create a file with the given content. Show up a confirmation dialog if the file already
* exists.
*
* @return true if the file was written successfully.
*/
public static boolean createFileWithDialog(Shell shell, IFile file,
InputStream stream) throws CoreException {
boolean success = false;
NullProgressMonitor monitor = new NullProgressMonitor();
try {
if (file.exists()) {
boolean overwrite = MessageDialog.openConfirm(shell, ResourceUtil
.getString("NewTestNGClassWizard.alreadyExists.title"), //$NON-NLS-1$
ResourceUtil.getFormattedString(
"NewTestNGClassWizard.alreadyExists.message", file
.getFullPath().toString())); //$NON-NLS-1$
if (overwrite) {
file.setContents(stream, true, true, monitor);
success = true;
}
} else {
createResourceRecursively(file, monitor);
file.setContents(stream, IFile.FORCE | IFile.KEEP_HISTORY, monitor);
success = true;
// result.create(contentStream, true, monitor);
}
stream.close();
} catch (IOException e) {
}
return success;
}
protected static void createResourceRecursively(IResource resource,
IProgressMonitor monitor) throws CoreException {
if (resource == null || resource.exists())
return;
if (!resource.getParent().exists())
createResourceRecursively(resource.getParent(), monitor);
switch (resource.getType()) {
case IResource.FILE:
((IFile) resource).create(new ByteArrayInputStream(new byte[0]), true,
monitor);
break;
case IResource.FOLDER:
((IFolder) resource).create(IResource.NONE, true, monitor);
break;
case IResource.PROJECT:
((IProject) resource).create(monitor);
((IProject) resource).open(monitor);
break;
}
}
}