crashanalysis/crashanalyser/com.nokia.s60tools.crashanalyser/src/com/nokia/s60tools/crashanalyser/containers/Summary.java
author Jussi Ryoma <ext-jussi.s.ryoma@nokia.com>
Tue, 24 Aug 2010 14:01:48 +0300
changeset 16 72f198be1c1d
parent 4 615035072f7e
permissions -rw-r--r--
Crash Analyser Carbide Extension 1.4.0

/*
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/

package com.nokia.s60tools.crashanalyser.containers;

import java.io.BufferedWriter;
import java.io.IOException;
import java.util.*;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import com.nokia.s60tools.crashanalyser.model.XmlUtils;

/**
 * This class contains basic information about a crash such as
 * crash date and time, product version etc. 
 *
 */
public final class Summary {
	
	// XML tags
	public static final String TAG_SEG_HEADER = "seg_header";
	public static final String TAG_DATE = "date";
	public static final String TAG_TIME = "time";
	public static final String TAG_UPTIME = "uptime";
	public static final String TAG_CRASH_SOURCE = "crash_source";
	public static final String TAG_SEG_HW_INFO = "seg_hw_info";
	public static final String TAG_VERSION = "version_text";
	public static final String TAG_VERSIONS = "version_text_list";
	public static final String TAG_PRODUCT_TYPE = "product_type";
	public static final String TAG_PRODUCT_CODE = "product_code";
	public static final String TAG_SERIAL_NUMBER = "serial_number";
	public static final String TAG_PRODUCTION_MODE = "production_mode";
	public static final String TAG_SEG_SW_INFO = "seg_sw_info";
	public static final String TAG_LANGUAGE = "language";
	public static final String TAG_CHECKSUM = "checksum";
	public static final String TAG_IMEI = "imei";
	public static final String TAG_SEG_MEMORY_INFO = "seg_memory_info";
	public static final String TAG_RAM = "ram";
	public static final String TAG_DRIVE = "drive";
	public static final String TAG_FREE = "free";
	
	public static final String FORMAT = "%-15s: %s";

	// Data
	private final String summaryCrashTime;
	private final String summaryCrashDate;
	private final String summaryUpTime;
	private final String[] summarySwVersion;
	private final String summaryLanguage;
	private final String summaryRomId;
	private final String[] summaryHwVersion;
	private final String summaryProductType;
	private final String summaryProductCode;
	private final String summarySerialNumber;
	private final String summaryImei;
	private final String summaryFreeRam;
	private final String summaryFreeDisk;
	private final String summaryProductionMode;
	private final String summaryCrashSource;
	
	private Summary(final String crashTime, final String crashDate, final String upTime, final String[] swVersion, final String language,
					final String romId, final String[] hwVersion, final String productType, final String productCode, 
					final String serialNumber, final String productionMode, final String crashSource, final String imei, final String freeRam, final String freeDisk) {
		summaryCrashTime = crashTime;
		summaryCrashDate = crashDate;
		summaryUpTime = upTime;
		summarySwVersion = swVersion.clone();
		summaryLanguage = language;
		summaryRomId = romId;
		summaryHwVersion = hwVersion.clone();
		summaryProductType = productType;
		summaryProductCode = productCode;
		summarySerialNumber = serialNumber;
		summaryImei = imei;
		summaryFreeRam = freeRam;
		summaryFreeDisk = freeDisk;
		summaryProductionMode = productionMode;
		summaryCrashSource = crashSource;
	}
	
	/**
	 * Writes summary data into given buffer (i.e. text file)
	 * @param out
	 * @throws IOException
	 */
	public void writeTo(final BufferedWriter out) throws IOException {
		writeLine(out, "Crash Time", summaryCrashTime);
		writeLine(out, "Crash Date", summaryCrashDate);
		writeLine(out, "Up Time", summaryUpTime);
		if (summarySwVersion != null && summarySwVersion.length > 0) {
			for (int i = 0; i < summarySwVersion.length; i++) {
				writeLine(out, "SW Version", summarySwVersion[i]);
			}
		}
		writeLine(out, "Language", summaryLanguage);
		writeLine(out, "Rom Id", summaryRomId);
		if (summaryHwVersion != null && summaryHwVersion.length > 0) {
			for (int i = 0; i < summaryHwVersion.length; i++) {
				writeLine(out, "HW Version", summaryHwVersion[i]);
			}
		}
		writeLine(out, "Product Type", summaryProductType);
		writeLine(out, "Product Code", summaryProductCode);
		writeLine(out, "Serial Number", summarySerialNumber);
		writeLine(out, "Imei", summaryImei);
		writeLine(out, "Free Ram", summaryFreeRam);
		writeLine(out, "Free Disk Space", summaryFreeDisk);
		writeLine(out, "Production Mode", summaryProductionMode);
		writeLine(out, "Crash Source", summaryCrashSource);
	}
	
