/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation 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
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.core.runtime.internal.stats;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.*;

/**
 * BundleStats is used to represent information about loaded bundle. A
 * bundlestats instance represents only one bundle.
 */

public class ResourceBundleStats {
	private String pluginId; // the plugin loading this bundle
	private String fileName; // the filename of the bundle 
	private int keyCount = 0; // number of keys in the bundle
	private int keySize = 0; // size of the keys in the bundle
	private int valueSize = 0; // size of the values in the bundle 
	private long hashSize = 0; // size of the hashtable
	private long fileSize = 0;

	private static int sizeOf(String value) {
		return 44 + (2 * value.length());
	}

	private static int sizeOf(Properties value) {
		return (int) Math.round(44 + (16 + (value.size() * 1.25 * 4)) + (24 * value.size()));
	}

	public ResourceBundleStats(String pluginId, String fileName, URL input) {
		this.pluginId = pluginId;
		this.fileName = fileName;
		initialize(input);
	}

	public ResourceBundleStats(String pluginId, String fileName, ResourceBundle bundle) {
		this.pluginId = pluginId;
		this.fileName = fileName;
		initialize(bundle);
	}

	/**
	 * Compute the size of bundle
	 */
	private void initialize(ResourceBundle bundle) {
		for (Enumeration keys = bundle.getKeys(); keys.hasMoreElements();) {
			String key = (String) keys.nextElement();
			keySize += sizeOf(key);
			valueSize += sizeOf(bundle.getString(key));
			keyCount++;
		}
	}

	/**
	 * Compute the size of stream which represents a property file
	 */
	private void initialize(URL url) {
		InputStream stream = null;
		Properties props = new Properties();
		try {
			try {
				stream = url.openStream();
				fileSize = stream.available();
				props.load(stream);
				for (Iterator iter = props.keySet().iterator(); iter.hasNext();) {
					String key = (String) iter.next();
					keySize += sizeOf(key);
					valueSize += sizeOf(props.getProperty(key));
					keyCount++;
				}
				hashSize = sizeOf(props);
			} finally {
				if (stream != null)
					stream.close();
			}
		} catch (IOException e) {
			// ignore exceptions as they will be handled when the stream 
			// is loaded for real.   See callers.
		}
	}

	public long getHashSize() {
		return hashSize;
	}

	public int getKeyCount() {
		return keyCount;
	}

	public String getPluginId() {
		return pluginId;
	}

	public int getKeySize() {
		return keySize;
	}

	public int getValueSize() {
		return valueSize;
	}

	public long getTotalSize() {
		return keySize + valueSize + hashSize;
	}

	public String getFileName() {
		return fileName;
	}

	public long getFileSize() {
		return fileSize;
	}
}
