001 package org.otfeed.j2ee.ra;
002
003 import java.io.PrintWriter;
004 import java.util.Set;
005
006 import javax.resource.ResourceException;
007 import javax.resource.spi.ConnectionManager;
008 import javax.resource.spi.ConnectionRequestInfo;
009 import javax.resource.spi.ManagedConnection;
010 import javax.resource.spi.ManagedConnectionFactory;
011 import javax.resource.spi.ResourceAdapter;
012 import javax.resource.spi.ResourceAdapterAssociation;
013 import javax.security.auth.Subject;
014
015 import org.slf4j.Logger;
016 import org.slf4j.LoggerFactory;
017
018 public class OtfeedManagedConnectionFactory implements ManagedConnectionFactory, ResourceAdapterAssociation {
019
020 private static final long serialVersionUID = 2023949373406454359L;
021
022 private static final Logger LOG = LoggerFactory.getLogger(OtfeedManagedConnectionFactory.class);
023
024 private PrintWriter logWriter = null;
025
026 public Object createConnectionFactory() throws ResourceException {
027 LOG.trace("creating connection factory (non-managed envir)");
028 return new OtfeedConnectionFactory(this, new DefaultConnectionManager());
029 }
030
031 public Object createConnectionFactory(ConnectionManager connectionManager)
032 throws ResourceException {
033 LOG.trace("creating connection factory (managed envir)");
034 return new OtfeedConnectionFactory(this, connectionManager);
035 }
036
037 public ManagedConnection createManagedConnection(Subject subject,
038 ConnectionRequestInfo connectionInfo) throws ResourceException {
039 LOG.trace("creating MANAGED connection for: {}", connectionInfo);
040
041 // merge with factory connection specs, and with resource adapter connection specs
042 OtfeedConnectionRequestInfo spec = OtfeedConnectionRequestInfo.merge(
043 (OtfeedConnectionRequestInfo) connectionInfo,
044 connectionDefaults
045 );
046
047 spec = OtfeedConnectionRequestInfo.merge(spec, resourceAdapter.connectionDefaults);
048 LOG.trace("merged connection specs: {}", spec);
049
050 return new OtfeedManagedConnection(spec, resourceAdapter);
051 }
052
053 @SuppressWarnings("unchecked")
054 public ManagedConnection matchManagedConnections(Set candidates, Subject subject,
055 ConnectionRequestInfo connectionInfo) throws ResourceException {
056 LOG.trace("matching connection factory for {}", connectionInfo);
057
058 // merge with factory connection specs, and with resource adapter connection specs
059 OtfeedConnectionRequestInfo spec = OtfeedConnectionRequestInfo.merge(
060 (OtfeedConnectionRequestInfo) connectionInfo,
061 connectionDefaults
062 );
063
064 spec = OtfeedConnectionRequestInfo.merge(spec, resourceAdapter.connectionDefaults);
065 LOG.trace("merged connection specs: {}", spec);
066
067 for(OtfeedManagedConnection mc : (Set<OtfeedManagedConnection>) candidates) {
068 LOG.trace("matching candidate: {}", mc.connectionSpec);
069 if(mc.connectionSpec.equals(spec)) {
070 LOG.trace("matching connection found: {}", mc);
071 return mc;
072 }
073 }
074
075 LOG.trace("match unsuccessfull");
076 return null;
077 }
078
079 public PrintWriter getLogWriter() throws ResourceException {
080 return logWriter;
081 }
082
083 public void setLogWriter(PrintWriter writer) throws ResourceException {
084 logWriter = writer;
085 }
086
087 private OtfeedResourceAdapter resourceAdapter;
088
089 public ResourceAdapter getResourceAdapter() {
090 return resourceAdapter;
091 }
092
093 public void setResourceAdapter(ResourceAdapter val) {
094 resourceAdapter = (OtfeedResourceAdapter) val;
095 }
096
097 private final OtfeedConnectionRequestInfo connectionDefaults = new OtfeedConnectionRequestInfo();
098
099 public String getDefaultUsername() {
100 return connectionDefaults.getUsername();
101 }
102
103 public void setDefaultUsername(String val) {
104 connectionDefaults.setUsername(val);
105 }
106
107 public String getDefaultPassword() {
108 return connectionDefaults.getPassword();
109 }
110
111 public void setDefaultPassword(String val) {
112 connectionDefaults.setPassword(val);
113 }
114
115 public String getDefaultHostsString() {
116 return connectionDefaults.getHostsString();
117 }
118
119 public void setDefaultHostsString(String address) {
120 connectionDefaults.setHostsString(address);
121 }
122
123 public Long getDefaultHeartbeatInterval() {
124 return connectionDefaults.getHeartbeatInterval();
125 }
126
127 public void setDefaultHeartbeatInterval(Long val) {
128 connectionDefaults.setHeartbeatInterval(val);
129 }
130
131 public String toString() {
132 return getClass().getSimpleName() + "{"
133 + "connectionDefaults=" + connectionDefaults
134 + "}";
135 }
136 }