diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF deleted file mode 100644 index c6ef292..0000000 --- a/src/META-INF/MANIFEST.MF +++ /dev/null @@ -1,9 +0,0 @@ -Manifest-Version: 1.0 -Class-Path: el-api.jar jasper.jar jsp-api.jar catalina.jar ecj-4.2.2.j - ar jasper-el.jar tomcat-api.jar catalina-ha.jar servlet-api.jar tomca - t-dbcp.jar tomcat-jdbc.jar tomcat-util.jar catalina-ant.jar tomcat-co - yote.jar tomcat-i18n-es.jar tomcat-i18n-fr.jar tomcat-i18n-ja.jar ann - otations-api.jar catalina-tribes.jar commons-fileupload-1.2.1.jar dom - 4j-1.6.1.jar junit-4.10.jar mysql-connector-java-5.1.14-bin.jar junit - -benchmarks-0.7.0.jar commons-io-1.4.jar javassist.jar - diff --git a/src/zutil/converters/Converter.java b/src/zutil/converters/Converter.java index ea95092..69afe43 100644 --- a/src/zutil/converters/Converter.java +++ b/src/zutil/converters/Converter.java @@ -23,6 +23,7 @@ package zutil.converters; import zutil.io.DynamicByteArrayStream; +import zutil.parser.Base64Decoder; import java.io.*; import java.util.BitSet; @@ -343,7 +344,7 @@ public class Converter { else if(c == Byte.class) return (T) new Byte(data); else if(c == byte.class) return (T) new Byte(data); else if(byte[].class.isAssignableFrom(c)) - return (T) new sun.misc.BASE64Decoder().decodeBuffer(data); + return (T) Base64Decoder.decode(data); }catch(Exception e){ e.printStackTrace(); } diff --git a/src/zutil/io/file/FileSearch.java b/src/zutil/io/file/FileSearch.java new file mode 100644 index 0000000..7a1dd60 --- /dev/null +++ b/src/zutil/io/file/FileSearch.java @@ -0,0 +1,147 @@ +/******************************************************************************* + * Copyright (c) 2013 Ziver + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +package zutil.io.file; + +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; + +public class FileSearch implements Iterable{ + private File root; + + // Search parameters + private String fileName; + private String extension; + private boolean recursive; + //private int depth; + private boolean searchFiles; + private boolean searchFolders; + + + public FileSearch(File root){ + this.root = root; + searchFiles = true; + searchFolders = true; + } + + + /** + * @param file Sets the exact file name to search for (includes extension) + */ + public void setFileName(String file){ + fileName = file; + } + + /** + * Sets the file extensions to search for (should not include . at the beggining) + */ + public void setExtension(String ext){ + + } + + /** + * Sets if the search should go into sub-folders + */ + public void setRecursive(boolean recursive){ + this.recursive = recursive; + } + + /** + * Sets how deep into folders the search should go + * (Recursion needs to be enabled for this attribute to be used) + */ + //public void setDepth(int depth){ + // this.depth = depth; + //} + + public void searchFiles(boolean searchFiles){ + this.searchFiles = searchFiles; + } + public void searchFolders(boolean searchFolders){ + this.searchFolders = searchFolders; + } + + + @Override + public Iterator iterator() { + return new FileSearchIterator(); + } + + + protected class FileSearchIterator implements Iterator{ + private ArrayList fileList; + private int currentIndex; + + public FileSearchIterator(){ + fileList = new ArrayList(); + currentIndex = 0; + + addToFileList(root.listFiles()); + next(); + } + + @Override + public boolean hasNext() { + return currentIndex != fileList.size(); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + @Override + public File next() { + if(currentIndex < 0) + return null; + // Temporarily save the current file + File ret = fileList.get(currentIndex); + + // Find the next file + for(; currentIndex { + private double pluginVersion; + private String pluginName; + private String pluginClass; + + private T obj; + + + protected PluginData(String intf, DataNode data){ + pluginVersion = data.getDouble("version"); + pluginName = data.getString("name"); + pluginClass = data.get("interfaces").getString(intf); + } + + public double getVersion(){ + return pluginVersion; + } + public String getName(){ + return pluginName; + } + + @SuppressWarnings("unchecked") + public T getObject() throws InstantiationException, IllegalAccessException, ClassNotFoundException{ + if(obj == null) + obj = (T) Class.forName(pluginClass).newInstance(); + return obj; + } + +} diff --git a/src/zutil/plugin/PluginManager.java b/src/zutil/plugin/PluginManager.java new file mode 100644 index 0000000..d149941 --- /dev/null +++ b/src/zutil/plugin/PluginManager.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2014 Ziver + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +package zutil.plugin; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; + +import zutil.io.file.FileSearch; +import zutil.io.file.FileUtil; +import zutil.parser.DataNode; +import zutil.parser.json.JSONParser; + +/** + * This class will search the file system for files + * with the name "plugin.json" that defines data + * parameters for a single plugin. + * The class will only load the latest version of the specific plugin. + * + * @author Ziver + */ +public class PluginManager implements Iterable>{ + private HashMap> plugins; + + public static PluginManager load(Class intfClass) throws IOException{ + return new PluginManager(intfClass); + } + + + private PluginManager(Class intfClass) throws IOException{ + FileSearch search = new FileSearch(new File(".")); + search.setRecursive(true); + search.searchFolders(false); + search.setFileName("plugin.json"); + + for(File file : search){ + DataNode node = JSONParser.read(FileUtil.getFileContent(file)); + PluginData plugin = new PluginData(intfClass.getName(), node); + + if(node.get("interfaces").getString(intfClass.getName()) != null){ + if(plugins.containsKey(plugin.getName())){ + if(plugins.get(plugin.getName()).getVersion() < plugin.getVersion()) + plugins.put(plugin.getName(), plugin); + } + else{ + plugins.put(plugin.getName(), plugin); + } + } + } + } + + @Override + public Iterator> iterator() { + return plugins.values().iterator(); + } + +} \ No newline at end of file diff --git a/src/zutil/plugin/plugin.json.example b/src/zutil/plugin/plugin.json.example new file mode 100644 index 0000000..7c350cb --- /dev/null +++ b/src/zutil/plugin/plugin.json.example @@ -0,0 +1,8 @@ +{ + version = 1.0, + name = "Nice name of Plugin" + interfaces = { + "plugin.interface.class" = "plugin.implementation.class", + "wa.server.plugin.WAFrontend" = "wa.server.plugin.apache.ApacheFrontend", + } +} \ No newline at end of file