/*******************************************************************************
 * Copyright (c) 2008, 2012 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.jdt.internal.launching;

import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.JavaRuntime;
import org.osgi.service.prefs.BackingStoreException;

/**
 * Initializes preferences for the JDT launching plug-in.
 *
 * @since 3.5
 */
public class LaunchingPreferenceInitializer extends AbstractPreferenceInitializer {

	/* (non-Javadoc)
	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
	 */
	@Override
	public void initializeDefaultPreferences() {
		IEclipsePreferences dnode = DefaultScope.INSTANCE.getNode(LaunchingPlugin.ID_PLUGIN);
		if(dnode == null) {
			return;
		}
		dnode.putInt(JavaRuntime.PREF_CONNECT_TIMEOUT, JavaRuntime.DEF_CONNECT_TIMEOUT);
		dnode.put(JavaRuntime.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE, JavaCore.WARNING);
		dnode.putBoolean(JavaRuntime.PREF_ONLY_INCLUDE_EXPORTED_CLASSPATH_ENTRIES, false);
		try {
			dnode.flush();
		} catch (BackingStoreException e) {
			LaunchingPlugin.log(e);
		}
				
		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=255381
		// NOTE: only the pref's default value is initialized to avoid deadlock (we don't set the
		// associated JavaCore options, as this can trigger a job to touch the project (see 
		// bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=260445)
		String launchFilter = "*." + ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION; //$NON-NLS-1$
		dnode = DefaultScope.INSTANCE.getNode(JavaCore.PLUGIN_ID);
		if(dnode == null) {
			return;
		}
		//check to see if another plug-in has contributed to these defaults as well
		//https://bugs.eclipse.org/bugs/show_bug.cgi?id=395366
		String val = dnode.get(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, (String)null);
		if(val != null && !"".equals(val)) { //$NON-NLS-1$
			String[] filters = val.split(","); //$NON-NLS-1$
			StringBuffer buff = new StringBuffer();
			boolean found = false;
			for (int i = 0; i < filters.length; i++) {
				if(launchFilter.equals(val)) {
					found = true;
					break;
				}
				String filter = filters[i].trim();
				buff.append(filter);
				if(i < filters.length-1) {
					buff.append(',');
				}
			}
			if(!found) {
				launchFilter = buff.append(',').append(launchFilter).toString();
				dnode.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, launchFilter);
			}
		}
		else {
			dnode.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, launchFilter);
		}
		
		try {
			dnode.flush();
		} catch (BackingStoreException e) {
			LaunchingPlugin.log(e);
		}
	}
}
