blob: f39e50e6d5eb56e2c81cba6d674e5b6874be5cd9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.cache.jta.jndi;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Map;
import javax.cache.configuration.Factory;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.transaction.TransactionManager;
import org.apache.ignite.IgniteException;
import org.apache.ignite.internal.util.typedef.internal.U;
/**
* Implementation of {@code Factory<TransactionManager>} interface that is using JNDI names to find TM.
* <p>
* Note that {@link #create()} method iterates by JNDI names and returns the first found
* {@link TransactionManager} instance at context.
*/
public class CacheJndiTmFactory implements Factory<TransactionManager> {
/** */
private static final long serialVersionUID = 0;
/** */
private String[] jndiNames;
/** */
private Map<?, ?> environment;
/**
* Creates uninitialized jndi TM lookup.
*/
public CacheJndiTmFactory() {
/* No-op. */
}
/**
* Creates generic TM lookup with given jndi names.
*
* @param jndiNames JNDI names that is used to find TM.
*/
public CacheJndiTmFactory(String... jndiNames) {
this.jndiNames = jndiNames;
}
/**
* Gets a list of JNDI names.
*
* @return List of JNDI names that is used to find TM.
*/
public String[] getJndiNames() {
return jndiNames;
}
/**
* Sets JNDI names used by this TM factory.
*
* @param jndiNames JNDI names that is used to find TM.
*/
public void setJndiNames(String... jndiNames) {
this.jndiNames = jndiNames;
}
/**
* Gets initial context environment map.
*
* @return Initial context environment map.
*/
public Map<?, ?> getInitialContextEnvironment() {
return environment;
}
/**
* Sets initial context environment map that will be used
* in {@link InitialContext#InitialContext(Hashtable)} constructor.
*
* @param environment Initial context environment map.
*/
public void setInitialContextEnvironment(Map<?, ?> environment) {
this.environment = environment;
}
/** {@inheritDoc} */
@SuppressWarnings("UseOfObsoleteCollectionType")
@Override public TransactionManager create() {
assert jndiNames != null;
assert jndiNames.length != 0;
InitialContext ctx;
try {
ctx = new InitialContext(environment == null ? null : new Hashtable<>(environment));
}
catch (NamingException e) {
throw new IgniteException("Failed to instantiate InitialContext: " + environment, e);
}
for (String s : jndiNames) {
Object obj;
try {
obj = ctx.lookup(s);
}
catch (NamingException e) {
U.warn(null, "Failed to lookup resourse: " + e);
continue;
}
if (obj != null && obj instanceof TransactionManager)
return (TransactionManager) obj;
}
throw new IgniteException("Failed to lookup TM by: " + Arrays.toString(jndiNames));
}
}