/******************************************************************************* * Copyright (c) 2000, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.update.internal.configurator; import java.io.*; import javax.xml.parsers.*; import org.eclipse.osgi.util.NLS; import org.xml.sax.*; import org.xml.sax.helpers.*; /** * Parse default feature.xml */ public class PluginParser extends DefaultHandler implements IConfigurationConstants { private final static SAXParserFactory parserFactory = SAXParserFactory.newInstance(); private SAXParser parser; private PluginEntry pluginEntry; private String location; private class ParseCompleteException extends SAXException { private static final long serialVersionUID = 1L; public ParseCompleteException(String arg0) { super(arg0); } } /** * Constructor for DefaultFeatureParser */ public PluginParser() { super(); try { parserFactory.setNamespaceAware(true); this.parser = parserFactory.newSAXParser(); } catch (ParserConfigurationException e) { System.out.println(e); } catch (SAXException e) { System.out.println(e); } } /** * @since 2.0 */ public synchronized PluginEntry parse(File pluginFile) throws SAXException, IOException { FileInputStream in = null; try{ in = new FileInputStream(pluginFile); return parse(in, PLUGINS + "/" + pluginFile.getParentFile().getName() + "/"); //$NON-NLS-1$ //$NON-NLS-2$ }finally{ if (in != null){ try{ in.close(); }catch(IOException e){ } } } } /** * @since 3.0 */ public synchronized PluginEntry parse(InputStream in, String bundleUrl) throws SAXException, IOException { try { location = bundleUrl; pluginEntry = new PluginEntry(); pluginEntry.setURL(bundleUrl); parser.parse(new InputSource(in), this); } catch (ParseCompleteException e) { // expected, we stopped the parsing when we have the information we need /// no need to pursue the parsing } return pluginEntry; } /** * @see DefaultHandler#startElement(String, String, String, Attributes) */ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { String tag = localName.trim(); if (tag.equalsIgnoreCase(CFG_PLUGIN)) { pluginEntry.isFragment(false); processPlugin(attributes); return; } if (tag.equalsIgnoreCase(CFG_FRAGMENT)) { pluginEntry.isFragment(true); processPlugin(attributes); return; } } /** * process plugin entry info */ private void processPlugin(Attributes attributes) throws ParseCompleteException { String id = attributes.getValue("id"); //$NON-NLS-1$ String version = attributes.getValue("version"); //$NON-NLS-1$ if (id == null || id.trim().length() == 0) { id = "_no_id_"; //$NON-NLS-1$ Utils.log(NLS.bind(Messages.PluginParser_plugin_no_id, (new String[] { location }))); } if (version == null || version.trim().length() == 0) { version = "0.0.0"; //$NON-NLS-1$ Utils.log(NLS.bind(Messages.PluginParser_plugin_no_version, (new String[] { location }))); } pluginEntry.setVersionedIdentifier(new VersionedIdentifier(id, version)); // stop parsing now throw new ParseCompleteException(""); //$NON-NLS-1$ } }