/* * Copyright (c) 2008-2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.plugins.metering; import java.io.File; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.model.Stat; import com.emc.storageos.db.client.model.TimeSeriesSerializer; import com.emc.storageos.plugins.common.Constants; public abstract class XMLStatsDumpGenerator { protected Logger _logger = LoggerFactory .getLogger(XMLStatsDumpGenerator.class); /** * Dump Metering Records as XML to disk * * @param <T> * @param record */ @SuppressWarnings("unchecked") public <T extends TimeSeriesSerializer.DataPoint> void dumpRecordstoXML(Map<String, Object> keyMap) { PrintWriter writer = null; try { List<Stat> records = (List<Stat>) keyMap.get(Constants._Stats); Map<String, String> meteringProps = (Map<String, String>) keyMap.get(Constants.PROPS); String location = constructFileName(meteringProps, keyMap); checkAndCreateDirectory(meteringProps.get(Constants.METERINGDUMPLOCATION)); writer = new PrintWriter(new File(location)); XMLMarshaller marshaller = new XMLMarshaller() { @Override public void tailer(PrintWriter writer) { delegatetailer(writer); } @Override public void header(PrintWriter writer) { delegateheader(writer); } }; marshaller.dumpXML(writer, records); } catch (Exception ex) { _logger.error("Dump Failed : ", ex); } finally { writer.close(); } } /** * Verify whether directory already exists or not. * if it is not there create one. * * @param directoryName */ private void checkAndCreateDirectory(final String directoryName) { try { final File dir = new File(directoryName); if (!dir.exists() && dir.mkdirs()) { _logger.debug("Debug dump directory created successfully."); } } catch (Exception ex) { _logger.error("Debug dump directory creation failed due to {}", ex.getMessage()); } } /** * Delegate Header to the corresponding subclass of cassandraInsertion. * * @param writer */ protected abstract void delegateheader(PrintWriter writer); /** * Delegate tailer to the corresponding subclass of CassandraInsertion. * * @param writer */ protected abstract void delegatetailer(PrintWriter writer); /** * Generate Unique key, delegate to subclass of CassandraInsertion. * This uniqueKey is to identify the XML Stats dump file name uniquely. * * @param keyMap * @return */ protected abstract String generateUniqueKey(Map<String, Object> keyMap); /** * Construct an unique fileName for Stats XML Dump * * @return */ private String constructFileName(Map<String, String> meteringProps, Map<String, Object> keyMap) { final StringBuilder dumpFile = new StringBuilder(); dumpFile.append(meteringProps.get(Constants.METERINGDUMPLOCATION).toString()) .append("/") .append(generateUniqueKey(keyMap)) .append(getDateTime()) .append(".xml"); return dumpFile.toString(); } /** * get current Time * * @return String */ private String getDateTime() { SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); Calendar currentDate = Calendar.getInstance(); return formatter.format(currentDate.getTime()); } }