/*******************************************************************************
 * Copyright (c) 2006, 2009 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.ant.internal.ui.console;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.ant.internal.ui.AntUIPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceRuleFactory;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.internal.ui.views.console.ProcessConsole;
import org.eclipse.jdt.core.IJavaModelMarker;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.ui.console.TextConsole;

public class JavacMarkerCreator {

	private final TextConsole fConsole;
	private IProcess fProcess;
	private static List fgFilesToBeCleaned= new ArrayList();
	private Map fFileToMarkerInfo= new HashMap();
	private final boolean fUseCustomMessage;

	private class MarkerInfo {
		
		public int fLineNumber;
		public int fOffset;
		public Integer fType;

		public void setLineNumber(int lineNumber) {
			fLineNumber= lineNumber;
		}
		public void setOffset(int offset) {
			fOffset = offset;
		}
		public void setType(Integer type) {
			fType= type;
			
		}
	}
	public JavacMarkerCreator(TextConsole console, boolean useCustomMessage) {
		fConsole = console;
		fUseCustomMessage = useCustomMessage;
		if (fConsole instanceof ProcessConsole) {
			fProcess= ((ProcessConsole) fConsole).getProcess();
		}
	}

	protected ISchedulingRule getMarkerRule(IResource resource) {
	    ISchedulingRule rule = null;
	    if (resource != null) {
	        IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
	        rule = ruleFactory.markerRule(resource);
	    }
	    return rule;
	}

	protected void run(ISchedulingRule rule, IWorkspaceRunnable wr) {
		try {
			ResourcesPlugin.getWorkspace().run(wr, rule, 0, null);
		} catch (CoreException e) {
			AntUIPlugin.log(e.getStatus());
		}			
	}

	protected void addFileToBeCleaned(IFile file) {
		fgFilesToBeCleaned.add(file);
	}
	
	protected void addMarker(IFile file, int lineNumber, int offset, Integer type) {
		MarkerInfo info= new MarkerInfo();
		info.setLineNumber(lineNumber);
		info.setOffset(offset);
		info.setType(type);
		List infos= (List) fFileToMarkerInfo.get(file);
		if (infos == null) {
			infos= new ArrayList();
			fFileToMarkerInfo.put(file, infos);
		}
		infos.add(info);
	}
	
	private void createMarkers(final IFile file, final List infos) {
		IWorkspaceRunnable wr= new IWorkspaceRunnable() {
			public void run(IProgressMonitor monitor) throws CoreException {
				
				try {
					for (Iterator iter = infos.iterator(); iter.hasNext();) {
						MarkerInfo info = (MarkerInfo) iter.next();
						IMarker marker= file.createMarker(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER);
						Map attributes= new HashMap(3);
						attributes.put(IMarker.LINE_NUMBER, new Integer(info.fLineNumber));
						String message= getMessage(info);
						attributes.put(IMarker.MESSAGE, message);
						attributes.put(IMarker.SEVERITY, info.fType);
						marker.setAttributes(attributes);
					}
				} catch (CoreException e) {
					AntUIPlugin.log(e.getStatus());
				}	
			}
		};
		run(getMarkerRule(file), wr);
	}

	protected String getMessage(MarkerInfo info) {
		IDocument doc= fConsole.getDocument();
		String message= ConsoleMessages.JavacMarkerCreator_0;
		if (fUseCustomMessage) {
			FindReplaceDocumentAdapter adapter= new FindReplaceDocumentAdapter(doc);
			try {
				IRegion match=adapter.find(info.fOffset, "[javac] ----------", true, false, false, false); //$NON-NLS-1$
				if (match != null) {
					match= adapter.find(match.getOffset(), "[javac]", false, false, false, false); //$NON-NLS-1$
					if (match != null) {
						int start= match.getOffset() + match.getLength() + 1;
						IRegion lineInfo= doc.getLineInformationOfOffset(start);
						message= doc.get(start, lineInfo.getOffset() - start + lineInfo.getLength());
					}
				}
			} catch (BadLocationException e) {
				AntUIPlugin.log(e);
			}
		}
		
		return message;
	}

	protected void finished(IProcess process) {
		if (process.equals(fProcess)) {
			if (!fgFilesToBeCleaned.isEmpty()) {
				Iterator itr= fgFilesToBeCleaned.iterator();
				while (itr.hasNext()) {
					IFile file = (IFile) itr.next();
					try {
						file.deleteMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
					} catch (CoreException e) {
						AntUIPlugin.log(e.getStatus());
					}					
				}
			}
			if (!fFileToMarkerInfo.isEmpty()) {
				//generate markers for all the warnings and errors
				Iterator files= fFileToMarkerInfo.keySet().iterator();
				while (files.hasNext()) {
					IFile file = (IFile) files.next();
					List infos= (List) fFileToMarkerInfo.get(file);
					createMarkers(file, infos);	
				}	
			}
			
			fFileToMarkerInfo.clear();
			fgFilesToBeCleaned.clear();
		}
	}
}