private List parseComponentDescription(BundleContext bundleContext, String xml) {
private List parseComponentDescription(BundleContext bundleContext, String xml) throws XMLParserNotAvailableException {  SAXParserFactory parserFactory = (SAXParserFactory) parserTracker.getService(); if (parserFactory == null) {  try { parserFactory = SAXParserFactory.newInstance(); } catch (FactoryConfigurationError err) {  delayedParseBundles.add(bundleContext.getBundle()); throw new XMLParserNotAvailableException(); } }
	private List parseComponentDescription(BundleContext bundleContext, String xml) {		List result = new ArrayList();		int fileIndex = xml.lastIndexOf('/');		String path = fileIndex != -1 ? xml.substring(0, fileIndex) : "/";		try {			Enumeration urls = bundleContext.getBundle().findEntries(path, xml.substring(fileIndex + 1), false);			if (urls == null || !urls.hasMoreElements()) {				throw new BundleException("resource not found: " + xml);			}			URL url = (URL) urls.nextElement();			InputStream is = url.openStream();			SAXParserFactory parserFactory = (SAXParserFactory) parserTracker.getService();			parserFactory.setNamespaceAware(true);			parserFactory.setValidating(false);			SAXParser saxParser = parserFactory.newSAXParser();			saxParser.parse(is, new ParserHandler(bundleContext, result));		} catch (IOException e) {			Log.log(1, "[SCR] IOException attempting to parse ComponentDescription XML. ", e);		} catch (BundleException e) {			Log.log(1, "[SCR] BundleException attempting to parse ComponentDescription XML. ", e);		} catch (SAXException e) {			Log.log(1, "[SCR] SAXException attempting to parse ComponentDescription XML. ", e);		} catch (ParserConfigurationException e) {			Log.log(1, "[SCR] ParserConfigurationException attempting to parse ComponentDescription XML. ", e);		}		return result;	}