plugin: simplify plugin loader
authorSeokYeon Hwang <syeon.hwang@samsung.com>
Tue, 2 Feb 2016 10:42:02 +0000 (19:42 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Wed, 3 Feb 2016 09:08:45 +0000 (18:08 +0900)
We can use EMPluginLoader itself as a classloader. All we need is a
child-first searching for resources.

Change-Id: Iaecbb3ea15c4599da869a365dee0106a3602951c
Signed-off-by: SeokYeon Hwang <syeon.hwang@samsung.com>
src/org/tizen/emulator/manager/plugin/EMPlugin.java
src/org/tizen/emulator/manager/plugin/EMPluginLoader.java
src/org/tizen/emulator/manager/plugin/ExtensionItem.java
src/org/tizen/emulator/manager/plugin/PluginImageResources.java

index 5a112b2..614f121 100644 (file)
@@ -30,7 +30,6 @@
 package org.tizen.emulator.manager.plugin;
 
 import java.io.File;
-import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.jar.Attributes;
 
@@ -77,7 +76,7 @@ public class EMPlugin {
        private String packageVersion;
        private final File pluginJar;
        private final Attributes attr;
-       private URLClassLoader loader;
+       private ClassLoader loader;
        private final ArrayList<ExtensionItem> exItemList
                = new ArrayList<ExtensionItem>();
        private EMPlugin parentPlugin;
@@ -99,13 +98,7 @@ public class EMPlugin {
        }
 
        public boolean initEMPlugin(Platform platform) {
-               ClassLoader parentLoader = null;
-               if (platform.getParentPlatform() != null) {
-                       parentPlugin = platform.getParentPlatform().getPlugin();
-                       parentLoader = parentPlugin.getLoader();
-               }
-
-               loader = EMPluginLoader.makeLoader(pluginJar, parentLoader);
+               loader = EMPluginLoader.makeLoader(pluginJar, platform.getParentPlatform());
                if (loader == null) {
                        return false;
                }
@@ -161,7 +154,7 @@ public class EMPlugin {
                return null;
        }
 
-       public URLClassLoader getLoader() {
+       public ClassLoader getLoader() {
                return loader;
        }
 
index 37c7286..8426764 100644 (file)
@@ -1,12 +1,12 @@
 /*
  * Emulator Manager
  *
- * Copyright (C) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2013 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact:
- * JiHye Kim <jihye1128.kim@samsung.com>
+ * JiHye Kim <jihye424.kim@samsung.com>
+ * Minkee Lee <minkee.lee@samsung.com>
  * SeokYeon Hwang <syeon.hwang@samsung.com>
- * YeongKyoon Lee <yeongkyoon.lee@samsung.com>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -38,40 +38,35 @@ import java.util.jar.Attributes;
 import java.util.jar.JarFile;
 
 import org.tizen.emulator.manager.logging.EMLogger;
-import org.tizen.emulator.manager.resources.StringResources;
+import org.tizen.emulator.manager.platform.Platform;
 
-public class EMPluginLoader {
+public class EMPluginLoader extends URLClassLoader {
+       private EMPluginLoader(URL url) throws MalformedURLException {
+               super(new URL[] { url });
+       }
+
+       private EMPluginLoader(URL url, ClassLoader parent) throws MalformedURLException {
+               super(new URL[] { url }, parent);
+       }
 
-       public static URLClassLoader makeLoader(File plugin, ClassLoader parent) {
+       public static ClassLoader makeLoader(File plugin, Platform parent) {
                URL url = null;
-               URLClassLoader loader;
+
                try {
                        url = plugin.toURI().toURL();
-               } catch (MalformedURLException e) {
-                       EMLogger.getLogger().warning("Failed to load url from jar file: " + e.getMessage()); //$NON-NLS-1$
-                       return null;
-               }
-
-               if (url == null) {
-                       EMLogger.getLogger().warning("Failed to load url from jar file." + //$NON-NLS-1$
-                                       StringResources.NEW_LINE + plugin.getAbsolutePath());
-                       return null;
-               }
+                       if (url == null) {
+                               throw new MalformedURLException();
+                       }
 
-               URL[] urls = new URL[1];
-               urls[0] = url;
-               if (parent == null) {
-                       loader = URLClassLoader.newInstance(urls);
-               } else {
-                       loader = URLClassLoader.newInstance(urls, parent);
-               }
+                       if (parent == null) {
+                               return new EMPluginLoader(url);
+                       }
 
-               if (loader == null) {
-                       EMLogger.getLogger().warning("Failed to create instance of URLClassLoader."); //$NON-NLS-1$
+                       return new EMPluginLoader(url, parent.getPlugin().getLoader());
+               } catch (MalformedURLException e) {
+                       EMLogger.getLogger().warning("Failed to load url from jar file: " + e.getMessage()); //$NON-NLS-1$
                        return null;
                }
-
-               return loader;
        }
 
        public static Attributes makeAttributes(File pluginJar) {
@@ -103,4 +98,15 @@ public class EMPluginLoader {
 
                return attr;
        }
-}
+
+       @Override
+       public URL getResource(String name) {
+               // child first resource searching
+               URL url = findResource(name);
+               if (url != null) {
+                       return url;
+               }
+
+               return super.getResource(name);
+       }
+}
\ No newline at end of file
index 874ccad..460699d 100644 (file)
 
 package org.tizen.emulator.manager.plugin;
 
-import java.net.URLClassLoader;
 import org.tizen.emulator.manager.logging.EMLogger;
 
 public class ExtensionItem {
        private String exPoint;
        private String pointClass;
-       private URLClassLoader loader;
+       private ClassLoader loader;
        private Object instance;
 
-       public ExtensionItem(String ex, String pointClass, URLClassLoader loader){
+       public ExtensionItem(String ex, String pointClass, ClassLoader loader){
                this.exPoint = ex;
                this.loader = loader;
                this.pointClass = pointClass;
index ba3c9df..78b15ac 100644 (file)
@@ -31,8 +31,6 @@ package org.tizen.emulator.manager.plugin;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.URL;
-import java.net.URLClassLoader;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -171,20 +169,16 @@ class ImageRegistry {
                return null;
        }
 
-       private static URL findImageURL(EMPlugin plugin, String name, String shape, String extension) {
-               URL url = null;
-               URLClassLoader loader = plugin.getLoader();
+       private static InputStream findImageURL(ClassLoader loader, String name, String shape, String extension) {
+               InputStream is = null;
                if (loader != null) {
-                       url = loader.findResource("res/" + shape + "_" + name + "." + extension); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                       if (url == null) {
+                       is = loader.getResourceAsStream("res/" + shape + "_" + name + "." + extension); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+                       if (is == null) {
                                // remove shape prefix
-                               url = loader.findResource("res/" + name + "." + extension); //$NON-NLS-1$ //$NON-NLS-2$
-                       }
-                       if (url == null && plugin.getParentPlugin() != null) {
-                               url = findImageURL(plugin.getParentPlugin(), name, shape, extension);
+                               is = loader.getResourceAsStream("res/" + name + "." + extension); //$NON-NLS-1$ //$NON-NLS-2$
                        }
                }
-               return url;
+               return is;
        }
 
        public static Image getImage(String name, String platformName, SKIN_SHAPE skinShape, String extension) {
@@ -198,15 +192,7 @@ class ImageRegistry {
                if (i == null) {
                        EMPlugin plugin = findPlugin(platformName);
                        if (plugin != null) {
-                               InputStream is = null;
-                               URL url = findImageURL(plugin, name, shape, extension);
-                               if (url != null) {
-                                       try {
-                                               is = url.openStream();
-                                       } catch (IOException e) {
-                                               EMLogger.getLogger().warning(e.getMessage());
-                                       }
-                               }
+                               InputStream is = findImageURL(plugin.getLoader(), name, shape, extension);
                                if (is != null) {
                                        i = new Image(Display.getCurrent(), is);
                                        map.put(name + platformName + shape, i);