/*******************************************************************************
 * Copyright (c) 2001, 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.jem.internal.adapters.jdom;
/*


 */
import java.util.*;

import org.eclipse.emf.common.notify.*;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.jdt.core.*;
import org.eclipse.jem.internal.java.adapters.*;
import org.eclipse.jem.internal.java.adapters.JavaReflectionAdapterFactory;
import org.eclipse.jem.internal.java.adapters.ReflectionAdaptor;
/**
 * Insert the type's description here.
 * Creation date: (6/13/2000 1:20:31 PM)
 * @author: Administrator
 */
public class JavaJDOMAdapterFactory extends JavaReflectionAdapterFactory {
	
	protected JavaReflectionSynchronizer synchronizer;
	protected IJavaProject javaProject;
/**
 * JavaJDOMAdapterFactory constructor comment.
 */
public JavaJDOMAdapterFactory() {
	super();
}
/**
 * JavaJDOMAdapterFactory constructor comment.
 */
public JavaJDOMAdapterFactory(IJavaProject aJavaProject) {
	this();
	setJavaProject(aJavaProject);
}
protected ReflectionAdaptor createJavaClassAdaptor(Notifier target) {
	return new JavaClassJDOMAdaptor(target, getJavaProject(), this);
}
protected ReflectionAdaptor createJavaFieldAdaptor(Notifier target) {
	return new JavaFieldJDOMAdaptor(target, getJavaProject());
}
protected ReflectionAdaptor createJavaMethodAdaptor(Notifier target) {
	return new JavaMethodJDOMAdaptor(target, getJavaProject());
}
/**
 *  Flush ALL adapters, worst case
 * We also want to ensure that the source types are also cleared
 * in this worst case scenario.
 */
public void flushAll() {
	doFlush(reflected.values(),true, true);
}

public List flushAllNoNotification() {
	return doFlush(reflected.values(),true, false);
}

public void flushPackage(String packageName, boolean noFlushIfSourceFound) {
	List adaptors = getReflectedForPackage(packageName, noFlushIfSourceFound);
	doFlush(adaptors, true, true);
}
public List flushPackageNoNotification(String packageName, boolean noFlushIfSourceFound) {
	List adaptors = getReflectedForPackage(packageName, noFlushIfSourceFound);
	return doFlush(adaptors, true, false);
}
/**
 * Return a List of reflection adaptors that belong to 
 * the packageName.
 * @param packageName
 * @return
 */
private List getReflectedForPackage(String packageName, boolean filterFoundTypes) {
	if (packageName != null && !reflected.isEmpty()) {
		isBusyIteratingReflected = true;
		List result = null;
		try {
			Iterator it = reflected.entrySet().iterator();
			Map.Entry entry;
			String key;
			JavaClassJDOMAdaptor adaptor;
			while (it.hasNext()) {
				entry = (Map.Entry) it.next();
				adaptor = (JavaClassJDOMAdaptor) entry.getValue();
				/*
				 * Ensure that the the adaptor is only filtered out if it has
				 * actually reflected the content.  It is not good enough just
				 * to test for the sourceType.
				 */
				if (filterFoundTypes && adaptor.hasValidReflection())
					continue;
				key = (String) entry.getKey();
				if (key.startsWith(packageName) && key.indexOf('.', packageName.length() + 1) < 0) {
					if (result == null)
						result = new ArrayList();
					result.add(entry.getValue());
				}	
			}
		} finally {
			finishedIteratingReflected();
		}
		if (result != null)
			return result;
	}
	return Collections.EMPTY_LIST;
}
private List doFlush(Collection adaptors, boolean clearSourceType, boolean doNotify) {
	if (!adaptors.isEmpty()) {
		isBusyIteratingReflected = true;
		List notifications = doNotify ? null : new ArrayList(adaptors.size());
		try {
			Notification notification;
			Iterator i = adaptors.iterator();
			JDOMAdaptor adaptor;
			while (i.hasNext()) {
				adaptor = (JDOMAdaptor) i.next();
				if (doNotify)
					adaptor.flushReflectedValuesIfNecessary(clearSourceType);
				else {
					notification = adaptor.flushReflectedValuesIfNecessaryNoNotification(clearSourceType);
					if (notification != null)
						notifications.add(notification);
				}
			}
		} finally {
			finishedIteratingReflected();
		}
		return notifications;
	}
	return Collections.EMPTY_LIST;
}
// Flush the adapter for a source object
public void flushReflection(String source) {
	JDOMAdaptor a = (JDOMAdaptor) reflected.get(source);
	if (a != null)
		a.flushReflectedValuesIfNecessary();
}
public Notification flushReflectionNoNotification(String source) {
	JDOMAdaptor a = (JDOMAdaptor) reflected.get(source);
	if (a != null)
		return a.flushReflectedValuesIfNecessaryNoNotification(false);
	return null;
}

public Notification flushReflectionPlusInnerNoNotification(String source) {
	isBusyIteratingReflected = true;
	Notification notification = null;
	try {
		String innerName = source + '$';
		Iterator it = reflected.entrySet().iterator();
		Map.Entry entry;
		String key;
		JavaReflectionAdaptor adaptor;
		while (it.hasNext()) {
			entry = (Map.Entry) it.next();
			key = (String) entry.getKey();
			if (key.equals(source) || key.startsWith(innerName)) {
				adaptor = (JavaReflectionAdaptor) reflected.get(key);
				if (adaptor != null) {
					if (notification == null)
						notification = adaptor.flushReflectedValuesIfNecessaryNoNotification(false);
					else
						((NotificationChain) notification).add(adaptor.flushReflectedValuesIfNecessaryNoNotification(false));
				}
			}
		}
	} finally {
		finishedIteratingReflected();
	}
	return notification;

}
/**
 * Insert the method's description here.
 * Creation date: (11/2/2000 3:02:31 PM)
 * @return org.eclipse.jdt.core.api.IJavaProject
 */
public IJavaProject getJavaProject() {
	return javaProject;
}
/**
 * Create a Java Model listener which will flush invalidated adaptors.
 * This will cause those adapters to re-reflect their target object's contents.
 */
protected void initializeSynchronizer() {
	synchronizer = new JavaReflectionSynchronizer(this);
}
/**
 * Notify all JDOMAdapters which use the same target ICompilationUnit
 * Creation date: (8/17/2001 4:45:43 PM)
 */
public void notifyContentChanged(ICompilationUnit targetCU) {

	if (targetCU == null || reflected.values()==null) return ;
	isBusyIteratingReflected = true;
	try {
		Iterator i = reflected.values().iterator();
		while (i.hasNext()) {
			Object a = i.next() ;
			if (a instanceof JDOMAdaptor) {
				JDOMAdaptor adaptor = (JDOMAdaptor) a;
				IMember reflectionSource = (IMember) adaptor.getReflectionSource();
				ICompilationUnit adapterCU = null ;
				if (reflectionSource != null) {
					try {
					   adapterCU = reflectionSource.getCompilationUnit();
					} catch (Exception e) {} 
				}
				if (adapterCU != null && targetCU.equals(adapterCU)) {
			       adaptor.contentChanged();
				}
			}
		}
	} finally {
		finishedIteratingReflected();  	
	}
}
/**
 * Insert the method's description here.
 * Creation date: (11/2/2000 3:02:31 PM)
 * @param newJavaProject org.eclipse.jdt.core.IJavaProject
 */
public void setJavaProject(IJavaProject newJavaProject) {
	javaProject = newJavaProject;
	if (newJavaProject != null && synchronizer == null)
		initializeSynchronizer();
}
}
