01: package org.drools.lang.dsl;
02:
03: /*
04: * Copyright 2005 JBoss Inc
05: *
06: * Licensed under the Apache License, Version 2.0 (the "License");
07: * you may not use this file except in compliance with the License.
08: * You may obtain a copy of the License at
09: *
10: * http://www.apache.org/licenses/LICENSE-2.0
11: *
12: * Unless required by applicable law or agreed to in writing, software
13: * distributed under the License is distributed on an "AS IS" BASIS,
14: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15: * See the License for the specific language governing permissions and
16: * limitations under the License.
17: */
18:
19: import java.io.IOException;
20: import java.io.Reader;
21: import java.util.HashMap;
22: import java.util.Map;
23:
24: import org.drools.RuntimeDroolsException;
25: import org.drools.lang.Expander;
26: import org.drools.lang.ExpanderResolver;
27:
28: /**
29: * The default expander resolver will provide instances of the DefaultExpander.
30: * The DefaultExpander uses templates to provide DSL and pseudo
31: * natural language support.
32: *
33: * @author Michael Neale
34: */
35: public class DefaultExpanderResolver implements ExpanderResolver {
36:
37: private final Map expanders = new HashMap();
38:
39: /**
40: * Create an empty resolver, which you will then
41: * call addExpander multiple times, to map a specific expander
42: * with a name that will be found in the drl after the expander keyword.
43: */
44: public DefaultExpanderResolver() {
45: }
46:
47: /**
48: * This will load up a DSL from the reader specified.
49: * This will make the expander available to any parser
50: * regardless of name.
51: *
52: * The DSL expander will be the default expander.
53: *
54: * This is the constructor most people should use.
55: */
56: public DefaultExpanderResolver(final Reader reader)
57: throws IOException {
58: final DSLMappingFile file = new DSLMappingFile();
59: if (file.parseAndLoad(reader)) {
60: final Expander expander = new DefaultExpander();
61: expander.addDSLMapping(file.getMapping());
62: this .expanders.put("*", expander);
63: } else {
64: throw new RuntimeDroolsException(
65: "Error parsing and loading DSL file."
66: + file.getErrors());
67: }
68: }
69:
70: /**
71: * Add an expander with the given name, which will be used
72: * by looking for the "expander" keyword in the DRL.
73: *
74: * If a default expander is installed, it will always be returned
75: * if none matching the given name can be found.
76: *
77: * You don't need to use this unless you have multiple expanders/DSLs
78: * involved when compiling multiple rule packages at the same time.
79: * If you don't know what that sentence means, you probably don't need to use this method.
80: */
81: public void addExpander(final String name, final Expander expander) {
82: this .expanders.put(name, expander);
83: }
84:
85: public Expander get(final String name, final String config) {
86: if (this .expanders.containsKey(name)) {
87: return (Expander) this .expanders.get(name);
88: } else {
89: final Expander exp = (Expander) this .expanders.get("*");
90: if (exp == null) {
91: throw new IllegalArgumentException(
92: "Unable to provide an expander for " + name
93: + " or a default expander.");
94: }
95: return exp;
96: }
97: }
98:
99: }
|