Package org.infoglue.cms.extensions

Source Code of org.infoglue.cms.extensions.ExtensionLoader

package org.infoglue.cms.extensions;

import java.io.File;
import java.io.FileInputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;

import org.apache.log4j.Logger;
import org.infoglue.cms.io.FileHelper;
import org.infoglue.cms.util.CmsPropertyHandler;

import webwork.config.XMLActionConfigurationExtendor;

public class ExtensionLoader
{
  private final static Logger logger = Logger.getLogger(ExtensionLoader.class.getName());

  private static List<String> extensions = new ArrayList<String>();
 
  /**
   * @return the extensions
   */
  public static List<String> getExtensions()
  {
    return extensions;
  }

  public void startExtensions()
  {
    try
    {
      logger.info("Starting extension in:" + CmsPropertyHandler.getContextRootPath());
      String extensionBasePath = CmsPropertyHandler.getContextRootPath() + "WEB-INF" + File.separator + "libextensions";
      File extensionBaseFile = new File(extensionBasePath);
      extensionBaseFile.mkdirs();
      File[] extensionFiles = extensionBaseFile.listFiles();
      for(File extensionFile : extensionFiles)
      {
        if(extensionFile.getName().endsWith(".jar"))
        {
          //ClassLoaderUtil.addFile(extensionFile.getPath());
          logger.info("extensionFile:" + extensionFile.getPath())
       
          String extensionDirName = extensionFile.getName().replaceAll(".jar", "");
         
          File extensionDir = new File(CmsPropertyHandler.getContextRootPath() + "extensions" + File.separator + extensionDirName);
          extensionDir.delete();
          extensionDir.mkdirs();

          FileHelper.unjarFileDirectories(extensionFile, extensionDir.getPath(), new String[]{"js","css","extra"});
          logger.info("Unpacking resource into cms directory extensions/" + extensionDirName);
         
          Set<String> actionClassNames = new HashSet<String>();
          File customActionsXmlFile = new File(extensionDir.getPath() + File.separator + "actions.xml");
          if(customActionsXmlFile.exists() && customActionsXmlFile.length() > 0)
          {
            String customActionsXML = FileHelper.getFileAsStringOpt(customActionsXmlFile);
            logger.info("customActionsXML:" + customActionsXML);
            customActionsXML = customActionsXML.replaceAll("\\$extensionPath", "/extensions" + File.separator + extensionDirName);
            logger.info("customActionsXML:" + customActionsXML);
            //String customAction = "<action name=\"org.infoglue.cms.applications.managementtool.actions.ViewMySettingsAction\" alias=\"ViewEcommerce\"><view name=\"success\">viewEcommerce.vm</view><view name=\"error\">/cms/managementtool/error.vm</view></action>";
            new XMLActionConfigurationExtendor().getMappingsFromString(customActionsXML, actionClassNames);
          }
         
          URL url = extensionFile.toURL();
          URLClassLoader classLoader = new URLClassLoader(new URL[]{url}, this.getClass().getClassLoader());
         
          JarInputStream jarFileInputStream = new JarInputStream(new FileInputStream (extensionFile));
          JarEntry jarEntry;

          while(true)
          {
            jarEntry = jarFileInputStream.getNextJarEntry ();
            if(jarEntry == null)
            {
              break;
            }
           
            if(jarEntry.getName ().endsWith (".class"))
            {
              String className = jarEntry.getName().replaceAll("/", "\\.").replaceAll(".class", "");
           
              logger.info("Found " + className);
              Class c = classLoader.loadClass(className);
              boolean isOk = InfoglueExtension.class.isAssignableFrom(c);
              logger.info("isOk:" + isOk + " for " + className);
              if(isOk)
              {
                logger.info("Adding class:" + className);
                InfoglueExtension extension = (InfoglueExtension)c.newInstance();
                extension.init();
              }
            }
          }
         
          for(String actionClassName : actionClassNames)
          {
            logger.info("Found actionClassName:" + actionClassName);
            try
            {
              Class c = classLoader.loadClass(actionClassName);
              logger.info("C:" + c.newInstance());

              Class c2 = Class.forName(actionClassName, true, classLoader);
              logger.info("C2:" + c2.newInstance());
            }
            catch (Exception e)
            {
              e.printStackTrace();
            }
          }

          extensions.add(extensionDirName);
        }
      }
    }
    catch (Throwable t)
    {
      t.printStackTrace();
    }
  }

}
TOP

Related Classes of org.infoglue.cms.extensions.ExtensionLoader

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.