blob: 463556c0095a8a7487de4622dd2a8ba67fd44191 [file] [log] [blame]
Stuart McCullochd00f9712009-07-13 10:06:47 +00001package aQute.bnd.make;
2
3import java.util.*;
4import java.util.regex.*;
5
6import aQute.bnd.service.*;
7import aQute.lib.osgi.*;
8
9public class Make {
10 Builder builder;
11 Map<Instruction, Map<String, String>> make;
12
13 public Make(Builder builder) {
14 this.builder = builder;
15 // builder.getPlugins().add(new MakeBnd());
16 // builder.getPlugins().add(new MakeCopy());
17 }
18
19 public Resource process(String source) {
20 Map<Instruction, Map<String, String>> make = getMakeHeader();
21 builder.trace("make " + source);
22
23 for (Map.Entry<Instruction, Map<String, String>> entry : make
24 .entrySet()) {
25 Instruction instr = (Instruction) entry.getKey();
26 Matcher m = instr.getMatcher(source);
27 if (m.matches() || instr.isNegated()) {
28 Map<String, String> arguments = replace(m, entry.getValue());
29 List<MakePlugin> plugins = builder.getPlugins(MakePlugin.class);
30 for (MakePlugin plugin : plugins) {
31 try {
32 Resource resource = plugin.make(builder,
33 source, arguments);
34 if (resource != null) {
35 builder.trace("Made " + source + " from args "
36 + arguments + " with " + plugin);
37 return resource;
38 }
39 } catch (Exception e) {
40 builder.error("Plugin " + plugin
41 + " generates error when use in making "
42 + source + " with args " + arguments, e);
43 }
44 }
45 }
46 }
47 return null;
48 }
49
50 private Map<String, String> replace(Matcher m, Map<String, String> value) {
51 Map<String, String> newArgs = Processor.newMap();
52 for (Map.Entry<String, String> entry : value.entrySet()) {
53 String s = entry.getValue();
54 s = replace(m, s);
55 newArgs.put(entry.getKey(), s);
56 }
57 return newArgs;
58 }
59
60 String replace(Matcher m, CharSequence s) {
61 StringBuffer sb = new StringBuffer();
62 int max = '0' + m.groupCount() + 1;
63 for (int i = 0; i < s.length(); i++) {
64 char c = s.charAt(i);
65 if (c == '$' && i < s.length() - 1) {
66 c = s.charAt(++i);
67 if (c >= '0' && c <= max) {
68 int index = c - '0';
69 String replacement = m.group(index);
70 if (replacement != null)
71 sb.append(replacement);
72 } else {
73 if (c == '$')
74 i++;
75 sb.append(c);
76 }
77 } else
78 sb.append(c);
79 }
80 return sb.toString();
81 }
82
83 Map<Instruction, Map<String, String>> getMakeHeader() {
84 if (make != null)
85 return make;
86 make = Processor.newMap();
87
88 String s = builder.getProperty(Builder.MAKE);
89 Map<String, Map<String, String>> make = builder.parseHeader(s);
90 for (Iterator<Map.Entry<String, Map<String, String>>> e = make
91 .entrySet().iterator(); e.hasNext();) {
92 Map.Entry<String, Map<String, String>> entry = e.next();
93 String pattern = Processor.removeDuplicateMarker(entry.getKey());
94
95 Instruction instr = Instruction.getPattern(pattern);
96 this.make.put(instr, entry.getValue());
97 }
98
99 return this.make;
100 }
101}