blob: 4cf78de313f2cec816060cac207a676a8f3506c0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 Borland Software Corporation and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.tests.qvt.oml;
import java.io.ByteArrayInputStream;
import java.util.Collections;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.codegen.ecore.Generator;
/**
* This strategy is copied from GMF project unittest (www.eclipse.org/gmf)
*
* ALMOST TRUE: With PDE, we need source code in the running workspace to allow compilation of our code
* (because PDE doesn't reexport set of plugins from it's running configuration, and it's no longer possible
* to set Target Platform to "same as running" as it was back in Eclipse 2.x).
*
* !!! NEW !!!
*
* Now, we managed to compile against linked binary folders, although using linked content instead of plugins
* requires us to explicitly add some plugins earlier available through plugin re-export (namely, oe.jface.text)
*
*
* Classloading works because there's -dev argument in the command line. With PDE launch, it's done by PDE.
* Without PDE, running tests as part of the build relies on Eclipse Testing Framework's org.eclipse.test_3.1.0/library.xml
* which specifies "-dev bin,runtime". Once it's not specified, or new format (properties file with plugin-id=binfolder)
* is in use, classloading of the generated code will fail and another mechanism should be invented then.
*
* If you get ClassNotFoundException while running tests in PDE environment, try to set read-only attribute for the next file:
* 'development-workspace'\.metadata\.plugins\org.eclipse.pde.core\'JUnitLaunchConfigName'\dev.properties
* @author artem
*/
public class RuntimeWorkspaceSetup {
private static RuntimeWorkspaceSetup INSTANCE;
private boolean isDevLaunchMode;
private RuntimeWorkspaceSetup() {
isDevLaunchMode = isDevLaunchMode();
}
public static RuntimeWorkspaceSetup getInstance() {
if(INSTANCE == null) {
try {
INSTANCE = new RuntimeWorkspaceSetup();
INSTANCE.initFull();
} catch (Exception e) {
throw new RuntimeException("Runtime Unittest workspace error", e); //$NON-NLS-1$
}
}
return INSTANCE;
}
public boolean getIsDevLaunchMode() {
return isDevLaunchMode;
}
/**
* Copy (almost, except for strange unused assignment) of <code>PDECore.isDevLaunchMode()</code>
*/
private static boolean isDevLaunchMode() {
String[] args = Platform.getApplicationArgs();
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-pdelaunch")) { //$NON-NLS-1$
return true;
}
}
return false;
}
private RuntimeWorkspaceSetup initFull() throws Exception {
init(new String[] {
"org.eclipse.emf.ecore", //$NON-NLS-1$
"org.eclipse.emf.common", //$NON-NLS-1$
"org.eclipse.m2m.qvt.oml", //$NON-NLS-1$
"org.eclipse.m2m.qvt.oml.samples", //$NON-NLS-1$
"org.eclipse.m2m.qvt.oml.ocl", //$NON-NLS-1$
AllTests.BUNDLE_ID,
});
return this;
}
private void init(String... pluginsToImport) throws Exception {
if (isDevLaunchMode) {
// Need to get some gmf source code into target workspace
importDevPluginsIntoRunTimeWorkspace(pluginsToImport);
}
}
public static IProject getSOSProject() {
return ResourcesPlugin.getWorkspace().getRoot().getProject(".SOSProject"); //$NON-NLS-1$
}
/**
* Another approach - output binary folders of required plugins are linked as subfolders
* of our own sosProject (created in the target workspace). Then, we could use library classpathEntries
* (details why we should use _workspace_ paths for libraries could be found at
* <code>org.eclipse.jdt.internal.core.builder.NameEnvironment#computeClasspathLocations</code>)
*
* TODO don't assume workspace is clear, check sosProject existence first
* TODO utilize GenDiagram.requiredPluginIDs once it's a field (i.e. add oe.jface.text and don't create plugin project then, just plain project with links
*/
private void importDevPluginsIntoRunTimeWorkspace(String[] pluginIDs) throws CoreException {
IProject p = getSOSProject();
final Path srcPath = new Path('/' + p.getName() + "/src"); //$NON-NLS-1$
Generator.createEMFProject(srcPath, null, Collections.<IProject>emptyList(), new NullProgressMonitor(), Generator.EMF_PLUGIN_PROJECT_STYLE, null);
StringBuffer pluginXmlContent = new StringBuffer();
pluginXmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<?eclipse version=\"3.0\"?>\n<plugin "); //$NON-NLS-1$
pluginXmlContent.append(" version=\"1.0.0\" name='%providerName' id='"); //$NON-NLS-1$
pluginXmlContent.append(p.getName());
pluginXmlContent.append("'>\n<requires>\n"); //$NON-NLS-1$
pluginXmlContent.append("<import plugin='org.eclipse.jface.text' export='true'/>\n"); //$NON-NLS-1$
pluginXmlContent.append("<import plugin='org.eclipse.ui.views.properties.tabbed' export='true'/>\n"); //$NON-NLS-1$
pluginXmlContent.append("</requires>\n</plugin>"); //$NON-NLS-1$
p.getFile("plugin.xml").create(new ByteArrayInputStream(pluginXmlContent.toString().getBytes()), true, new NullProgressMonitor()); //$NON-NLS-1$
}
}