/*
* 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.spi.util;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.binary.data.rev160325.storetsdrbinaryrecord.input.TSDRBinaryRecord;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.TSDRLog;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.tsdrlog.RecordAttributes;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.tsdrlog.RecordAttributesBuilder;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.metric.data.rev160325.TSDRMetric;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.DataCategory;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.tsdrrecord.RecordKeys;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.tsdrrecord.RecordKeysBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* This class provides formatting related utilities
*
* @author <a href="mailto:syedbahm@cisco.com">Basheeruddin Ahmed</a>
* @author <a href="mailto:saichler@gmail.com">Sharon Aicler</a>
* <p>
* Created: May 13, 2015
* Modified: Dec 11, 2015
*/
public class FormatUtil {
public static final String QUERY_TIMESTAMP = "yyyy-MM-dd HH:mm:ss";
private static final Logger log = LoggerFactory.getLogger(FormatUtil.class);
public static final String COMMAND_OUT_TIMESTAMP = "MM/dd/yyyy HH:mm:ss";
public static final String KEY_NODEID = "[NID=";
public static final String KEY_CATEGORY = "[DC=";
public static final String KEY_METRICNAME = "[MN=";
public static final String KEY_RECORDKEYS = "[RK=";
public static final String KEY_TIMESTAMP = "[TS=";
public static final String KEY_RECORD_ATTRIBUTES = "[RA=";
private static final Set<String> dataCategoryStrings = new HashSet<>();
static {
for(DataCategory c:DataCategory.values()){
dataCategoryStrings.add(c.name());
}
}
public static boolean isDataCategory(String str){
return dataCategoryStrings.contains(str);
}
/**
* Check if the tsdrKey is a valid tsdrKey and only contains DC section.
* @param tsdrKey
* @return
*/
public static boolean isDataCategoryKey(String tsdrKey){
if (isValidTSDRKey(tsdrKey)){
/* if it's a valid metircs key,
* getNodeId, getMetriName, getRecordKeys, and getDataCategory from the tsdrkey
* would not be null.
*/
if (getNodeIdFromTSDRKey(tsdrKey).length() == 0
&& getMetriNameFromTSDRKey(tsdrKey).length() == 0
&& getRecordKeysFromTSDRKey(tsdrKey).size() == 0
&& getDataCategoryFromTSDRKey(tsdrKey).length() != 0){
return true;
}else{
return false;
}
}else if (isValidTSDRLogKey(tsdrKey)){
/* if it's valid log key,
* getNodeId, getRecordKeys, and getDataCategory from the tsdrKey
* would not be null.
*/
if (getNodeIdFromTSDRKey(tsdrKey).length() == 0
&& getRecordKeysFromTSDRKey(tsdrKey).size() == 0
&& getDataCategoryFromTSDRKey(tsdrKey).length() != 0){
return true;
}else{
return false;
}
}else{//not a valid tsdrkey
return false;
}
}
public static String getFormattedTimeStamp(long timestamp, String formatString) {
Date date = new Date(timestamp);
DateFormat formatter = new SimpleDateFormat(formatString, Locale.US);
return (formatter.format(date));
}
public static String getTSDRLogKeyWithTimeStamp(TSDRLog m){
StringBuilder sb = new StringBuilder(getTSDRLogKey(m));
sb.append(KEY_TIMESTAMP);
sb.append(m.getTimeStamp());
sb.append("]");
return sb.toString();
}
public static String getTSDRLogKey(TSDRLog m){
StringBuilder sb = new StringBuilder();
sb.append(KEY_NODEID);
if(m.getNodeID()!=null)
sb.append(m.getNodeID());
sb.append("]");
sb.append(KEY_CATEGORY);
if(m.getTSDRDataCategory()!=null)
sb.append(m.getTSDRDataCategory().name());
sb.append("]");
sb.append(KEY_RECORDKEYS);
if(m.getRecordKeys()!=null){
boolean isFirst = true;
for(RecordKeys rec:m.getRecordKeys()){
if(!isFirst)
sb.append(",");
if(rec.getKeyName()!=null)
sb.append(rec.getKeyName());
sb.append(":");
if(rec.getKeyValue()!=null)
sb.append(rec.getKeyValue());
isFirst = false;
}
}
sb.append("]");
return sb.toString();
}
public static String getTSDRBinaryKey(TSDRBinaryRecord m){
StringBuilder sb = new StringBuilder();
sb.append(KEY_NODEID);
if(m.getNodeID()!=null)
sb.append(m.getNodeID());
sb.append("]");
sb.append(KEY_CATEGORY);
if(m.getTSDRDataCategory()!=null)
sb.append(m.getTSDRDataCategory().name());
sb.append("]");
sb.append(KEY_RECORDKEYS);
if(m.getRecordKeys()!=null){
boolean isFirst = true;
for(RecordKeys rec:m.getRecordKeys()){
if(!isFirst)
sb.append(",");
if(rec.getKeyName()!=null)
sb.append(rec.getKeyName());
sb.append(":");
if(rec.getKeyValue()!=null)
sb.append(rec.getKeyValue());
isFirst = false;
}
}
sb.append("]");
return sb.toString();
}
public final static boolean isValidTSDRKey(String str){
if(getDataCategoryFromTSDRKey(str)==null) {
return false;
}
if(getMetriNameFromTSDRKey(str)==null){
return false;
}
if(getNodeIdFromTSDRKey(str)==null){
return false;
}
if(getRecordKeysFromTSDRKey(str)==null){
return false;
}
return true;
}
public final static boolean isValidTSDRLogKey(String str){
if(getDataCategoryFromTSDRKey(str)==null) {
return false;
}
if(getNodeIdFromTSDRKey(str)==null){
return false;
}
if(getRecordKeysFromTSDRKey(str)==null){
return false;
}
return true;
}
public final static String getDataCategoryFromTSDRKey(String tsdrKey){
int index1 = tsdrKey.indexOf(KEY_CATEGORY);
if(index1==-1){
return null;
}
int index2 = tsdrKey.indexOf("]",index1);
return tsdrKey.substring(index1+KEY_CATEGORY.length(),index2);
}
public final static Long getTimeStampFromTSDRKey(String tsdrKey){
int index1 = tsdrKey.indexOf(KEY_TIMESTAMP);
if(index1==-1){
return null;
}
int index2 = tsdrKey.indexOf("]",index1);
if(index2==-1){
return null;
}
return Long.parseLong(tsdrKey.substring(index1+KEY_TIMESTAMP.length(),index2));
}
public final static String getMetriNameFromTSDRKey(String tsdrKey){
int index1 = tsdrKey.indexOf(KEY_METRICNAME);
if(index1==-1){
return null;
}
int index2 = tsdrKey.indexOf("]",index1);
return tsdrKey.substring(index1+KEY_METRICNAME.length(),index2);
}
public final static String getNodeIdFromTSDRKey(String tsdrKey){
int index1 = tsdrKey.indexOf(KEY_NODEID);
if(index1==-1){
return null;
}
int index2 = tsdrKey.indexOf("]",index1);
return tsdrKey.substring(index1+KEY_NODEID.length(),index2);
}
public final static List<RecordKeys> getRecordKeysFromTSDRKey(String tsdrKey){
int index1 = tsdrKey.indexOf(KEY_RECORDKEYS);
if(index1==-1){
return null;
}
int index2 = tsdrKey.indexOf("]",index1);
String recs = tsdrKey.substring(index1+KEY_RECORDKEYS.length(),index2);
StringTokenizer tokens = new StringTokenizer(recs,",");
List<RecordKeys> result = new ArrayList<>();
while(tokens.hasMoreTokens()){
String recKey = tokens.nextToken();
int index3 = recKey.indexOf(":");
RecordKeysBuilder rb = new RecordKeysBuilder();
if(index3==-1){
rb.setKeyName(recKey);
rb.setKeyValue(recKey);
}else{
rb.setKeyName(recKey.substring(0,index3));
rb.setKeyValue(recKey.substring(index3+1));
}
result.add(rb.build());
}
return result;
}
public final static List<RecordAttributes> getRecordAttributesFromTSDRKey(String tsdrKey){
int index1 = tsdrKey.indexOf(KEY_RECORD_ATTRIBUTES);
if(index1==-1){
return null;
}
int index2 = tsdrKey.indexOf("]",index1);
String recs = tsdrKey.substring(index1+KEY_RECORD_ATTRIBUTES.length(),index2);
StringTokenizer tokens = new StringTokenizer(recs,",");
List<RecordAttributes> result = new ArrayList<>();
while(tokens.hasMoreTokens()){
String recKey = tokens.nextToken();
int index3 = recKey.indexOf(":");
RecordAttributesBuilder rb = new RecordAttributesBuilder();
if(index3==-1){
rb.setName(recKey);
rb.setValue(recKey);
}else{
rb.setName(recKey.substring(0,index3));
rb.setValue(recKey.substring(index3+1));
}
result.add(rb.build());
}
return result;
}
public final static String getTSDRMetricKeyWithTimeStamp(TSDRMetric m){
StringBuilder sb = new StringBuilder(getTSDRMetricKey(m));
sb.append(KEY_TIMESTAMP);
sb.append(m.getTimeStamp());
sb.append("]");
return sb.toString();
}
public final static String getTSDRLogKeyWithRecordAttributes(TSDRLog l){
StringBuilder sb = new StringBuilder(getTSDRLogKey(l));
sb.append(KEY_RECORD_ATTRIBUTES);
if(l.getRecordAttributes()!=null){
boolean isFirst = true;
for(RecordAttributes rec:l.getRecordAttributes()){
if(!isFirst)
sb.append(",");
if(rec.getName()!=null && rec.getValue()!=null) {
if(rec.getName().equals(rec.getValue())){
sb.append(rec.getName());
}else {
sb.append(rec.getName());
sb.append(":");
sb.append(rec.getValue());
}
}
isFirst = false;
}
}
sb.append("]");
return sb.toString();
}
public final static String getTSDRMetricKey(TSDRMetric m){
StringBuilder sb = new StringBuilder();
sb.append(KEY_NODEID);
if(m.getNodeID()!=null)
sb.append(m.getNodeID());
sb.append("]");
sb.append(KEY_CATEGORY);
if(m.getTSDRDataCategory()!=null)
sb.append(m.getTSDRDataCategory());
sb.append("]");
sb.append(KEY_METRICNAME);
if(m.getMetricName()!=null)
sb.append(m.getMetricName());
sb.append("]");
sb.append(KEY_RECORDKEYS);
if(m.getRecordKeys()!=null){
boolean isFirst = true;
for(RecordKeys rec:m.getRecordKeys()){
if(!isFirst)
sb.append(",");
if(rec.getKeyName()!=null && rec.getKeyValue()!=null) {
if(rec.getKeyName().equals(rec.getKeyValue())){
sb.append(rec.getKeyName());
}else {
sb.append(rec.getKeyName());
sb.append(":");
sb.append(rec.getKeyValue());
}
}
isFirst = false;
}
}
sb.append("]");
return sb.toString();
}
public static final BigDecimal toMetricValue(Counter32 counter32){
if(counter32!=null)
return new BigDecimal(counter32.getValue());
return BigDecimal.ZERO;
}
public static final BigDecimal toMetricValue(Counter64 counter64){
if(counter64!=null)
return new BigDecimal(counter64.getValue());
return BigDecimal.ZERO;
}
public static final BigDecimal toMetricValue(BigInteger bigInteger){
if(bigInteger!=null)
return new BigDecimal(bigInteger);
return BigDecimal.ZERO;
}
public static String getFixedFormatString(String value,long length){
return String.format("%1$"+length+"s",value);
}
}