package org.bundlemaker.core.itestframework;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Copy;
import org.apache.tools.ant.types.FileSet;
import org.bundlemaker.core.BundleMakerCore;
import org.bundlemaker.core.IBundleMakerProject;
import org.bundlemaker.core.common.utils.EclipseProjectUtils;
import org.bundlemaker.core.itestframework.internal.TestProjectCreator;
import org.bundlemaker.core.jdt.content.JdtProjectContentProvider;
import org.bundlemaker.core.resource.IModularizedSystem;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jface.text.Document;
import org.eclipse.text.edits.TextEdit;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
/**
* <p>
* </p>
*
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*/
public class AbstractJdtProjectTest {
private static final String SIMPLE_ARTIFACT_MODEL_TEST_JDT = "SimpleArtifactModelTest-JDT";
/** - */
private IJavaProject _javaProject;
private IBundleMakerProject _bundleMakerProject;
private IModularizedSystem _modularizedSystem;
/**
* <p>
* </p>
*
* @return the modularizedSystem
*/
public IModularizedSystem getModularizedSystem() {
return _modularizedSystem;
}
/**
* <p>
* </p>
*
* @throws CoreException
*/
@Before
public void before() throws CoreException {
//
createTestJavaProject();
//
IProject project = BundleMakerCore
.getOrCreateSimpleProjectWithBundleMakerNature(this.getClass()
.getSimpleName());
_bundleMakerProject = BundleMakerCore.getBundleMakerProject(project);
//
JdtProjectContentProvider contentProvider = new JdtProjectContentProvider();
contentProvider.addJavaProject(_javaProject);
_bundleMakerProject.getModifiableProjectDescription()
.addContentProvider(contentProvider);
_bundleMakerProject.getModifiableProjectDescription().setJre(TestProjectCreator.getTestVmName());
_bundleMakerProject.getModifiableProjectDescription().save();
TestProjectCreator.initializeParseAndOPen(_bundleMakerProject);
//
_modularizedSystem = _bundleMakerProject
.getModularizedSystemWorkingCopy();
}
/**
* <p>
* </p>
*
* @throws CoreException
*/
@After
public void after() throws CoreException {
//
_javaProject.getProject().close(null);
_bundleMakerProject.dispose();
_bundleMakerProject.getProject().close(null);
//
EclipseProjectUtils.deleteProjectIfExists(_javaProject.getProject()
.getName());
EclipseProjectUtils.deleteProjectIfExists(_bundleMakerProject
.getProject().getName());
}
/**
* <p>
* </p>
*
* @return the _javaProject
*/
public IJavaProject getJavaProject() {
return _javaProject;
}
/**
* <p>
* </p>
*
* @return the bundleMakerProject
*/
public IBundleMakerProject getBundleMakerProject() {
return _bundleMakerProject;
}
public void addSource() {
try {
IPackageFragment pack = getJavaProject().getPackageFragmentRoot(
getJavaProject().getProject().getFolder("src"))
.createPackageFragment("newPack", false, null);
StringBuffer buf = new StringBuffer();
buf.append("package " + pack.getElementName() + ";\n");
buf.append("\n");
buf.append("public class NewClass {}");
ICompilationUnit cu = pack.createCompilationUnit("NewClass.java",
buf.toString(), false, null);
} catch (JavaModelException e) {
Assert.fail(e.getMessage());
}
}
public void modifyClassKlasse() throws Exception {
//
ICompilationUnit compilationUnit = getJavaProject()
.getPackageFragmentRoot(
getJavaProject().getProject().getFolder("src"))
.getPackageFragment("de.test")
.getCompilationUnit("Klasse.java");
// create an AST
ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setSource(compilationUnit);
parser.setResolveBindings(false);
CompilationUnit astRoot = (CompilationUnit) parser.createAST(null);
AST ast = astRoot.getAST();
// create the descriptive ast rewriter
ASTRewrite rewrite = ASTRewrite.create(ast);
// get the block node that contains the statements in the method body
TypeDeclaration typeDecl = (TypeDeclaration) astRoot.types().get(0);
MethodDeclaration methodDecl = typeDecl.getMethods()[0];
Block block = methodDecl.getBody();
// String value = javax.naming.Context.AUTHORITATIVE;
VariableDeclarationFragment fragment = ast
.newVariableDeclarationFragment();
fragment.setName(ast.newSimpleName("value"));
Expression expression = ast.newQualifiedName(
ast.newQualifiedName(
ast.newQualifiedName(ast.newSimpleName("javax"),
ast.newSimpleName("naming")),
ast.newSimpleName("Context")),
ast.newSimpleName("AUTHORITATIVE"));
fragment.setInitializer(expression);
VariableDeclarationStatement statement = ast
.newVariableDeclarationStatement(fragment);
statement.setType(ast.newSimpleType(ast.newSimpleName("String")));
// describe that the first node is inserted as first statement in block,
// the other one as last statement
// note: AST is not modified by this
ListRewrite listRewrite = rewrite.getListRewrite(block,
Block.STATEMENTS_PROPERTY);
listRewrite.insertFirst(statement, null);
// evaluate the text edits corresponding to the described changes. AST
// and CU still unmodified.
TextEdit res = rewrite.rewriteAST();
// apply the text edits to the compilation unit
Document document = new Document(compilationUnit.getSource());
res.apply(document);
compilationUnit.getBuffer().setContents(document.get());
compilationUnit.save(null, true);
}
protected void removeClassKlasse() {
try {
//
IFile file = getJavaProject().getProject().getFile(
"src/de/test/Klasse.java");
file.delete(true, null);
} catch (Exception e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
// ICompilationUnit compilationUnit = getJavaProject()
// .getPackageFragmentRoot(
// getJavaProject().getProject().getFolder("src"))
// .getPackageFragment("de.test")
// .getCompilationUnit("Klasse.java");)
}
private void createTestJavaProject() throws CoreException,
JavaModelException {
//
_javaProject = createNewJavaProject(SIMPLE_ARTIFACT_MODEL_TEST_JDT);
IProject project = _javaProject.getProject();
//
IFolder srcFolder = project.getFolder("src");
// copy the test files
Copy copy = new Copy();
copy.setProject(new Project());
copy.setTodir(srcFolder.getRawLocation().toFile());
FileSet fileSet = new FileSet();
fileSet.setDir(new File(TestProjectCreator
.getSourcesPath(TestProjectCreator
.getTestDataDirectory("SimpleArtifactModelTest"))));
copy.addFileset(fileSet);
copy.execute();
// refresh and build
srcFolder.refreshLocal(IResource.DEPTH_INFINITE, null);
project.build(IncrementalProjectBuilder.CLEAN_BUILD, null);
project.build(IncrementalProjectBuilder.FULL_BUILD, null);
}
/**
* @param projectName
* @throws CoreException
*/
protected IJavaProject createNewJavaProject(String projectName)
throws CoreException {
// create the eclipse project
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject(projectName);
project.create(null);
project.open(null);
// add java nature
IProjectDescription description = project.getDescription();
description.setNatureIds(new String[] { JavaCore.NATURE_ID });
project.setDescription(description, null);
// create the java project
IJavaProject javaProject = JavaCore.create(project);
// set the bin folder
IFolder binFolder = project.getFolder("bin");
binFolder.create(false, true, null);
javaProject.setOutputLocation(binFolder.getFullPath(), null);
// set the class path (src and JDK)
List<IClasspathEntry> entries = new LinkedList<IClasspathEntry>();
IFolder srcFolder = project.getFolder("src");
srcFolder.create(false, true, null);
entries.add(JavaCore.newSourceEntry(srcFolder.getFullPath()));
entries.add(JavaCore.newContainerEntry(JavaRuntime
.newJREContainerPath(TestProjectCreator.getTestVm())));
javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[0]),
null);
//
return javaProject;
}
}