/*******************************************************************************
 * 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 innerHandlers = new ArrayList(); 
		
		public OptionalRefactorHandlerRegistryReader() {
			super(J2EEPlugin.PLUGIN_ID, EXTENSION_POINT);
		} 

		/**
		 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
		 */
		@Override
		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);
					}

				});

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