/* * 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.util.Collection; import java.util.Collections; import java.util.EnumSet; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; 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.ParserResultHandler; import org.antlr.netbeans.parsing.spi.ParserTask; import org.antlr.netbeans.parsing.spi.ParserTaskDefinition; import org.antlr.netbeans.parsing.spi.ParserTaskManager; import org.antlr.netbeans.parsing.spi.ParserTaskScheduler; import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.annotations.common.NullAllowed; import org.openide.loaders.DataObject; import org.openide.loaders.DataObjectNotFoundException; /** * * @author Sam Harwell * @param <TPanel> * @param <TData> */ public abstract class AbstractNavigatorUpdateParserTask<TPanel extends AbstractNavigatorPanel<?>, TData> implements ParserTask { // -J-Dorg.antlr.netbeans.editor.navigation.AbstractNavigatorUpdateParserTask.level=FINE private static final Logger LOGGER = Logger.getLogger(AbstractNavigatorUpdateParserTask.class.getName()); private final Object lock = new Object(); private final ParserDataDefinition<? extends TData> rootDataDefinition; protected AbstractNavigatorUpdateParserTask(@NonNull ParserDataDefinition<? extends TData> rootDataDefinition) { this.rootDataDefinition = rootDataDefinition; } @Override public void parse(ParserTaskManager taskManager, ParseContext parseContext, DocumentSnapshot snapshot, Collection<? extends ParserDataDefinition<?>> requestedData, ParserResultHandler results) throws InterruptedException, ExecutionException { synchronized (lock) { TPanel panel = getActiveNavigatorPanel(); if (panel == null) { LOGGER.log(Level.FINE, "Navigator update cancelled: active panel instance not found."); return; } try { if (!panel.isExpectedContext(DataObject.find(snapshot.getVersionedDocument().getFileObject()))) { return; } } catch (DataObjectNotFoundException ex) { return; } Future<? extends ParserData<? extends TData>> futureData = taskManager.getData(snapshot, rootDataDefinition, EnumSet.of(ParserDataOptions.NO_UPDATE, ParserDataOptions.SYNCHRONOUS)); ParserData<? extends TData> parserData = futureData != null ? futureData.get() : null; TData root = parserData != null ? parserData.getData() : null; if (root == null) { return; } refresh(parseContext, snapshot, panel, root); } } @CheckForNull protected abstract TPanel getActiveNavigatorPanel(); protected abstract void refresh(@NonNull ParseContext parseContext, @NonNull DocumentSnapshot snapshot, @NonNull TPanel panel, @NonNull TData data); protected static abstract class AbstractDefinition extends ParserTaskDefinition { protected AbstractDefinition(@NonNull String name, @NonNull Collection<? extends ParserDataDefinition<?>> inputs) { super(name, inputs, Collections.<ParserDataDefinition<?>>emptyList(), ParserTaskScheduler.INPUT_SENSITIVE_TASK_SCHEDULER); } protected AbstractDefinition(@NonNull String name, @NonNull Collection<? extends ParserDataDefinition<?>> inputs, @NonNull Collection<? extends ParserDataDefinition<?>> outputs) { super(name, inputs, outputs, ParserTaskScheduler.INPUT_SENSITIVE_TASK_SCHEDULER); } protected AbstractDefinition(@NonNull String name, @NonNull Collection<? extends ParserDataDefinition<?>> inputs, @NonNull Collection<? extends ParserDataDefinition<?>> outputs, @NullAllowed Class<? extends ParserTaskScheduler> scheduler) { super(name, inputs, outputs, scheduler); } } }