Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2000, 2011 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.equinox.internal.p2.updatesite;
 
 import java.io.*;
 import java.net.URI;
 import java.util.*;
 import  org.eclipse.equinox.p2.publisher.eclipse.URLEntry;
 import org.w3c.dom.*;
 import org.xml.sax.*;
Parses a site.xml file. This class was initially copied from org.eclipse.update.core.model.DefaultSiteParser.
 
 public class DefaultSiteParser extends DefaultHandler {
 
 	private static final String ARCHIVE = "archive"//$NON-NLS-1$
 	private static final String CATEGORY = "category"//$NON-NLS-1$
 	private static final String CATEGORY_DEF = "category-def"//$NON-NLS-1$
 
 	private static final String ASSOCIATE_SITES_URL = "associateSitesURL"//$NON-NLS-1$
 	private static final String ASSOCIATE_SITE = "associateSite"//$NON-NLS-1$
 	private static final String DEFAULT_INFO_URL = "index.html"//$NON-NLS-1$
 	private static final String DESCRIPTION = "description"//$NON-NLS-1$
 	private static final String FEATURE = "feature"//$NON-NLS-1$
 	private static final String FEATURES = "features/"//$NON-NLS-1$
 	private final static SAXParserFactory parserFactory = SAXParserFactory.newInstance();
 	private static final String PLUGIN_ID = .;
 	private static final String SITE = "site"//$NON-NLS-1$
 
 	private static final int STATE_ARCHIVE = 3;
 	private static final int STATE_CATEGORY = 4;
 	private static final int STATE_CATEGORY_DEF = 5;
 	private static final int STATE_DESCRIPTION_CATEGORY_DEF = 7;
 	private static final int STATE_DESCRIPTION_SITE = 6;
 	private static final int STATE_FEATURE = 2;
 	private static final int STATE_IGNORED_ELEMENT = -1;
 	private static final int STATE_INITIAL = 0;
 	private static final int STATE_SITE = 1;
 
 	private int currentState;
 
 	private boolean DESCRIPTION_SITE_ALREADY_SEEN = false;
 	// Current object stack (used to hold the current object we are
 	// populating in this plugin descriptor
 
 	private SAXParser parser;
 
 	// Current State Information
 
 	// List of string keys for translated strings
 	private final List<StringmessageKeys = new ArrayList<String>(4);
 
 	private MultiStatus status;
 	private final URI siteLocation;
 
 	/*
 	 * 
 	 */
 	private static void debug(String s) {
 		Tracing.debug("DefaultSiteParser: " + s); //$NON-NLS-1$
 	}
 
 	private static URLEntry[] getAssociateSites(String associateSitesURL) {
 
 		try {
 			DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
 			DocumentBuilder builder = domFactory.newDocumentBuilder();
 			Document document = builder.parse(associateSitesURL);
 			if (document == null)
 				return null;
 			NodeList mirrorNodes = document.getElementsByTagName();
 			URLEntry[] mirrors = new URLEntry[mirrorNodes.getLength()];
 			for (int i = 0; i < mirrorNodes.getLength(); i++) {
 				Element mirrorNode = (ElementmirrorNodes.item(i);
 				mirrors[i] = new URLEntry();
 				String infoURL = mirrorNode.getAttribute("url"); //$NON-NLS-1$
 				String label = mirrorNode.getAttribute("label"); //$NON-NLS-1$
 				mirrors[i].setURL(infoURL);
 				mirrors[i].setAnnotation(label);
 
					debug("Processed mirror: url:" + infoURL + " label:" + label); //$NON-NLS-1$ //$NON-NLS-2$
			}
			return mirrors;
catch (Exception e) {
			// log if absolute url
			if (associateSitesURL != null && (associateSitesURL.startsWith("http://"//$NON-NLS-1$
					|| associateSitesURL.startsWith("https://"//$NON-NLS-1$
					|| associateSitesURL.startsWith("file://"//$NON-NLS-1$
					|| associateSitesURL.startsWith("ftp://"//$NON-NLS-1$
			|| associateSitesURL.startsWith("jar://"))) //$NON-NLS-1$
			return null;
		}
	}
	static void log(Exception e) {
		LogHelper.log(new Status(.."Internal Error"e)); //$NON-NLS-1$
	}
	static void log(String message) {
		LogHelper.log(new Status(..messagenull));
	}
	static void log(String messageException e) {
		LogHelper.log(new Status(..messagee));
	}

Constructs a site parser.
	public DefaultSiteParser(URI siteLocation) {
		super();
		this. = siteLocation;
		 = null;
		try {
			log(e);
catch (SAXException e) {
			log(e);
		}
			debug("Created"); //$NON-NLS-1$
	}

Handle character text

Since:
2.0
See also:
DefaultHandler.characters(char[], int, int)
	public void characters(char[] chint startint length) {
		String text = new String(chstartlength);
		//only push if description
		int state = .peek().intValue();
	}

Handle end of element tags

Since:
2.0
See also:
DefaultHandler.endElement(String, String, String)
	public void endElement(String uriString localNameString qName) {
		String text = null;
		URLEntry info = null;
		int state = .peek().intValue();
		switch (state) {
				break;
				break;
			case  :
				if (.peek() instanceof String) {
					text = (String.pop();
					site.getDescription().setAnnotation(text);
				}
				//do not pop the object
				break;
				break;
				if (.peek() instanceof String) {
					text = (String.pop();
					category.setDescription(text);
				}
				break;
				text = ""//$NON-NLS-1$
				while (.peek() instanceof String) {
					// add text, preserving at most one space between text fragments
					String newText = (String.pop();
					if (trailingSpace(newText) && !leadingSpace(text)) {
						text = " " + text//$NON-NLS-1$
					}
					text = newText.trim() + text;
					if (leadingSpace(newText) && !leadingSpace(text)) {
						text = " " + text//$NON-NLS-1$
					}
				}
				text = text.trim();
				info = (URLEntry) .pop();
				if (text != null)
					info.setAnnotation(text);
				SiteModel siteModel = (SiteModel.peek();
				// override description.
				// do not raise error as previous description may be default one
				// when parsing site tag
				siteModel.setDescription(info);
				break;
				text = ""//$NON-NLS-1$
				while (.peek() instanceof String) {
					// add text, preserving at most one space between text fragments
					String newText = (String.pop();
					if (trailingSpace(newText) && !leadingSpace(text)) {
						text = " " + text//$NON-NLS-1$
					}
					text = newText.trim() + text;
					if (leadingSpace(newText) && !leadingSpace(text)) {
						text = " " + text//$NON-NLS-1$
					}
				}
				text = text.trim();
				info = (URLEntry) .pop();
				if (text != null)
					info.setAnnotation(text);
				if (category.getDescription() != null)
				else {
					checkTranslated(info.getAnnotation());
					category.setDescription(info.getAnnotation());
				}
				break;
			default :
				break;
		}
			debug("End Element:" + uri + ":" + localName + ":" + qName);//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	}
	/*
	 * Handles an error state specified by the status.  The collection of all logged status
	 * objects can be accessed using <code>getStatus()</code>.
	 *
	 * @param error a status detailing the error condition
	 */
	private void error(IStatus error) {
		if ( == null) {
		}
		.add(error);
			LogHelper.log(error);
	}

Handle errors

Since:
2.0
See also:
DefaultHandler.error(SAXParseException)
	public void error(SAXParseException ex) {
	}

Handle fatal errors

Throws:
SAXException
Since:
2.0
See also:
DefaultHandler.fatalError(SAXParseException)
	public void fatalError(SAXParseException exthrows SAXException {
		throw ex;
	}
	/*
	 * return the state as String
	 */
	private String getState(int state) {
		switch (state) {
				return "Ignored"//$NON-NLS-1$
				return "Initial"//$NON-NLS-1$
			case  :
				return "Site"//$NON-NLS-1$
				return "Feature"//$NON-NLS-1$
				return "Archive"//$NON-NLS-1$
				return "Category"//$NON-NLS-1$
				return "Category Def"//$NON-NLS-1$
				return "Description / Category Def"//$NON-NLS-1$
				return "Description / Site"//$NON-NLS-1$
			default :
		}
	}

Returns all status objects accumulated by the parser.

Returns:
multi-status containing accumulated status, or null.
Since:
2.0
	public MultiStatus getStatus() {
		return ;
	}
	private void handleCategoryDefState(String elementNameAttributes attributes) {
		if (elementName.equals()) {
			processFeature(attributes);
else if (elementName.equals()) {
			processArchive(attributes);
else if (elementName.equals()) {
			processCategoryDef(attributes);
else if (elementName.equals()) {
			processInfo(attributes);
else
	}
	private void handleCategoryState(String elementNameAttributes attributes) {
		if (elementName.equals()) {
			processInfo(attributes);
else if (elementName.equals()) {
			processFeature(attributes);
else if (elementName.equals()) {
			processArchive(attributes);
else if (elementName.equals()) {
			processCategoryDef(attributes);
else if (elementName.equals()) {
			processCategory(attributes);
else
	}
	private void handleFeatureState(String elementNameAttributes attributes) {
		if (elementName.equals()) {
			processInfo(attributes);
else if (elementName.equals()) {
			processFeature(attributes);
else if (elementName.equals()) {
			processArchive(attributes);
else if (elementName.equals()) {
			processCategoryDef(attributes);
else if (elementName.equals()) {
			processCategory(attributes);
else
	}
	private void handleInitialState(String elementNameAttributes attributesthrows SAXException {
		if (elementName.equals()) {
			processSite(attributes);
else {
			// what we received was not a site.xml, no need to continue
		}
	}
	private void handleSiteState(String elementNameAttributes attributes) {
		if (elementName.equals()) {
			processInfo(attributes);
else if (elementName.equals()) {
			processFeature(attributes);
else if (elementName.equals()) {
			processArchive(attributes);
else if (elementName.equals()) {
			processCategoryDef(attributes);
else
	}
	/*
	 * 
	 */
	private void internalError(String message) {
		error(new Status(..messagenull));
	}
	/*
	 * 
	 */
	private void internalErrorUnknownTag(String msg) {
	}
	private boolean leadingSpace(String str) {
		if (str.length() <= 0) {
			return false;
		}
		return Character.isWhitespace(str.charAt(0));
	}
	/*
	 * 
	 */
	private void logStatus(SAXParseException ex) {
		String name = ex.getSystemId();
		if (name == null)
			name = ""//$NON-NLS-1$
		else
			name = name.substring(1 + name.lastIndexOf("/")); //$NON-NLS-1$
		String msg;
		if (name.equals("")) //$NON-NLS-1$
		String[] values = new String[] {name, Integer.toString(ex.getLineNumber()), Integer.toString(ex.getColumnNumber()), ex.getMessage()};
		error(new Status(.msgex));
	}

Parses the specified input steam and constructs a site model. The input stream is not closed as part of this operation.

Parameters:
in input stream
Returns:
site model
Throws:
SAXException
IOException
Since:
2.0
		.parse(new InputSource(in), this);
		if (.peek() instanceof SiteModel) {
			return site;
		}
		String stack = ""//$NON-NLS-1$
		while (iter.hasNext()) {
			stack = stack + iter.next().toString() + "\r\n"//$NON-NLS-1$
		}
	}
	/* 
	 * process archive info
	 */
	private void processArchive(Attributes attributes) {
		URLEntry archive = new URLEntry();
		String id = attributes.getValue("path"); //$NON-NLS-1$
		if (id == null || id.trim().equals("")) { //$NON-NLS-1$
			internalError(NLS.bind(., (new String[] {"path"getState()}))); //$NON-NLS-1$
		}
		archive.setAnnotation(id);
		String url = attributes.getValue("url"); //$NON-NLS-1$
		if (url == null || url.trim().equals("")) { //$NON-NLS-1$
			internalError(NLS.bind(., (new String[] {"archive"getState()}))); //$NON-NLS-1$
else {
			archive.setURL(url);
			site.addArchive(archive);
		}
			debug("End processing Archive: path:" + id + " url:" + url);//$NON-NLS-1$ //$NON-NLS-2$
	}
	/* 
	 * process the Category  info
	 */
	private void processCategory(Attributes attributes) {
		String category = attributes.getValue("name"); //$NON-NLS-1$
		feature.addCategoryName(category);
			debug("End processing Category: name:" + category); //$NON-NLS-1$
	}
	/* 
	 * process category def info
	 */
	private void processCategoryDef(Attributes attributes) {
		SiteCategory category = new SiteCategory();
		String name = attributes.getValue("name"); //$NON-NLS-1$
		String label = attributes.getValue("label"); //$NON-NLS-1$
		category.setName(name);
		category.setLabel(label);
		site.addCategory(category);
		.push(category);
			debug("End processing CategoryDef: name:" + name + " label:" + label); //$NON-NLS-1$ //$NON-NLS-2$
	}
	/* 
	 * process feature info
	 */
	private void processFeature(Attributes attributes) {
		SiteFeature feature = new SiteFeature();
		// feature location on the site
		String urlInfo = attributes.getValue("url"); //$NON-NLS-1$
		// identifier and version
		String id = attributes.getValue("id"); //$NON-NLS-1$
		String ver = attributes.getValue("version"); //$NON-NLS-1$
		boolean noURL = (urlInfo == null || urlInfo.trim().equals("")); //$NON-NLS-1$
		boolean noId = (id == null || id.trim().equals("")); //$NON-NLS-1$
		boolean noVersion = (ver == null || ver.trim().equals("")); //$NON-NLS-1$
		// We need to have id and version, or the url, or both.
		if (noURL) {
			if (noId || noVersion)
			else
				// default url
				urlInfo =  + id + '_' + ver// 
		}
		feature.setURLString(urlInfo);
		String type = attributes.getValue("type"); //$NON-NLS-1$
		feature.setType(type);
		// if one is null, and not the other
		if (noId ^ noVersion) {
			String[] values = new String[] {idvergetState()};
else {
			feature.setFeatureVersion(ver);
		}
		// get label if it exists
		String label = attributes.getValue("label"); //$NON-NLS-1$
		if (label != null) {
			if ("".equals(label.trim())) //$NON-NLS-1$
				label = null;
		}
		feature.setLabel(label);
		// OS
		String os = attributes.getValue("os"); //$NON-NLS-1$
		feature.setOS(os);
		// WS
		String ws = attributes.getValue("ws"); //$NON-NLS-1$
		feature.setWS(ws);
		// NL
		String nl = attributes.getValue("nl"); //$NON-NLS-1$
		feature.setNL(nl);
		// arch
		String arch = attributes.getValue("arch"); //$NON-NLS-1$
		feature.setArch(arch);
		//patch
		String patch = attributes.getValue("patch"); //$NON-NLS-1$
		feature.setPatch(patch);
		site.addFeature(feature);
		feature.setSiteModel(site);
		.push(feature);
			debug("End Processing DefaultFeature Tag: url:" + urlInfo + " type:" + type); //$NON-NLS-1$ //$NON-NLS-2$
	}
	/* 
	 * process URL info with element text
	 */
	private void processInfo(Attributes attributes) {
		URLEntry inf = new URLEntry();
		String infoURL = attributes.getValue("url"); //$NON-NLS-1$
		inf.setURL(infoURL);
			debug("Processed Info: url:" + infoURL); //$NON-NLS-1$
	}
	/* 
	 * process site info
	 */
	private void processSite(Attributes attributes) {
		// create site map
		SiteModel site = new SiteModel();
		// if URL is specified, it replaces the URL of the site
		// used to calculate the location of features and archives
		String siteURL = attributes.getValue("url"); //$NON-NLS-1$
		if (siteURL != null && !("".equals(siteURL.trim()))) { //$NON-NLS-1$
			if (!siteURL.endsWith("/") && !siteURL.endsWith(.)) { //$NON-NLS-1$
				siteURL += "/"//$NON-NLS-1$
			}
			site.setLocationURIString(siteURL);
		}
		// provide default description URL
		// If <description> is specified, for the site,  it takes precedence		
		URLEntry description = new URLEntry();
		description.setURL();
		site.setDescription(description);
		// verify we can parse the site ...if the site has
		// a different type throw an exception to force reparsing
		// with the matching parser
		String type = attributes.getValue("type"); //$NON-NLS-1$
		site.setType(type);
		// get mirrors, if any
		String mirrorsURL = attributes.getValue("mirrorsURL"); //$NON-NLS-1$
		if (mirrorsURL != null && mirrorsURL.trim().length() > 0) {
			//			URLEntry[] mirrors = getMirrors(mirrorsURL);
			//			if (mirrors != null)
			//				site.setMirrors(mirrors);
			//			else
			//Since we are parsing the site at p2 generation time and the 
			//mirrors may change, there is no point doing the mirror expansion now
			site.setMirrorsURIString(mirrorsURL);
		}
		String pack200 = attributes.getValue("pack200"); //$NON-NLS-1$
		if (pack200 != null && new Boolean(pack200).booleanValue()) {
		}
		String digestURL = attributes.getValue("digestURL"); //$NON-NLS-1$
		if (digestURL != null)
			site.setDigestURIString(digestURL);
		// TODO: Digest locales
		//			if ((attributes.getValue("availableLocales") != null) && (!attributes.getValue("availableLocales").trim().equals(""))) { //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
		//				StringTokenizer locals = new StringTokenizer(attributes.getValue("availableLocales"), ","); //$NON-NLS-1$//$NON-NLS-2$
		//				String[] availableLocals = new String[locals.countTokens()];
		//				int i = 0;
		//				while (locals.hasMoreTokens()) {
		//					availableLocals[i++] = locals.nextToken();
		//				}
		//								extendedSite.setAvailableLocals(availableLocals);
		//			}
		//		}
		//
		final String associateURL = attributes.getValue();
		if (associateURL != null) {
			//resolve the URI relative to the site location
			URI resolvedLocation = .resolve(associateURL);
			site.setAssociateSites(getAssociateSites(resolvedLocation.toString()));
		}
			debug("End process Site tag: siteURL:" + siteURL + " type:" + type);//$NON-NLS-1$ //$NON-NLS-2$
	}

Handle start of element tags

Since:
2.0
See also:
DefaultHandler.startElement(String, String, String, Attributes)
	public void startElement(String uriString localNameString qNameAttributes attributesthrows SAXException {
			debug("State: " + ); //$NON-NLS-1$
			debug("Start Element: uri:" + uri + " local Name:" + localName + " qName:" + qName);//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
		}
		switch () {
				break;
				handleInitialState(localNameattributes);
				break;
			case  :
				handleSiteState(localNameattributes);
				break;
				handleFeatureState(localNameattributes);
				break;
				handleSiteState(localNameattributes);
				break;
				handleCategoryState(localNameattributes);
				break;
				handleCategoryDefState(localNameattributes);
				break;
				handleSiteState(localNameattributes);
				break;
				handleSiteState(localNameattributes);
				break;
			default :
				break;
		}
		int newState = .peek().intValue();
		if (newState != )
			 = newState;
	}
	private boolean trailingSpace(String str) {
		if (str.length() <= 0) {
			return false;
		}
		return Character.isWhitespace(str.charAt(str.length() - 1));
	}
	// Add translatable strings from the site.xml
	// to the list of message keys.
	private void checkTranslated(String value) {
		if (value != null && value.length() > 1 && value.startsWith("%")) //$NON-NLS-1$
	}
New to GrepCode? Check out our FAQ X