/** * 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.rdb.query.enhancer; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.util.Iterator; import java.util.logging.Logger; import javax.sql.DataSource; import org.apache.commons.lang.StringUtils; import com.qualogy.qafe.bind.resource.query.Batch; import com.qualogy.qafe.bind.resource.query.Query; import com.qualogy.qafe.bind.resource.query.QueryContainer; import com.qualogy.qafe.business.resource.rdb.RDBDatasource; public class EnhancementManager { public final static Logger logger = Logger.getLogger(EnhancementManager.class.getName()); private static Query enhance(Query query, QueryContainer container, DatabaseMetaData md) { if (StringUtils.isNotBlank(query.getRef())) { Query reference = container.get(query.getRef()); if (reference == null) { throw new EnhancementFailedException( "Referencing to non-existing query, ref=" + query.getRef()); } query.setReference(reference); } else { Enhancer enhancer = EnhancerFactory.create(query); if (enhancer != null) { query = enhancer.enhance(query, md); logger.info("Enhanced query with id [" + query.getId() + "]"); } } return query; } public static QueryContainer enhance(QueryContainer container, RDBDatasource dsResource) { if ((dsResource == null) || (dsResource.getDataSource() == null)) { throw new IllegalArgumentException( "Properties not read correctly or properties are incorrect, loading datasource failed"); } DataSource dataSource = dsResource.getDataSource(); Connection con = null; try { con = dataSource.getConnection(); DatabaseMetaData md = con.getMetaData(); for (Iterator<Query> iter = container.values().iterator(); iter.hasNext();) { Query query = (Query) iter.next(); if (query instanceof Batch) { for (Iterator<Query> iterator = ((Batch) query).getQueries() .iterator(); iterator.hasNext();) { Query batchQuery = (Query) iterator.next(); batchQuery = enhance(batchQuery, container, md); } } else { query = enhance(query, container, md); } container.update(query); } } catch (SQLException e) { String error = e.getMessage() + "[ on source ]" + dsResource.toString(); throw new EnhancementFailedException(error); } finally { if (con != null) { try { con.close(); } catch (SQLException e) { String error = e.getMessage() + "[ on source ]" + dsResource.toString(); throw new EnhancementFailedException(error); } } } return container; } public static Query enhance(Query query, RDBDatasource dsResource) { QueryContainer container = new QueryContainer(); return enhance(container, dsResource).get(query.getId()); } }