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