/*******************************************************************************
 * Copyright (c) 2004, 2007 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.ui.internal.intro.impl.model.loader;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.ui.internal.intro.impl.model.AbstractBaseIntroElement;
import org.eclipse.ui.internal.intro.impl.model.AbstractIntroElement;
import org.eclipse.ui.internal.intro.impl.model.AbstractIntroIdElement;
import org.eclipse.ui.internal.intro.impl.model.util.BundleUtil;
import org.eclipse.ui.internal.intro.impl.util.Log;
import org.osgi.framework.Bundle;
import org.w3c.dom.Element;


/**
 * Utilities class for help with loading the intro model from the Platform
 * runtime model and from the DOM of content files.
 */
public class ModelLoaderUtil {

    /**
     * Utility method to validate an elements name.
     *
     * @param element
     * @param validName
     * @return
     */
    public static boolean isValidElementName(IConfigurationElement element,
            String validName) {

        if (element.getName().equals(validName))
            return true;
        // bad element name.
        return false;
    }

    /**
     * Utility method to verify that there is only a single configElement in the
     * passed array of elements. If the array is empty, null is returned. If
     * there is more than one element in the array, the first one is picked, but
     * this fact is logged. Attribute passed is used for logging.
     *
     * @param configElements
     * @return the first configElement in the array, or null if the array is
     *         empty.
     */
    public static IConfigurationElement validateSingleContribution(
            IConfigurationElement[] configElements, String logAttribute) {

        int arraySize = configElements.length;
        if (arraySize == 0)
            // No one contributed to extension. return null.
            return null;

        // we should only have one, so use first one.
        IConfigurationElement configElement = configElements[0];
        if (Log.logInfo) {
            String msg = "Loading " + getLogString(configElement, logAttribute); //$NON-NLS-1$
            Log.info(msg);
        }

        if (arraySize != 1) {
            // we have more than one, warn in the log.
            for (int i = 1; i < arraySize; i++)
                // log each extra extension.
                Log.warning(getLogString(configElements[i], logAttribute)
                        + " ignored due to multiple contributions"); //$NON-NLS-1$
        }
        return configElement;
    }

    /**
     * Utility method to return a string to display in .log. If logAttribute is
     * not null, its value is also printed.
     */
    public static String getLogString(IConfigurationElement element,
            String logAttribute) {
        StringBuffer buffer = new StringBuffer(element.getName());
        buffer.append(" element"); //$NON-NLS-1$
        if (logAttribute != null) {
            buffer.append(" with "); //$NON-NLS-1$
            buffer.append(logAttribute);
            buffer.append("=\""); //$NON-NLS-1$
            buffer.append(element.getAttribute(logAttribute));
        }
        buffer.append("\" in extension: "); //$NON-NLS-1$
        buffer.append(element.getDeclaringExtension()
            .getExtensionPointUniqueIdentifier());
        buffer.append(" in Bundle: "); //$NON-NLS-1$
        buffer.append(element.getContributor().getName());


        return buffer.toString();
    }

    /**
     * Utility method to return a string to display in .log. If logAttribute is
     * not null, its value is also printed.
     */
    public static String getLogString(Bundle bundle, Element element,
            String logAttribute) {
        StringBuffer buffer = new StringBuffer(element.getNodeName());
        buffer.append(" element"); //$NON-NLS-1$
        if (logAttribute != null) {
            buffer.append(" with "); //$NON-NLS-1$
            buffer.append(logAttribute);
            buffer.append("=\""); //$NON-NLS-1$
            buffer.append(element.getAttribute(logAttribute));
        }
        buffer.append("\" from xml file in Bundle:"); //$NON-NLS-1$
        buffer.append(bundle.getSymbolicName());


        return buffer.toString();
    }



    /**
     * Util class for creating class instances from plugins.
     *
     * @param pluginId
     * @param className
     * @return
     */
    public static Object createClassInstance(String pluginId, String className) {
        // quick exits.
        if (pluginId == null || className == null)
            return null;
        Bundle bundle = Platform.getBundle(pluginId);
        if (!BundleUtil.bundleHasValidState(bundle))
            return null;

        Class aClass;
        Object aObject;
        try {
            aClass = bundle.loadClass(className);
            aObject = aClass.newInstance();
            return aObject;
        } catch (Exception e) {
            Log.error("Intro Could not instantiate: " + className + " in " //$NON-NLS-1$ //$NON-NLS-2$
                    + pluginId, e);
            return null;
        }
    }



    /**
     * Creates a key for the given element. Returns null if any id is null along
     * the path.
     *
     * @param element
     * @return
     */
    public static StringBuffer createPathToElementKey(
            AbstractIntroIdElement element, boolean full) {
        if (element.getId() == null)
            return null;
        StringBuffer buffer = new StringBuffer(element.getId());
        AbstractBaseIntroElement parent = (AbstractBaseIntroElement) element
            .getParent();
        while (parent != null
                && !parent.isOfType(AbstractIntroElement.MODEL_ROOT)) {
            if (parent.getId() == null)
                return null;
            buffer.insert(0, parent.getId() + "."); //$NON-NLS-1$
            parent = (AbstractBaseIntroElement) parent.getParent();
        }
        return buffer;
    }
}
