Lors de la création d'applications RCP, il peut être utile de récupérer quelques features indépendantes afin des les intégrer à la distribution (pour ajouter des nouveaux plugins). Quand ces features ne sont pas livrées de manière autonome, il devient vite assez fastidieux de suivre à la main toutes les dépendances pour récupérer les plugins utiles.
Pour faciliter ce travail à tous ceux qui en auront besoin, voici une petite moulinette prête à l'emploi pour copier toutes les dépendances d'une feature :
public class EclipseFeatureExtractor {
private static Set<String> requiredFeatures = new HashSet<String>();
private static Set<String> requiredPlugins = new HashSet<String>();
private static DocumentBuilder builder;
private static XPath xpath;
private static File featuresFolder;
private static File pluginsFolder;
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
if(args.length != 2 || (args.length>=1 && args[0].equals("-help"))) {
System.out.println("*********** USAGE ***********");
System.out.println("-help affiche aide.\n");
System.out.println("Paramètres nécessaires :");
System.out.println("1- Dossier de la feature à examiner");
System.out.println("2- Dossier de destination pour la copie des features et plugins");
return;
}
String mainFeature = args[0];
String destination = args[1];
File destFolder = new File(destination);
File mainFeatureFolder = new File(mainFeature);
featuresFolder = mainFeatureFolder.getParentFile();
pluginsFolder = new File(featuresFolder.getParentFile(), "plugins");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
builder = factory.newDocumentBuilder();
XPathFactory xpathfactory = XPathFactory.newInstance();
xpath = xpathfactory.newXPath();
parseFeature(mainFeatureFolder);
File destFeaturesFolder = new File(destFolder,"features");
if(!destFeaturesFolder.exists()) {
destFeaturesFolder.mkdirs();
}
copyFeatures(destFeaturesFolder);
File destPluginsFolder = new File(destFolder,"plugins");
if(!destPluginsFolder.exists()) {
destPluginsFolder.mkdirs();
}
copyPlugins(destPluginsFolder);
}
private static void copyPlugins(File destPluginsFolder) throws Exception {
for(String required : requiredPlugins) {
for(File other : pluginsFolder.listFiles()) {
if(other.getName().startsWith(required)) {
System.out.println("Copying plugin : "+other.getName());
if(other.isDirectory()) {
File specificDest = new File(destPluginsFolder, other.getName());
specificDest.mkdirs();
FileUtils.copyDirectory(other, specificDest);
} else {
File copiedPlugin = new File(destPluginsFolder, other.getName());
FileUtils.copyFile(other, copiedPlugin);
}
}
}
}
}
private static void copyFeatures(File destFeaturesFolder) throws Exception {
for(String required : requiredFeatures) {
for(File other : featuresFolder.listFiles()) {
if(other.isDirectory() && other.getName().startsWith(required)) {
File specificDest = new File(destFeaturesFolder, other.getName());
specificDest.mkdirs();
System.out.println("Copying feature : "+other.getName());
FileUtils.copyDirectory(other, specificDest);
}
}
}
}
public static void parseFeature(File featureFolder)
throws SAXException, IOException, XPathExpressionException {
File featureDescriptor = new File(featureFolder, "feature.xml");
System.out.println("Parsing : " + featureDescriptor.getAbsolutePath());
Document doc = builder.parse(featureDescriptor);
// Required features
XPathExpression xRequiredFeatures = xpath.compile("//requires/import/@feature|//includes/@id");
NodeList nodes = (NodeList)xRequiredFeatures.evaluate(doc, XPathConstants.NODESET);
String feature = "";
for (int i = 0; i < nodes.getLength(); i++) {
feature = nodes.item(i).getNodeValue()+"_";
requiredFeatures.add(feature);
for(File other : featuresFolder.listFiles()) {
if(other.isDirectory() && other.getName().startsWith(feature)) {
parseFeature(other);
}
}
}
// Required plugins
XPathExpression xRequiredPlugins = xpath.compile("//plugin/@id");
nodes = (NodeList)xRequiredPlugins.evaluate(doc, XPathConstants.NODESET);
String plugin = "";
for (int i = 0; i < nodes.getLength(); i++) {
plugin = nodes.item(i).getNodeValue()+"_";
requiredPlugins.add(plugin);
}
}
}
Ce code peut être amélioré pour gérer de manière plus fine les versions des features/plugins, ici ignorées.
0 commentaires:
Enregistrer un commentaire