Commit 41116852 authored by Martti Käärik's avatar Martti Käärik
Browse files

TDL execution property page and command.

parent f807b3d6
Loading
Loading
Loading
Loading
+98 −0
Original line number Original line Diff line number Diff line
package org.etsi.mts.tdl.execution.java.eclipse.commands;

import java.io.IOException;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
import org.etsi.mts.tdl.Package;
import org.etsi.mts.tdl.execution.java.codegen.JUnitTestGenerator;
import org.etsi.mts.tdl.execution.java.codegen.Settings;
import org.etsi.mts.tdl.execution.java.eclipse.ui.PropertyPage;
import org.osgi.service.prefs.Preferences;

public class RenderHandler extends AbstractHandler implements IHandler {

	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		IFile tdl = null;
		
		ISelection selection = HandlerUtil.getCurrentSelection(event);
		if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
			Object element = ((IStructuredSelection) selection).getFirstElement();
			if (element instanceof IFile) {
				String ext = ((IFile) element).getFileExtension();
				if (ext.toLowerCase().contains("tdl")) {
					tdl = (IFile) element;
				}
			}
		}
		if (tdl == null)
			return null;

		ResourceSetImpl rs = new ResourceSetImpl();
		URI uri = URI.createPlatformResourceURI(tdl.getFullPath().toString(), true);
		Resource resource = rs.getResource(uri, true);
		Package model = (Package) resource.getContents().get(0);

		ProjectScope ps = new ProjectScope(tdl.getProject());
		Preferences preferences = ps.getNode(PropertyPage.PREFERENCE_SCOPE);

		IContainer root = ResourcesPlugin.getWorkspace().getRoot();
		final IFolder generationDir = root.getFolder(new Path(preferences.get(Settings.OUTPUT_DIR, "")));
		Settings settings = new Settings(preferences.get(Settings.OUTPUT_DIR, ""),
				generationDir.getLocation().toFile(),
				preferences.get(Settings.PACKAGE, ""),
				preferences.get(Settings.INJECTOR, ""),
				preferences.get(Settings.DATE_FORMAT, ""));
		
		JUnitTestGenerator generator = new JUnitTestGenerator(model, settings);

		final String taskName = "Render JUnit";
		final Job j = new Job(taskName) {
			@Override
			public IStatus run(final IProgressMonitor monitor) {
				try {
					generator.generate();
				} catch (IOException e) {
					return new Status(IStatus.ERROR, getClass(), taskName +  " failed", e);
				}
				
				try {
					generationDir.refreshLocal(IResource.DEPTH_INFINITE, monitor);
				} catch (CoreException e) {
					return e.getStatus();
				}
				
				return Status.OK_STATUS;
			}
		};

		j.setUser(true);
		j.setPriority(Job.INTERACTIVE);

		j.schedule();
		
		return null;
	}

}
+179 −0
Original line number Original line Diff line number Diff line
package org.etsi.mts.tdl.execution.java.eclipse.ui;

import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.StringButtonFieldEditor;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.etsi.mts.tdl.execution.java.codegen.Settings;

public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenchPropertyPage {

	public static final String PREFERENCE_SCOPE = "org.etsi.mts.tdl";

	private static final List<String> REQUIRED_SETTINGS = Arrays.asList(new String[] { Settings.OUTPUT_DIR, Settings.INJECTOR });

	protected IAdaptable element;

	protected Map<FieldEditor, String> fields = new Hashtable<FieldEditor, String>();

	public PropertyPage() {
		super(GRID);
	}

	@Override
	public IAdaptable getElement() {
		return element;
	}

	@Override
	public void setElement(IAdaptable element) {
		this.element = element;
	}

	@Override
	protected IPreferenceStore doGetPreferenceStore() {
		ProjectScope ps = new ProjectScope((IProject) this.element);
		return new ScopedPreferenceStore(ps, PREFERENCE_SCOPE);
	}

	@Override
	protected void initialize() {
		for (FieldEditor e : fields.keySet()) {
			String value = getPreferenceStore().getString(e.getPreferenceName());
			fields.put(e, value);
			initialize(e.getPreferenceName(), value, e);
		}
		super.initialize();
	}

	protected void initialize(String name, String value, FieldEditor e) {
	}

	@Override
	protected void addField(FieldEditor editor) {
		super.addField(editor);
		fields.put(editor, "");
	}

	@Override
	public void propertyChange(PropertyChangeEvent event) {
		super.propertyChange(event);
		if (event.getProperty().equals(FieldEditor.VALUE)) {
			FieldEditor e = (FieldEditor) event.getSource();

			String name = e.getPreferenceName();
			String value = (String) event.getNewValue();

			fields.put(e, value);

			initialize(name, value, e);

			checkState();
		}
	}

	@Override
	protected void checkState() {
		setErrorMessage(null);
		super.checkState();
	}

	@Override
	protected void createFieldEditors() {

		Composite parent = getFieldEditorParent();
		FieldEditor outDir = new ContainerFieldEditor(Settings.OUTPUT_DIR, "Output folder", parent) {
			@Override
			public boolean isValid() {
				return PropertyPage.this.isValid(this) && doCheckState();
			}
		};
		addField(outDir);

		parent = getFieldEditorParent();
		StringFieldEditor outPackage = new StringFieldEditor(Settings.PACKAGE, "Package", parent);
		addField(outPackage);

		parent = getFieldEditorParent();
		StringFieldEditor injector = new StringFieldEditor(Settings.INJECTOR, "Guice module", parent);
		addField(injector);

		parent = getFieldEditorParent();
		StringFieldEditor dateFormat = new StringFieldEditor(Settings.DATE_FORMAT, "Date format", parent);
		addField(dateFormat);

	}

	private boolean isValid(FieldEditor e) {
		String name = e.getPreferenceName();
		String value = fields.get(e);

		if (REQUIRED_SETTINGS.contains(name)) {
			if (value.isEmpty()) {
				setErrorMessage(String.format("%s must be selected!", e.getLabelText()));
				return false;
			}
		}

		return true;
	}

}

class ContainerFieldEditor extends StringButtonFieldEditor {

	public ContainerFieldEditor(String name, String label, Composite parent) {
		super(name, label, parent);
	}

	@Override
	protected String changePressed() {

		IContainer root = ResourcesPlugin.getWorkspace().getRoot();
		ContainerSelectionDialog d = new ContainerSelectionDialog(getShell(), root, true, "Select output folder");
		int result = d.open();
		if (result == 0) {
			Object[] dir = d.getResult();
			if (dir.length > 0)
				return dir[0].toString();
		}
		return null;
	}

	@Override
	protected boolean doCheckState() {
		String pathText = getTextControl().getText();
		IPath path = new Path(pathText);
		IContainer root = ResourcesPlugin.getWorkspace().getRoot();
		IFolder f;
		try {
			f = root.getFolder(path);
		} catch (IllegalArgumentException e) {
			setErrorMessage(e.getMessage());
			return false;
		}
		if (!f.exists())
			setErrorMessage(pathText + " does not exist!");
		return f != null && f.exists();
	}

}