package com.thinkbiganalytics.nifi.v2.core.spring;
/*-
* #%L
* thinkbig-nifi-core-service
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* 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.
* #L%
*/
import com.thinkbiganalytics.nifi.core.api.spring.SpringContextService;
import org.apache.nifi.annotation.lifecycle.OnEnabled;
import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.components.Validator;
import org.apache.nifi.controller.AbstractControllerService;
import org.apache.nifi.controller.ConfigurationContext;
import org.apache.nifi.controller.ControllerService;
import org.apache.nifi.processor.Processor;
import org.apache.nifi.reporting.InitializationException;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractRefreshableConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Collections;
import java.util.List;
/**
* Creates a Spring {@link ApplicationContext} that can be reused by other {@link ControllerService} and {@link Processor} objects.
*
* <p><b>NOTE:</b> The context is only valid within the NAR file containing this service.</p>
*/
public class SpringContextLoaderService extends AbstractControllerService implements SpringContextService {
public static final PropertyDescriptor CONFIG_CLASSES = new PropertyDescriptor.Builder()
.name("Configuraton Classes")
.description("A comma-separated list of fully qualified names of java config classes")
.addValidator(Validator.VALID)
.required(false)
.build();
private static final List<PropertyDescriptor> properties;
static {
properties = Collections.singletonList(CONFIG_CLASSES);
}
private volatile AbstractRefreshableConfigApplicationContext context;
@Override
protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
return properties;
}
/**
* Called by the framework to load controller configurations, this method
* will create a spring context
*
* @param context not used in this case
* @throws InitializationException an except thrown if there are any errors
*/
@OnEnabled
public void loadConfiurations(final ConfigurationContext context) throws InitializationException {
try {
this.context = new ClassPathXmlApplicationContext();
this.context.setClassLoader(getClass().getClassLoader());
this.context.setConfigLocation("application-context.xml");
getLogger().info("Refreshing spring context");
this.context.refresh();
getLogger().info("Spring context refreshed");
} catch (BeansException | IllegalStateException e) {
getLogger().error("Failed to load spring configurations", e);
throw new InitializationException(e);
}
}
/* (non-Javadoc)
* @see com.thinkbiganalytics.controller.SpringContextService#getBean(java.lang.Class)
*/
@Override
public <T> T getBean(Class<T> requiredType) throws BeansException {
return this.context.getBean(requiredType);
}
/* (non-Javadoc)
* @see com.thinkbiganalytics.controller.SpringContextService#getBean(java.lang.String, java.lang.Class)
*/
@Override
public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
return this.context.getBean(name, requiredType);
}
}