001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.connector.deployment.dconfigbean;
019
020 import java.util.HashMap;
021 import java.util.Map;
022 import javax.enterprise.deploy.model.DDBean;
023 import javax.enterprise.deploy.spi.DConfigBean;
024 import javax.enterprise.deploy.spi.exceptions.ConfigurationException;
025
026 import org.apache.geronimo.deployment.plugin.DConfigBeanSupport;
027 import org.apache.geronimo.xbeans.geronimo.GerConfigPropertySettingType;
028 import org.apache.geronimo.xbeans.geronimo.GerConnectionDefinitionType;
029 import org.apache.geronimo.xbeans.geronimo.GerOutboundResourceadapterType;
030 import org.apache.geronimo.xbeans.geronimo.GerResourceadapterInstanceType;
031 import org.apache.geronimo.xbeans.geronimo.GerResourceadapterType;
032 import org.apache.xmlbeans.SchemaTypeLoader;
033
034 /**
035 *
036 *
037 * @version $Rev: 476049 $ $Date: 2006-11-16 23:35:17 -0500 (Thu, 16 Nov 2006) $
038 *
039 * */
040 public class ResourceAdapterDConfigBean extends DConfigBeanSupport {
041
042 private final static String[][] RESOURCE_ADAPTER_XPATHS = {
043 {"config-property"},
044 {"outbound-resourceadapter", "connection-definition"},
045 {"adminobject"}};
046 private Map configPropertiesMap = new HashMap();
047 private Map connectionDefinitionsMap = new HashMap();
048 private Map adminObjectsMap = new HashMap();
049
050 public ResourceAdapterDConfigBean(DDBean ddBean, final GerResourceadapterType resourceadapter) {
051 super(ddBean, resourceadapter);
052 if (getResourceadapterInstance() == null) {
053 resourceadapter.addNewResourceadapterInstance();
054 }
055 ConfigPropertiesHelper.initializeConfigSettings(ddBean, new ConfigPropertiesHelper.ConfigPropertiesSource() {
056 public GerConfigPropertySettingType[] getConfigPropertySettingArray() {
057 return getResourceadapterInstance().getConfigPropertySettingArray();
058 }
059
060 public GerConfigPropertySettingType addNewConfigPropertySetting() {
061 return getResourceadapterInstance().addNewConfigPropertySetting();
062 }
063
064 public void removeConfigPropertySetting(int j) {
065 }
066
067 public ConfigPropertySettings[] getConfigPropertySettings() {
068 return new ConfigPropertySettings[0];
069 }
070
071 public void setConfigPropertySettings(ConfigPropertySettings[] configs) {
072 }
073
074 }, configPropertiesMap, "config-property", "config-property-name");
075 //initialize connection definitions
076 GerOutboundResourceadapterType outboundResourceadapter = resourceadapter.getOutboundResourceadapter();
077 if (outboundResourceadapter == null) {
078 outboundResourceadapter = resourceadapter.addNewOutboundResourceadapter();
079 }
080 DDBean[] connectionDefinitionDDBeans = ddBean.getChildBean(getXpaths()[1]);
081 GerConnectionDefinitionType[] connectionDefinitions = outboundResourceadapter.getConnectionDefinitionArray();
082
083 if (connectionDefinitions.length == 0) {
084 //we are new
085 for (int i = 0; i < connectionDefinitionDDBeans.length; i++) {
086 DDBean connectionDefinitionDdBean = connectionDefinitionDDBeans[i];
087 GerConnectionDefinitionType connectionDefinition = outboundResourceadapter.addNewConnectionDefinition();
088 String connectionfactoryInterface = connectionDefinitionDdBean.getText("connectionfactory-interface")[0];
089 ConnectionDefinitionDConfigBean connectionDefinitionDConfigBean = new ConnectionDefinitionDConfigBean(connectionDefinitionDdBean, connectionDefinition);
090 connectionDefinitionsMap.put(connectionfactoryInterface, connectionDefinitionDConfigBean);
091 }
092 } else {
093 //we are read in from xml. Check correct length
094 assert connectionDefinitionDDBeans.length == connectionDefinitions.length;
095 for (int i = 0; i < connectionDefinitionDDBeans.length; i++) {
096 DDBean connectionDefinitionDdBean = connectionDefinitionDDBeans[i];
097 GerConnectionDefinitionType connectionDefinition = connectionDefinitions[i];
098 String connectionfactoryInterface = connectionDefinitionDdBean.getText("connectionfactory-interface")[0];
099 assert connectionfactoryInterface.equals(connectionDefinition.getConnectionfactoryInterface());
100 ConnectionDefinitionDConfigBean connectionDefinitionDConfigBean = new ConnectionDefinitionDConfigBean(connectionDefinitionDdBean, connectionDefinition);
101 connectionDefinitionsMap.put(connectionfactoryInterface, connectionDefinitionDConfigBean);
102 }
103 }
104
105 //admin objects
106 // DDBean[] adminObjecDdBeans = ddBean.getChildBean(getXpaths()[2]);
107 // GerAdminobjectType[] adminobjectTypes = getResourceadapter().getAdminobjectArray();
108 //
109 // if (adminobjectTypes.length == 0) {
110 // //we are new
111 // for (int i = 0; i < adminObjecDdBeans.length; i++) {
112 // DDBean adminObjectDdBean = adminObjecDdBeans[i];
113 // GerAdminobjectType adminobjectType = getResourceadapter().addNewAdminobject();
114 // String adminObjectInterface = adminObjectDdBean.getText("adminobject-interface")[0];
115 // String adminObjectClass = adminObjectDdBean.getText("adminobject-class")[0];
116 // AdminObjectDConfigBean adminObjectDConfigBean = new AdminObjectDConfigBean(adminObjectDdBean, adminobjectType);
117 // adminObjectsMap.put(new Key(adminObjectInterface, adminObjectClass), adminObjectDConfigBean);
118 // }
119 // } else {
120 // //we are read in from xml. Check correct length
121 // assert adminObjecDdBeans.length == adminobjectTypes.length;
122 // for (int i = 0; i < adminObjecDdBeans.length; i++) {
123 // DDBean adminObjectDdBean = adminObjecDdBeans[i];
124 // GerAdminobjectType adminobjectType = adminobjectTypes[i];
125 // String adminObjectInterface = adminObjectDdBean.getText("adminobject-interface")[0];
126 // assert(adminObjectInterface.equals(adminobjectType.getAdminobjectInterface().getStringValue()));
127 // String adminObjectClass = adminObjectDdBean.getText("adminobject-class")[0];
128 // assert(adminObjectClass.equals(adminobjectType.getAdminobjectClass().getStringValue()));
129 // AdminObjectDConfigBean adminObjectDConfigBean = new AdminObjectDConfigBean(adminObjectDdBean, adminobjectType);
130 // adminObjectsMap.put(new Key(adminObjectInterface, adminObjectClass), adminObjectDConfigBean);
131 //
132 // }
133 // }
134
135 }
136
137 GerResourceadapterType getResourceadapter() {
138 return (GerResourceadapterType) getXmlObject();
139 }
140
141 private GerResourceadapterInstanceType getResourceadapterInstance() {
142 return getResourceadapter().getResourceadapterInstance();
143 }
144
145 public String getResourceAdapterName() {
146 return getResourceadapterInstance().getResourceadapterName();
147 }
148
149 public void setResourceAdapterName(String resourceAdapterName) {
150 getResourceadapterInstance().setResourceadapterName(resourceAdapterName);
151 }
152
153 public String getWorkManager() {
154 if(getResourceadapterInstance() == null || getResourceadapterInstance().getWorkmanager() == null) {
155 return null;
156 }
157 return getResourceadapterInstance().getWorkmanager().getGbeanLink();
158 }
159
160 public void setWorkManager(String workManager) {
161 if(getResourceadapterInstance() == null) {
162 getResourceadapter().addNewResourceadapterInstance();
163 }
164 if(getResourceadapterInstance().getWorkmanager() == null) {
165 getResourceadapterInstance().addNewWorkmanager();
166 }
167 getResourceadapterInstance().getWorkmanager().setGbeanLink(workManager);
168 }
169
170 public DConfigBean getDConfigBean(DDBean bean) throws ConfigurationException {
171 String xpath = bean.getXpath();
172 String[] xpaths = getXpaths();
173 if (xpath.equals(xpaths[0])) {
174 //resource adapter config property
175 String configPropertyName = bean.getText("config-property-name")[0];
176 ConfigPropertySettingDConfigBean configPropertySetting = (ConfigPropertySettingDConfigBean) configPropertiesMap.get(configPropertyName);
177 assert configPropertySetting != null;
178 return configPropertySetting;
179 }
180 if (xpath.equals(xpaths[1])) {
181 //connection definition
182 String connectionFactoryInterface = bean.getText("connectionfactory-interface")[0];
183 ConnectionDefinitionDConfigBean connectionDefinition = (ConnectionDefinitionDConfigBean) connectionDefinitionsMap.get(connectionFactoryInterface);
184 assert connectionDefinition != null;
185 return connectionDefinition;
186 }
187 if (xpath.equals(xpaths[2])) {
188 //admin objects
189 String adminObjectInterface = bean.getText("adminobject-interface")[0];
190 String adminObjectClass = bean.getText("adminobject-class")[0];
191 AdminObjectDConfigBean adminObject = (AdminObjectDConfigBean) adminObjectsMap.get(new Key(adminObjectInterface, adminObjectClass));
192 assert adminObject != null;
193 return adminObject;
194 }
195 return null;
196 }
197
198
199 public String[] getXpaths() {
200 return getXPathsForJ2ee_1_4(RESOURCE_ADAPTER_XPATHS);
201 }
202
203 protected SchemaTypeLoader getSchemaTypeLoader() {
204 return ResourceAdapterDConfigRoot.SCHEMA_TYPE_LOADER;
205 }
206
207
208 //from doubleKeyedHashMap, currently in transaction module
209 private final static class Key {
210 private final Object part1;
211 private final Object part2;
212
213 public Key(Object part1, Object part2) {
214 this.part1 = part1;
215 this.part2 = part2;
216 }
217
218 public int hashCode() {
219 return part1.hashCode() ^ part2.hashCode();
220 }
221
222 public boolean equals(Object obj) {
223 if (obj instanceof Key) {
224 Key other = (Key) obj;
225 return this.part1.equals(other.part1) && this.part2.equals(other.part2);
226 } else {
227 return false;
228 }
229 }
230 }
231 }