/***************************************************************************************************
 * Copyright (c) 2003, 2004 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
 **************************************************************************************************/
/*
 * Created on Oct 1, 2003
 * 
 * To change the template for this generated file go to Window&gt;Preferences&gt;Java&gt;Code
 * Generation&gt;Code and Comments
 */
package org.eclipse.wst.common.framework.operation;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

import org.eclipse.core.runtime.CoreException;
import org.eclispe.wst.common.internal.framework.enablement.EnablementManager;

import com.ibm.wtp.common.logger.proxy.Logger;

public class OperationExtensionRegistry {

	protected static boolean canExtHasRead = false;

	protected static boolean extPointHasRead = false;

	protected static OperationExtensionRegistry instance = null;

	protected static HashMap extensibleOperations = null;

	protected static HashMap opExtensions = null;

	protected static OperationExtensibilityReader opExtensibilityReader = null;

	protected static OperationExtensionReader opExtensionReader = null;

	public static String[] getRegisteredOperations(String className) {
		extensibleOperations = getExtensibility();
		if (extensibleOperations != null) {
			String id = (String) extensibleOperations.get(className);
			if (id == null)
				return null;
			if (opExtensions == null)
				opExtensions = getExtensionPoints();
			if (opExtensions != null) {
				Collection ext = (Collection) opExtensions.get(id);
				if (ext != null)
					return getClassNames(ext.toArray());
			}
		}
		return null;
	}

	private static String[] getClassNames(Object[] opExt) {
		ArrayList classNames = new ArrayList();
		OperationExtension currentExt = null;
		for (int i = 0; i < opExt.length; i++) {
			currentExt = (OperationExtension) opExt[i];
			/* Only allow extensions which enabled (null project indicates enabled by activity only) */
			if (EnablementManager.INSTANCE.getIdentifier(currentExt.getExtensionId(), null).isEnabled()) {
				String className = currentExt.getPreOperationClass();
				if (null != className) {
					classNames.add(className);
				}
				className = currentExt.getPostOperationClass();
				if (null != className) {
					classNames.add(className);
				}
			}
		}
		String[] array = new String[classNames.size()];
		classNames.toArray(array);
		return array;
	}

	public static ComposedExtendedOperationHolder getExtensions(String className) {
		extensibleOperations = getExtensibility();
		if (extensibleOperations != null) {
			String id = (String) extensibleOperations.get(className);
			if (id == null)
				return null;
			if (opExtensions == null)
				opExtensions = getExtensionPoints();
			if (opExtensions != null) {
				Collection ext = (Collection) opExtensions.get(id);
				if (ext != null) {
					try {
						return calculateOperationHolder(ext);
					} catch (CoreException ex) {
						Logger.getLogger().logError(ex);
					}
				}
			}
		}
		return null;
	}

	public static ComposedExtendedOperationHolder getExtensions(WTPOperation op) {
		return getExtensions(op.getClass().getName());
	}

	protected String getExtendableOperationId(WTPOperation op) {
		return (String) extensibleOperations.get(op.getClass().getName());
	}

	private static ComposedExtendedOperationHolder calculateOperationHolder(Collection ext) throws CoreException {
		Object[] opExt = ext.toArray();
		ComposedExtendedOperationHolder extOperationHolder = new ComposedExtendedOperationHolder();
		WTPOperation preOp = null;
		WTPOperation postOp = null;
		OperationExtension currentExt = null;
		for (int i = 0; i < opExt.length; i++) {
			currentExt = (OperationExtension) opExt[i];
			/* Only allow extensions which enabled (null project indicates enabled by activity only) */
			if (EnablementManager.INSTANCE.getIdentifier(currentExt.getExtensionId(), null).isEnabled()) {
				preOp = currentExt.getPreOperation();
				if (preOp != null) {
					extOperationHolder.addPreOperation(preOp);
				}
				postOp = currentExt.getPostOperation();
				if (postOp != null) {
					extOperationHolder.addPostOperation(postOp);
				}
			}
		}
		return extOperationHolder;
	}

	private static HashMap getExtensibility() {
		if (!canExtHasRead) {
			opExtensibilityReader = new OperationExtensibilityReader();
			opExtensibilityReader.readRegistry();
			canExtHasRead = true;
		}
		if (opExtensibilityReader == null)
			return null;
		return OperationExtensibilityReader.getExtendableOperations();
	}

	private static HashMap getExtensionPoints() {
		if (!extPointHasRead) {
			opExtensionReader = new OperationExtensionReader();
			opExtensionReader.readRegistry();
			extPointHasRead = true;
		}
		if (opExtensionReader == null)
			return null;
		return OperationExtensionReader.getExtensionPoints();
	}

	/**
	 * Gets the instance.
	 * 
	 * @return Returns a EjbPageExtensionRegistry
	 */
	public static OperationExtensionRegistry getInstance() {
		if (instance == null)
			instance = new OperationExtensionRegistry();
		return instance;
	}

}