Changeset 1907 for trunk


Ignore:
Timestamp:
2011-06-16 15:53:57 (11 months ago)
Author:
bruno
Message:

When using <directory> in wiring.xml, not only load jar files from within the directory, but also XML files. The XML files will be parsed in the same way as wiring.xml's (except for the virtualHost section which will be ignored if present), thus offering inclusion functionality for wiring.xml files.
The same for <file>, the path can now point to an XML file.
Recursive inclusions are detected.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/core/kauri-runtime/src/main/java/org/kauriproject/runtime/model/KauriRuntimeModelBuilder.java

    r1877 r1907  
    2727import java.io.File; 
    2828import java.io.FilenameFilter; 
     29import java.io.IOException; 
    2930import java.util.*; 
    3031import java.util.regex.Pattern; 
     
    5758        } 
    5859 
     60        Stack<String> wiringFileStack = new Stack<String>(); // used to detect recursive wiring.xml inclusions 
     61        List<ModuleDefinition> modules = new ArrayList<ModuleDefinition>(); 
     62 
     63        buildModules(modules, wiringFileStack, runtimeConf, repository, artifactSourceLocations); 
     64 
     65        // Remove disabled module entries 
     66        Iterator<ModuleDefinition> it = modules.iterator(); 
     67        while (it.hasNext()) { 
     68            ModuleDefinition entry = it.next(); 
     69            if (disabledModuleIds.contains(entry.getId())) 
     70                it.remove(); 
     71        } 
     72 
     73        for (ModuleDefinition md : modules) 
     74            model.addModule(md); 
     75 
     76        return model; 
     77    } 
     78 
     79    private static void buildModules(List<ModuleDefinition> modules, Stack<String> wiringFileStack, Conf runtimeConf, 
     80            ArtifactRepository repository, SourceLocations artifactSourceLocations) throws Exception { 
     81 
    5982        Conf modulesConf = runtimeConf.getRequiredChild("modules"); 
    60  
    61         List<ModuleDefinition> modules = new ArrayList<ModuleDefinition>(); 
    6283        List<Conf> importConfs = modulesConf.getChildren(); 
    6384        for (Conf importConf : importConfs) { 
     
    6586            ModuleSourceType sourceType = null; 
    6687            String version = "unknown"; 
    67             String id = importConf.getAttribute("id"); 
     88            String id = null; 
    6889            if (importConf.getName().equals("file")) { 
    6990                String path = PropertyResolver.resolveProperties(importConf.getAttribute("path")); 
    70                 fileToImport = new File(path); 
    71                 sourceType = ModuleSourceType.JAR; 
     91                File file = new File(path); 
     92                if (file.getName().toLowerCase().endsWith(".xml")) { 
     93                    // Import a wiring.xml-type file 
     94                    includeWiring(file, modules, wiringFileStack, repository, artifactSourceLocations); 
     95                } else { 
     96                    id = importConf.getAttribute("id"); 
     97                    fileToImport = new File(path); 
     98                    sourceType = ModuleSourceType.JAR; 
     99                } 
    72100            } else if (importConf.getName().equals("artifact")) { 
     101                id = importConf.getAttribute("id"); 
    73102                String groupId = importConf.getAttribute("groupId"); 
    74103                String artifactId = importConf.getAttribute("artifactId"); 
     
    91120                } 
    92121            } else if (importConf.getName().equals("directory")) { 
     122                id = importConf.getAttribute("id"); 
    93123                String dirName = PropertyResolver.resolveProperties(importConf.getAttribute("path")); 
    94124                File dir = new File(dirName); 
    95125                if (dir.exists() && dir.isDirectory()) { 
    96                     File[] jarFiles = dir.listFiles(new JarFilter()); 
     126                    File[] files = dir.listFiles(); 
    97127                    // order of imports is important, to provide some deterministic behaviour, sort the entries by name 
    98                     Arrays.sort(jarFiles, new FileNameComparator()); 
    99                     for (File file : jarFiles) { 
    100                         String genId = id + "-" + stripJarExt(file.getName()); 
    101                         modules.add(new ModuleDefinition(genId, file, ModuleSourceType.JAR)); 
     128                    Arrays.sort(files, new FileNameComparator()); 
     129                    for (File file : files) { 
     130                        if (file.isDirectory()) { 
     131                            // skip 
     132                        } else if (file.getName().toLowerCase().endsWith(".jar")) { 
     133                            String genId = id + "-" + stripJarExt(file.getName()); 
     134                            modules.add(new ModuleDefinition(genId, file, ModuleSourceType.JAR)); 
     135                        } else if (file.getName().toLowerCase().endsWith(".xml")) { 
     136                            // Import a wiring.xml-type file 
     137                            includeWiring(file, modules, wiringFileStack, repository, artifactSourceLocations); 
     138                        } 
    102139                    } 
    103140                } 
     
    120157            } 
    121158        } 
    122  
    123         // Remove disabled module entries 
    124         Iterator<ModuleDefinition> it = modules.iterator(); 
    125         while (it.hasNext()) { 
    126             ModuleDefinition entry = it.next(); 
    127             if (disabledModuleIds.contains(entry.getId())) 
    128                 it.remove(); 
    129         } 
    130  
    131         for (ModuleDefinition md : modules) 
    132             model.addModule(md); 
    133  
    134         return model; 
     159    } 
     160 
     161    private static void includeWiring(File file, List<ModuleDefinition> modules, Stack<String> wiringFileStack, 
     162            ArtifactRepository repository, SourceLocations artifactSourceLocations) throws Exception { 
     163 
     164        String key = file.getCanonicalPath(); 
     165 
     166        if (wiringFileStack.contains(key)) { 
     167            throw new KauriRTException("Recursive loading of wiring.xml-type file detected: " + key); 
     168        } 
     169 
     170        Conf conf = XmlConfBuilder.build(file); 
     171 
     172        // go recursive 
     173        wiringFileStack.push(key); 
     174        buildModules(modules, wiringFileStack, conf, repository, artifactSourceLocations); 
     175        wiringFileStack.pop(); 
    135176    } 
    136177 
     
    296337    } 
    297338 
    298     private static class JarFilter implements FilenameFilter { 
    299         public boolean accept(File dir, String name) { 
    300             return name.toLowerCase().endsWith(".jar"); 
    301         } 
    302     } 
    303  
    304339    private static class FileNameComparator implements Comparator<File> { 
    305340        public int compare(File o1, File o2) { 
Note: See TracChangeset for help on using the changeset viewer.