/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.hibernate.eclipse.console.test.project;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.osgi.util.NLS;
import org.hibernate.eclipse.console.test.ConsoleTestMessages;
import org.hibernate.eclipse.console.test.mappingproject.Customization;
import org.hibernate.eclipse.console.test.mappingproject.MappingTestsAnnotations;
import org.hibernate.eclipse.console.test.mappingproject.MappingTestsJpa;
import org.hibernate.eclipse.console.test.utils.FilesTransfer;
/**
*
* @author Dmitry Geraskov
* @author Vitali Yemialyanchyk
*/
public class ConfigurableTestProject extends TestProject {
public static final String RESOURCE_SRC_PATH = "res/project/src/".replaceAll("//", File.separator); //$NON-NLS-1$ //$NON-NLS-2$
public static final String RESOURCE_LIB_PATH = "res/project/lib/".replaceAll("//", File.separator); //$NON-NLS-1$ //$NON-NLS-2$
public static final String HIBERNATE_PLUGIN_LIB_PATH = "lib"; //$NON-NLS-1$
protected ArrayList<String> foldersList = new ArrayList<String>();
protected int activePackage = -1;
public ConfigurableTestProject(String projectName) {
super(projectName);
}
protected void buildProject() throws JavaModelException, CoreException, IOException {
super.buildProject();
//final File srcFolder = getFolder(RESOURCE_SRC_PATH);
long startCopyFiles = System.currentTimeMillis();
IPackageFragmentRoot sourcePackageFragment = createSourceFolder();
//FilesTransfer.copyFolder(srcFolder, (IFolder)sourcePackageFragment.getResource());
long startCopyLibs = System.currentTimeMillis();
final File libFolder = getFolder(RESOURCE_LIB_PATH);
List<IPath> libs = copyLibs(libFolder);
libs.addAll(copyLibs(getFolder("res/libs/")));
long startBuild = System.currentTimeMillis();
generateClassPath(libs, sourcePackageFragment);
fullBuild();
long stopBuild = System.currentTimeMillis();
if (Customization.USE_CONSOLE_OUTPUT){
System.out.println("====================================================="); //$NON-NLS-1$
System.out.println("copyFiles: " + ( ( startCopyLibs - startCopyFiles ) / 1000 )); //$NON-NLS-1$
System.out.println("copyLibs: " + ( ( startBuild - startCopyLibs ) / 1000 )); //$NON-NLS-1$
System.out.println("build: " + ( ( stopBuild - startBuild ) / 1000 )); //$NON-NLS-1$
}
}
protected File getHibernateLibsPluginFolder(String path) throws IOException {
URL entry = Platform.getBundle("org.hibernate.eclipse.libs").getEntry(path);
URL resProject = FileLocator.resolve(entry);
String resolvePath = FileLocator.resolve(resProject).getFile();
File folder = new File(resolvePath);
if (!folder.exists()) {
String out = NLS.bind(ConsoleTestMessages.MappingTestProject_folder_not_found, path);
throw new RuntimeException(out);
}
return folder;
}
public void restartTestFolders() {
activePackage = -1;
}
public boolean setupNextTestFolder() throws IOException, CoreException {
activePackage++;
if (activePackage >= foldersList.size()) {
return false;
}
FilesTransfer.delete(new File(project.getLocation().append(SRC_FOLDER).toOSString()));
final String pack = foldersList.get(activePackage);
final File srcFolder = getFolder(RESOURCE_SRC_PATH + pack);
IPackageFragmentRoot sourcePackageFragment = createFolder(SRC_FOLDER + File.separator + pack);
FilesTransfer.copyFolder(srcFolder, (IFolder)sourcePackageFragment.getResource());
return true;
}
public IPackageFragment getCurrentPackage() throws JavaModelException{
if (activePackage < foldersList.size()) {
final String pack = foldersList.get(activePackage).replaceAll("\\\\", "."); //$NON-NLS-1$ //$NON-NLS-2$
IPackageFragment[] packageFragments = javaProject.getPackageFragments();
for (IPackageFragment iPackageFragment : packageFragments) {
if (iPackageFragment.getKind() == IPackageFragmentRoot.K_SOURCE
&& iPackageFragment.getElementName().equals(pack)){
return iPackageFragment;
}
}
}
return null;
}
public boolean createTestFoldersList(FileFilter filterFiles, FileFilter filterFolders) {
activePackage = -1;
foldersList = new ArrayList<String>();
File srcFolder = null;
try {
srcFolder = getFolder(RESOURCE_SRC_PATH);
} catch (IOException e) {
// ignore
}
if (srcFolder == null) {
return false;
}
FilesTransfer.collectFoldersWithFiles(srcFolder, filterFiles, filterFolders, foldersList);
IPath base = Path.fromOSString(srcFolder.getPath());
for (int i = 0; i < foldersList.size(); i++) {
String str = foldersList.get(i);
IPath path = Path.fromOSString(str);
path = path.makeRelativeTo(base);
foldersList.set(i, path.toOSString());
}
return true;
}
public static final FileFilter filterFoldersOnlyCore = new FileFilter() {
public boolean accept(File f) {
return f.exists() && f.isDirectory() && !f.isHidden() &&
(!f.getAbsolutePath().toLowerCase().contains(MappingTestsAnnotations.annotationsMarkerStr)) &&
(!f.getAbsolutePath().toLowerCase().contains(MappingTestsJpa.jpaMarkerStr)) &&
(!f.getAbsolutePath().toLowerCase().contains(MappingTestsJpa.jpaMarkerMetaInf));
}
};
public boolean createTestFoldersList() {
return createTestFoldersList(FilesTransfer.filterFilesJava, filterFoldersOnlyCore);
}
public boolean useAllSources() {
activePackage = -1;
foldersList = new ArrayList<String>();
File srcFolder = null;
try {
srcFolder = getFolder(RESOURCE_SRC_PATH);
} catch (IOException e) {
// ignore
}
IPackageFragmentRoot sourcePackageFragment = null;
try {
sourcePackageFragment = createSourceFolder();
} catch (CoreException e) {
// ignore
}
if (srcFolder != null && sourcePackageFragment != null) {
FilesTransfer.copyFolder(srcFolder, (IFolder)sourcePackageFragment.getResource());
foldersList.add(""); //$NON-NLS-1$
return true;
}
return false;
}
public boolean useSelectedFolders() throws IOException, CoreException {
activePackage = -1;
if (foldersList == null) {
return false;
}
FilesTransfer.delete(new File(project.getLocation().append(SRC_FOLDER).toOSString()));
for (int i = 0; i < foldersList.size(); i++) {
final String pack = foldersList.get(i);
final File srcFolder = getFolder(RESOURCE_SRC_PATH + pack);
IPackageFragmentRoot sourcePackageFragment = createFolder(SRC_FOLDER + File.separator + pack);
FilesTransfer.copyFolder(srcFolder, (IFolder)sourcePackageFragment.getResource());
}
foldersList = new ArrayList<String>();
foldersList.add(""); //$NON-NLS-1$
return true;
}
}