/** * Copyright 2008-2016 Qualogy Solutions B.V. * * 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 com.qualogy.qafe.business.resource.java.spring; import java.io.File; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.lang.StringUtils; import org.springframework.context.support.FileSystemXmlApplicationContext; import com.qualogy.qafe.bind.ValidationException; import com.qualogy.qafe.bind.core.application.ApplicationContext; import com.qualogy.qafe.bind.io.FileLocation; import com.qualogy.qafe.bind.orm.jibx.BindException; import com.qualogy.qafe.bind.resource.SpringBeanResource; import com.qualogy.qafe.bind.resource.SpringContextResource; import com.qualogy.qafe.business.resource.Resource; import com.qualogy.qafe.business.resource.java.ClassInfo; import com.qualogy.qafe.core.QafeApplicationContext; import com.qualogy.qafe.core.QafeConfigurationManager; public class SpringContext extends Resource { private org.springframework.context.ApplicationContext springContext; private Map<String, String> beanNames = new HashMap<String, String>(); public SpringContext(SpringContextResource resource) { super(resource); } @Override public void init(ApplicationContext context) { SpringContextResource springContextResource = (SpringContextResource) getBindResource(); if (springContextResource.isUseWebConfig()) { springContext = getWebSpringContext(); if (springContext == null) { throw new ValidationException("Not able to get spring context from web.xml file."); } } else { springContext = getQafeSpringContext(context, springContextResource); } List<SpringBeanResource> beanList = springContextResource.getBeans(); for (SpringBeanResource bean : beanList) { beanNames.put(bean.getId(), bean.getBeanName()); } } private org.springframework.context.ApplicationContext getQafeSpringContext(ApplicationContext context, SpringContextResource springContextResource) { org.springframework.context.ApplicationContext springContext = null; String configFiles = springContextResource.getConfigFiles(); String[] xmlConfigFiles = configFiles.split(","); for (int i = 0; i < xmlConfigFiles.length; i++) { String xmlConfigFile = xmlConfigFiles[i]; if (!xmlConfigFile.startsWith("classpath")) { xmlConfigFiles[i] = resolveXMLConfigFile(context.getRoot(), xmlConfigFile); } Logger.getLogger(this.getClass().getName()).log(Level.INFO, "XMLFile " + xmlConfigFiles[i]); } springContext = new FileSystemXmlApplicationContext(xmlConfigFiles); return springContext; } private org.springframework.context.ApplicationContext getWebSpringContext() { org.springframework.context.ApplicationContext webSpringContext = null; final QafeApplicationContext qafeApplicationContext = QafeApplicationContext.getInstance(); final QafeConfigurationManager contextInitialiser = (QafeConfigurationManager) qafeApplicationContext.getInstance(QafeConfigurationManager.class .getName()); if (contextInitialiser != null) { webSpringContext = contextInitialiser.getSpringContext(); } return webSpringContext; } // CHECKSTYLE.OFF: CyclomaticComplexity public String resolveXMLConfigFile(String root, String xmlConfigFile) { URI uri = null; if (!StringUtils.isEmpty(root) && !root.endsWith("/") && !root.endsWith("\\")) { root += File.separator; } String path = ((root != null) ? root : "") + ((xmlConfigFile != null) ? xmlConfigFile : ""); if (File.separatorChar == '\\') { path = path.replace('\\', '/'); } if (path.startsWith(FileLocation.SCHEME_HTTP + FileLocation.COMMON_SCHEME_DELIM)) { try { URL url = new URL(path); uri = url.toURI(); } catch (MalformedURLException e) { throw new BindException(e); } catch (URISyntaxException e) { throw new BindException(e); } } else if (path.startsWith(FileLocation.SCHEME_FILE)) { try { uri = new URI(path); } catch (URISyntaxException e) { throw new BindException(e); } } else { if (!StringUtils.isEmpty(root) && !root.startsWith("/") && !root.startsWith("\\")) { root = File.separator + root; } File file = StringUtils.isEmpty(root) ? new File(((xmlConfigFile != null) ? xmlConfigFile : "")) : new File(root, ((xmlConfigFile != null) ? xmlConfigFile : "")); uri = file.toURI(); return "file:" + uri.getPath(); } return uri.getPath(); } // CHECKSTYLE.ON: CyclomaticComplexity public Object getBean(String beanRef) { if (beanNames.containsKey(beanRef)) { String beanName = beanNames.get(beanRef); Object bean = springContext.getBean(beanName); return bean; } return null; } protected ClassInfo getBeanInfo(Object bean) { if (bean != null) { ClassInfo beanInfo = ClassInfo.create(bean.getClass()); return beanInfo; } return null; } public Method getMethod(Object bean, String methodName, Class<?>[] parameterClasses) throws NoSuchMethodException { return getBeanInfo(bean).getMethod(methodName, parameterClasses); } @Override public void destroy(ApplicationContext context) { // TODO Auto-generated method stub } @Override public boolean isEqualTo(Resource otherResource) { // TODO Auto-generated method stub return false; } @Override public String toLogString() { // TODO Auto-generated method stub return null; } @Override public void validate() throws ValidationException { if (((SpringContextResource) getBindResource()).getConfigFiles() == null) { throw new ValidationException("config-files must be set for resource type spring"); } } }