Package org.hibernate.ejb.test.packaging

Source Code of org.hibernate.ejb.test.packaging.JarVisitorTest

//$Id: JarVisitorTest.java 21091 2012-12-10 18:17:48Z brmeyer $
package org.hibernate.ejb.test.packaging;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import java.util.Set;

import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.MappedSuperclass;

import junit.framework.TestCase;

import org.hibernate.ejb.packaging.ClassFilter;
import org.hibernate.ejb.packaging.Entry;
import org.hibernate.ejb.packaging.ExplodedJarVisitor;
import org.hibernate.ejb.packaging.FileFilter;
import org.hibernate.ejb.packaging.FileZippedJarVisitor;
import org.hibernate.ejb.packaging.Filter;
import org.hibernate.ejb.packaging.InputStreamZippedJarVisitor;
import org.hibernate.ejb.packaging.JarProtocolVisitor;
import org.hibernate.ejb.packaging.JarVisitor;
import org.hibernate.ejb.packaging.JarVisitorFactory;
import org.hibernate.ejb.packaging.PackageFilter;
import org.hibernate.ejb.test.pack.defaultpar.ApplicationServer;
import org.hibernate.ejb.test.pack.explodedpar.Carpet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* @author Emmanuel Bernard
*/
@SuppressWarnings("unchecked")
public class JarVisitorTest extends TestCase {
 
  private static final Logger log = LoggerFactory.getLogger(JarVisitorTest.class);

  public void testHttp() throws Exception {
    URL url = JarVisitorFactory.getJarURLFromURLEntry(
        new URL(
            "jar:http://www.ibiblio.org/maven/hibernate/jars/hibernate-annotations-3.0beta1.jar!/META-INF/persistence.xml"
        ),
        "/META-INF/persistence.xml"
    );
    try {
      URLConnection urlConnection = url.openConnection();
      urlConnection.connect();
    }
    catch (IOException ie) {
      //fail silently
      return;
    }
    JarVisitor visitor = JarVisitorFactory.getVisitor( url, getFilters() );
    assertEquals( 0, visitor.getMatchingEntries()[0].size() );
    assertEquals( 0, visitor.getMatchingEntries()[1].size() );
    assertEquals( 0, visitor.getMatchingEntries()[2].size() );
  }
 
  /**
   * related to JBPAPP-7488
   */
  public void testJarVisitorFactory() throws Exception{
   
        //setting URL to accept vfs based protocol
    URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory() {
      public URLStreamHandler createURLStreamHandler(String protocol) {
        if("vfsfile".equals(protocol) || "vfszip".equals(protocol)) {
          return new URLStreamHandler() {
            protected URLConnection openConnection(URL u)
              throws IOException {
                return null;
            }
          };
        } else
          return null;
      }
    });
       
    URL jarUrl  = new URL ("file:./target/test-packages/defaultpar.par");
    JarVisitor jarVisitor =  JarVisitorFactory.getVisitor(jarUrl, getFilters(), null);
    assertEquals(FileZippedJarVisitor.class.getName(), jarVisitor.getClass().getName());
   
    jarUrl  = new URL ("file:./target/test-packages/explodedpar.par");
    jarVisitor =  JarVisitorFactory.getVisitor(jarUrl, getFilters(), null);
    assertEquals(ExplodedJarVisitor.class.getName(), jarVisitor.getClass().getName());
   
      jarUrl  = new URL ("vfszip:./target/test-packages/defaultpar.par");
    jarVisitor =  JarVisitorFactory.getVisitor(jarUrl, getFilters(), null);
    //ideally it should be FileZippedJarVisitor as well, but there is a bug in FileZippedJarVisitor
    //which causes regression for some tests in EAP test suite. InputStreamZippedJarVisitor is safer than it, for now.
    assertEquals(InputStreamZippedJarVisitor.class.getName(), jarVisitor.getClass().getName());
   
    jarUrl  = new URL ("vfsfile:./target/test-packages/explodedpar.par");
    jarVisitor =  JarVisitorFactory.getVisitor(jarUrl, getFilters(), null);
    assertEquals(ExplodedJarVisitor.class.getName(), jarVisitor.getClass().getName());   
 

  public void testInputStreamZippedJar() throws Exception {
    String jarFileName = "file:./target/test-packages/defaultpar.par";
    //JarVisitor jarVisitor = new ZippedJarVisitor( jarFileName, true, true );
    Filter[] filters = getFilters();
    JarVisitor jarVisitor = new InputStreamZippedJarVisitor( new URL( jarFileName ), filters, "" );
    assertEquals( "defaultpar", jarVisitor.getUnqualifiedJarName() );
    Set entries = jarVisitor.getMatchingEntries()[1];
    assertEquals( 3, entries.size() );
    Entry entry = new Entry( ApplicationServer.class.getName(), null );
    assertTrue( entries.contains( entry ) );
    entry = new Entry( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName(), null );
    assertTrue( entries.contains( entry ) );
    assertNull( ( (Entry) entries.iterator().next() ).getInputStream() );
    assertEquals( 2, jarVisitor.getMatchingEntries()[2].size() );
    for (Entry localEntry : (Set<Entry>) jarVisitor.getMatchingEntries()[2] ) {
      assertNotNull( localEntry.getInputStream() );
      localEntry.getInputStream().close();
    }
  }

