/* * PluginResURLConnection.java - jEdit plugin resource URL connection * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright © 1999 - 2014 Slava Pestov, Eric Le Lay, Alan Ezust * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.gjt.sp.jedit.proto.jeditresource; //{{{ Imports import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import javax.annotation.Nonnull; import org.gjt.sp.jedit.MiscUtilities; import org.gjt.sp.jedit.PluginJAR; import org.gjt.sp.jedit.jEdit; import org.gjt.sp.util.Log; //}}} //{{{ class PluginResURLConnection /** An implementation of jeditresource:/ url protocol. Can be used for accessing jEdit core resources as well. */ public class PluginResURLConnection extends URLConnection { //{{{ constructor public PluginResURLConnection(URL url) throws IOException { super(url); String file = url.getFile(); int index = file.indexOf('!',0); if(index == -1) { plugin = null; resource = file; } else { int start; if(file.charAt(0) == '/') start = 1; else start = 0; plugin = file.substring(start,index); resource = file.substring(index + 1); } if(plugin != null && resource.startsWith("/")) resource = resource.substring(1); }//}}} //{{{ connect() /** * @throws IOException on error * @throws FileNotFoundException if resource is not found */ public void connect() throws IOException, FileNotFoundException { if(!connected) { if(plugin == null) { in = jEdit.class.getResourceAsStream(resource); } else { boolean pluginFoundInPluginJARs = false; PluginJAR[] plugins = jEdit.getPluginJARs(); for (PluginJAR jar : plugins) { String jarName = MiscUtilities.getFileName(jar.getPath()).toLowerCase(); if (plugin.equalsIgnoreCase(jarName)) { pluginFoundInPluginJARs = true; in = jar.getClassLoader().getResourceAsStream(resource); break; } } if(!pluginFoundInPluginJARs){ Log.log(Log.DEBUG, PluginResURLConnection.class, "reading resource from not loaded plugin " +" => will always fail !"); } } if((in == null) && (plugin == null)) { // can't find it in jEdit.jar, look in getJEditHome(). File f = new File(jEdit.getJEditHome(), resource); if (f.exists()) in = new FileInputStream(f); } connected = true; } if(in == null) { if(plugin != null) { throw new FileNotFoundException("Resource not found: " + plugin + "!" + resource); } else { throw new FileNotFoundException("Resource not found: " + getURL()); } } }//}}} //{{{ getInputStream() /** * @return input stream to read the resource's contents. never null * @throws IOException on error * @throws FileNotFoundException if resource is not found */ @Nonnull public InputStream getInputStream() throws IOException, FileNotFoundException { connect(); return in; }//}}} //{{{ getHeaderField() public String getHeaderField(String name) { if(name.equals("content-type")) { String lcResource = resource.toLowerCase(); if(lcResource.endsWith(".html")) return "text/html"; else if(lcResource.endsWith(".txt")) return "text/plain"; else if(lcResource.endsWith(".rtf")) return "text/rtf"; else if(lcResource.endsWith(".gif")) return "image/gif"; else if(lcResource.endsWith(".jpg") || lcResource.endsWith(".jpeg")) return "image/jpeg"; else return null; } else return null; }//}}} //{{{ private members private InputStream in; private String plugin; private String resource; //}}} }//}}}