	void writeLine(final BufferedWriter out, final String header, final String value) throws IOException {
		if (!"".equals(value)) {
			out.write(String.format(FORMAT, header, value));
			out.newLine();
		}
	}
	
	/**
	 * Reads and creates summary data from given root xml element
	 * @param rootElement
	 * @return created summary data or null
	 */
	public static Summary read(final Element rootElement) {
		try {
			String crashTime = "";
			String crashDate = "";
			String upTime = "";
			String crashSource = "";
			
			// read data under seg_header node
			final NodeList segHeader = rootElement.getElementsByTagName(TAG_SEG_HEADER);
			if (segHeader != null && segHeader.getLength() > 0) {
				// read crash time
				crashTime = XmlUtils.getTextValue((Element)segHeader.item(0), TAG_TIME);
				if (crashTime == null) {
					crashTime = "";
				} else if (!crashTime.contains(":") && crashTime.length() == 6){
					final String time = crashTime.substring(0, 2) + ":" +
								  crashTime.substring(2, 4) + ":" +
								  crashTime.substring(4, 6);
					crashTime = time;
				}
				
				// read crashdate
				crashDate = XmlUtils.getTextValue((Element)segHeader.item(0), TAG_DATE);
				if (crashDate == null) {
					crashDate = "";
				} else if (crashDate.length() == 8) {
					final String date = crashDate.substring(0,4) + "-" + 
									crashDate.substring(4,6) + "-" +
									crashDate.substring(6,8);
					crashDate = date;
				}
				
				// read uptime
				upTime = XmlUtils.getTextValue((Element)segHeader.item(0), TAG_UPTIME);
				if (upTime == null) {
					upTime = "";
				} else {
					upTime = convertUpTime(upTime);
				}
				
				// read crash source
				crashSource = XmlUtils.getTextValue((Element)segHeader.item(0), TAG_CRASH_SOURCE);
				if(crashSource == null)
					crashSource = "";
			}
			
			final List<String> hwVersions = new ArrayList<String>();
			String productType = "";
			String productCode = "";
			String serialNumber = "";
			String productionMode = "";
			
			// read data under seg_hw_info node
			final NodeList segHwInfo = rootElement.getElementsByTagName(TAG_SEG_HW_INFO);
			if (segHwInfo != null && segHwInfo.getLength() > 0) {

				// read all versions
				final NodeList versions = ((Element)segHwInfo.item(0)).getElementsByTagName(TAG_VERSION);
				if (versions != null && versions.getLength() > 0) {
					for (int i = 0; i < versions.getLength(); i++) {
						// read sw version
						final String version = XmlUtils.getNodeValue(versions.item(i));
						if (version != null)
							hwVersions.add(version);
					}
				}
				
				// read product type
				productType = XmlUtils.getTextValue((Element)segHwInfo.item(0), TAG_PRODUCT_TYPE);
				if (productType == null)
					productType = "";
				
				// read product code
				productCode = XmlUtils.getTextValue((Element)segHwInfo.item(0), TAG_PRODUCT_CODE);
				if (productCode == null)
					productCode = "";
				
				// read serial number
				serialNumber = XmlUtils.getTextValue((Element)segHwInfo.item(0), TAG_SERIAL_NUMBER);
				if (serialNumber == null)
					serialNumber = "";

				// read production mode
				productionMode = XmlUtils.getTextValue((Element)segHwInfo.item(0), TAG_PRODUCTION_MODE);
				if (productionMode == null)
					productionMode = "";
			}
			
			final List<String> swVersions = new ArrayList<String>();
			String language = "";
			String romId = "";
			
			// read data under seg_sw_info node
			final NodeList segSwInfo = rootElement.getElementsByTagName(TAG_SEG_SW_INFO);
			if (segSwInfo != null && segSwInfo.getLength() > 0) {

				// read all versions
				final NodeList versions = ((Element)segSwInfo.item(0)).getElementsByTagName(TAG_VERSION);
				if (versions != null && versions.getLength() > 0) {
					for (int i = 0; i < versions.getLength(); i++) {
						// read sw version
						final String version = XmlUtils.getNodeValue(versions.item(i));
						if (version != null)
							swVersions.add(version);
					}
				}
				
				// read language
				language = XmlUtils.getTextValue((Element)segSwInfo.item(0), TAG_LANGUAGE);
				if (language == null)
					language = "";
				
				// read rom id
				romId = XmlUtils.getTextValue((Element)segSwInfo.item(0), TAG_CHECKSUM);
				if (romId == null)
					romId = "";
			}
			
			String imei = "";
			// read imei value
			final NodeList imeiNode = rootElement.getElementsByTagName(TAG_IMEI);
			if (imeiNode != null && imeiNode.getLength() > 0) {
				imei = imeiNode.item(0).getFirstChild().getNodeValue();
			}
			
			String freeRamAmount = "";
			String freeDiskSpace = "";
			
			// read free ram amount
			final NodeList segMemoryInfo = rootElement.getElementsByTagName(TAG_SEG_MEMORY_INFO);
			if (segMemoryInfo != null && segMemoryInfo.getLength() > 0) {
				final NodeList ram = ((Element)segMemoryInfo.item(0)).getElementsByTagName(TAG_RAM);
				if (ram != null && ram.getLength() > 0) {
					freeRamAmount = XmlUtils.getTextValue((Element)ram.item(0), TAG_FREE);
					if (freeRamAmount == null)
						freeRamAmount = "";
				}
				final NodeList drive = ((Element)segMemoryInfo.item(0)).getElementsByTagName(TAG_DRIVE);
				if (drive != null && drive.getLength() > 0) {
					freeDiskSpace = XmlUtils.getTextValue((Element)drive.item(0), TAG_FREE);
					if (freeDiskSpace == null)
						freeDiskSpace = "";
				}
			}
			
			return new Summary(crashTime, crashDate, upTime, swVersions.toArray(new String[swVersions.size()]), 
								language, romId, hwVersions.toArray(new String[hwVersions.size()]), productType, 
								productCode, serialNumber, productionMode, crashSource, imei, freeRamAmount, freeDiskSpace);
		} catch (Exception e) {
			return null;
		}
	}
	
