/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ui.internal.activities;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.WeakHashMap;
import java.util.regex.Pattern;

import org.eclipse.core.runtime.Platform;
import org.eclipse.ui.activities.IActivity;
import org.eclipse.ui.activities.IActivityEvent;
import org.eclipse.ui.activities.IActivityManager;
import org.eclipse.ui.activities.IActivityManagerEvent;
import org.eclipse.ui.activities.IActivityManagerListener;
import org.eclipse.ui.activities.IPatternBinding;
import org.eclipse.ui.internal.util.Util;

public final class ActivityManager implements IActivityManager {

	static boolean isActivityDefinitionChildOf(String ancestor, String id, Map activityDefinitionsById) {
		Collection visited = new HashSet();

		while (id != null && !visited.contains(id)) {
			IActivityDefinition activityDefinition = (IActivityDefinition) activityDefinitionsById.get(id);				
			visited.add(id);

			if (activityDefinition != null && Util.equals(id = activityDefinition.getParentId(), ancestor))
				return true;
		}

		return false;
	}	

	private Set activeActivityIds = new HashSet();
	private Map activitiesById = new WeakHashMap();
	private Set activitiesWithListeners = new HashSet();
	private Map activityDefinitionsById = new HashMap();
	private List activityManagerListeners;
	private IActivityRegistry activityRegistry;	
	private Set definedActivityIds = new HashSet();
	private Set enabledActivityIds = new HashSet();	
	private Map patternBindingsByActivityId = new HashMap();

	public ActivityManager() {
		this(new ExtensionActivityRegistry(Platform.getExtensionRegistry()));
	}

	public ActivityManager(IActivityRegistry activityRegistry) {
		if (activityRegistry == null)
			throw new NullPointerException();

		this.activityRegistry = activityRegistry;
		
		this.activityRegistry.addActivityRegistryListener(new IActivityRegistryListener() {
			public void activityRegistryChanged(IActivityRegistryEvent activityRegistryEvent) {
				readRegistry();
			}
		});

		readRegistry();
	}	
	
	public void addActivityManagerListener(IActivityManagerListener activityManagerListener) {
		if (activityManagerListener == null)
			throw new NullPointerException();
			
		if (activityManagerListeners == null)
			activityManagerListeners = new ArrayList();
		
		if (!activityManagerListeners.contains(activityManagerListener))
			activityManagerListeners.add(activityManagerListener);
	}

	public Set getActiveActivityIds() {
		return Collections.unmodifiableSet(activeActivityIds);
	}

	public IActivity getActivity(String activityId) {
		if (activityId == null)
			throw new NullPointerException();
			
		Activity activity = (Activity) activitiesById.get(activityId);
		
		if (activity == null) {
			activity = new Activity(this, activityId);
			updateActivity(activity);
			activitiesById.put(activityId, activity);
		}
		
		return activity;
	}
	
	public Set getDefinedActivityIds() {
		return Collections.unmodifiableSet(definedActivityIds);
	}

	public Set getEnabledActivityIds() {
		return Collections.unmodifiableSet(enabledActivityIds);
	}	

	public boolean match(String string, Set activityIds) {
		activityIds = Util.safeCopy(activityIds, String.class);
		
		for (Iterator iterator = activityIds.iterator(); iterator.hasNext();) {			
			IActivity activity = getActivity((String) iterator.next());
						
			if (activity.match(string))
				return true;
		}
			
		return false;
	}	

	public void removeActivityManagerListener(IActivityManagerListener activityManagerListener) {
		if (activityManagerListener == null)
			throw new NullPointerException();
			
		if (activityManagerListeners != null)
			activityManagerListeners.remove(activityManagerListener);
	}

	public void setActiveActivityIds(Set activeActivityIds) {
		activeActivityIds = Util.safeCopy(activeActivityIds, String.class);
		boolean activityManagerChanged = false;
		Map activityEventsByActivityId = null;

		if (!this.activeActivityIds.equals(activeActivityIds)) {
			this.activeActivityIds = activeActivityIds;
			activityManagerChanged = true;	
			activityEventsByActivityId = updateActivities(activitiesById.keySet());	
		}
		
		if (activityManagerChanged)
			fireActivityManagerChanged(new ActivityManagerEvent(this, true, false, false));

		if (activityEventsByActivityId != null)
			notifyActivities(activityEventsByActivityId);	
	}
	
	public void setEnabledActivityIds(Set enabledActivityIds) {	
		enabledActivityIds = Util.safeCopy(enabledActivityIds, String.class);
		boolean activityManagerChanged = false;
		Map activityEventsByActivityId = null;

		if (!this.enabledActivityIds.equals(enabledActivityIds)) {
			this.enabledActivityIds = enabledActivityIds;
			activityManagerChanged = true;	
			activityEventsByActivityId = updateActivities(this.definedActivityIds);	
		}
		
		if (activityManagerChanged)
			fireActivityManagerChanged(new ActivityManagerEvent(this, false, false, true));

		if (activityEventsByActivityId != null)
			notifyActivities(activityEventsByActivityId);	
	}	
	
	Set getActivitiesWithListeners() {
		return activitiesWithListeners;
	}

	private void fireActivityManagerChanged(IActivityManagerEvent activityManagerEvent) {
		if (activityManagerEvent == null)
			throw new NullPointerException();
		
		if (activityManagerListeners != null)
			for (int i = 0; i < activityManagerListeners.size(); i++)
				((IActivityManagerListener) activityManagerListeners.get(i)).activityManagerChanged(activityManagerEvent);
	}