  public void testNestedJarProtocol() throws Exception {
    String jarFileName = "jar:file:./target/test-packages/nestedjar.ear!/defaultpar.par";
    //JarVisitor jarVisitor = new ZippedJarVisitor( jarFileName, true, true );
    Filter[] filters = getFilters();
    JarVisitor jarVisitor = new JarProtocolVisitor( new URL( jarFileName ), filters, "" );
    //TODO should we fix the name here to reach defaultpar rather than nestedjar ??
    //assertEquals( "defaultpar", jarVisitor.getUnqualifiedJarName() );
    Set entries = jarVisitor.getMatchingEntries()[1];
    assertEquals( 3, entries.size() );
    Entry entry = new Entry( ApplicationServer.class.getName(), null );
    assertTrue( entries.contains( entry ) );
    entry = new Entry( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName(), null );
    assertTrue( entries.contains( entry ) );
    assertNull( ( (Entry) entries.iterator().next() ).getInputStream() );
    assertEquals( 2, jarVisitor.getMatchingEntries()[2].size() );
    for (Entry localEntry : (Set<Entry>) jarVisitor.getMatchingEntries()[2] ) {
      assertNotNull( localEntry.getInputStream() );
      localEntry.getInputStream().close();
    }

    jarFileName = "jar:file:./target/test-packages/nesteddir.ear!/defaultpar.par";
    //JarVisitor jarVisitor = new ZippedJarVisitor( jarFileName, true, true );
    filters = getFilters();
    jarVisitor = new JarProtocolVisitor( new URL( jarFileName ), filters, "" );
    //TODO should we fix the name here to reach defaultpar rather than nestedjar ??
    //assertEquals( "defaultpar", jarVisitor.getUnqualifiedJarName() );
    entries = jarVisitor.getMatchingEntries()[1];
    assertEquals( 3, entries.size() );
    entry = new Entry( ApplicationServer.class.getName(), null );
    assertTrue( entries.contains( entry ) );
    entry = new Entry( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName(), null );
    assertTrue( entries.contains( entry ) );
    assertNull( ( (Entry) entries.iterator().next() ).getInputStream() );
    assertEquals( 2, jarVisitor.getMatchingEntries()[2].size() );
    for (Entry localEntry : (Set<Entry>) jarVisitor.getMatchingEntries()[2] ) {
      assertNotNull( localEntry.getInputStream() );
      localEntry.getInputStream().close();
    }
  }

  public void testJarProtocol() throws Exception {
    String jarFileName = "jar:file:./target/test-packages/war.war!/WEB-INF/classes";
    //JarVisitor jarVisitor = new ZippedJarVisitor( jarFileName, true, true );
    Filter[] filters = getFilters();
    JarVisitor jarVisitor = new JarProtocolVisitor( new URL( jarFileName ), filters, "" );
    assertEquals( "war", jarVisitor.getUnqualifiedJarName() );
    Set entries = jarVisitor.getMatchingEntries()[1];
    assertEquals( 3, entries.size() );
    Entry entry = new Entry( org.hibernate.ejb.test.pack.war.ApplicationServer.class.getName(), null );
    assertTrue( entries.contains( entry ) );
    entry = new Entry( org.hibernate.ejb.test.pack.war.Version.class.getName(), null );
    assertTrue( entries.contains( entry ) );
    assertNull( ( (Entry) entries.iterator().next() ).getInputStream() );
    assertEquals( 2, jarVisitor.getMatchingEntries()[2].size() );
    for (Entry localEntry : (Set<Entry>) jarVisitor.getMatchingEntries()[2] ) {
      assertNotNull( localEntry.getInputStream() );
      localEntry.getInputStream().close();
    }
  }

  public void testZippedJar() throws Exception {
    String jarFileName = "file:./target/test-packages/defaultpar.par";
    //JarVisitor jarVisitor = new ZippedJarVisitor( jarFileName, true, true );
    Filter[] filters = getFilters();
    JarVisitor jarVisitor = new FileZippedJarVisitor( new URL( jarFileName ), filters, "" );
    assertEquals( "defaultpar", jarVisitor.getUnqualifiedJarName() );
    Set entries = jarVisitor.getMatchingEntries()[1];
    assertEquals( 3, entries.size() );
    Entry entry = new Entry( ApplicationServer.class.getName(), null );
    assertTrue( entries.contains( entry ) );
    entry = new Entry( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName(), null );
    assertTrue( entries.contains( entry ) );
    assertNull( ( (Entry) entries.iterator().next() ).getInputStream() );
    assertEquals( 2, jarVisitor.getMatchingEntries()[2].size() );
    for (Entry localEntry : (Set<Entry>) jarVisitor.getMatchingEntries()[2] ) {
      assertNotNull( localEntry.getInputStream() );
      localEntry.getInputStream().close();
    }
  }


