/* * PluginListHandler.java - XML handler for the plugin list * Copyright (C) 2001 Slava Pestov * * 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.pluginmgr; //{{{ Imports import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.helpers.DefaultHandler; import org.gjt.sp.util.Log; import org.gjt.sp.util.XMLUtilities; //}}} /** * @version $Id: PluginListHandler.java 12504 2008-04-22 23:12:43Z ezust $ */ class PluginListHandler extends DefaultHandler { //{{{ PluginListHandler constructor PluginListHandler(PluginList pluginList, String path) { this.pluginList = pluginList; this.path = path; author = new StringBuilder(); description = new StringBuilder(); pluginSetEntry = new StringBuilder(); download = new StringBuilder(); downloadSource = new StringBuilder(); } //}}} //{{{ resolveEntity() method public InputSource resolveEntity(String publicId, String systemId) { return XMLUtilities.findEntity(systemId, "plugins.dtd", getClass()); } //}}} //{{{ attribute() method public void attribute(String aname, String value, boolean isSpecified) { if(aname == "NAME") name = value; else if(aname == "JAR") jar = value; else if(aname == "VERSION") version = value; else if(aname == "DATE") date = value; else if(aname == "OBSOLETE") obsolete = ("TRUE".equals(value)); else if(aname == "WHAT") depWhat = value; else if(aname == "FROM") depFrom = value; else if(aname == "TO") depTo = value; else if(aname == "PLUGIN") depPlugin = value; else if(aname == "SIZE") { size = Integer.parseInt(value); if(size == 0) Log.log(Log.WARNING,this,"SIZE = 0"); } } //}}} //{{{ characters() method public void characters(char[] c, int off, int len) { String tag = peekElement(); if(tag.equals("DESCRIPTION")) { description.append(c, off, len); } else if(tag.equals("PLUGIN_SET_ENTRY")) pluginSetEntry.append(c, off, len); else if(tag.equals("AUTHOR")) { if(author.length() != 0) author.append(", "); author.append(c, off, len); } else if(tag.equals("DOWNLOAD")) download.append(c, off, len); else if(tag.equals("DOWNLOAD_SOURCE")) downloadSource.append(c, off, len); } //}}} //{{{ startElement() method public void startElement(String uri, String localName, String tag, Attributes attrs) { for (int i = 0; i < attrs.getLength(); i++) { String aName = attrs.getQName(i); String aValue = attrs.getValue(i); attribute(aName, aValue, true); } tag = pushElement(tag); if(tag.equals("PLUGIN_SET")) { description.setLength(0); pluginSet = new PluginList.PluginSet(); pluginSet.name = name; } else if(tag.equals("PLUGIN")) { description.setLength(0); author.setLength(0); branch = null; plugin = new PluginList.Plugin(); } else if(tag.equals("BRANCH")) { download.setLength(0); branch = new PluginList.Branch(); } else if(tag.equals("DOWNLOAD")) downloadSize = size; else if(tag.equals("DOWNLOAD_SOURCE")) downloadSourceSize = size; } //}}} //{{{ endElement() method public void endElement(String uri, String localName, String tag) { popElement(); if(tag.equals("PLUGIN_SET")) { pluginList.addPluginSet(pluginSet); pluginSet = null; pluginSetEntry.setLength(0); } else if(tag.equals("PLUGIN_SET_ENTRY")) { pluginSet.plugins.add(pluginSetEntry.toString()); pluginSetEntry.setLength(0); } else if(tag.equals("PLUGIN")) { plugin.jar = jar; plugin.name = name; plugin.author = author.toString(); plugin.description = description.toString(); pluginList.addPlugin(plugin); jar = null; name = null; author.setLength(0); description.setLength(0); } else if(tag.equals("BRANCH")) { branch.version = version; branch.date = date; branch.download = download.toString(); branch.downloadSize = downloadSize; branch.downloadSource = downloadSource.toString(); branch.downloadSourceSize = downloadSourceSize; branch.obsolete = obsolete; plugin.branches.add(branch); version = null; download.setLength(0); downloadSource.setLength(0); obsolete = false; } else if(tag.equals("DEPEND")) { PluginList.Dependency dep = new PluginList.Dependency( depWhat,depFrom,depTo,depPlugin); branch.deps.add(dep); depWhat = null; depFrom = null; depTo = null; depPlugin = null; } } //}}} //{{{ startDocument() method public void startDocument() { try { pushElement(null); } catch (Exception e) { Log.log(Log.ERROR, this, e); } } //}}} //{{{ endDocument() method public void endDocument() { pluginList.finished(); } //}}} // end HandlerBase implementation //{{{ private members //{{{ Instance variables private final String path; private final PluginList pluginList; private PluginList.PluginSet pluginSet; private final StringBuilder pluginSetEntry; private PluginList.Plugin plugin; private String jar; private StringBuilder author; private PluginList.Branch branch; private boolean obsolete; private String version; private String date; private StringBuilder download; private int downloadSize; private StringBuilder downloadSource; private int downloadSourceSize; private int size; private String depWhat; private String depFrom; private String depTo; private String depPlugin; private String name; private StringBuilder description; private final Stack<String> stateStack = new Stack<String>(); //}}} //{{{ pushElement() method private String pushElement(String name) { stateStack.push(name); return name; } //}}} //{{{ peekElement() method private String peekElement() { return stateStack.peek(); } //}}} //{{{ popElement() method private String popElement() { return stateStack.pop(); } //}}} //}}} }