/*******************************************************************************
 * Copyright (c) 2003, 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.wst.server.core.internal;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Properties;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.wst.server.core.IRuntime;
/**
 * Helper class that stores preference information for the server tools.
 * 
 * TODO: Currently this class always reads from disk. It should cache the file
 * and have a resource listener.
 */
public class ProjectProperties {
	private static final String PREFERENCE_FOLDER = ".settings";
	private static final String PREFERENCE_FILE = "org.eclipse.wst.server.core.prefs";
	private static final String SERVER_PROJECT_PREF = "org.eclipse.wst.server.core.isServerProject";

	protected IProject project;

	protected boolean serverProject = false;

	/**
	 * ProjectProperties constructor.
	 * 
	 * @param project a project
	 */
	public ProjectProperties(IProject project) {
		super();
		this.project = project;
	}

	/**
	 * Load the preferences.
	 */
	private void loadPreferences() {
		Trace.trace(Trace.FINEST, "Loading project preferences: " + project);
		
		if (!project.isAccessible())
			return;
		
		InputStream in = null;
		try {
			IFile file = project.getFolder(PREFERENCE_FOLDER).getFile(PREFERENCE_FILE);
			if (file == null || !file.isAccessible())
				return;
			
			in = file.getContents();
			Properties p = new Properties();
			p.load(in);
			
			String s = p.getProperty(SERVER_PROJECT_PREF);
			if (s != null && "true".equals(s))
				serverProject = true;
			else
				serverProject = false;
		} catch (Exception e) {
			Trace.trace(Trace.SEVERE, "Could not load preferences: " + e.getMessage());
		} finally {
			try {
				if (in != null)
					in.close();
			} catch (Exception e) {
				// ignore
			}
		}
	}

	private void savePreferences(IProgressMonitor monitor) throws CoreException {
		if (project == null || !project.isAccessible())
			return;
		
		IFolder folder = project.getFolder(PREFERENCE_FOLDER);
		if (!folder.exists())
			folder.create(true, true, monitor);
		
		IFile file = project.getFolder(PREFERENCE_FOLDER).getFile(PREFERENCE_FILE);
		
		if (file.exists() && file.isReadOnly()) {
			IStatus status = ResourcesPlugin.getWorkspace().validateEdit(new IFile[] { file }, null);
			if (status.getSeverity() == IStatus.ERROR)
				// didn't work or not under source control
				throw new CoreException(status);
		}
		
		Properties p = new Properties();
		p.put("eclipse.preferences.version", "1");
		if (serverProject)
			p.put(SERVER_PROJECT_PREF, "true");
		else
			p.put(SERVER_PROJECT_PREF, "false");
		
		InputStream in = null;
		try {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			p.store(out, null);
		
			in = new ByteArrayInputStream(out.toByteArray());
			
			if (file.exists())
				file.setContents(in, true, true, monitor);
			else
				file.create(in, true, monitor);
		} catch (Exception e) {
			throw new CoreException(new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, "", e));
		} finally {
			try {
				in.close();
			} catch (Exception e) {
				// ignore
			}
		}
	}

	/**
	 * Returns the current runtime target type for the given project.
	 * 
	 * @return the runtime target
	 */
	public IRuntime getRuntimeTarget() {
		return null;
	}

	/**
	 * Returns <code>true</code> if this project can contain server artifacts, and
	 * <code>false</code> otherwise.
	 * 
	 * @return <code>true</code> if this project can contain server artifacts, and
	 *    <code>false</code> otherwise
	 */
	public boolean isServerProject() {
		loadPreferences();
		return serverProject;
	}

	/**
	 * Sets whether the project can contain server resources.
	 * 
	 * @param b <code>true</code> to allow the project to contain server
	 *    resources, or <code>false</code> to not allow the project to contain
	 *    servers
	 * @param monitor a progress monitor, or <code>null</code> if progress
	 *    reporting and cancellation are not desired
	 * @throws CoreException if there is a problem setting the server project
	 */
	public void setServerProject(boolean b, IProgressMonitor monitor) throws CoreException {
		loadPreferences();
		serverProject = b;
		savePreferences(monitor);
	}

	public String toString() {
		return "ProjectProperties[" + project + "]";
	}
}