| /********************************************************************** |
| * Copyright (c) 2009,2010 IBM Corporation. |
| * 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.ptp.etfw.feedback.sample; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import javax.xml.parsers.DocumentBuilderFactory; |
| import javax.xml.parsers.ParserConfigurationException; |
| import javax.xml.xpath.XPath; |
| import javax.xml.xpath.XPathConstants; |
| import javax.xml.xpath.XPathExpression; |
| import javax.xml.xpath.XPathExpressionException; |
| import javax.xml.xpath.XPathFactory; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IWorkspace; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.ptp.etfw.feedback.AbstractFeedbackParser; |
| import org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.NamedNodeMap; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.NodeList; |
| import org.xml.sax.SAXException; |
| |
| /** |
| * Sample parser to return items for the ETFw Feedback view |
| * |
| * @author beth |
| * |
| */ |
| public class SampleFeedbackParser extends AbstractFeedbackParser { |
| private boolean traceOn = false; |
| private List<IFeedbackItem> items = new ArrayList<IFeedbackItem>(); |
| |
| public List<IFeedbackItem> getFeedbackItems(IFile ifile) { |
| if (traceOn) |
| System.out.println("Reading xml file: " + ifile.getLocation()); |
| |
| items = new ArrayList<IFeedbackItem>(); |
| try { |
| items = parse(ifile); |
| } catch (XPathExpressionException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } catch (ParserConfigurationException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } catch (SAXException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } catch (IOException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return items; |
| } |
| |
| /** |
| * @deprecated use getFeedbackItems(IFile) instead |
| */ |
| public List<IFeedbackItem> getFeedbackItems(File file) { |
| // this is probably twisted around, too much converting back and forth |
| IWorkspace workspace = ResourcesPlugin.getWorkspace(); |
| IPath location = Path.fromOSString(file.getAbsolutePath()); |
| IFile ifile = workspace.getRoot().getFileForLocation(location); |
| List<IFeedbackItem> items = getFeedbackItems(ifile); |
| return items; |
| } |
| |
| /** |
| * Marker ID for markers added by this feedback parser. |
| * For now they are all the same, using plugin id. |
| */ |
| public String getMarkerID() { |
| return Activator.MARKER_ID; |
| } |
| |
| public String getViewID() { |
| return Activator.VIEW_ID; |
| } |
| |
| /** |
| * Populate objects from the xml file given |
| * |
| * @param xmlfile |
| * @throws ParserConfigurationException |
| * @throws SAXException |
| * @throws IOException |
| * @throws XPathExpressionException |
| */ |
| public List<IFeedbackItem> parse(IFile ifile) throws ParserConfigurationException, SAXException, IOException, |
| XPathExpressionException { |
| List<IFeedbackItem> items = new ArrayList<IFeedbackItem>(); |
| |
| // We will look for file in same dir as xml file; save its locn here |
| IPath p = ifile.getFullPath(); |
| p = p.removeLastSegments(1); |
| String filepath = p.toPortableString() + IPath.SEPARATOR; |
| |
| DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); |
| domFactory.setNamespaceAware(true); // never forget this! |
| Document document = super.getXMLDocument(ifile); |
| XPathFactory factory = XPathFactory.newInstance(); |
| XPath xpath = factory.newXPath(); |
| |
| /* get the items */ |
| XPathExpression expr = xpath.compile("//*[local-name()='MyItem']"); |
| Object result = expr.evaluate(document, XPathConstants.NODESET); |
| NodeList nodes = (NodeList) result; |
| for (int i = 0; i < nodes.getLength(); i++) { |
| NamedNodeMap attributes = nodes.item(i).getAttributes(); |
| if (attributes == null) |
| continue; |
| try { |
| String name = attributes.getNamedItem("name").getNodeValue(); |
| String fname = attributes.getNamedItem("file").getNodeValue(); |
| // Remote: assure we save enough info to regurgitate even a remote file |
| // Note: we never had an IResource/IFile for this to begin with. |
| // must create enough info |
| fname = filepath + fname; // fully qualify |
| String function = attributes.getNamedItem("function").getNodeValue(); |
| String line = attributes.getNamedItem("lineNo").getNodeValue(); |
| int lineNo = Integer.parseInt(line); |
| String id = attributes.getNamedItem("id").getNodeValue(); |
| Node parentNode = attributes.getNamedItem("parent"); |
| String parentID = "noParent"; |
| if (parentNode != null) { |
| parentID = attributes.getNamedItem("parent").getNodeValue(); |
| } |
| SampleFeedbackItem item = new SampleFeedbackItem(name, parentID, id, fname, lineNo, function); |
| items.add(item); |
| } catch (Exception e) { |
| System.out.println("SampleFeedbackParser: Exception creating item " + i); |
| } |
| |
| }// end for |
| |
| if (traceOn) |
| System.out.println("SFP found items: " + items.size() + " elements"); |
| return items; |
| } |
| |
| /** |
| * For testing only: |
| * try to create an IFile/IResource from the info we have |
| * |
| * @param fname |
| */ |
| private void tryCreateFile(String fname, IFile xmlFile) { |
| System.out.println("xmlFile: " + xmlFile); |
| IProject proj = xmlFile.getProject(); |
| IResource foundRes = proj.findMember(fname); |
| boolean exists = foundRes.exists(); |
| IPath path = foundRes.getFullPath(); |
| String s = path.toString(); |
| String s2 = path.toPortableString(); |
| String s3 = path.toOSString(); |
| IResource recreatedRes = getResourceInProject(proj, fname); |
| exists = recreatedRes.exists(); |
| |
| } |
| |
| } |