code: package ca.concordia.jdeodorant.clone.parsers;
  
  import java.io.File;
  import java.io.IOException;
  
  import javax.xml.parsers.DocumentBuilder;
  import javax.xml.parsers.DocumentBuilderFactory;
  import javax.xml.parsers.ParserConfigurationException;
  
  import org.eclipse.jdt.core.IJavaProject;
  import org.eclipse.jdt.core.JavaModelException;
  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;
  
  import ca.concordia.jdeodorant.clone.parsers.ResourceInfo.ICompilationUnitNotFoundException;
  
  
  public class NiCadOutputParser extends CloneDetectorOutputParser {
  
  	private Document document;
  
  	public NiCadOutputParser(IJavaProject iJavaProject, String cloneOutputFilePath) throws InvalidInputFileException {
  		super(iJavaProject, cloneOutputFilePath);
  		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  		factory.setIgnoringElementContentWhitespace(true);
  		try {
  			DocumentBuilder builder = factory.newDocumentBuilder();
  			File file = new File(this.getToolOutputFilePath());
  			this.document  = builder.parse(file);
  			NodeList classInfoNodeList = document.getElementsByTagName("classinfo");
  			try {
  				this.setCloneGroupCount(Integer.parseInt(classInfoNodeList.item(0).getAttributes().getNamedItem("nclasses").getNodeValue()));
  			} catch (Exception nfe) {
  				this.document = null;
  				throw new InvalidInputFileException();
  			}
  		} catch (IOException ioex) {
  			ioex.printStackTrace();
  		} catch (SAXException saxe) {
  			saxe.printStackTrace();
  		} catch (ParserConfigurationException e) {
  			e.printStackTrace();
  		}
  	}
  
  	@Override
  	public CloneGroupList readInputFile() throws InvalidInputFileException {
  		
  		if (this.document == null)
  			throw new InvalidInputFileException();
  
  		CloneGroupList cloneGroups = new CloneGroupList(getIJavaProject());
  
  		NodeList classNodeList = document.getElementsByTagName("class");
  		for (int cloneClassIndex = 0; cloneClassIndex < classNodeList.getLength(); cloneClassIndex++) {
  			if (this.isOperationCanceled())
  				break;
  			Node classNode = classNodeList.item(cloneClassIndex);
  			try {
  				int cloneGroupID = Integer.parseInt(classNode.getAttributes().getNamedItem("classid").getNodeValue());
  				CloneGroup cloneGroup = new CloneGroup(cloneGroupID);
  				NodeList cloneInstancesNodeList = classNode.getChildNodes();
  				for (int cloneInstanceIndex = 0; cloneInstanceIndex < cloneInstancesNodeList.getLength(); cloneInstanceIndex++) {
  					Node cloneInstanceNode = cloneInstancesNodeList.item(cloneInstanceIndex);
  					if ("source".equals(cloneInstanceNode.getNodeName())) {
  						NamedNodeMap cloneInstanceAttributes = cloneInstanceNode.getAttributes();
  						String filePath = cloneInstanceAttributes.getNamedItem("file").getNodeValue();
  						int startLine = Integer.parseInt(cloneInstanceAttributes.getNamedItem("startline").getNodeValue());
  						int endLine = Integer.parseInt(cloneInstanceAttributes.getNamedItem("endline").getNodeValue());
  						CloneInstance cloneInstance = getCloneInstance(filePath, cloneInstanceIndex, true, startLine, 0, endLine, 0);
  						cloneGroup.addClone(cloneInstance);
  					}
  				}
  				if (cloneGroup.getCloneGroupSize() > 1)
  					cloneGroups.add(cloneGroup);
  			} catch (NullPointerException npex) {
  				addExceptionHappenedDuringParsing(npex);
  			} catch (StringIndexOutOfBoundsException siobex) {
  				addExceptionHappenedDuringParsing(siobex);
  			} catch (NumberFormatException nfex) {
  				addExceptionHappenedDuringParsing(nfex);
  			} catch (JavaModelException jme) {
  				addExceptionHappenedDuringParsing(jme);
  			} catch (ICompilationUnitNotFoundException infe) {
  				addExceptionHappenedDuringParsing(infe);
  			}
  			progress(cloneClassIndex);
  		}	
  
  		if (cloneGroups.getCloneGroupsCount() == 0)
  			throw new InvalidInputFileException();
  
  		return cloneGroups;
  	}
  
  }
  