/*******************************************************************************
 * Copyright (c) 2004, 2007 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.wst.css.core.internal.metamodelimpl;



import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.Vector;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.wst.css.core.internal.Logger;
import org.eclipse.wst.css.core.internal.metamodel.CSSMetaModel;
import org.eclipse.wst.css.core.internal.metamodel.CSSProfile;
import org.osgi.framework.Bundle;



class CSSProfileImpl implements CSSProfile {

	/**
	 * Constructor for CSSMetaModelProfileInfoImpl.
	 */
	private CSSProfileImpl() {
		super();
	}

	/**
	 * Constructor for CSSMetaModelProfileInfoImpl.
	 */
	public CSSProfileImpl(String id, URL url) {
		this();
		fID = id;
		fURL = url;
	}

	/**
	 * Constructor for CSSMetaModelProfileInfoImpl.
	 */
	CSSProfileImpl(String id, URL url, String relativeURI) {
		super();
		fID = id;
		fURL = url;
		fRelativeURI = relativeURI;
	}

	/*
	 * @see CSSMetaModelProfileInfo#getProfileID()
	 */
	public String getProfileID() {
		return fID;
	}

	/*
	 * @see CSSMetaModelProfileInfo#getProfileName()
	 */
	public String getProfileName() {
		return (fName == null) ? fID : fName;
	}

	public CSSMetaModel getMetaModel() {
		if (fMetaModel == null) {
			try {
				InputStream input = getProfileURL().openStream();
				ProfileLoader loader = new ProfileLoader(getResourceBundle(), getLogging());
				fMetaModel = loader.loadProfile(input);
			}
			catch (IOException e) {
				Logger.logException("Cannot open stream for profile", e); //$NON-NLS-1$
			}
		}
		return fMetaModel;
	}

	private ResourceBundle getResourceBundle() {
		ResourceBundle resourceBundle = null;

		Bundle bundle = null;
		String pluginID = getOwnerPluginID();
		if (pluginID != null) {
			bundle = Platform.getBundle(pluginID);
			if (bundle != null) {
				// needed to work around FileLocator.openStream not looking for
				// files with Java naming conventions (BUG103345)
				IPath[] paths = getResourceBundlePaths();
				if (paths != null) {
					InputStream inStream = null;
					int i = 0;
					while (i < paths.length && inStream == null) {
						IPath path = paths[i];
						try {
							inStream = FileLocator.openStream(bundle, path, true);
							if (inStream != null)
								resourceBundle = new PropertyResourceBundle(inStream);
							else
								++i;
						}
						catch (IOException e) {
							// unable to open stream with current path so just
							// try next path
							++i;
						}
						finally {
							if (inStream != null)
								try {
									inStream.close();
								}
								catch (IOException e) {
									Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
								}
						}
					}
				}
			}
		}
		return resourceBundle;
	}

	/**
	 * Returns an array of potential resource bundle paths or null if there
	 * are none
	 * 
	 * @return IPath[] or null
	 */
	private IPath[] getResourceBundlePaths() {
		IPath[] paths = new IPath[0];

		if (fRelativeURI != null) {
			// original path = location of profile.xml - profile.xml
			IPath originalPath = Path.fromOSString(fRelativeURI).removeLastSegments(1);

			String baseName = "cssprofile"; //$NON-NLS-1$ 
			Vector names = calculateBundleNames(baseName, Locale.getDefault());

			int a = 0;
			paths = new IPath[names.size()];
			for (int i = names.size(); i > 0; --i) {
				String bundleName = (String) names.get(i - 1);
				IPath path = originalPath.append(bundleName).addFileExtension("properties"); //$NON-NLS-1$
				paths[a] = path;
				++a;
			}
		}
		return paths;
	}

	/**
	 * Calculate the bundles along the search path from the base bundle to the
	 * bundle specified by baseName and locale.<br />
	 * 
	 * @param baseName
	 *            the base bundle name
	 * @param locale
	 *            the locale
	 * @param names
	 *            the vector used to return the names of the bundles along the
	 *            search path.
	 * 
	 */
	private Vector calculateBundleNames(String baseName, Locale locale) {
	    // this method can be deleted after BUG103345 is fixed
		final Vector result = new Vector(4); // default size 4
		final String language = locale.getLanguage();
		final int languageLength = language.length();
		final String country = locale.getCountry();
		final int countryLength = country.length();
		final String variant = locale.getVariant();
		final int variantLength = variant.length();

		result.addElement(baseName); // at least add base name
		if (languageLength + countryLength + variantLength == 0) {
			// The locale is "", "", "".
			return result;
		}
		final StringBuffer temp = new StringBuffer(baseName);
		temp.append('_');
		temp.append(language);
		if (languageLength > 0) {
			result.addElement(temp.toString());
		}

		if (countryLength + variantLength == 0) {
			return result;
		}
		temp.append('_');
		temp.append(country);
		if (countryLength > 0) {
			result.addElement(temp.toString());
		}

		if (variantLength == 0) {
			return result;
		}
		temp.append('_');
		temp.append(variant);
		result.addElement(temp.toString());

		return result;
	}

	/*
	 * @see CSSMetaModelProfileInfo#getProfileURL()
	 */
	public URL getProfileURL() {
		return fURL;
	}

	void setProfileName(String name) {
		fName = name;
	}

	public boolean isDefault() {
		return fDefault;
	}

	void setDefault(boolean isDefault) {
		fDefault = isDefault;
	}

	public String getOwnerPluginID() {
		return fOwnerPluginID;
	}

	void setOwnerPluginID(String pluginID) {
		fOwnerPluginID = pluginID;
	}

	/**
	 * hidden option : logging
	 */
	void setLogging(boolean logging) {
		fLogging = logging;
	}

	boolean getLogging() {
		return fLogging;
	}


	String fID = null;
	String fName = null;
	URL fURL = null;
	CSSMetaModel fMetaModel = null;
	String fOwnerPluginID = null;
	boolean fDefault = false;
	boolean fLogging = false;
	private String fRelativeURI = null;
}
