package org.objectstyle.wolips.mechanic; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import com.google.eclipse.mechanic.DirectoryIteratingTaskScanner; import com.google.eclipse.mechanic.IResourceTaskProvider; import com.google.eclipse.mechanic.IResourceTaskReference; import com.google.eclipse.mechanic.TaskCollector; public class ImportProjectTaskScanner extends DirectoryIteratingTaskScanner { private static final Logger log = Logger.getLogger(ImportProjectsTask.class.getName()); public ImportProjectTaskScanner() { } @Override public void scan(IResourceTaskProvider source, TaskCollector collector) { Pattern variablePattern = Pattern.compile("^#\\s*@(\\S+)\\s+(.*)"); for (Iterator<IResourceTaskReference> iterator = source.getTaskReferences(".proj").iterator(); iterator.hasNext();) { IResourceTaskReference ref = iterator.next(); File projectFile = ref.asFile(); try { BufferedReader br = new BufferedReader(new FileReader(projectFile)); try { List<IPath> importPaths = new LinkedList<IPath>(); String id = projectFile.getName(); String title = id; String description = null; boolean reconcile = true; String line; while ((line = br.readLine()) != null) { Matcher variableMatcher = variablePattern.matcher(line); if (variableMatcher.matches()) { String key = variableMatcher.group(1); String value = variableMatcher.group(2); if ("title".equals(key)) { title = value; } else if ("description".equals(key)) { description = value; } else if ("reconcile".equals(key)) { reconcile = Boolean.parseBoolean(value); } } else if (line.startsWith("#")) { // ignore comments } else { String pathStr = line.trim(); if (pathStr.length() > 0) { importPaths.add(new Path(pathStr)); } } } collector.add(new ImportProjectsTask(id, title, description, importPaths, reconcile)); } finally { br.close(); } } catch (Throwable t) { log.log(Level.SEVERE, "Failed to read project file '" + projectFile + "'.", t); } } } }