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 package org.apache.geronimo.connector.deployment.jsr88;
018
019 import java.util.Set;
020 import java.util.HashSet;
021 import java.util.Iterator;
022 import javax.enterprise.deploy.model.DDBean;
023 import org.apache.geronimo.deployment.plugin.XmlBeanSupport;
024 import org.apache.geronimo.xbeans.geronimo.GerResourceadapterType;
025 import org.apache.geronimo.xbeans.geronimo.GerOutboundResourceadapterType;
026 import org.apache.geronimo.xbeans.geronimo.GerConnectionDefinitionType;
027 import org.apache.xmlbeans.SchemaTypeLoader;
028
029 /**
030 * Represents /connector/resourceadapter in the Geronimo Connector deployment plan.
031 * Note: is not a DConfigBean, because there may be more than one ResourceAdapter
032 * in the Geronimo plan per ResourceAdapter in the J2EE deployment descriptor.
033 *
034 * @version $Rev: 476049 $ $Date: 2006-11-16 23:35:17 -0500 (Thu, 16 Nov 2006) $
035 */
036 public class ResourceAdapter extends XmlBeanSupport {
037 private DDBean resourceAdapter;
038 private ConnectionDefinition[] instances = new ConnectionDefinition[0];
039 private ResourceAdapterInstance resourceAdapterInstance;
040
041 public ResourceAdapter() {
042 super(null);
043 }
044
045 public ResourceAdapter(DDBean resourceAdapter, GerResourceadapterType ra) {
046 super(null);
047 configure(resourceAdapter, ra);
048 }
049
050 protected GerResourceadapterType getResourceAdapter() {
051 return (GerResourceadapterType)getXmlObject();
052 }
053
054 void configure(DDBean resourceAdapter, GerResourceadapterType ra) {
055 this.resourceAdapter = resourceAdapter;
056 setXmlObject(ra);
057 if(ra.isSetResourceadapterInstance()) {
058 resourceAdapterInstance = new ResourceAdapterInstance(resourceAdapter, ra.getResourceadapterInstance());
059 } else {
060 resourceAdapterInstance = null;
061 }
062 if(ra.isSetOutboundResourceadapter()) {
063 DDBean[] test = resourceAdapter.getChildBean("outbound-resourceadapter");
064 if(test != null && test.length > 0) {
065 GerOutboundResourceadapterType outbound = ra.getOutboundResourceadapter();
066 GerConnectionDefinitionType[] defs = outbound.getConnectionDefinitionArray();
067 if(defs != null) {
068 instances = new ConnectionDefinition[defs.length];
069 for (int i = 0; i < defs.length; i++) {
070 GerConnectionDefinitionType def = defs[i];
071 instances[i] = new ConnectionDefinition(resourceAdapter, def);
072 }
073 }
074 } else {
075 //todo: clean up the Geronimo deployment info since there's no J2EE outbound RA
076 }
077 }
078 }
079
080 // ----------------------- JavaBean Properties for /connector/resourceadapter ----------------------
081
082 public ConnectionDefinition[] getConnectionDefinition() {
083 return instances;
084 }
085
086 public ConnectionDefinition getConnectionDefinition(int index) {
087 return instances[index];
088 }
089
090 public void setConnectionDefinition(ConnectionDefinition[] definitions) {
091 ConnectionDefinition[] old = getConnectionDefinition();
092
093 if(definitions != null && definitions.length > 0) {
094 if(!getResourceAdapter().isSetOutboundResourceadapter()) {
095 getResourceAdapter().addNewOutboundResourceadapter();
096 }
097 } else {
098 if(getResourceAdapter().isSetOutboundResourceadapter()) {
099 getResourceAdapter().unsetOutboundResourceadapter();
100 }
101 }
102 Set before = new HashSet();
103 for (int i = 0; i < old.length; i++) {
104 before.add(old[i]);
105 }
106 instances = definitions;
107 // Handle current or new definitions
108 for (int i = 0; i < definitions.length; i++) {
109 ConnectionDefinition definition = definitions[i];
110 if(definition.getConnectionDefinition() == null) {
111 definition.configure(resourceAdapter, getResourceAdapter().getOutboundResourceadapter().addNewConnectionDefinition());
112 } else {
113 before.remove(definition);
114 }
115 }
116 // Handle removed definitions
117 for (Iterator it = before.iterator(); it.hasNext();) {
118 ConnectionDefinition definition = (ConnectionDefinition) it.next();
119 GerConnectionDefinitionType all[] = getResourceAdapter().isSetOutboundResourceadapter() ? getResourceAdapter().getOutboundResourceadapter().getConnectionDefinitionArray() : new GerConnectionDefinitionType[0];
120 for (int i = 0; i < all.length; i++) {
121 if(all[i] == definition) {
122 getResourceAdapter().getOutboundResourceadapter().removeConnectionDefinition(i);
123 break;
124 }
125 }
126 }
127 pcs.firePropertyChange("connectionDefinition", old, instances);
128 }
129
130 public void setConnectionDefinition(int index, ConnectionDefinition definition) {
131 ConnectionDefinition[] old = instances;
132 instances[index] = definition;
133 if(definition.getConnectionDefinition() == null) {
134 definition.configure(resourceAdapter, getResourceAdapter().getOutboundResourceadapter().addNewConnectionDefinition());
135 }
136 pcs.firePropertyChange("connectionDefinition", old, instances);
137 }
138
139 public ResourceAdapterInstance getResourceAdapterInstance() {
140 return resourceAdapterInstance;
141 }
142
143 public void setResourceAdapterInstance(ResourceAdapterInstance resourceAdapterInstance) {
144 ResourceAdapterInstance old = this.resourceAdapterInstance;
145 this.resourceAdapterInstance = resourceAdapterInstance;
146 if(resourceAdapterInstance.getResourceAdapterInstance() == null) {
147 if(getResourceAdapter().isSetResourceadapterInstance()) {
148 resourceAdapterInstance.configure(resourceAdapter, getResourceAdapter().getResourceadapterInstance());
149 } else {
150 resourceAdapterInstance.configure(resourceAdapter, getResourceAdapter().addNewResourceadapterInstance());
151 }
152 }
153 pcs.firePropertyChange("resourceAdapterInstance", old, instances);
154 }
155
156 // ----------------------- End of JavaBean Properties ----------------------
157
158 protected SchemaTypeLoader getSchemaTypeLoader() {
159 return Connector15DCBRoot.SCHEMA_TYPE_LOADER;
160 }
161 }