/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.antlr.netbeans.editor.navigation;
import java.lang.ref.WeakReference;
import java.util.EnumSet;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.antlr.netbeans.editor.text.DocumentSnapshot;
import org.antlr.netbeans.parsing.spi.ParseContext;
import org.antlr.netbeans.parsing.spi.ParserData;
import org.antlr.netbeans.parsing.spi.ParserDataDefinition;
import org.antlr.netbeans.parsing.spi.ParserDataOptions;
import org.antlr.netbeans.parsing.spi.ParserTaskManager;
import org.netbeans.api.annotations.common.NonNull;
import org.netbeans.api.annotations.common.NullAllowed;
import org.openide.util.Lookup;
/**
*
* @author Sam Harwell
* @param <TPanel>
* @param <TData>
* @param <TContext>
*/
public abstract class AbstractNavigatorUpdateWithContextParserTask<TPanel extends AbstractNavigatorPanel<?>, TData, TContext> extends AbstractNavigatorUpdateParserTask<TPanel, TData> {
private static WeakReference<ParserTaskManager> parserTaskManager =
new WeakReference<>(null);
private final ParserDataDefinition<? extends TContext> contextDataDefinition;
protected AbstractNavigatorUpdateWithContextParserTask(@NonNull ParserDataDefinition<? extends TData> rootDataDefinition, @NonNull ParserDataDefinition<? extends TContext> contextDataDefinition) {
super(rootDataDefinition);
this.contextDataDefinition = contextDataDefinition;
}
private static ParserTaskManager getParserTaskManager() {
ParserTaskManager result = parserTaskManager.get();
if (result == null) {
result = Lookup.getDefault().lookup(ParserTaskManager.class);
parserTaskManager = new WeakReference<>(result);
}
return result;
}
protected abstract void refresh(@NonNull ParseContext parseContext, @NonNull DocumentSnapshot snapshot, @NonNull TPanel panel, @NonNull TData data, @NullAllowed TContext context);
@Override
protected final void refresh(ParseContext parseContext, DocumentSnapshot snapshot, TPanel panel, TData data) {
ParserTaskManager taskManager = getParserTaskManager();
TContext context = null;
if (contextDataDefinition != null) {
Future<? extends ParserData<? extends TContext>> futureContextData = taskManager.getData(snapshot, contextDataDefinition, EnumSet.of(ParserDataOptions.NO_UPDATE, ParserDataOptions.SYNCHRONOUS));
ParserData<? extends TContext> parserContextData;
try {
parserContextData = futureContextData != null ? futureContextData.get() : null;
} catch (InterruptedException | ExecutionException ex) {
parserContextData = null;
}
context = parserContextData != null ? parserContextData.getData() : null;
}
refresh(parseContext, snapshot, panel, data, context);
}
}