/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.resource.adapter.infinispan.hotrod;
import java.util.HashSet;
import javax.resource.ResourceException;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.infinispan.client.hotrod.marshall.ProtoStreamMarshaller;
import org.infinispan.protostream.FileDescriptorSource;
import org.infinispan.protostream.SerializationContext;
import org.infinispan.query.remote.client.ProtobufMetadataManagerConstants;
import org.teiid.core.BundleUtil;
import org.teiid.infinispan.api.ProtobufResource;
import org.teiid.resource.spi.BasicConnectionFactory;
import org.teiid.resource.spi.BasicManagedConnectionFactory;
import org.teiid.translator.TranslatorException;
public class InfinispanManagedConnectionFactory extends BasicManagedConnectionFactory {
public static final BundleUtil UTIL = BundleUtil.getBundleUtil(InfinispanManagedConnectionFactory.class);
private static final long serialVersionUID = -4791974803005018658L;
private String remoteServerList;
private String cacheName;
public String getRemoteServerList() {
return remoteServerList;
}
public void setRemoteServerList(String remoteServerList) {
this.remoteServerList = remoteServerList;
}
public String getCacheName() {
return cacheName;
}
public void setCacheName(String cacheName) {
this.cacheName = cacheName;
}
@Override
public BasicConnectionFactory<InfinispanConnectionImpl> createConnectionFactory()
throws ResourceException {
return new InfinispanConnectionFactory();
}
class InfinispanConnectionFactory extends BasicConnectionFactory<InfinispanConnectionImpl> {
private static final long serialVersionUID = 1064143496037686580L;
private RemoteCacheManager cacheManager;
private HashSet<String> registeredProtoFiles = new HashSet<>();
private SerializationContext ctx;
public InfinispanConnectionFactory() throws ResourceException {
try {
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServers(remoteServerList);
builder.marshaller(new ProtoStreamMarshaller());
// note this object is expensive, so there needs to only one
// instance for the JVM, in this case one per RA instance.
this.cacheManager = new RemoteCacheManager(builder.build());
// register default marshellers
/*
SerializationContext ctx = ProtoStreamMarshaller.getSerializationContext(this.cacheManager);
FileDescriptorSource fds = new FileDescriptorSource();
ctx.registerProtoFiles(fds);
*/
this.cacheManager.start();
this.ctx = ProtoStreamMarshaller.getSerializationContext(this.cacheManager);
} catch (Throwable e) {
throw new ResourceException(e);
}
}
public void registerProtobufFile(ProtobufResource protobuf) throws TranslatorException {
try {
if (protobuf != null && !this.registeredProtoFiles.contains(protobuf.getIdentifier())) {
// client side
this.ctx.registerProtoFiles(FileDescriptorSource.fromString(protobuf.getIdentifier(), protobuf.getContents()));
// server side
RemoteCache<String, String> metadataCache = this.cacheManager
.getCache(ProtobufMetadataManagerConstants.PROTOBUF_METADATA_CACHE_NAME);
if (metadataCache != null && metadataCache.get(protobuf.getIdentifier()) == null) {
metadataCache.put(protobuf.getIdentifier(), protobuf.getContents());
String errors = metadataCache.get(ProtobufMetadataManagerConstants.ERRORS_KEY_SUFFIX);
if (errors != null) {
throw new TranslatorException(InfinispanManagedConnectionFactory.UTIL.getString("proto_error", errors));
}
this.registeredProtoFiles.add(protobuf.getIdentifier());
}
}
} catch(Throwable t) {
throw new TranslatorException(t);
}
}
@Override
public InfinispanConnectionImpl getConnection() throws ResourceException {
return new InfinispanConnectionImpl(this.cacheManager, cacheName,this.ctx, this);
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((remoteServerList == null) ? 0 : remoteServerList.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
InfinispanManagedConnectionFactory other = (InfinispanManagedConnectionFactory) obj;
if (remoteServerList == null) {
if (other.remoteServerList != null)
return false;
} else if (!remoteServerList.equals(other.remoteServerList))
return false;
return true;
}
}