package org.bundlemaker.core.ui.projecteditor.filebased;
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import org.bundlemaker.core.common.utils.IFileBasedProjectContentInfo;
import org.bundlemaker.core.project.AnalyzeMode;
import org.bundlemaker.core.project.IModifiableProjectDescription;
import org.bundlemaker.core.project.VariablePath;
/**
* Util class that creates FileBasedContent instances based on a set of selected files.
*
* @author Nils Hartmann (nils@nilshartmann.net)
*
*/
public class FileBasedContentCreator {
//
// private final static String[] SOURCE_EXTENSIONS = { ".src", ".source", "-src", "-source" };
/**
* <p>
* </p>
*
* @param modifiableProjectDescription
* @param fileNames
*/
public void addFiles(IModifiableProjectDescription modifiableProjectDescription, String[] fileNames) {
VariablePath[] paths = new VariablePath[fileNames.length];
for (int i = 0; i < fileNames.length; i++) {
paths[i] = new VariablePath(fileNames[i]);
}
addFiles(modifiableProjectDescription, paths);
}
/**
* <p>
* </p>
*
* @param modifiableProjectDescription
* @param variablePaths
*/
private void addFiles(IModifiableProjectDescription modifiableProjectDescription, VariablePath[] variablePaths) {
//
final Map<IFileBasedProjectContentInfo, VariablePath> modules = new HashMap<IFileBasedProjectContentInfo, VariablePath>();
// STEP 1:
for (VariablePath variablePath : variablePaths) {
//
File file = getFile(variablePath);
if (file == null) {
// variable cannot be resolved. use name only
FileBasedProjectContentProviderFactory.addNewFileBasedContentProvider(modifiableProjectDescription,
variablePath
.getUnresolvedPath().toOSString(), null, AnalyzeMode.BINARIES_ONLY);
continue;
}
if (file.isDirectory()) {
// TODO: for now we assume a directory is always binary content
FileBasedProjectContentProviderFactory.addNewFileBasedContentProvider(modifiableProjectDescription,
file.getAbsolutePath(), null, AnalyzeMode.BINARIES_ONLY);
continue;
}
IFileBasedProjectContentInfo jarInfo = IFileBasedProjectContentInfo.Factory
.extractFileBasedProjectContentInfo(file);
//
modules.put(jarInfo, variablePath);
}
// STEP 2:
for (IFileBasedProjectContentInfo info : new LinkedList<IFileBasedProjectContentInfo>(modules.keySet())) {
// ignore potential source modules for now
if (info.isSource()) {
continue;
}
// already handled?
VariablePath variablePath = modules.remove(info);
if (variablePath == null) {
continue;
}
//
IFileBasedProjectContentInfo sourceInfo = getAssociatedFileBasedProjectContent(info,
modules.keySet());
//
VariablePath sourcePath = modules.remove(sourceInfo);
if (sourceInfo != null) {
FileBasedProjectContentProviderFactory.addNewFileBasedContentProvider(modifiableProjectDescription,
variablePath,
sourcePath,
AnalyzeMode.BINARIES_AND_SOURCES);
} else {
FileBasedProjectContentProviderFactory.addNewFileBasedContentProvider(modifiableProjectDescription,
variablePath, null,
AnalyzeMode.BINARIES_ONLY);
}
}
// add rest of files (most probably source files according to our naming conventions. Add it anyway) TODO: we could
// issue a warning here (sources without binaries)
for (IFileBasedProjectContentInfo info : modules.keySet()) {
FileBasedProjectContentProviderFactory.addNewFileBasedContentProvider(modifiableProjectDescription,
modules.get(info), null,
AnalyzeMode.BINARIES_ONLY);
}
}
/**
* Returns the resolved path as file or null if it couldn't be resolved
*
* @param variablePath
* @return
*/
private File getFile(VariablePath variablePath) {
try {
return variablePath.getAsFile();
} catch (Exception ex) {
return null;
}
}
private IFileBasedProjectContentInfo getAssociatedFileBasedProjectContent(IFileBasedProjectContentInfo info,
Collection<IFileBasedProjectContentInfo> allInfos) {
//
for (IFileBasedProjectContentInfo i : allInfos) {
if (info.isSource()) {
// in case info IS SOURCE, i must not be source
if (i.isSource() == false) {
if (info.getBinaryName().equals(i.getName()) && info.getVersion().equals(i.getVersion())) {
return i;
}
}
} else {
if (i.isSource()) {
if (info.getName().equals(i.getBinaryName()) && info.getVersion().equals(i.getVersion())) {
return i;
}
}
}
//
if (i.getName().equals(info.getName()) && i.getVersion().equals(info.getVersion())
&& i.isSource() != info.isSource()) {
return i;
}
}
//
return null;
}
}