📄 pluginjar.java
字号:
else if(lname.equals("services.xml")) { servicesURI = classLoader.getResource(name); cache.servicesURI = servicesURI; } else if(lname.endsWith(".props")) { InputStream in = classLoader.getResourceAsStream(name); properties.load(in); in.close(); } else if(name.endsWith(".class")) { String className = MiscUtilities .fileToClass(name); if(className.endsWith("Plugin")) { plugins.add(className); } classes.add(className); } } cache.cachedProperties = properties; jEdit.addPluginProps(properties); this.classes = cache.classes = (String[])classes.toArray( new String[classes.size()]); String label = null; Iterator iter = plugins.iterator(); while(iter.hasNext()) { String className = (String)iter.next(); String _label = jEdit.getProperty("plugin." + className + ".name"); String version = jEdit.getProperty("plugin." + className + ".version"); if(_label == null || version == null) { Log.log(Log.WARNING,this,"Ignoring: " + className); } else { cache.pluginClass = className; // Check if a plugin with the same name // is already loaded if(jEdit.getPlugin(className) != null) { jEdit.pluginError(path, "plugin-error.already-loaded", null); return null; } else { plugin = new EditPlugin.Deferred( className); plugin.jar = (EditPlugin.JAR)this; label = _label; } break; } } if(cache.actionsURI != null) { actions = new ActionSet(this,null,null, cache.actionsURI); actions.load(); cache.cachedActionNames = actions.getCacheableActionNames(); cache.cachedActionToggleFlags = new boolean[ cache.cachedActionNames.length]; for(int i = 0; i < cache.cachedActionNames.length; i++) { cache.cachedActionToggleFlags[i] = jEdit.getBooleanProperty( cache.cachedActionNames[i] + ".toggle"); } } if(cache.browserActionsURI != null) { browserActions = new ActionSet(this,null,null, cache.browserActionsURI); browserActions.load(); VFSBrowser.getActionContext().addActionSet(browserActions); cache.cachedBrowserActionNames = browserActions.getCacheableActionNames(); cache.cachedBrowserActionToggleFlags = new boolean[ cache.cachedBrowserActionNames.length]; for(int i = 0; i < cache.cachedBrowserActionNames.length; i++) { cache.cachedBrowserActionToggleFlags[i] = jEdit.getBooleanProperty( cache.cachedBrowserActionNames[i] + ".toggle"); } } if(dockablesURI != null) { DockableWindowManager.loadDockableWindows(this, dockablesURI,cache); } if(actions.size() != 0) { if(label != null) { actions.setLabel(jEdit.getProperty( "action-set.plugin", new String[] { label })); } else actionsPresentButNotCoreClass(); jEdit.addActionSet(actions); } if(servicesURI != null) { ServiceManager.loadServices(this,servicesURI,cache); } return cache; } //}}} //{{{ startPlugin() method private void startPlugin() { try { plugin.start(); } catch(Throwable t) { breakPlugin(); Log.log(Log.ERROR,PluginJAR.this, "Error while starting plugin " + plugin.getClassName()); Log.log(Log.ERROR,PluginJAR.this,t); String[] args = { t.toString() }; jEdit.pluginError(path,"plugin-error.start-error",args); } if(plugin instanceof EBPlugin) { if(jEdit.getProperty("plugin." + plugin.getClassName() + ".activate") == null) { // old plugins expected jEdit 4.1-style // behavior, where a PropertiesChanged // was sent after plugins were started ((EBComponent)plugin).handleMessage( new org.gjt.sp.jedit.msg.PropertiesChanged(null)); } EditBus.addToBus((EBPlugin)plugin); } // buffers retain a reference to the fold handler in // question... and the easiest way to handle fold // handler loading is this... Buffer buffer = jEdit.getFirstBuffer(); while(buffer != null) { FoldHandler handler = FoldHandler.getFoldHandler( buffer.getStringProperty("folding")); // == null before loaded if(buffer.getFoldHandler() != null && handler != null && handler != buffer.getFoldHandler()) { buffer.setFoldHandler(handler); } buffer = buffer.getNext(); } } //}}} //{{{ startPluginLater() method private void startPluginLater() { SwingUtilities.invokeLater(new Runnable() { public void run() { if(!activated) return; startPlugin(); } }); } //}}} //{{{ breakPlugin() method private void breakPlugin() { plugin = new EditPlugin.Broken(plugin.getClassName()); plugin.jar = (EditPlugin.JAR)this; // remove action sets, dockables, etc so that user doesn't // see the broken plugin uninit(false); // but we want properties to hang around jEdit.addPluginProps(properties); } //}}} //}}} //{{{ PluginCacheEntry class /** * Used by the <code>DockableWindowManager</code> and * <code>ServiceManager</code> to handle caching. * @since jEdit 4.2pre1 */ public static class PluginCacheEntry { public static final int MAGIC = 0xB7A2E420; //{{{ Instance variables public PluginJAR plugin; public long modTime; public String[] classes; public URL actionsURI; public String[] cachedActionNames; public boolean[] cachedActionToggleFlags; public URL browserActionsURI; public String[] cachedBrowserActionNames; public boolean[] cachedBrowserActionToggleFlags; public URL dockablesURI; public String[] cachedDockableNames; public boolean[] cachedDockableActionFlags; public URL servicesURI; public ServiceManager.Descriptor[] cachedServices; public Properties cachedProperties; public String pluginClass; //}}} /* read() and write() must be kept perfectly in sync... * its a very simple file format. doing it this way is * faster than serializing since serialization calls * reflection, etc. */ //{{{ read() method public boolean read(DataInputStream din) throws IOException { int cacheMagic = din.readInt(); if(cacheMagic != MAGIC) return false; String cacheBuild = readString(din); if(!cacheBuild.equals(jEdit.getBuild())) return false; long cacheModTime = din.readLong(); if(cacheModTime != modTime) return false; actionsURI = readURI(din); cachedActionNames = readStringArray(din); cachedActionToggleFlags = readBooleanArray(din); browserActionsURI = readURI(din); cachedBrowserActionNames = readStringArray(din); cachedBrowserActionToggleFlags = readBooleanArray(din); dockablesURI = readURI(din); cachedDockableNames = readStringArray(din); cachedDockableActionFlags = readBooleanArray(din); servicesURI = readURI(din); int len = din.readInt(); if(len == 0) cachedServices = null; else { cachedServices = new ServiceManager.Descriptor[len]; for(int i = 0; i < len; i++) { ServiceManager.Descriptor d = new ServiceManager.Descriptor( readString(din), readString(din), null, plugin); cachedServices[i] = d; } } classes = readStringArray(din); cachedProperties = readMap(din); pluginClass = readString(din); return true; } //}}} //{{{ write() method public void write(DataOutputStream dout) throws IOException { dout.writeInt(MAGIC); writeString(dout,jEdit.getBuild()); dout.writeLong(modTime); writeString(dout,actionsURI); writeStringArray(dout,cachedActionNames); writeBooleanArray(dout,cachedActionToggleFlags); writeString(dout,browserActionsURI); writeStringArray(dout,cachedBrowserActionNames); writeBooleanArray(dout,cachedBrowserActionToggleFlags); writeString(dout,dockablesURI); writeStringArray(dout,cachedDockableNames); writeBooleanArray(dout,cachedDockableActionFlags); writeString(dout,servicesURI); if(cachedServices == null) dout.writeInt(0); else { dout.writeInt(cachedServices.length); for(int i = 0; i < cachedServices.length; i++) { writeString(dout,cachedServices[i].clazz); writeString(dout,cachedServices[i].name); } } writeStringArray(dout,classes); writeMap(dout,cachedProperties); writeString(dout,pluginClass); } //}}} //{{{ Private members //{{{ readString() method private String readString(DataInputStream din) throws IOException { int len = din.readInt(); if(len == 0) return null; char[] str = new char[len]; for(int i = 0; i < len; i++) str[i] = din.readChar(); return new String(str); } //}}} //{{{ readURI() method private URL readURI(DataInputStream din) throws IOException { String str = readString(din); if(str == null) return null; else return new URL(str); } //}}} //{{{ readStringArray() method private String[] readStringArray(DataInputStream din) throws IOException { int len = din.readInt(); if(len == 0) return null; String[] str = new String[len]; for(int i = 0; i < len; i++) { str[i] = readString(din); } return str; } //}}} //{{{ readBooleanArray() method private boolean[] readBooleanArray(DataInputStream din) throws IOException { int len = din.readInt(); if(len == 0) return null; boolean[] bools = new boolean[len]; for(int i = 0; i < len; i++) { bools[i] = din.readBoolean(); } return bools; } //}}} //{{{ readMap() method private Properties readMap(DataInputStream din) throws IOException { Properties returnValue = new Properties(); int count = din.readInt(); for(int i = 0; i < count; i++) { String key = readString(din); String value = readString(din); if(value == null) value = ""; returnValue.put(key,value); } return returnValue; } //}}} //{{{ writeString() method private void writeString(DataOutputStream dout, Object obj) throws IOException { if(obj == null) { dout.writeInt(0); } else { String str = obj.toString(); dout.writeInt(str.length()); dout.writeChars(str); } } //}}} //{{{ writeStringArray() method private void writeStringArray(DataOutputStream dout, String[] str) throws IOException { if(str == null) { dout.writeInt(0); } else { dout.writeInt(str.length); for(int i = 0; i < str.length; i++) { writeString(dout,str[i]); } } } //}}} //{{{ writeBooleanArray() method private void writeBooleanArray(DataOutputStream dout, boolean[] bools) throws IOException { if(bools == null) { dout.writeInt(0); } else { dout.writeInt(bools.length); for(int i = 0; i < bools.length; i++) { dout.writeBoolean(bools[i]); } } } //}}} //{{{ writeMap() method private void writeMap(DataOutputStream dout, Map map) throws IOException { dout.writeInt(map.size()); Iterator iter = map.keySet().iterator(); while(iter.hasNext()) { String key = (String)iter.next(); writeString(dout,key); writeString(dout,map.get(key)); } } //}}} //}}} } //}}}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -