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    }