  public void testExplodedJar() throws Exception {
    String jarFileName = "./target/test-packages/explodedpar.par";
    //JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, true, true );
    Filter[] filters = getFilters();
    JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, filters );
    assertEquals( "explodedpar", jarVisitor.getUnqualifiedJarName() );
    Set[] entries = jarVisitor.getMatchingEntries();
    assertEquals( 1, entries[1].size() );
    assertEquals( 1, entries[0].size() );
    assertEquals( 1, entries[2].size() );

    Entry entry = new Entry( Carpet.class.getName(), null );
    assertTrue( entries[1].contains( entry ) );
    for (Entry localEntry : (Set<Entry>) jarVisitor.getMatchingEntries()[2] ) {
      assertNotNull( localEntry.getInputStream() );
      localEntry.getInputStream().close();
    }
  }

  /**
   * @see EJB-230
   */
  public void testDuplicateFilterExplodedJarExpected() throws Exception {
   
    log.warn("Skipping test! See jira issue EJB-230.");

//    String jarFileName = "./target/test-packages/explodedpar.par";
//    Filter[] filters = getFilters();
//    Filter[] dupeFilters = new Filter[filters.length * 2];
//    int index = 0;
//    for ( Filter filter : filters ) {
//      dupeFilters[index++] = filter;
//    }
//    filters = getFilters();
//    for ( Filter filter : filters ) {
//      dupeFilters[index++] = filter;
//    }
//    JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, dupeFilters );
//    assertEquals( "explodedpar", jarVisitor.getUnqualifiedJarName() );
//    Set[] entries = jarVisitor.getMatchingEntries();
//    assertEquals( 1, entries[1].size() );
//    assertEquals( 1, entries[0].size() );
//    assertEquals( 1, entries[2].size() );
//    for ( Entry entry : (Set<Entry>) entries[2] ) {
//      InputStream is = entry.getInputStream();
//      if ( is != null ) {
//        assertTrue( 0 < is.available() );
//        is.close();
//      }
//    }
//    for ( Entry entry : (Set<Entry>) entries[5] ) {
//      InputStream is = entry.getInputStream();
//      if ( is != null ) {
//        assertTrue( 0 < is.available() );
//        is.close();
//      }
//    }
//
//    Entry entry = new Entry( Carpet.class.getName(), null );
//    assertTrue( entries[1].contains( entry ) );
  }
 
  // HHH-7835
  public void testGetBytesFromInputStream() {
    try {
      File file = new File(
          "src/test/resources/org/hibernate/ejb/test/packaging/large.jar");

      long start = System.currentTimeMillis();
      InputStream stream = new BufferedInputStream(new FileInputStream(
          file));
      int oldLength = getBytesFromInputStream(stream).length;
      stream.close();
      long oldTime = System.currentTimeMillis() - start;

      start = System.currentTimeMillis();
      stream = new BufferedInputStream(new FileInputStream(file));
      int newLength = JarVisitorFactory.getBytesFromInputStream(stream).length;
      stream.close();
      long newTime = System.currentTimeMillis() - start;

      assertEquals(oldLength, newLength);
      assertTrue(oldTime > newTime);
    } catch (Exception e) {
      fail(e.getMessage());
    }
  }

  // This is the old getBytesFromInputStream from JarVisitorFactory before
  // it was changed by HHH-7835. Use it as a regression test.
  private byte[] getBytesFromInputStream(InputStream inputStream)
      throws IOException {
    int size;

    byte[] entryBytes = new byte[0];
    for (;;) {
      byte[] tmpByte = new byte[4096];
      size = inputStream.read(tmpByte);
      if (size == -1)
        break;
      byte[] current = new byte[entryBytes.length + size];
      System.arraycopy(entryBytes, 0, current, 0, entryBytes.length);
      System.arraycopy(tmpByte, 0, current, entryBytes.length, size);
      entryBytes = current;
    }
    return entryBytes;
  }

  // HHH-7835
  public void testGetBytesFromZeroInputStream() {
    try {
      // Ensure that JarVisitorFactory#getBytesFromInputStream
      // can handle 0 length streams gracefully.
      InputStream emptyStream = new BufferedInputStream(
          new FileInputStream(
              new File(
                  "src/test/resources/org/hibernate/ejb/test/packaging/empty.txt")));
      int length = JarVisitorFactory.getBytesFromInputStream(emptyStream).length;
      assertEquals(length, 0);
      emptyStream.close();
    } catch (Exception e) {
      fail(e.getMessage());
    }
  }

  private Filter[] getFilters() {
    return new Filter[]{
        new PackageFilter( false, null ) {
          public boolean accept(String javaElementName) {
            return true;
          }
        },
        new ClassFilter(
            false, new Class[]{
            Entity.class,
            MappedSuperclass.class,
            Embeddable.class}
        ) {
          public boolean accept(String javaElementName) {
            return true;
          }
        },
        new FileFilter( true ) {
          public boolean accept(String javaElementName) {
            return javaElementName.endsWith( "hbm.xml" ) || javaElementName.endsWith( "META-INF/orm.xml" );
          }
        }
    };
  }
}
TOP

Related Classes of org.hibernate.ejb.test.packaging.JarVisitorTest

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.