1 package org.codehaus.mojo.javascript.assembler;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.io.File;
20 import java.util.Iterator;
21 import java.util.List;
22
23 import javax.xml.parsers.DocumentBuilder;
24 import javax.xml.parsers.DocumentBuilderFactory;
25
26 import org.apache.commons.jxpath.JXPathContext;
27 import org.codehaus.plexus.logging.LogEnabled;
28 import org.codehaus.plexus.logging.Logger;
29 import org.w3c.dom.Document;
30 import org.w3c.dom.Node;
31
32
33
34
35 public class JsBuilderAssemblerReader
36 implements AssemblerReader, LogEnabled
37 {
38 private Logger logger;
39
40
41
42
43
44
45 public void enableLogging( Logger logger )
46 {
47 this.logger = logger;
48 }
49
50 private static final String OUTPUT = "$output/";
51
52
53
54
55
56
57 public Assembler getAssembler( File file )
58 throws Exception
59 {
60 logger.info( "Reading assembler descriptor " + file.getAbsolutePath() );
61 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
62 Document dom = builder.parse( file );
63
64 Assembler assembler = new Assembler();
65 JXPathContext xpath = JXPathContext.newContext( dom );
66 xpath.setLenient( true );
67 String src = (String) xpath.getValue( "//directory/@name" );
68 List nodes = xpath.selectNodes( "//target" );
69 for ( Iterator iterator = nodes.iterator(); iterator.hasNext(); )
70 {
71 Node node = (Node) iterator.next();
72 Script script = new Script();
73 assembler.addScript( script );
74 JXPathContext nodeContext = JXPathContext.newContext( node );
75 String fileName = (String) nodeContext.getValue( "@file" );
76 fileName = fileName.replace( '\\', '/' );
77 if ( fileName.startsWith( OUTPUT ) )
78 {
79 fileName = fileName.substring( OUTPUT.length() );
80 }
81 script.setFileName( fileName );
82
83 for ( Iterator iter = nodeContext.iterate( "//include/@name" ); iter.hasNext(); )
84 {
85 String include = ( (String) iter.next() ).replace( '\\', '/' );
86 if ( src != null && src.length() > 0 )
87 {
88 include = include.substring( src.length() + 1 );
89 }
90 script.addInclude( include );
91 }
92 }
93 return assembler;
94 }
95 }