package com.sap.mi.textual.parsing.textblocks.reference;
import java.util.EventListener;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.xml.stream.EventFilter;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import com.sap.furcas.metamodel.FURCAS.TCS.ConcreteSyntax;
import com.sap.furcas.runtime.common.interfaces.IRuleName;
import com.sap.furcas.runtime.parser.impl.DelayedReference;
import com.sap.furcas.runtime.parser.impl.ObservableInjectingParser;
public class GlobalDelayedReferenceResolver implements GlobalEventListener {
static final String TEMPORARY_QUERY_PARAM_REPLACEMENT = "__TEMP__";
private final Set<ReferenceResolvingListener> listeners = new HashSet<ReferenceResolvingListener>(1);
private IncrementalReferenceEvaluationRegistry registry;
private ReferenceResolver resolver;
private static GlobalDelayedReferenceResolver instance;
public GlobalDelayedReferenceResolver() {
// Do the assignment here as the constructor will be invoked by the
// extension point.
instance = this;
}
public static synchronized GlobalDelayedReferenceResolver getInstance() {
return instance;
}
@Override
public Map<EventFilter, Map<ListenerType, EventListener>> getFilters(ResourceSet connection, BundleContext bundleContext) {
BundleContext context = bundleContext;
ServiceReference globalEventListenerRegistryRef = context
.getServiceReference(GlobalEventListenerRegistry.class.getName());
HashMap<EventFilter, Map<ListenerType, EventListener>> result = new HashMap<EventFilter, Map<ListenerType, EventListener>>();
// addFilterAndListenerForDeleteEvent(connection, result);
setupResolverInfrastructure(context, globalEventListenerRegistryRef);
return result;
}
private void setupResolverInfrastructure(BundleContext context, ServiceReference globalEventListenerRegistryRef) {
assert registry == null && resolver == null;
registry = new IncrementalReferenceEvaluationRegistry(globalEventListenerRegistryRef, context);
resolver = new ReferenceResolver(this, registry);
registry.setResolver(resolver);
}
/**
* Registers a new {@link ReferenceResolvingListener} that gets notified on
* registration as well as resolving of {@link DelayedReference delayed
* references}.
*
* @param listener
* The listener to be registered.
*/
public void addReferenceResolvingListener(ReferenceResolvingListener listener) {
listeners.add(listener);
}
/**
* Unregisters a {@link ReferenceResolvingListener} that gets notified on
* registration as well as resolving of {@link DelayedReference delayed
* references}.
*
* @param listener
* The listener to be unregistered.
*/
public void removeReferenceResolvingListener(ReferenceResolvingListener listener) {
listeners.remove(listener);
}
public void registerReferenceForIncrementalEvaluation(ConcreteSyntax syntax, ResourceSet connection,
EPackage outermostPackageOfMetamodel, ObservableInjectingParser parser, IRuleName ruleNameBuilder,
IProgressMonitor monitor) {
registry.registerReferenceForIncrementalEvaluation(syntax, connection, outermostPackageOfMetamodel, parser,
ruleNameBuilder, monitor);
}
public String getDebugInfoAsCsv(ResourceSet connection) {
return registry.getDebugInfo(connection);
}
public boolean hasEmptyQueue() {
return resolver.hasEmptyQueue();
}
public void resolveReferences(IProgressMonitor monitor) {
resolver.resolveReferences(monitor);
}
public void clearUnresolvedIAReferences() {
resolver.clearUnresolvedReferences();
}
void notifyReferenceUnset(DelayedReference reference,
Object valueRemovedFromProperty) {
for (ReferenceResolvingListener listener : listeners) {
listener.outdatedReferencesRemoved(reference,
valueRemovedFromProperty);
}
}
void notifyReferenceSet(DelayedReference reference,
Object valueSetOnProperty) {
for (ReferenceResolvingListener listener : listeners) {
listener.referenceResolved(reference, valueSetOnProperty);
}
}
}