	public String getCrashTime() {
		return summaryCrashTime;
	}
	
	public String getCrashDate() {
		return summaryCrashDate;
	}
	
	public String getUpTime() {
		return summaryUpTime;
	}
	
	public String getRomId() {
		return summaryRomId;
	}
	
	public String[] getSwVersion() {
		return summarySwVersion.clone();
	}
	
	public String[] getHwVersion() {
		return summaryHwVersion.clone();
	}
	
	public String getProductType() {
		return summaryProductType;
	}
	
	public String getProductCode() {
		return summaryProductCode;
	}
	
	public String getLanguage() {
		return summaryLanguage;
	}
	
	public String getSerialNumber() {
		return summarySerialNumber;
	}
	
	public String getImei() {
		return summaryImei;
	}
	
	public String getFreeRam() {
		return summaryFreeRam;
	}

	public String getFreeDisk() {
		return summaryFreeDisk;
	}

	public String getProductionMode() {
		return summaryProductionMode;
	}
	
	public String getCrashSource() {
		return summaryCrashSource;
	}

	
	static String convertUpTime(final String uptime) {
		try {
			final int secs =Integer.valueOf(uptime); 
			final int hours =  secs / 3600,
			remainder = secs % 3600,
			minutes = remainder / 60,
			seconds = remainder % 60;
	
			return ( (hours < 10 ? "0" : "") + hours
			+ ":" + (minutes < 10 ? "0" : "") + minutes
			+ ":" + (seconds< 10 ? "0" : "") + seconds );
		} catch (Exception e) {
			return uptime;
		}
	}
}