content: /**
   *  Copyright (c) 2013-2016 Angelo ZERR.
   *  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:
   *  Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
   */
  package tern.eclipse.ide.linter.core.validation;
  
  import org.eclipse.core.resources.IFile;
  import org.eclipse.core.resources.IResource;
  import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
  import org.eclipse.wst.validation.internal.provisional.core.IMessage;
  import org.eclipse.wst.validation.internal.provisional.core.IReporter;
  import org.eclipse.wst.validation.internal.provisional.core.IValidator;
  
  import tern.eclipse.ide.core.IIDETernProject;
  import tern.eclipse.ide.core.utils.FileUtils;
  import tern.server.protocol.IJSONObjectHelper;
  import tern.server.protocol.lint.ITernLintCollector;
  import tern.server.protocol.lint.TernLintQuery;
  
  /**
   * Tern report collector to add in WTP {@link IReporter} messages coming from
   * tern linter.
   *
   */
  public class TernReporterCollector implements ITernLintCollector {
  
  	private static final String CHAR_END = "charEnd";
  	private static final String CHAR_START = "charStart";
  	private static final String WARNING_SEVERITY = "warning";
  
  	private final IIDETernProject ternProject;
  	private final IReporter reporter;
  	private final IValidator validator;
  
  	public TernReporterCollector(IIDETernProject ternProject, IReporter reporter, IValidator validator) {
  		this.ternProject = ternProject;
  		this.reporter = reporter;
  		this.validator = validator;
  	}
  
  	@Override
  	public void startLint(String file) {
  
  	}
  
  	@Override
  	public void addMessage(String messageId, String messageText, Long start, Long end, Long line, String severity,
  			String file, Object messageObject, TernLintQuery query, IJSONObjectHelper helper) {
  		if (start == null) {
  			start = 0L;
  		}
  		if (end == null) {
  			end = start + 1;
  		}
  		IResource resource = (IResource) ternProject.getFile(file).getAdapter(IFile.class);
  		LocalizedMessage message = new LocalizedMessage(getSeverity(severity), messageText, resource);
  		message.setOffset(start.intValue());
  		message.setLength(end.intValue() - start.intValue());
  		message.setAttribute(CHAR_START, start.intValue());
  		message.setAttribute(CHAR_END, end.intValue());
  		Integer lineNumber = getLineNumber(line, start.intValue(), resource);
  		if (lineNumber != null) {
  			message.setLineNo(lineNumber);
  		}
  		addMessage(message, messageObject, query, helper);
  	}
  
  	protected void addMessage(LocalizedMessage message, Object messageObject, TernLintQuery query, IJSONObjectHelper helper) {
  		reporter.addMessage(validator, message);
  	}
  
  	/**
  	 * Try to retrieve the line number.
  	 */
  	private Integer getLineNumber(Long line, int start, IResource resource) {
  		if (line != null) {
  			return line.intValue();
  		}
  		if (start >= 0) {
  			return FileUtils.getLineOfOffset(start, (IFile) resource);
  		}
  		return null;
  	}
  
  	private int getSeverity(String severity) {
  		return WARNING_SEVERITY.equals(severity) ? IMessage.NORMAL_SEVERITY : IMessage.HIGH_SEVERITY;
  	}
  
  	@Override
  	public void endLint(String file) {
  
  	}
  
  	public IReporter getReporter() {
  		return reporter;
  	}
  
  	public IValidator getValidator() {
  		return validator;
  	}
  }
  