Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2000, 2010 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.net.URI;
 import java.util.*;
 import  org.eclipse.equinox.p2.publisher.eclipse.URLEntry;
 import org.xml.sax.*;
Parses a category.xml file. This class was initially copied from org.eclipse.update.core.model.DefaultSiteParser.
 
 public class CategoryParser extends DefaultHandler {
 	private final static SAXParserFactory parserFactory = SAXParserFactory.newInstance();
 	private static final String PLUGIN_ID = .;
 
 	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 DESCRIPTION = "description"//$NON-NLS-1$
 	private static final String FEATURE = "feature"//$NON-NLS-1$
 	private static final String SITE = "site"//$NON-NLS-1$
 	private static final String IU = "iu"//$NON-NLS-1$
 	private static final String QUERY = "query"//$NON-NLS-1$
 	private static final String EXPRESSION = "expression"//$NON-NLS-1$
 	private static final String PARAM = "param"//$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_IU = 8;
 	private static final int STATE_EXPRESSION = 9;
 	private static final int STATE_PARAM = 10;
 	private static final int STATE_QUERY = 11;
 	private static final int STATE_SITE = 1;
 
 	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 static void debug(String s) {
 		Tracing.debug("CategoryParser: " + s); //$NON-NLS-1$
 	}
 
 	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 CategoryParser(URI siteLocation) {
 		super();
 		 = new Stack<Integer>();
 		 = new Stack<Object>();
		 = null;
		try {
			log(e);
catch (SAXException e) {
			log(e);
		}
			debug("Created"); //$NON-NLS-1$
	}
	public int currentState() {
		Integer state = .peek();
		if (state != null)
			return state.intValue();
	}

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 = currentState();
		switch (state) {
				break;
			case  :
				text = text.trim();
				String existing = null;
				if (.peek() instanceof String)
					existing = (String.pop();
				if (existing != null)
					text = existing + text;
				break;
			default :
				break// nothing
		}
	}

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 = currentState();
		switch (state) {
			case  :
				break;
				break;
			case  :
				if (.peek() instanceof String) {
					text = (String.pop();
					site.getDescription().setAnnotation(text);
				}
				//do not pop the object
				break;
				break;
			case  :
				SiteIU completeIU = (SiteIU.pop();
				String id = completeIU.getID();
				String expression = completeIU.getQueryExpression();
				if (id == null && expression == null)
					internalError("The IU must specify an id or an expression to match against."); //$NON-NLS-1$
				break;
				if (.peek() instanceof String) {
					text = (String.pop();
						debug("Found Expression: " + text); //$NON-NLS-1$
				}
				break;
			case  :
				if (.peek() instanceof String) {
					text = (String.pop();
						debug("Found Param: " + text); //$NON-NLS-1$
				}
				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$
			case  :
				return "IU"//$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()) {
			processInfo(attributes);
else
	}
	private void handleCategoryState(String elementNameAttributes attributes) {
	}
	private void handleFeatureState(String elementNameAttributes attributes) {
		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()) {
			processIU(attributes);
else if (elementName.equals()) {
			processArchive(attributes);
else if (elementName.equals()) {
			processCategoryDef(attributes);
else
	}
	private void handleIUState(String elementNameAttributes attributes) {
		if (elementName.equals()) {
			processQuery(attributes);
else if (elementName.equals()) {
			processCategory(attributes);
else
	}
	private void handleQueryState(String elementNameAttributes attributes) {
		if (elementName.equals()) {
			processExpression(attributes);
else if (elementName.equals()) {
			processParam(attributes);
else
	}
	private void handleExpression(String elementNameAttributes attributes) {
	}
	private void handleParamState(String elementNameAttributes attributes) {
	}
	/*
	 * 
	 */
	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$
		else {
			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) {
		// don't care about archives in category xml
			debug("End processing Archive"); //$NON-NLS-1$
	}
	/* 
	 * process the Category  info
	 */
	private void processCategory(Attributes attributes) {
		String category = attributes.getValue("name"); //$NON-NLS-1$
		// TODO could create common class/interface for adding categories
		if (obj instanceof SiteFeature)
			((SiteFeatureobj).addCategoryName(category);
		else if (obj instanceof SiteIU)
			((SiteIUobj).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();
		// identifier and version
		String id = attributes.getValue("id"); //$NON-NLS-1$
		String ver = attributes.getValue("version"); //$NON-NLS-1$
		boolean noId = (id == null || id.trim().equals("")); //$NON-NLS-1$
		// We need to have id and version, or the url, or both.
		if (noId)
			internalError(NLS.bind(., (new String[] {"url"getState(currentState())}))); //$NON-NLS-1$
		feature.setFeatureVersion(ver);
		site.addFeature(feature);
		feature.setSiteModel(site);
		.push(feature);
			debug("End Processing Feature Tag: id:" + id + " version:" + ver); //$NON-NLS-1$ //$NON-NLS-2$
	}
	/* 
	 * process IU info
	 */
	private void processIU(Attributes attributes) {
		SiteIU iu = new SiteIU();
		// identifier and version
		String id = attributes.getValue("id"); //$NON-NLS-1$
		String range = attributes.getValue("range"); //$NON-NLS-1$
		id = id == null ? null : id.trim();
		range = range == null ? null : range.trim();
		iu.setID(id);
		iu.setRange(range);
		site.addIU(iu);
			debug("End processing iu."); //$NON-NLS-1$
	}
	/* 
	 * process expression info
	 */
	private void processExpression(Attributes attributes) {
		iu.setQueryType(attributes.getValue("type")); //$NON-NLS-1$
			debug("End processing Expression: " + iu.getQueryType()); //$NON-NLS-1$ 
	}
	/* 
	 * process query info
	 */
	private void processQuery(Attributes attributes) {
		// TODO may have simple attriutes for id and range
			debug("End processing Query."); //$NON-NLS-1$
	}
	/* 
	 * process param info
	 */
	private void processParam(Attributes attributes) {
			debug("End processing Param."); //$NON-NLS-1$
	}
	/* 
	 * 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();
			debug("End process Site tag."); //$NON-NLS-1$
	}

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: " + currentState()); //$NON-NLS-1$
			debug("Start Element: uri:" + uri + " local Name:" + localName + " qName:" + qName);//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
		}
		switch (currentState()) {
				break;
				handleInitialState(localNameattributes);
				break;
			case  :
				handleSiteState(localNameattributes);
				break;
				handleFeatureState(localNameattributes);
				break;
			case  :
				handleIUState(localNameattributes);
				break;
				handleExpression(localNameattributes);
				break;
			case  :
				handleQueryState(localNameattributes);
				break;
			case  :
				handleParamState(localNameattributes);
				break;
				handleSiteState(localNameattributes);
				break;
				handleCategoryState(localNameattributes);
				break;
				handleCategoryDefState(localNameattributes);
				break;
				handleSiteState(localNameattributes);
				break;
				handleSiteState(localNameattributes);
				break;
			default :
				break;
		}
	}
	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