/*******************************************************************************
 * Copyright (c) 2002, 2007 GEBIT Gesellschaft fuer EDV-Beratung
 * und Informatik-Technologien mbH, 
 * Berlin, Duesseldorf, Frankfurt (Germany) and others.
 *
 * This program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     GEBIT Gesellschaft fuer EDV-Beratung und Informatik-Technologien mbH - initial API and implementation
 * 	   IBM Corporation - bug fixes
 *******************************************************************************/

package org.eclipse.ant.internal.ui.editor.text;

import org.eclipse.ant.internal.ui.model.AntModel;
import org.eclipse.ant.internal.ui.model.IProblemRequestor;
import org.eclipse.ant.internal.ui.model.LocationProvider;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentExtension3;
import org.eclipse.jface.text.ISynchronizable;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.editors.text.TextFileDocumentProvider;
import org.eclipse.ui.texteditor.IDocumentProvider;

public class AntEditorDocumentProvider extends TextFileDocumentProvider {

	private final AntDocumentSetupParticipant fAntDocumentSetupParticipant;

	/**
	 * Remembers a Ant document model for each element.
	 */
	protected class AntFileInfo extends FileInfo {

		public AntModel fAntModel;

		public AntFileInfo() {
		}
	}

	public AntEditorDocumentProvider() {
		IDocumentProvider provider = new TextFileDocumentProvider(new AntStorageDocumentProvider());
		setParentDocumentProvider(provider);
		fAntDocumentSetupParticipant = new AntDocumentSetupParticipant();
	}

	public AntModel getAntModel(Object element) {
		FileInfo info = getFileInfo(element);
		if (info instanceof AntFileInfo) {
			AntFileInfo xmlInfo = (AntFileInfo) info;
			return xmlInfo.fAntModel;
		}
		return null;
	}

	@Override
	protected IAnnotationModel createAnnotationModel(IFile file) {
		return new AntAnnotationModel(file);
	}

	protected AntModel createAntModel(Object element, IDocument document, IAnnotationModel annotationModel) {
		IProblemRequestor requestor = annotationModel instanceof IProblemRequestor ? (IProblemRequestor) annotationModel : null;
		return new AntModel(document, requestor, new LocationProvider(element instanceof IEditorInput ? (IEditorInput) element : null));
	}

	@Override
	protected FileInfo createFileInfo(Object element) throws CoreException {
		FileInfo info = super.createFileInfo(element);
		if (!(info instanceof AntFileInfo)) {
			return null;
		}

		// This is a required workaround for the disconnect between workbench file associations
		// and content types based document setup and creation
		// This ensures that a workbench file association for the AntEditor will have a document
		// that is setup with the correct document setup participant since it was "missed" by the
		// document setup extensions (bug 72598).
		IDocument document = info.fTextFileBuffer.getDocument();
		if (document instanceof IDocumentExtension3) {
			IDocumentExtension3 extension = (IDocumentExtension3) document;
			if (extension.getDocumentPartitioner(AntDocumentSetupParticipant.ANT_PARTITIONING) == null)
				fAntDocumentSetupParticipant.setup(document);
		}

		// Check if the annotation model has been set by the annotation model factory extension for Ant UI
		// and is an annotation model that was specified by the extension (all are IProblemRequestors).
		// If we do not have an annotation model or not a correct annotation model, defer to the annotation model
		// created from this document provider. The document provider is only queried for an annotation model for workspace files.
		// Therefore if the annotation model is still null we are dealing with an external file that is associated with
		// the Ant editor from a user preference setting.
		// In all cases the determined annotation model is set for the file info to be used in the editor.
		AntFileInfo xmlInfo = (AntFileInfo) info;
		IAnnotationModel annotationModel = xmlInfo.fTextFileBuffer.getAnnotationModel();
		if (annotationModel instanceof IProblemRequestor) {
			xmlInfo.fModel = annotationModel;
		} else {
			annotationModel = xmlInfo.fModel;
		}

		if (annotationModel == null) {
			annotationModel = new AntExternalAnnotationModel();
			xmlInfo.fModel = annotationModel;
		}

		AntModel antModel = createAntModel(element, document, annotationModel);
		antModel.install();
		xmlInfo.fAntModel = antModel;

		return xmlInfo;
	}

	@Override
	protected void disposeFileInfo(Object element, FileInfo info) {
		if (info instanceof AntFileInfo) {
			AntFileInfo xmlInfo = (AntFileInfo) info;
			if (xmlInfo.fAntModel != null) {
				IDocument doc = xmlInfo.fTextFileBuffer.getDocument();
				Object lock = null;
				if (doc instanceof ISynchronizable) {
					lock = ((ISynchronizable) doc).getLockObject();
				} else {
					lock = xmlInfo.fAntModel;
				}
				if (lock == null) {
					xmlInfo.fAntModel.dispose();
					xmlInfo.fAntModel = null;
				} else {
					synchronized (lock) {
						xmlInfo.fAntModel.dispose();
						xmlInfo.fAntModel = null;
					}
				}
			}
		}
		super.disposeFileInfo(element, info);
	}

	@Override
	protected FileInfo createEmptyFileInfo() {
		return new AntFileInfo();
	}
}