001: /*
002: * Copyright 2004-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.compass.spring;
018:
019: import org.compass.core.Compass;
020: import org.compass.core.CompassSession;
021: import org.compass.core.spi.InternalCompassSession;
022: import org.compass.core.support.session.CompassSessionTransactionalProxy;
023: import org.springframework.beans.BeansException;
024: import org.springframework.beans.factory.FactoryBean;
025: import org.springframework.beans.factory.InitializingBean;
026: import org.springframework.context.ApplicationContext;
027: import org.springframework.context.ApplicationContextAware;
028:
029: /**
030: * A factory for {@link org.compass.core.CompassSession} that creates a special proxied
031: * session which can be used within code that runs within an external transaction (Spring, JTA).
032: * The session can be used without using Compass transaction management code or even without
033: * closing the session.
034: * <p/>
035: * It is optional to set the {@link org.compass.core.Compass} instance that will be used to create
036: * the transactional Compass session. If there is a single Compass instance defined within the spring
037: * application context, it will be automatically used.
038: *
039: * @author kimchy
040: */
041: public class LocalCompassSessionBean implements FactoryBean,
042: InitializingBean, ApplicationContextAware {
043:
044: private ApplicationContext applicationContext;
045:
046: private Compass compass;
047:
048: /**
049: * Transactional aware proxied Compass session
050: */
051: private CompassSession compassSession;
052:
053: public void setApplicationContext(
054: ApplicationContext applicationContext)
055: throws BeansException {
056: this .applicationContext = applicationContext;
057: }
058:
059: /**
060: * If no Compass instance was set, will try to use Spring application context
061: * to get a Compass instance.
062: *
063: * @throws Exception
064: */
065: public void afterPropertiesSet() throws Exception {
066: if (compass == null) {
067: String[] compassesNames = this .applicationContext
068: .getBeanNamesForType(Compass.class);
069: if (compassesNames.length == 1) {
070: compass = (Compass) this .applicationContext
071: .getBean(compassesNames[0]);
072: } else {
073: throw new IllegalArgumentException(
074: "compass instance not set and application context has more than one compass instance");
075: }
076: }
077: compassSession = CompassSessionTransactionalProxy
078: .newProxy(compass);
079: }
080:
081: /**
082: * Sets the Compass instance used to open session. It is optional
083: * to set the Compass instance, since if there is a single instance
084: * defined within the application context, it will be automatically used.
085: *
086: * @param compass The Compass instance to use for openning the session
087: */
088: public void setCompass(Compass compass) {
089: this .compass = compass;
090: }
091:
092: public Object getObject() throws Exception {
093: return compassSession;
094: }
095:
096: public Class getObjectType() {
097: return InternalCompassSession.class;
098: }
099:
100: public boolean isSingleton() {
101: return true;
102: }
103: }
|