/*******************************************************************************
* Copyright (c) 2005-2012 eBay Inc.
* All rights reserved. This program and the accompanying materials
* are 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
*
*******************************************************************************/
package org.eclipse.vjet.eclipse.core.test.ted;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.dltk.mod.core.IScriptProject;
import org.eclipse.dltk.mod.internal.core.Model;
import org.eclipse.dltk.mod.internal.core.ModelManager;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.osgi.framework.Bundle;
import org.eclipse.vjet.eclipse.core.PiggyBackClassPathUtil;
import org.eclipse.vjet.eclipse.core.test.parser.AbstractVjoModelTests;
import org.eclipse.vjet.eclipse.internal.ui.editor.VjoEditor;
import org.eclipse.vjet.testframework.util.UnitTestHelper;
public class TedTypespaceLoadTest extends AbstractVjoModelTests {
public static final String POM_FILE_NAME = "pom.xml";
public static final String KEY_PROJECT_NAME = "ProjectName";
private boolean m_isProjectSetUp = false;
/**
* verify type space loader in TED
*
* @throws Exception
*/
public void testTypespaceLoaderFromJDTInTed() throws Exception {
if (!isTedInstalled()) {
return;
}
VjoEditor vjoEditor = null;
IWorkbenchPage workbenchPage = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
try {
IProject project = setUpProjectTo("TestProject", "TestProject");
waitJobs();
// copyPomFile(project);
IJavaProject jProject = JavaCore.create(project);
assertTrue("Failed to create java project", jProject.exists());
IFile file = project.getFile("/src/test/DragDrop.js");
vjoEditor = (VjoEditor) IDE.openEditor(workbenchPage, file);
List<URL> urls = PiggyBackClassPathUtil
.getProjectDependencyUrls_bak(jProject);
assertTrue(
"Can not resolved the correct URLs from Maven project, the result size is "
+ urls.size(), urls.size() > 0);
} finally {
deleteProject("TestProject");
workbenchPage.closeEditor(vjoEditor, false);
}
}
/**
* verify type space loader in TED
*
* @throws Exception
*/
public void testTypespaceLoaderFromDLTKInTed() throws Exception {
if (!isTedInstalled()) {
return;
}
VjoEditor vjoEditor = null;
IWorkbenchPage workbenchPage = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
try {
IProject project = setUpProjectTo("TestProject", "TestProject");
waitJobs();
Model model = ModelManager.getModelManager().getModel();
IScriptProject sProject = model.getScriptProject(project.getName());
assertTrue("Failed to create java project", sProject.exists());
PiggyBackClassPathUtil
.initializeScriptProjectFromJavProject(sProject);
List<URL> urls = PiggyBackClassPathUtil
.getProjectDependantJars_DLTK(sProject);
//Use 3 because this jars this test project depends on is larger than 3;
assertTrue(
"Can not resolved the correct URLs from Maven project, the result size is "
+ urls.size(), urls.size() > 0);
} finally {
deleteProject("TestProject");
workbenchPage.closeEditor(vjoEditor, false);
}
}
private void copyPomFile(IProject project) throws CoreException {
IFile file = project.getFile(POM_FILE_NAME);
String pomContent = getPomContent();
pomContent.replaceAll(KEY_PROJECT_NAME, project.getName());
file.create(new ByteArrayInputStream(pomContent.getBytes()), true,
new NullProgressMonitor());
}
private String getPomContent() {
InputStream is = getClass().getClassLoader().getResourceAsStream(
"org.eclipse.vjet.eclipse/core/test/ted/" + POM_FILE_NAME);
StringBuffer buffer = new StringBuffer();
try {
byte[] bytes = new byte[2048];
while (is.read(bytes) != -1) {
buffer.append(new String(bytes));
is.read();
}
} catch (IOException e) {
assertTrue("Failed to create pom.xml", false);
}
return buffer.toString();
}
public File getSourceWorkspacePath() {
return new File(getPluginDirectoryPath(), "workspace_ted");
}
private boolean isTedInstalled() {
Bundle bundle = Platform.getBundle("com.ebay.tools.v4.ebox.ui");
return bundle != null && bundle.getState() == Bundle.ACTIVE;
}
private void waitJobs() {
waitUIOperation(40);//wait 2s to make sure build starts
try {
// wait auto/manual build jobs finishes.
Job.getJobManager().join(ResourcesPlugin.FAMILY_MANUAL_BUILD, null);
Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This method is actually works for the first time The latter call will not
* trigger the job again <job value will be null> as the index is already
* updated. wait for index to set up
*/
private void waitUpdateIndex() {
// this line of code is to ensure maven index to start load and not
// depend on maven
ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display
.getCurrent().getActiveShell());
try {
dialog.run(true, false, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
monitor.beginTask("waiting for index updater to finish...",
10);
Job job = null;// Jobs.getJobByName("Updating indexes");
if (job != null) {
job.join();
} else {
System.err
.println("cannot find job! May be the job has run yet, so ignore the error message if this is a wrong alarm.");
}
monitor.done();
}
});
} catch (Exception e) {
}
}
public static Job[] getJobs() {
return Job.getJobManager().find(null);
}
public static Job getJobByName(String name) {
Job[] jobs = getJobs();
for (Job job : jobs) {
if (name.equals(job.getName())) {
return job;
}
}
return null;
}
/**
* wait X*50 ms.at least 500ms
*
* @param waitCount
*/
public static void waitUIOperation(int waitCount) {
if (waitCount < 10) {
waitCount = 10;
}
int countDown = waitCount;
try {
while (countDown-- != 0) {
UnitTestHelper.runEventQueue();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (RuntimeException e) {
// TODO Auto-generated catch block
// ignore
}
}
protected IProject setUpProjectTo(final String projectName,
final String fromName) throws CoreException, IOException {
if (!m_isProjectSetUp) {
m_isProjectSetUp = true;
return super.setUpProjectTo(projectName, fromName);
} else {
return ResourcesPlugin.getWorkspace().getRoot()
.getProject(projectName);
}
}
}