blob: 640dd91aa20af5760f9081eb00ec89cad80bfdfc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2019 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Nicolas Guyomar (Mia-Software) - initial API and implementation
* Nicolas Bros (Mia-Software) - Bug 335003 - [Discoverer] : Existing Discoverers Refactoring based on new framework
*******************************************************************************/
package org.eclipse.modisco.kdm.source.extension.discovery;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.modisco.infra.discovery.core.AbstractModelDiscoverer;
/**
* This abstract discoverer should be reused for each new leaf discoverer which visits some language
* source code, in order to have the capability to notify the visit of source regions with a generic
* mechanism. Composite discoverers should not inherit from this class but rather listen to leaf
* discoverers by using the proposed listening API.
*
* See Help Contents or http://wiki.eclipse.org/MoDisco/Components/KDMSourceExtension
*
* See also {@link org.eclipse.modisco.kdm.source.extension.discovery.SourceVisitListener}
*
*/
public abstract class AbstractRegionDiscoverer2<T> extends AbstractModelDiscoverer<T> implements ISourceRegionNotifier<T> {
private List<SourceVisitListener> sourceVisitListeners;
/* (non-Javadoc)
* @see org.eclipse.modisco.kdm.source.extension.discovery.IAbstractRegionDiscoverer#notifySourceRegionVisited(java.lang.String, int, int, int, int, org.eclipse.emf.ecore.EObject)
*/
public final void notifySourceRegionVisited(final String filePath, final int startOffset,
final int endOffset, final int startLine, final int endLine, final EObject targetNode) {
if (this.sourceVisitListeners != null && !this.sourceVisitListeners.isEmpty()) {
for (SourceVisitListener listener : new ArrayList<SourceVisitListener>(
this.sourceVisitListeners)) {
listener.sourceRegionVisited(filePath, startOffset, endOffset, startLine, endLine,
targetNode);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.modisco.kdm.source.extension.discovery.IAbstractRegionDiscoverer#notifySourceRegionVisited(java.lang.String, int, int, org.eclipse.emf.ecore.EObject)
*/
public final void notifySourceRegionVisited(final String filePath, final int startOffset,
final int endOffset, final EObject targetNode) {
notifySourceRegionVisited(filePath, startOffset, endOffset, -1, -1, targetNode);
}
/* (non-Javadoc)
* @see org.eclipse.modisco.kdm.source.extension.discovery.IAbstractRegionDiscoverer#addSourceVisitListener(org.eclipse.modisco.kdm.source.extension.discovery.SourceVisitListener)
*/
public final void addSourceVisitListener(final SourceVisitListener sourceVisitListener) {
if (this.sourceVisitListeners == null) {
this.sourceVisitListeners = new ArrayList<SourceVisitListener>();
}
if (sourceVisitListener != null && !this.sourceVisitListeners.contains(sourceVisitListener)) {
this.sourceVisitListeners.add(sourceVisitListener);
}
}
/* (non-Javadoc)
* @see org.eclipse.modisco.kdm.source.extension.discovery.IAbstractRegionDiscoverer#removeSourceVisitListener(org.eclipse.modisco.kdm.source.extension.discovery.SourceVisitListener)
*/
public final void removeSourceVisitListener(final SourceVisitListener sourceVisitListener) {
if (this.sourceVisitListeners != null) {
this.sourceVisitListeners.remove(sourceVisitListener);
}
}
/* (non-Javadoc)
* @see org.eclipse.modisco.kdm.source.extension.discovery.IAbstractRegionDiscoverer#getSourceVisitListeners()
*/
public final List<SourceVisitListener> getSourceVisitListeners() {
return Collections.unmodifiableList(this.sourceVisitListeners);
}
}