1 package org.apache.maven.tools.plugin.extractor.beanshell;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import bsh.EvalError;
23 import bsh.Interpreter;
24 import org.apache.maven.plugin.descriptor.InvalidPluginDescriptorException;
25 import org.apache.maven.plugin.descriptor.MojoDescriptor;
26 import org.apache.maven.tools.plugin.PluginToolsRequest;
27 import org.apache.maven.tools.plugin.extractor.AbstractScriptedMojoDescriptorExtractor;
28 import org.apache.maven.tools.plugin.extractor.ExtractionException;
29 import org.apache.maven.tools.plugin.extractor.MojoDescriptorExtractor;
30 import org.codehaus.plexus.component.annotations.Component;
31
32 import java.io.File;
33 import java.io.InputStreamReader;
34 import java.io.UnsupportedEncodingException;
35 import java.util.ArrayList;
36 import java.util.List;
37 import java.util.Map;
38 import java.util.Set;
39
40
41
42
43
44
45 @Component( role = MojoDescriptorExtractor.class, hint = "bsh" )
46 public class BeanshellMojoDescriptorExtractor
47 extends AbstractScriptedMojoDescriptorExtractor
48 implements MojoDescriptorExtractor
49 {
50
51
52
53 protected String getScriptFileExtension( PluginToolsRequest request )
54 {
55 return ".bsh";
56 }
57
58
59
60
61 protected List<MojoDescriptor> extractMojoDescriptors( Map<String, Set<File>> scriptFilesKeyedByBasedir,
62 PluginToolsRequest request )
63 throws ExtractionException, InvalidPluginDescriptorException
64 {
65 List<MojoDescriptor> descriptors = new ArrayList<MojoDescriptor>();
66
67 for ( Map.Entry<String, Set<File>> entry : scriptFilesKeyedByBasedir.entrySet() )
68 {
69 String basedir = entry.getKey();
70 Set<File> metadataFiles = entry.getValue();
71
72 for ( File scriptFile : metadataFiles )
73 {
74 String relativePath = null;
75
76 if ( basedir.endsWith( "/" ) )
77 {
78 basedir = basedir.substring( 0, basedir.length() - 2 );
79 }
80
81 relativePath = scriptFile.getPath().substring( basedir.length() );
82
83 relativePath = relativePath.replace( '\\', '/' );
84
85 MojoDescriptor mojoDescriptor = createMojoDescriptor( basedir, relativePath, request );
86 descriptors.add( mojoDescriptor );
87 }
88 }
89
90 return descriptors;
91 }
92
93
94
95
96
97
98
99
100
101 private MojoDescriptor createMojoDescriptor( String basedir, String resource, PluginToolsRequest request )
102 throws InvalidPluginDescriptorException
103 {
104 MojoDescriptor mojoDescriptor = new MojoDescriptor();
105 mojoDescriptor.setPluginDescriptor( request.getPluginDescriptor() );
106
107 mojoDescriptor.setLanguage( "bsh" );
108 mojoDescriptor.setComponentConfigurator( "bsh" );
109
110 mojoDescriptor.setImplementation( resource );
111
112 Interpreter interpreter = new Interpreter();
113
114 try
115 {
116 interpreter.set( "file", new File( basedir, resource ) );
117
118 interpreter.set( "mojoDescriptor", mojoDescriptor );
119
120 interpreter.set( "encoding", "UTF-8" );
121
122 interpreter.eval( new InputStreamReader( getClass().getResourceAsStream( "/extractor.bsh" ), "UTF-8" ) );
123 }
124 catch ( EvalError evalError )
125 {
126 throw new InvalidPluginDescriptorException( "Error scanning beanshell script", evalError );
127 }
128 catch ( UnsupportedEncodingException uee )
129 {
130
131 throw new InvalidPluginDescriptorException( "Unsupported encoding while reading beanshell script", uee );
132 }
133
134 return mojoDescriptor;
135 }
136 }