/*
* 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.parsing.spi.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.antlr.netbeans.parsing.spi.ParseContext;
import org.antlr.netbeans.parsing.spi.ParserDataDefinition;
import org.antlr.netbeans.parsing.spi.ParserDataEvent;
import org.antlr.netbeans.parsing.spi.ParserDataListener;
import org.antlr.netbeans.parsing.spi.ParserTaskManager;
import org.antlr.netbeans.parsing.spi.ParserTaskProvider;
import org.antlr.netbeans.parsing.spi.ParserTaskScheduler;
import org.netbeans.api.editor.mimelookup.MimeLookup;
import org.openide.util.lookup.ServiceProvider;
/**
*
* @author Sam Harwell
*/
@ServiceProvider(service=ParserTaskScheduler.class)
public class DataInputParserTaskScheduler extends ParserTaskScheduler {
private final ParserDataListener<Object> listener = new Listener();
private final Map<ParserDataDefinition<?>, List<ParserTaskProvider>> dependentTasks =
new HashMap<>();
@Override
protected void initializeImpl() {
ParserTaskManager taskManager = getTaskManager();
taskManager.addDataListener(listener);
}
@Override
protected int getParseDelayMilliseconds() {
return 0;
}
private class Listener implements ParserDataListener<Object> {
@Override
public void dataChanged(ParserDataEvent<?> event) {
if (event == null || event.getData() == null) {
return;
}
List<ParserTaskProvider> tasks;
synchronized (dependentTasks) {
tasks = dependentTasks.get(event.getDefinition());
if (tasks == null) {
tasks = new ArrayList<>();
String mimeType = event.getData().getSnapshot().getVersionedDocument().getMimeType();
Collection<? extends ParserTaskProvider> providers = MimeLookup.getLookup(mimeType).lookupAll(ParserTaskProvider.class);
for (ParserTaskProvider provider : providers) {
if (!DataInputParserTaskScheduler.this.getClass().equals(provider.getDefinition().getScheduler())) {
continue;
}
if (provider.getDefinition().getInputs().contains(event.getData().getDefinition())) {
tasks.add(provider);
}
}
dependentTasks.put(event.getDefinition(), tasks);
}
}
ParseContext context = new ParseContext(DataInputParserTaskScheduler.this.getClass(), event.getData().getSnapshot());
schedule(context, tasks);
}
}
}