blob: 9236586fd6a657b2a746b714b6ab08c53db7b5ae [file] [log] [blame]
/*******************************************************************************
* 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.helpers;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.ImportStrategy;
/**
* An interface that defines an API for opening archives. The {@link CommonArchiveFactory}
* implementation uses a root level discriminator to open an archive. The main benefit of this api
* is it allows extended teams or third parties to plug in to the framework to allow specialized
* kinds of jar files do be discerned at creation/open time without the client having to provide a
* lot of logic. For example, a client would simply write
* <code>((CommonArchivePackage)EPackage.Registry.INSTANCE.getEPackage(CommonArchivePackage.eNS_URI)).getCommonArchiveFactory().open(aString)<code>, and get back
* the correct kind of archive instance. A discriminator contains children, which is an ordered list of discriminators, each of which
* can have its turn to determine if it can open an archive. The first one to succeed wins. Once a discriminator determines that it
* can open an archive, it gives each of its children the opportuntity to do something more specific, and so on. In the base
* implementation, discriminators are defined as single instances of an inner class for each import strategy. The following code shows
* how to register a discriminator for a specialized EJBJarFile:
* <code>EjbJar11ImportStrategyImpl.getDiscriminator().addChild(aDiscriminator);</code>
* This would be done as an initialization at startup time. If the child discriminator is ever invoked, the parent will have already
* determined that the archive is an EJBJarFile and will have converted it to that type.
*/
public interface ArchiveTypeDiscriminator {
public void addChild(ArchiveTypeDiscriminator child);
/**
* @throws java.util.NoSuchElementException
* if the predecessor is not included in the list of children
*/
public void addChildAfter(ArchiveTypeDiscriminator child, ArchiveTypeDiscriminator predecessor) throws java.util.NoSuchElementException;
/**
* @throws java.util.NoSuchElementException
* if the successor is not included in the list of children
*/
public void addChildBefore(ArchiveTypeDiscriminator child, ArchiveTypeDiscriminator successor) throws java.util.NoSuchElementException;
/**
* Performs tests on the archive to determine if it is the kind this discriminator is interested
* in
*/
public boolean canImport(Archive anArchive);
/**
* Factory method to create the import strategy for a converted archive
*/
public ImportStrategy createImportStrategy(Archive old, Archive newArchive);
/**
* Return a string to be presented either through an exception or error message when a specific
* kind of archive is expected and this discriminator can't open it.
*/
public String getUnableToOpenMessage();
public boolean hasChild(ArchiveTypeDiscriminator disc);
public boolean hasChildren();
/**
* Point of entry for attempting to open an archive
*
* @return a converted archive or null if this discriminator can't convert it
*/
public Archive openArchive(Archive anArchive) throws OpenFailureException;
public void removeChild(ArchiveTypeDiscriminator child);
}