/*******************************************************************************
* Copyright (c) 2005 RadRails.org and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.radrails.rails.internal.generators;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.radrails.rails.core.RailsLog;
import org.radrails.rails.internal.core.RailsPlugin;
public class VendorGeneratorsLocator extends GeneratorsLocator implements IResourceChangeListener
{
private static final String GENERATORS_DIRECTORY = "generators";
public VendorGeneratorsLocator(IProject project)
{
super(project);
}
public void locateGenerators()
{
String[] generatorLocations = { "lib", "vendor" };
generators.clear();
for (int i = 0; i < generatorLocations.length; i++)
{
IFolder folder = getRailsRoot().getFolder(new Path(generatorLocations[i]).append(GENERATORS_DIRECTORY));
populateGeneratorsAtPath(folder);
}
populateGeneratorsFromPlugins(getRailsRoot().getFolder(new Path("vendor").append("plugins")));
}
private IContainer getRailsRoot()
{
IPath root = RailsPlugin.findRailsRoot(getProject());
if (root == null || root.segmentCount() == 0)
return getProject();
return getProject().getFolder(root);
}
private void populateGeneratorsFromPlugins(IFolder pluginsDir)
{
if (pluginsDir == null)
return;
if (!pluginsDir.exists())
return;
try
{
IResource[] members = pluginsDir.members();
for (int i = 0; i < members.length; i++)
{
IResource plugin = members[i];
if (plugin.getType() != IResource.FOLDER)
continue; // skip if it's not a folder
// Search for generators under each plugin's directory
IFolder generatorsFolder = ((IFolder) plugin).getFolder(GENERATORS_DIRECTORY);
populateGeneratorsAtPath(generatorsFolder);
}
}
catch (CoreException e)
{
RailsLog.logError("Could not fetch members of " + pluginsDir.getName(), e);
}
}
private void populateGeneratorsAtPath(IFolder folder)
{
if (folder == null)
return;
if (!folder.exists())
return;
if (!folder.getName().equals(GENERATORS_DIRECTORY))
return;
try
{
IResource[] genFolderMembers = folder.members();
for (int i = 0; i < genFolderMembers.length; i++)
{
if (genFolderMembers[i].getType() != IResource.FOLDER)
continue;
IFolder generatorFolder = (IFolder) genFolderMembers[i];
IFile generatorFile = generatorFolder.getFile(generatorFolder.getName() + "_generator.rb");
if (!generatorFile.exists())
continue;
generators.add(new Generator(generatorFile.getLocation().toPortableString()));
}
}
catch (CoreException e)
{
RailsLog.logError("Could not fetch members of " + folder.getName(), e);
}
}
public void resourceChanged(IResourceChangeEvent event)
{
RailsLog.logInfo("resource changed " + event.getDelta().getFullPath().toString(), null);
}
}