Package org.eclipse.jst.jsf.core.jsfappconfig

Source Code of org.eclipse.jst.jsf.core.jsfappconfig.JARFileJSFAppConfigProvider

/*******************************************************************************
* Copyright (c) 2005 Oracle Corporation.
* 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:
*    Ian Trimble - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.core.jsfappconfig;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collections;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.core.internal.Messages;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
import org.eclipse.jst.jsf.facesconfig.util.FacesConfigResourceFactory;
import org.eclipse.osgi.util.NLS;

/**
* JARFileJSFAppConfigProvider provides the root element of an application
* configuration model by loading the model from a /META-INF/faces-config.xml
* entry in a JAR file.
*
* <p><b>Provisional API - subject to change</b></p>
*
* @author Ian Trimble - Oracle
*/
public class JARFileJSFAppConfigProvider extends AbstractJSFAppConfigProvider {

  /**
   * Prefix required to turn filename into a JAR URI.
   */
  public static final String JARFILE_URI_PREFIX = "jar:file:///"; //$NON-NLS-1$

  /**
   * Suffix required to turn filename into a JAR URI.
   */
  public static final String FACES_CONFIG_IN_JAR_SUFFIX = "!/META-INF/faces-config.xml"; //$NON-NLS-1$

  /**
   * Name of a JAR file that contains a /META-INF/faces-config.xml entry.
   */
  protected String filename = null;

  /**
   * Cached {@link FacesConfigType} instance.
   */
  protected FacesConfigType facesConfig = null;

  /**
   * Flag to track if load error has been logged at least once.
   */
  protected boolean loadErrorLogged = false;
 
  /**
   * Creates an instance, storing the passed IProject instance and file name
   * String to be used for subsequent processing.
   *
   * @param filename Name of a JAR file that contains a
   * /META-INF/faces-config.xml entry.
   */
  public JARFileJSFAppConfigProvider(String filename) {
    this.filename = filename;
  }

  /* (non-Javadoc)
   * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
   */
  public FacesConfigType getFacesConfigModel() {
      // TODO: should this job be pushed into the model?
    if (facesConfig == null && filename != null)
    {
      facesConfig = getFacesConfig();
     
      if (facesConfig != null)
      {
        jsfAppConfigLocater.getJSFAppConfigManager().addFacesConfigChangeAdapter(facesConfig);
      }
    }
    return facesConfig;
  }

  /* (non-Javadoc)
   * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
   */
  public void releaseFacesConfigModel() {
    jsfAppConfigLocater.getJSFAppConfigManager().removeFacesConfigChangeAdapter(facesConfig);
    facesConfig = null;
  }

  /**
   * Called to log a load error; load error will be logged once only per
   * instance, per VM session.
   *
   * @param ex Throwable instance to be logged.
   */
  protected void logLoadError(Throwable ex) {
    if (!loadErrorLogged) {
      JSFCorePlugin.log(
          IStatus.ERROR,
          NLS.bind(Messages.JARFileJSFAppConfigProvider_ErrorLoadingModel, JARFILE_URI_PREFIX + filename + FACES_CONFIG_IN_JAR_SUFFIX),
          ex);
      loadErrorLogged = true;
    }
  }

  /*
   * (non-Javadoc)
   * @see java.lang.Object#equals(java.lang.Object)
   */
  public boolean equals(Object otherObject) {
    boolean equals = false;
    if (otherObject instanceof JARFileJSFAppConfigProvider) {
      String otherFilename = ((JARFileJSFAppConfigProvider)otherObject).filename;
      if (filename != null) {
        equals = filename.equals(otherFilename);
      } else {
        equals = otherFilename == null;
      }
    }
    return equals;
  }

  /*
   * (non-Javadoc)
   * @see java.lang.Object#hashCode()
   */
  public int hashCode() {
    return filename != null ? filename.hashCode() : 0;
  }

  /*
   * (non-Javadoc)
   * @see java.lang.Object#toString()
   */
  public String toString() {
    StringBuffer sb = new StringBuffer("JARFileJSFAppConfigProvider["); //$NON-NLS-1$
    if (filename != null) {
      sb.append(filename);
    } else {
      sb.append("null"); //$NON-NLS-1$
    }
    sb.append("]"); //$NON-NLS-1$
    return sb.toString();
  }

  private FacesConfigType getFacesConfig()
  {
    FacesConfigType  result = null;
    JarFile     jarFile = null;
    File        tempFile = null;
    OutputStream  tempFileStream = null;

    try
    {
      jarFile = new JarFile(filename, false);
      ZipEntry entry = jarFile.getEntry("META-INF/faces-config.xml"); //$NON-NLS-1$

      if (entry != null)
      {
        InputStream stream = jarFile.getInputStream(entry);
 
        tempFile = File.createTempFile("tempfile", ".xml"); //$NON-NLS-1$ //$NON-NLS-2$
        tempFileStream = new FileOutputStream(tempFile);
 
        int read = 0;
        byte[]  buffer = new byte[4096];
 
        while ((read = stream.read(buffer)) != -1)
        {
          tempFileStream.write(buffer, 0, read);
        }
 
        tempFileStream.close();
        tempFileStream = null;
 
        FacesConfigResourceFactory factory = FacesConfigResourceFactory.createResourceFactoryForJar();
        //FacesConfigResourceFactory.register(tempFile.toURI().toString());
        Resource resource = factory.createResource(URI.createFileURI(tempFile.getAbsolutePath()));
       
        try {
                    if (resource != null) {
                        resource.load(Collections.EMPTY_MAP);
            EList resourceContents = resource.getContents();
            if (resourceContents != null && resourceContents.size() > 0) {
                result = (FacesConfigType)resourceContents.get(0);
            }
          }
        } catch(IllegalStateException ise) {
          //log error
          logLoadError(ise);
        } catch(IOException ioe) {
          //log error
          logLoadError(ioe);
        }
      }

      return result;
    }
    catch (IOException ioe)
    {
      logLoadError(ioe);
      return null;
    }
    finally
    {
      if (jarFile != null)
      {
        try
        {
          jarFile.close();
        }
        catch (IOException ioe)
        {
          logLoadError(ioe);
        }
      }

      if (tempFileStream != null)
      {
        try
        {
          tempFileStream.close();
        }
        catch(IOException ioe)
        {
          logLoadError(ioe);
        }
      }

      if (tempFile != null && tempFile.exists())
      {
        if (!tempFile.delete())
        {
          tempFile.deleteOnExit();
        }
      }
    }
  }
}
TOP

Related Classes of org.eclipse.jst.jsf.core.jsfappconfig.JARFileJSFAppConfigProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.