/******************************************************************************* * Copyright (c) 2005, 2006 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.internal.resources; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.internal.localstore.HistoryStore2; import org.eclipse.core.internal.localstore.IHistoryStore; import org.eclipse.core.internal.properties.IPropertyManager; import org.eclipse.core.internal.properties.PropertyManager2; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; /** * This is mostly a convenience class for accessing the ResourcesCompatibility class from the * compatibility fragment using reflection. * * See the ResourcesCompatibility class in the compatibility fragment. */ public class ResourcesCompatibilityHelper { private static final String COMPATIBILITY_CLASS = "org.eclipse.core.internal.resources.ResourcesCompatibility"; //$NON-NLS-1$ private static final String CONVERT_HISTORY_STORE = ResourcesPlugin.PI_RESOURCES + ".convertHistory"; //$NON-NLS-1$ private static final String CONVERT_PROPERTY_STORE = ResourcesPlugin.PI_RESOURCES + ".convertProperties"; //$NON-NLS-1$ private static final String ENABLE_NEW_HISTORY_STORE = ResourcesPlugin.PI_RESOURCES + ".newHistory"; //$NON-NLS-1$ private static final String ENABLE_NEW_PROPERTY_STORE = ResourcesPlugin.PI_RESOURCES + ".newProperties"; //$NON-NLS-1$ /** * Creates a history store. Decides which implementation of history store should be chosen, and whether * conversion from the existing state should be performed by looking at some system properties. */ public static IHistoryStore createHistoryStore(IPath location, int limit) { // the default is to use new implementation boolean newImpl = !Boolean.FALSE.toString().equalsIgnoreCase(System.getProperty(ENABLE_NEW_HISTORY_STORE)); // the default is to convert existing state to the new implementation boolean convert = !Boolean.FALSE.toString().equalsIgnoreCase(System.getProperty(CONVERT_HISTORY_STORE)); try { return createHistoryStore(location, limit, newImpl, convert, true); } catch (ClassNotFoundException e) { // fragment not available } catch (NoSuchMethodException e) { // unlikely if (Workspace.DEBUG) e.printStackTrace(); } catch (IllegalAccessException e) { // unlikely if (Workspace.DEBUG) e.printStackTrace(); } catch (InvocationTargetException e) { // got a runtime exception/error Throwable target = e.getTargetException(); if (target instanceof RuntimeException) throw (RuntimeException) target; throw (Error) target; } // default to new version IFileStore store = EFS.getLocalFileSystem().getStore(location); return new HistoryStore2((Workspace) ResourcesPlugin.getWorkspace(), store, limit); } public static IHistoryStore createHistoryStore(IPath location, int limit, boolean newImpl, boolean convert, boolean rename) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { Class clazz = Class.forName(COMPATIBILITY_CLASS); Method createMethod = clazz.getDeclaredMethod("createHistoryStore", new Class[] {IPath.class, int.class, boolean.class, boolean.class, boolean.class}); //$NON-NLS-1$ return (IHistoryStore) createMethod.invoke(null, new Object[] {location, new Integer(limit), Boolean.valueOf(newImpl), Boolean.valueOf(convert), Boolean.valueOf(rename)}); } public static IPropertyManager createPropertyManager(boolean newImpl, boolean convert) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { Class clazz = Class.forName(COMPATIBILITY_CLASS); Method createMethod = clazz.getDeclaredMethod("createPropertyManager", new Class[] {boolean.class, boolean.class}); //$NON-NLS-1$ return (IPropertyManager) createMethod.invoke(null, new Object[] {Boolean.valueOf(newImpl), Boolean.valueOf(convert)}); } /** * Creates a property manager. Decides which implementation of property manager should be chosen, and whether * conversion from the existing state should be performed by looking at some system properties. */ public static IPropertyManager createPropertyManager() { // the default is to use new implementation boolean newImpl = !Boolean.FALSE.toString().equalsIgnoreCase(System.getProperty(ENABLE_NEW_PROPERTY_STORE)); // the default is to convert existing state to the new implementation boolean convert = !Boolean.FALSE.toString().equalsIgnoreCase(System.getProperty(CONVERT_PROPERTY_STORE)); try { return createPropertyManager(newImpl, convert); } catch (ClassNotFoundException e) { // fragment not available } catch (NoSuchMethodException e) { // unlikely if (Workspace.DEBUG) e.printStackTrace(); } catch (IllegalAccessException e) { // unlikely if (Workspace.DEBUG) e.printStackTrace(); } catch (InvocationTargetException e) { // got a runtime exception/error Throwable target = e.getTargetException(); if (target instanceof RuntimeException) throw (RuntimeException) target; throw (Error) target; } // default to new version return new PropertyManager2((Workspace) ResourcesPlugin.getWorkspace()); } }