/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.tsdr.service.impl; import com.google.common.base.Preconditions; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; import org.opendaylight.tsdr.entity.Metric; import org.opendaylight.tsdr.service.TsdrJpaService; import org.opendaylight.tsdr.spi.model.TSDRConstants; import org.opendaylight.tsdr.spi.util.FormatUtil; import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.DataCategory; import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.storetsdrmetricrecord.input.TSDRMetricRecord; import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.storetsdrmetricrecord.input.TSDRMetricRecordBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * JPA Service implementation helping in performing the * JPA store operations. * * The <code>javax.persistence.EntityManager</code> is injected * using blueprint framework - the definition of which * can be found in resources/blueprint.xml * * @author <a href="mailto:syedbahm@cisco.com">Basheeruddin Ahmed</a> */ public class TsdrJpaServiceImpl implements TsdrJpaService { private EntityManager em; private static final Logger log = LoggerFactory.getLogger(TsdrJpaServiceImpl.class); @Override public void add(Metric metric) { Preconditions.checkArgument(em != null, "EntityManager found to be null"); Preconditions.checkArgument(metric != null,"add metric called with null metric"); try { em.persist(metric); em.flush(); }catch(Exception e){ log.error("TsdrJpaServiceImpl:add", e); } } @Override public void deleteAll() { Preconditions.checkArgument(em != null, "EntityManager found to be null"); try { em.createQuery("delete from Metric").executeUpdate(); em.flush(); }catch(Exception e){ log.error("TsdrJpaServiceImpl:delete", e); } } @Override public List<Metric> getMetricsFilteredByCategory(String category,int maxResults) { Preconditions.checkArgument(em != null, "EntityManager found to be null"); //default to 1000 results if(maxResults <=0){ maxResults = TSDRConstants.MAX_RESULTS_FROM_LIST_METRICS_COMMAND; } StringBuffer sb = new StringBuffer(); sb.append("select * from Metric where metriccategory = '") .append(category.toUpperCase()) .append("' order by metrictimestamp desc LIMIT " + maxResults); log.info("getMetricsFilteredByCategory: query being sent is "+ sb.toString()); Query nativeQuery = em.createNativeQuery(sb.toString(),Metric.class); return nativeQuery.getResultList(); } @Override public List<TSDRMetricRecord> getMetricsFilteredByCategory(String tsdrMetricKey, long startDateTime, long endDateTime) { Preconditions.checkArgument(em != null, "EntityManager found to be null"); log.info("getMetricsFilteredByCateory:called with category={},startDateTime={},endDateTime ={}", tsdrMetricKey, startDateTime, endDateTime); List<TSDRMetricRecord> results = new ArrayList<>(); if(!FormatUtil.isDataCategory(tsdrMetricKey)){ if(!FormatUtil.isValidTSDRKey(tsdrMetricKey)){ log.error("TSDR Metric Key {} is not in the correct format",tsdrMetricKey); return results; } String dataCategory = FormatUtil.getDataCategoryFromTSDRKey(tsdrMetricKey); if(!FormatUtil.isDataCategory(dataCategory)){ log.error("Data Category is unknown {}",dataCategory); return results; } StringBuffer sb = new StringBuffer(); sb.append("select * from Metric where metrictimestamp ") .append("between '") .append(startDateTime) .append("' and '") .append(endDateTime) .append("' and metricdetails = '") .append(tsdrMetricKey) .append("'") .append(" order by metrictimestamp"); log.info("getMetricsFilteredByCategory with start date and end date: query being sent is "+ sb.toString()); Query nativeQuery = em.createNativeQuery(sb.toString(),Metric.class); List<Metric> metrics = nativeQuery.getResultList(); for(Metric m:metrics){ results.add(getTSDRMetricRecord(m)); } return results; }else{ StringBuffer sb = new StringBuffer(); sb.append("select * from Metric where metrictimestamp ") .append("between '") .append(startDateTime) .append("' and '") .append(endDateTime) .append("' and metriccategory = '") .append(tsdrMetricKey.toUpperCase()) .append("'") .append(" order by metrictimestamp desc"); log.info("getMetricsFilteredByCategory with start date and end date: query being sent is "+ sb.toString()); Query nativeQuery = em.createNativeQuery(sb.toString(),Metric.class); List<Metric> metrics = nativeQuery.getResultList(); for(Metric m:metrics){ results.add(getTSDRMetricRecord(m)); } return results; } } private static final TSDRMetricRecord getTSDRMetricRecord(Metric entry){ TSDRMetricRecordBuilder rb = new TSDRMetricRecordBuilder(); rb.setMetricName(entry.getMetricName()); rb.setMetricValue(new BigDecimal(entry.getMetricValue())); rb.setNodeID(entry.getNodeId()); rb.setRecordKeys(FormatUtil.getRecordKeysFromTSDRKey(entry.getMetricDetails())); rb.setTimeStamp(entry.getMetricTimeStamp()); rb.setTSDRDataCategory(DataCategory.valueOf(entry.getMetricCategory())); return rb.build(); } @Override public void close() { try{ em.close(); em.clear(); }catch(Exception e){ log.warn("Exception occurred when closing the persistence store",e); } } @Override public void purge(DataCategory category, long retentionTime) { Preconditions.checkArgument(em != null, "EntityManager found to be null"); try { StringBuffer query = new StringBuffer(); query.append("delete from Metric where metrictimestamp") .append(" <= '") .append(FormatUtil.getFormattedTimeStamp(new Date(retentionTime).getTime(), FormatUtil.QUERY_TIMESTAMP)) .append("' and metriccategory = '") .append(category.toString()) .append("'"); em.createQuery(query.toString()).executeUpdate(); em.flush(); }catch(Exception e){ log.error("TsdrJpaServiceImpl:purge", e); } } @Override public void purgeAll(long retentionTime) { try { StringBuffer query = new StringBuffer(); query.append("delete from Metric where metrictimestamp") .append(" <= '") .append(FormatUtil.getFormattedTimeStamp(new Date(retentionTime).getTime(), FormatUtil.QUERY_TIMESTAMP)) .append("'"); em.createQuery(query.toString()).executeUpdate(); em.flush(); }catch(Exception e){ log.error("TsdrJpaServiceImpl:purgeAll", e); } } public void setEntityManager(EntityManager em) { this.em = em; } }