/*
* Copyright 2015-2016 the original author or authors.
*
* Licensed 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.springframework.integration.file.remote.session;
import java.util.Map;
import org.springframework.messaging.Message;
import org.springframework.util.Assert;
/**
* {@link SessionFactory} that delegates to a {@link SessionFactory} retrieved from a
* {@link SessionFactoryLocator}.
*
* @author Gary Russell
* @since 4.2
*
*/
public class DelegatingSessionFactory<F> implements SessionFactory<F> {
private final SessionFactoryLocator<F> factoryLocator;
private final ThreadLocal<Object> threadKey = new ThreadLocal<Object>();
/**
* Construct an instance with a {@link DefaultSessionFactoryLocator} using the
* supplied factories and default key.
* @param factories the factories.
* @param defaultFactory the default to use if the lookup fails.
*/
public DelegatingSessionFactory(Map<Object, SessionFactory<F>> factories, SessionFactory<F> defaultFactory) {
this(new DefaultSessionFactoryLocator<F>(factories, defaultFactory));
}
/**
* Construct an instance using the supplied factory.
* @param factoryLocator the factory.
*/
public DelegatingSessionFactory(SessionFactoryLocator<F> factoryLocator) {
Assert.notNull(factoryLocator, "'factoryFactory' cannot be null");
this.factoryLocator = factoryLocator;
}
/**
* Return this factory's locator.
* @return the locator.
*/
public SessionFactoryLocator<F> getFactoryLocator() {
return this.factoryLocator;
}
/**
* Set a key to be used for {@link #getSession()} on this thread.
* @param key the key.
*/
public void setThreadKey(Object key) {
this.threadKey.set(key);
}
/**
* Clear the key for this thread.
*/
public void clearThreadKey() {
this.threadKey.remove();
}
/**
* Messaging-friendly version of {@link #setThreadKey(Object)} that can be invoked from
* a service activator.
* @param message the message.
* @param key the key.
* @return the message (unchanged).
*/
public Message<?> setThreadKey(Message<?> message, Object key) {
this.threadKey.set(key);
return message;
}
/**
* Messaging-friendly version of {@link #clearThreadKey()} that can be invoked from
* a service activator.
* @param message the message.
* @return the message (unchanged).
*/
public Message<?> clearThreadKey(Message<?> message) {
this.threadKey.remove();
return message;
}
@Override
public Session<F> getSession() {
return getSession(this.threadKey.get());
}
public Session<F> getSession(Object key) {
SessionFactory<F> sessionFactory = this.factoryLocator.getSessionFactory(key);
Assert.notNull(sessionFactory, "No default SessionFactory configured");
return sessionFactory.getSession();
}
}