/*******************************************************************************
 * Copyright (c) 2001, 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
 *******************************************************************************/
package org.eclipse.jst.j2ee.commonarchivecore.internal.impl;



import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminatorImpl;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.EjbJar11ImportStrategyImpl;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.ImportStrategy;


/**
 * Insert the type's description here. Creation date: (12/04/00 5:24:44 PM)
 * 
 * @author: Administrator
 */
public class RootEJBJarDescriminatorImpl extends org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminatorImpl {
	protected static ArchiveTypeDiscriminatorImpl singleton;

	/**
	 * CommonArchiveFactoryDescriminator constructor comment.
	 */
	public RootEJBJarDescriminatorImpl() {
		super();
		initialize();
	}

	/**
	 * @see com.ibm.etools.archive.ArchiveTypeDiscriminator
	 */
	@Override
	public boolean canImport(Archive anArchive) {
		java.util.List theChildren = getChildren();
		for (int i = 0; i < theChildren.size(); i++) {
			ArchiveTypeDiscriminator child = (ArchiveTypeDiscriminator) theChildren.get(i);
			if (child.canImport(anArchive))
				return true;
		}
		return false;
	}

	/**
	 * @see com.ibm.etools.archive.ArchiveTypeDiscriminator
	 */
	@Override
	public Archive convert(Archive anArchive) {
		return anArchive;
	}

	/**
	 * @see com.ibm.etools.archive.ArchiveTypeDiscriminator This never gets called for this
	 *      implementer.
	 */
	@Override
	public Archive createConvertedArchive() {
		return null;
	}

	/**
	 * @see com.ibm.etools.archive.ArchiveTypeDiscriminator This never gets called for this
	 *      implementer.
	 */
	public org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.ImportStrategy createImportStrategy() {
		return null;
	}

	/**
	 * @see com.ibm.etools.archive.ArchiveTypeDiscriminator This never gets called for this
	 *      implementer.
	 */
	@Override
	public ImportStrategy createImportStrategy(Archive old, Archive newArchive) {
		return null;
	}

	/**
	 * @return null This method should not get called at this level
	 * 
	 * @see ArchiveTypeDescriminator#getUnableToOpenMessage()
	 */
	public java.lang.String getUnableToOpenMessage() {
		StringBuffer message = new StringBuffer();
		java.util.List theChildren = getChildren();
		for (int i = 0; i < theChildren.size(); i++) {
			ArchiveTypeDiscriminator child = (ArchiveTypeDiscriminator) theChildren.get(i);
			message.append(child.getUnableToOpenMessage());
			message.append('\n');
		}
		return message.toString();
	}

	public void initialize() {
		addChild(EjbJar11ImportStrategyImpl.getDiscriminator());
	}

	/**
	 * @see ArchiveTypeDiscriminator#openArchive(Archive)
	 */
	@Override
	public Archive openArchive(Archive anArchive) throws OpenFailureException {
		Archive result = super.openArchive(anArchive);
		if (result == anArchive)
			//Couldn't convert
			return null;
		return result;
	}

	public static ArchiveTypeDiscriminator singleton() {
		if (singleton == null) {
			singleton = new RootEJBJarDescriminatorImpl();
		}
		return singleton;
	}
}