	private void notifyActivities(Map activityEventsByActivityId) {	
		for (Iterator iterator = activityEventsByActivityId.entrySet().iterator(); iterator.hasNext();) {	
			Map.Entry entry = (Map.Entry) iterator.next();			
			String activityId = (String) entry.getKey();
			IActivityEvent activityEvent = (IActivityEvent) entry.getValue();
			Activity activity = (Activity) activitiesById.get(activityId);
			
			if (activity != null)
				activity.fireActivityChanged(activityEvent);
		}
	}

	private void readRegistry() {
		Collection activityDefinitions = new ArrayList();
		activityDefinitions.addAll(activityRegistry.getActivityDefinitions());				
		Map activityDefinitionsById = new HashMap(ActivityDefinition.activityDefinitionsById(activityDefinitions, false));

		for (Iterator iterator = activityDefinitionsById.values().iterator(); iterator.hasNext();) {
			IActivityDefinition activityDefinition = (IActivityDefinition) iterator.next();
			String name = activityDefinition.getName();
				
			if (name == null || name.length() == 0)
				iterator.remove();
		}

		for (Iterator iterator = activityDefinitionsById.keySet().iterator(); iterator.hasNext();)
			if (!isActivityDefinitionChildOf(null, (String) iterator.next(), activityDefinitionsById))
				iterator.remove();

		Map patternBindingDefinitionsByActivityId = PatternBindingDefinition.patternBindingDefinitionsByActivityId(activityRegistry.getPatternBindingDefinitions());
		Map patternBindingsByActivityId = new HashMap();		

		for (Iterator iterator = patternBindingDefinitionsByActivityId.entrySet().iterator(); iterator.hasNext();) {
			Map.Entry entry = (Map.Entry) iterator.next();
			String activityId = (String) entry.getKey();
			
			if (activityDefinitionsById.containsKey(activityId)) {			
				Collection patternBindingDefinitions = (Collection) entry.getValue();
				
				if (patternBindingDefinitions != null)
					for (Iterator iterator2 = patternBindingDefinitions.iterator(); iterator2.hasNext();) {
						IPatternBindingDefinition patternBindingDefinition = (IPatternBindingDefinition) iterator2.next();
						String pattern = patternBindingDefinition.getPattern();
					
						if (pattern != null && pattern.length() != 0) {
							IPatternBinding patternBinding = new PatternBinding(patternBindingDefinition.isInclusive(), Pattern.compile(pattern));	
							List patternBindings = (List) patternBindingsByActivityId.get(activityId);
							
							if (patternBindings == null) {
								patternBindings = new ArrayList();
								patternBindingsByActivityId.put(activityId, patternBindings);
							}
							
							patternBindings.add(patternBinding);
						}
					}
			}
		}		
		
		this.activityDefinitionsById = activityDefinitionsById;
		this.patternBindingsByActivityId = patternBindingsByActivityId;			
		boolean activityManagerChanged = false;			
		Set definedActivityIds = new HashSet(activityDefinitionsById.keySet());		

		if (!definedActivityIds.equals(this.definedActivityIds)) {
			this.definedActivityIds = definedActivityIds;
			activityManagerChanged = true;	
		}

		Map activityEventsByActivityId = updateActivities(activitiesById.keySet());	
		
		if (activityManagerChanged)
			fireActivityManagerChanged(new ActivityManagerEvent(this, false, true, false));

		if (activityEventsByActivityId != null)
			notifyActivities(activityEventsByActivityId);		
	}

	private IActivityEvent updateActivity(Activity activity) {
		boolean activeChanged = activity.setActive(activeActivityIds.contains(activity.getId()));		
		IActivityDefinition activityDefinition = (IActivityDefinition) activityDefinitionsById.get(activity.getId());
		boolean definedChanged = activity.setDefined(activityDefinition != null);
		boolean descriptionChanged = activity.setDescription(activityDefinition != null ? activityDefinition.getDescription() : null);		
		boolean enabledChanged = activity.setEnabled(enabledActivityIds.contains(activity.getId()));
		boolean nameChanged = activity.setName(activityDefinition != null ? activityDefinition.getName() : null);
		boolean parentIdChanged = activity.setParentId(activityDefinition != null ? activityDefinition.getParentId() : null);				
		List patternBindings = (List) patternBindingsByActivityId.get(activity.getId());
		boolean patternBindingsChanged = activity.setPatternBindings(patternBindings != null ? patternBindings : Collections.EMPTY_LIST);

		if (activeChanged || definedChanged || descriptionChanged || enabledChanged || nameChanged || parentIdChanged || patternBindingsChanged)
			return new ActivityEvent(activity, activeChanged, definedChanged, descriptionChanged, enabledChanged, nameChanged, parentIdChanged, patternBindingsChanged); 
		else 
			return null;
	}

	private Map updateActivities(Collection activityIds) {
		Map activityEventsByActivityId = new TreeMap();
		
		for (Iterator iterator = activityIds.iterator(); iterator.hasNext();) {		
			String activityId = (String) iterator.next();					
			Activity activity = (Activity) activitiesById.get(activityId);
			
			if (activity != null) {
				IActivityEvent activityEvent = updateActivity(activity);
				
				if (activityEvent != null)
					activityEventsByActivityId.put(activityId, activityEvent);
			}
		}
		
		return activityEventsByActivityId;			
	}
}
