1 /**
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.geronimo.system.configuration;
19
20 import org.apache.geronimo.system.configuration.condition.ConditionParser;
21 import org.apache.geronimo.system.configuration.condition.JexlConditionParser;
22
23 import org.apache.geronimo.gbean.AbstractName;
24 import org.apache.geronimo.kernel.InvalidGBeanException;
25 import org.apache.geronimo.kernel.repository.Artifact;
26
27 import org.w3c.dom.Element;
28 import org.w3c.dom.NodeList;
29 import org.w3c.dom.Document;
30
31 import java.util.Iterator;
32 import java.util.LinkedHashMap;
33 import java.util.Map;
34
35 /**
36 * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
37 */
38 class ConfigurationOverride {
39 private final Artifact name;
40 private boolean load;
41 private String condition;
42 private final Map gbeans = new LinkedHashMap();
43
44 /**
45 * Cached condition parser; lazy init on the first call to {@link #parseCondition()}
46 * whne {@link #condition} is non-null.
47 */
48 private static ConditionParser parser;
49
50 public ConfigurationOverride(Artifact name, boolean load) {
51 this.name = name;
52 this.load = load;
53 }
54
55 public ConfigurationOverride(ConfigurationOverride base, Artifact name) {
56 this.name = name;
57 this.load = base.load;
58 this.condition = base.condition;
59 this.gbeans.putAll(base.gbeans);
60 }
61
62 public ConfigurationOverride(Element element) throws InvalidGBeanException {
63 name = Artifact.create(element.getAttribute("name"));
64
65 condition = element.getAttribute("condition");
66
67 String loadConfigString = element.getAttribute("load");
68 load = !"false".equals(loadConfigString);
69
70 NodeList gbeans = element.getElementsByTagName("gbean");
71 for (int g = 0; g < gbeans.getLength(); g++) {
72 Element gbeanElement = (Element) gbeans.item(g);
73 GBeanOverride gbean = new GBeanOverride(gbeanElement);
74 addGBean(gbean);
75 }
76 }
77
78 public Artifact getName() {
79 return name;
80 }
81
82 public String getCondition() {
83 return condition;
84 }
85
86 public void setCondition(final String condition) {
87 this.condition = condition;
88 }
89
90 private boolean parseCondition() {
91 if (condition == null) {
92
93 return true;
94 }
95
96
97 if (parser == null) {
98 parser = new JexlConditionParser();
99 }
100
101 return parser.evaluate(condition);
102 }
103
104 public boolean isLoad() {
105 return load && parseCondition();
106 }
107
108 public void setLoad(boolean load) {
109 this.load = load;
110 }
111
112 public GBeanOverride getGBean(String gbeanName) {
113 return (GBeanOverride) gbeans.get(gbeanName);
114 }
115
116 public void addGBean(GBeanOverride gbean) {
117 gbeans.put(gbean.getName(), gbean);
118 }
119
120 public void addGBean(String gbeanName, GBeanOverride gbean) {
121 gbeans.put(gbeanName, gbean);
122 }
123
124 public Map getGBeans() {
125 return gbeans;
126 }
127
128 public GBeanOverride getGBean(AbstractName gbeanName) {
129 return (GBeanOverride) gbeans.get(gbeanName);
130 }
131
132 public void addGBean(AbstractName gbeanName, GBeanOverride gbean) {
133 gbeans.put(gbeanName, gbean);
134 }
135
136 public Element writeXml(Document doc, Element root) {
137 Element module = doc.createElement("module");
138 root.appendChild(module);
139 module.setAttribute("name", name.toString());
140 if (!load) {
141 module.setAttribute("load", "false");
142 }
143 if (condition != null && condition.trim().length() != 0) {
144 module.setAttribute("condition", condition);
145 }
146
147
148 for (Iterator gb = gbeans.entrySet().iterator(); gb.hasNext();) {
149 Map.Entry gbean = (Map.Entry) gb.next();
150 GBeanOverride gbeanOverride = (GBeanOverride) gbean.getValue();
151 gbeanOverride.writeXml(doc, module);
152 }
153 return module;
154 }
155 }