/* * #%L * Service Activity Monitoring :: Server * %% * Copyright (C) 2011 - 2012 Talend Inc. * %% * 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% */ package org.talend.esb.sam.server.ui; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.springframework.jdbc.core.StatementCreatorUtils; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.talend.esb.sam.server.persistence.criterias.Criteria; import org.talend.esb.sam.server.persistence.criterias.DateCriteria; import org.talend.esb.sam.server.persistence.criterias.PatternCriteria; import org.talend.esb.sam.server.persistence.dialects.QueryFilter; /** * Adapter that implements {@link SqlParameterSource} to be used to map HTTP URL * parameters to the SQL parameters. * * @author zubairov */ public class CriteriaAdapter implements SqlParameterSource, QueryFilter { private static final Logger LOG = Logger.getLogger(CriteriaAdapter.class.getName()); private static final String CONSUMER_EVENT_TYPES = "(EI_EVENT_TYPE = 'REQ_OUT' or EI_EVENT_TYPE = 'RESP_IN')"; private static final String PROVIDER_EVENT_TYPES = "(EI_EVENT_TYPE = 'REQ_IN' or EI_EVENT_TYPE = 'RESP_OUT')"; private static final Criteria[] FILTER_CRITERIAS = { new PatternCriteria("transport", "MI_TRANSPORT_TYPE"), new PatternCriteria("port", "MI_PORT_TYPE"), new PatternCriteria("operation", "MI_OPERATION_NAME"), new DateCriteria("timestamp_before", "EI_TIMESTAMP"), new DateCriteria("timestamp_after", "EI_TIMESTAMP"), new DateCriteria("timestamp_on", "EI_TIMESTAMP"), new PatternCriteria("flowID", "MI_FLOW_ID"), new PatternCriteria("consumerIP", "ORIG_IP", CONSUMER_EVENT_TYPES), new PatternCriteria("consumerHost", "ORIG_HOSTNAME", CONSUMER_EVENT_TYPES), new PatternCriteria("providerIP", "ORIG_IP", PROVIDER_EVENT_TYPES), new PatternCriteria("providerHost", "ORIG_HOSTNAME", PROVIDER_EVENT_TYPES) }; private static final String LIMIT_NAME = "limit"; private static final String OFFSET_NAME = "offset"; private final Map<String, Criteria> criterias; private final long offset; private final long limit; /** * Instantiates a new criteria adapter. * * @param offset the offset * @param limit the limit * @param params the CriteriaAdapter params */ public CriteriaAdapter(long offset, long limit, Map<String, String[]> params) { this.offset = offset; this.limit = limit; this.criterias = getCriterias(params); } /** * Reads filter parameters. * * @param params the params * @return the criterias */ private Map<String, Criteria> getCriterias(Map<String, String[]> params) { Map<String, Criteria> result = new HashMap<String, Criteria>(); for (Map.Entry<String, String[]> param : params.entrySet()) { for (Criteria criteria : FILTER_CRITERIAS) { if (criteria.getName().equals(param.getKey())) { try { Criteria[] parsedCriterias = criteria.parseValue(param.getValue()[0]); for (Criteria parsedCriteria : parsedCriterias) { result.put(parsedCriteria.getName(), parsedCriteria); } } catch (Exception e) { // Exception happened during paring LOG.log(Level.SEVERE, "Error parsing parameter " + param.getKey(), e); } break; } } } return result; } /* (non-Javadoc) * @see org.springframework.jdbc.core.namedparam.SqlParameterSource#hasValue(java.lang.String) */ @Override public boolean hasValue(String paramName) { return criterias.containsKey(paramName) || LIMIT_NAME.equals(paramName) || OFFSET_NAME.equals(paramName); } /* (non-Javadoc) * @see org.springframework.jdbc.core.namedparam.SqlParameterSource#getValue(java.lang.String) */ @Override public Object getValue(String paramName) throws IllegalArgumentException { if (!hasValue(paramName)) { throw new IllegalArgumentException("Can't find criteria with name " + paramName); } if (LIMIT_NAME.equals(paramName)) { return limit; } if (OFFSET_NAME.equals(paramName)) { return offset; } return criterias.get(paramName).getValue(); } /* (non-Javadoc) * @see org.springframework.jdbc.core.namedparam.SqlParameterSource#getSqlType(java.lang.String) */ @Override public int getSqlType(String paramName) { if (!hasValue(paramName)) { return TYPE_UNKNOWN; } Object value = getValue(paramName); return StatementCreatorUtils.javaTypeToSqlParameterType(value.getClass()); } /* (non-Javadoc) * @see org.springframework.jdbc.core.namedparam.SqlParameterSource#getTypeName(java.lang.String) */ @Override public String getTypeName(String paramName) { return null; } /* (non-Javadoc) * @see org.talend.esb.sam.server.persistence.dialects.QueryFilter#getWhereClause() */ @Override public String getWhereClause() { StringBuilder result = new StringBuilder(); List<String> names = new ArrayList<String>(criterias.keySet()); Collections.sort(names); for (String key : names) { Criteria criteria = criterias.get(key); if (result.length() > 0) { result.append(" AND "); } result.append('(').append(criteria.getFilterClause()).append(')'); } return result.toString(); } }