/* Copyright (C) 2009 Mobile Sorcery AB
This program is free software; you can redistribute it and/or modify it
under the terms of the Eclipse Public License v1.0.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License v1.0 for
more details.
You should have received a copy of the Eclipse Public License v1.0 along
with this program. It is also available at http://www.eclipse.org/legal/epl-v10.html
*/
package com.mobilesorcery.sdk.importproject;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import com.mobilesorcery.sdk.core.MoSyncTool;
import com.mobilesorcery.sdk.core.Util;
/**
*
* @author Mattias Bybro
* @deprecated Modify this to ignore .mopro files, until then it's deprecated.
*/
public class FindProjectsRunnable implements IRunnableWithProgress {
public static final String FINISHED = "finished"; //$NON-NLS-1$
private PropertyChangeSupport listeners = new PropertyChangeSupport(this);
private File root;
private Set<File> projectDescriptionFiles = new HashSet<File>();
public FindProjectsRunnable(File root) {
this.root = root;
}
public File[] getProjectDescriptionFiles() {
return projectDescriptionFiles.toArray(new File[projectDescriptionFiles.size()]);
}
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
monitor.beginTask(Messages.FindProjectsRunnable_ScanningDirectories, IProgressMonitor.UNKNOWN);
findInDirectory(monitor, root);
} catch (IOException e) {
throw new InvocationTargetException(e);
}
}
public void findInDirectory(IProgressMonitor monitor, File root) throws IOException {
try {
findInDirectory(monitor, root, projectDescriptionFiles, new HashSet<String>());
} finally {
listeners.firePropertyChange(new PropertyChangeEvent(this, FINISHED, null, getProjectDescriptionFiles()));
}
}
private void findInDirectory(IProgressMonitor monitor, File dir, Set<File> projectDescriptionFiles, Set<String> directoriesVisited) throws IOException {
monitor.setTaskName(Messages.FindProjectsRunnable_ScanningProgress + dir.getAbsolutePath());
if (monitor.isCanceled()) {
return;
}
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
String ext = Util.getExtension(files[i]);
if (files[i].isDirectory() && !isTemplateDirectory(files[i])) {
if (directoriesVisited.contains(files[i].getCanonicalPath())) {
return;
}
directoriesVisited.add(files[i].getCanonicalPath());
findInDirectory(monitor, files[i], projectDescriptionFiles, directoriesVisited);
} else if ("msp".equals(ext) || "mopro".equals(ext)) { //$NON-NLS-1$ //$NON-NLS-2$
projectDescriptionFiles.add(files[i]);
}
}
}
private boolean isTemplateDirectory(File file) {
File templateDir = MoSyncTool.getDefault().getTemplatesPath().toFile();
return file.equals(templateDir);
}
public void addFinishedListener(PropertyChangeListener listener) {
listeners.addPropertyChangeListener(listener);
}
public void removeFinishedListener(PropertyChangeListener listener) {
listeners.removePropertyChangeListener(listener);
}
}