//------------------------------------------------------------------------------ // Copyright (c) 2005, 2008 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 implementation //------------------------------------------------------------------------------ package org.eclipse.epf.library.configuration; import java.util.Collection; import java.util.Iterator; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.epf.library.ILibraryManager; import org.eclipse.epf.library.LibraryService; import org.eclipse.epf.library.LibraryServiceUtil; import org.eclipse.epf.library.events.ILibraryChangeListener; import org.eclipse.epf.uma.ContentCategory; import org.eclipse.epf.uma.MethodConfiguration; import org.eclipse.epf.uma.MethodLibrary; /** * Base class managing configuration data * Current sub class: SuppportingElementData * To do: refactor ConfigurationData to be a sub class of it too. * * @author Weiping Lu - Mar 24, 2008 * @since 1.5 */ public abstract class ConfigDataBase { public static boolean localDebug = false; private static boolean profiling = false; private MethodConfiguration config; private boolean needUpdateChanges = true; private ILibraryManager libraryManager; private Adapter configListener; private ILibraryChangeListener libListener; private boolean enableUpdate = true; private boolean updatingChanges = false; public ConfigDataBase(MethodConfiguration config) { this.config = config; configListener = new AdapterImpl() { public void notifyChanged(Notification msg) { if (isNeedUpdateChanges()) { return; } int type = msg.getEventType(); if ( type == Notification.ADD || type == Notification.ADD_MANY || type == Notification.REMOVE || type == Notification.REMOVE_MANY) { setNeedUpdateChanges(true); } } }; config.eAdapters().add(configListener); libListener = new ILibraryChangeListener() { public void libraryChanged(int option, Collection changedItems) { if (localDebug) { //System.out.println("LD> libraryChanged, option: " + option + ", " + changedItems);//$NON-NLS-1$//$NON-NLS-2$ } handleLibraryChange(option, changedItems); } }; MethodLibrary library = LibraryServiceUtil.getMethodLibrary(config); libraryManager = LibraryService.getInstance().getLibraryManager(library); if(libraryManager != null) { libraryManager.addListener(libListener); } } protected void handleLibraryChange(int option, Collection changedItems) { setNeedUpdateChanges(true); /* if (isNeedUpdateChanges()) { return; } for (Iterator it = changedItems.iterator(); it.hasNext();) { Object item = it.next(); if (item instanceof ContentCategory) { setNeedUpdateChanges(true); return; } }*/ } public void dispose() { config.eAdapters().remove(configListener); libraryManager.removeListener(libListener); } protected boolean isNeedUpdateChanges() { return needUpdateChanges; } public void setNeedUpdateChanges(boolean needUpdateChanges) { this.needUpdateChanges = needUpdateChanges; if (localDebug) { System.out.println("LD> setNeedUpdateChanges: " + needUpdateChanges); //$NON-NLS-1$ } } protected boolean isEnableUpdate() { return enableUpdate; } public void setEnableUpdate(boolean enableUpdate) { this.enableUpdate = enableUpdate; if (localDebug) { System.out.println("LD> setEnableUpdate: " + enableUpdate); //$NON-NLS-1$ } } public MethodConfiguration getConfig() { return config; } public void setConfig(MethodConfiguration config) { this.config = config; } protected void updateChanges() { if (! isEnableUpdate()) { return; } if (! isNeedUpdateChanges()) { return; } if (isUpdatingChanges()) { return; } long t = 0; if (profiling) { System.out.println("LD> updateChanges_() -> " + getType()); //$NON-NLS-1$ t = System.currentTimeMillis(); } if (localDebug) { System.out.println("LD> updateChanges(): " + getType()); //$NON-NLS-1$ } updateChangeImpl(); if (profiling) { t = System.currentTimeMillis() - t; System.out.println("LD> updateChanges_() <- time: " + t + ", " + getType()); //$NON-NLS-1$//$NON-NLS-2$ System.out.println(""); //$NON-NLS-1$ } } protected abstract void updateChangeImpl(); public boolean isUpdatingChanges() { return updatingChanges; } protected void setUpdatingChanges(boolean updatingChanges) { this.updatingChanges = updatingChanges; if (localDebug) { System.out.println("LD> setUpdatingChanges: " + updatingChanges + ", " + getType());//$NON-NLS-1$ //$NON-NLS-2$ } } private String getType() { if (this instanceof SupportingElementData) { return "SupportingElementData"; //$NON-NLS-1$ } return ""; //$NON-NLS-1$ } }