All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.smartics.maven.plugin.jboss.modules.util.classpath.AbstractProjectClassLoader Maven / Gradle / Ivy

Go to download

Generates an archive of modules based on information in a POM to be copied to an JBoss 7 installation.

The newest version!
/*
 * Copyright 2013-2018 smartics, Kronseder & Reiner GmbH
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package de.smartics.maven.plugin.jboss.modules.util.classpath;

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.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Logger;

import org.apache.commons.io.IOUtils;

/**
 * Base implementation of class loaders that serve classes from the given
 * directories.
 */
public abstract class AbstractProjectClassLoader extends ClassLoader
{
  // ********************************* Fields *********************************

  // --- constants ------------------------------------------------------------

  // --- members --------------------------------------------------------------

  /**
   * Reference to the logger for this class.
   */
  private static final Logger LOG = Logger
      .getLogger(ClassPathListingFactory.class.getName());

  // ****************************** Initializer *******************************

  // ****************************** Constructors ******************************

  /**
   * Default constructor.
   *
   * @param parent the parent class loader.
   */
  protected AbstractProjectClassLoader(final ClassLoader parent)
  {
    super(parent);
  }

  // ****************************** Inner Classes *****************************

  // ********************************* Methods ********************************

  // --- init -----------------------------------------------------------------

  // --- get&set --------------------------------------------------------------

  // --- business -------------------------------------------------------------

  /**
   * Ensures that the package of a class specified by the given name is already
   * defined. If it is not defined the loaded class instance will not have a
   * package reference.
   *
   * @param className the name of the class whose package is to check to be
   *          already defined.
   */
  protected void ensurePackageProvided(final String className)
  {
    final int lastDotIndex = className.lastIndexOf('.');
    if (lastDotIndex != -1)
    {
      final String packageName = className.substring(0, lastDotIndex);
      final Package paccage = getPackage(packageName);
      if (paccage == null)
      {
        definePackage(packageName, null, null, null, null, null, null, null);
      }
    }
  }

  /**
   * Loads the class. Ensures that the package of the class is defined.
   *
   * @param className the name of the class.
   * @param classFile the file with the binary data.
   * @return the loaded class definition.
   * @throws ClassNotFoundException if the class cannot be loaded.
   */
  protected Class loadClassFile(final String className, final File classFile)
    throws ClassNotFoundException
  {
    ensurePackageProvided(className);
    InputStream in = null;
    try
    {
      in = new BufferedInputStream(new FileInputStream(classFile));
      final byte[] data = IOUtils.toByteArray(in);
      final Class clazz = defineClass(className, data, 0, data.length);
      return clazz;
    }
    catch (final IOException e)
    {
      final String message =
          "Cannot load class '" + className + "' from file '" + classFile
              + "'.";
      LOG.fine(message);

      throw new ClassNotFoundException(message, e);
    }
    finally
    {
      IOUtils.closeQuietly(in);
    }
  }

  /**
   * Opens a reader to the class file within the archive.
   *
   * @param className the name of the class to load.
   * @param fileName the name of the class file to load.
   * @param dirName the name of the directory the archive file is located.
   * @return the reader to the source file for the given class in the archive.
   * @throws ClassNotFoundException if the class cannot be found.
   */
  protected Class loadClassFromLibrary(final String className,
      final String fileName, final File dirName) throws ClassNotFoundException
  {
    ensurePackageProvided(className);
    try
    {
      final JarFile jarFile = new JarFile(dirName); // NOPMD
      final JarEntry entry = jarFile.getJarEntry(fileName);
      if (entry != null)
      {
        InputStream in = null;
        try
        {
          in = new BufferedInputStream(jarFile.getInputStream(entry));
          final byte[] data = IOUtils.toByteArray(in);
          final Class clazz = defineClass(className, data, 0, data.length);
          return clazz;
        }
        finally
        {
          IOUtils.closeQuietly(in);
        }
      }
    }
    catch (final IOException e)
    {
      final String message =
          "Cannot load class '" + className + "' from file '" + dirName + "'.";
      LOG.fine(message);

      throw new ClassNotFoundException(message, e);
    }

    final String message =
        "Cannot load class '" + className + "' from file '" + dirName + "'.";
    LOG.fine(message);

    throw new ClassNotFoundException(message);
  }

  /**
   * Opens a reader to the resource file within the archive.
   *
   * @param resourceName the name of the resource to load.
   * @param fileName the name of the resource file to load.
   * @param dirName the name of the directory the archive file is located.
   * @return the reader to the source file for the given class in the archive.
   * @throws IOException if the class cannot be found.
   */
  protected URL loadResourceFromLibrary(final String resourceName,
      final String fileName, final File dirName) throws IOException
  {
    ensurePackageProvided(resourceName);
    try
    {
      return new URL("jar:file:" + dirName.getName() + "!/" + fileName);
    }
    catch (final IOException e)
    {
      final String message =
          "Cannot load class '" + resourceName + "' from file '" + dirName
              + "'.";
      LOG.fine(message);
      final IOException ioe = new IOException(message);
      ioe.initCause(e);
      throw ioe;
    }
  }

  // --- object basics --------------------------------------------------------

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy