SGF-476 - Implement ServerLauncherCacheProvider to launch Geode with Spring.

Geode has removed the direct dependency on spring data gemfire in favor
of using a ServiceLoader to allow overriding the behavior of geode's server
launcher start behavior. Implementing the ServerLauncherCacheProvider
interface to allow SDG to override the server launcher behavior to parse
a spring xml file, if present.

(cherry picked from commit 4272216552d3404922a50c8cba7492b9893d1f8d)
Signed-off-by: John Blum <jblum@pivotal.io>
This commit is contained in:
Dan Smith
2016-02-29 18:08:19 -08:00
committed by John Blum
parent fe4527a45a
commit b02abf2c1e
5 changed files with 292 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
/*
* Copyright 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.data.gemfire.support;
import java.util.Collections;
import java.util.Properties;
import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.distributed.ServerLauncher;
import com.gemstone.gemfire.distributed.ServerLauncher.Builder;
import com.gemstone.gemfire.distributed.internal.DistributionConfig;
import com.gemstone.gemfire.internal.util.CollectionUtils;
import com.gemstone.gemfire.distributed.ServerLauncherCacheProvider;
/**
* The SpringServerLauncherCacheProvider class is overrides the default behavior
* of GemFire's ServerLauncher to bootstrap the cache using a Spring
* ApplicationContext instead of a GemFire cache.xml inside a GemFire Server
* JVM-based process. This enables a GemFire Cache Server resources to be
* configured with Spring Data GemFire's XML namespace.
*
* Unlike {@link SpringContextBootstrappingInitializer}, this allows the configuration
* of the cache to specified in the Spring Context.
*
* To use this cache provider, ensure that the spring data gemfire jars are on
* the classpath of the GemFire server and specify the --spring-xml-location
* option from the command line or call {@link Builder#setSpringXmlLocation(String)}
* when launching the GemFire server.
*
* @author Dan Smith
* @see ServerLauncherCacheProvider
* @see SpringContextBootstrappingInitializer
* @see org.springframework.context.ApplicationContext
* @see org.springframework.context.ApplicationListener
* @see org.springframework.context.ConfigurableApplicationContext
* @see org.springframework.context.annotation.
* AnnotationConfigApplicationContext
* @see org.springframework.context.event.ApplicationContextEvent
* @see org.springframework.context.event.ApplicationEventMulticaster
* @see org.springframework.context.support.ClassPathXmlApplicationContext
* @see com.gemstone.gemfire.cache.Declarable
* @link http://gemfire.docs.pivotal.io/latest/userguide/index.html#basic_config
* /the_cache/setting_cache_initializer.html
*/
public class SpringServerLauncherCacheProvider implements ServerLauncherCacheProvider {
@Override
public Cache createCache(Properties gemfireProperties, ServerLauncher serverLauncher) {
if (!serverLauncher.isSpringXmlLocationSpecified()) {
return null;
}
System.setProperty(DistributionConfig.GEMFIRE_PREFIX + DistributionConfig.NAME_NAME,
serverLauncher.getMemberName());
createSpringContextBootstrappingInitializer().init(CollectionUtils.createProperties(
Collections.singletonMap(SpringContextBootstrappingInitializer.CONTEXT_CONFIG_LOCATIONS_PARAMETER,
serverLauncher.getSpringXmlLocation())));
return SpringContextBootstrappingInitializer.getApplicationContext().getBean(Cache.class);
}
/* Used for testing purposes */
protected SpringContextBootstrappingInitializer createSpringContextBootstrappingInitializer() {
return new SpringContextBootstrappingInitializer();
}
}