/*******************************************************************************
 * 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.jst.j2ee.refactor.operations;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jem.util.RegistryReader;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;

public class OptionalRefactorHandler implements IOptionalRefactorHandler{

	private static final String EXTENSION_POINT = "optionalRefactorHandler"; //$NON-NLS-1$
	private static final String TAG_OPTIONAL_REFACTOR = "optionalRefactorHandler"; //$NON-NLS-1$
	private static final String ATT_CLASS = "class"; //$NON-NLS-1$
	
	private static OptionalRefactorHandler instance = new OptionalRefactorHandler();
	private IOptionalRefactorHandler [] handlers = null;
	
	private OptionalRefactorHandler () {
		SafeRunner.run(new ISafeRunnable() {

			public void handleException(Throwable exception) {
				J2EEPlugin.logError(0, exception.getMessage(), exception);
			}

			public void run() throws Exception {
				OptionalRefactorHandlerRegistryReader reader = new OptionalRefactorHandlerRegistryReader();
				reader.readRegistry();
				handlers = reader.getHandlers();
			}

		});
	}
	
	public static OptionalRefactorHandler getInstance() {
		return instance;
	}
	
    /* (non-Javadoc)
     * @see org.eclipse.jst.j2ee.refactor.operations.IOptionalRefactorHandler#shouldRefactorDeletedProject(org.eclipse.jst.j2ee.refactor.operations.ProjectRefactorMetadata)
     */
    public boolean shouldRefactorDeletedProject(final ProjectRefactorMetadata metadata) {
        for(int i=0;i<handlers.length; i++){
            if(!handlers[i].shouldRefactorDeletedProject(metadata)){
                return false;
            }
        }
        return true;
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jst.j2ee.refactor.operations.IOptionalRefactorHandler#shouldRefactorRenamedProject(org.eclipse.jst.j2ee.refactor.operations.ProjectRefactorMetadata)
     */
    public boolean shouldRefactorRenamedProject(final ProjectRefactorMetadata metadata) {
        for(int i=0;i<handlers.length; i++){
            if(!handlers[i].shouldRefactorRenamedProject(metadata)){
                return false;
            }
        }
        return true;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jst.j2ee.refactor.operations.IOptionalRefactorHandler#shouldRefactorDependentProjectOnDelete(org.eclipse.jst.j2ee.refactor.operations.ProjectRefactorMetadata, org.eclipse.jst.j2ee.refactor.operations.ProjectRefactorMetadata)
     */
    public boolean shouldRefactorDependentProjectOnDelete(final ProjectRefactorMetadata deletedMetadata, ProjectRefactorMetadata dependentMetadata) {
        for(int i=0;i<handlers.length; i++){
            if(!handlers[i].shouldRefactorDependentProjectOnDelete(deletedMetadata, dependentMetadata)){
                return false;
            }
        }
        return true;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jst.j2ee.refactor.operations.IOptionalRefactorHandler#shouldRefactorDependentProjectOnRename(org.eclipse.jst.j2ee.refactor.operations.ProjectRefactorMetadata, org.eclipse.jst.j2ee.refactor.operations.ProjectRefactorMetadata)
     */
    public boolean shouldRefactorDependentProjectOnRename(final ProjectRefactorMetadata renamedMetadata, ProjectRefactorMetadata dependentMetadata) {
        for(int i=0;i<handlers.length; i++){
            if(!handlers[i].shouldRefactorDependentProjectOnRename(renamedMetadata, dependentMetadata)){
                return false;
            }
        }
        return true;
    }
    

	private class OptionalRefactorHandlerRegistryReader extends RegistryReader {

		private List handlers = new ArrayList(); 
		
		public OptionalRefactorHandlerRegistryReader() {
			super(J2EEPlugin.PLUGIN_ID, EXTENSION_POINT);
		} 

		/**
		 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
		 */
		public boolean readElement(final IConfigurationElement element) {
			if (TAG_OPTIONAL_REFACTOR.equals(element.getName())) {

				/*
				 * Because the only instance of this type is created from a static singleton field, and
				 * the registry is initialized in the constructor of this type, other threads cannot
				 * compete with readElement() for access to <i>descriptors</i>
				 */
				final IOptionalRefactorHandler[] handlerArray = new IOptionalRefactorHandler[1];

				SafeRunner.run(new ISafeRunnable() {

					public void handleException(Throwable exception) {
						J2EEPlugin.logError(0, exception.getMessage(), exception);
					}

					public void run() throws Exception {
						handlerArray[0] = (IOptionalRefactorHandler) element.createExecutableExtension(ATT_CLASS);
					}

				});

				handlers.add(handlerArray[0]);
				return true;
			}
			return false;
		}
		
		public IOptionalRefactorHandler [] getHandlers() {
			IOptionalRefactorHandler [] handlersArray = new IOptionalRefactorHandler[handlers.size()];
			for(int i=0;i<handlersArray.length;i++){
				handlersArray[i] = (IOptionalRefactorHandler)handlers.get(i);
			}
			return handlersArray;
		}
	}
	
}
