/* * Copyright 2011 Stefan Partusch * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.spartusch.nasfvi.server; import java.io.File; import java.util.Map; import java.util.Set; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.queryParser.core.QueryNodeException; import de.spartusch.Resources; import de.spartusch.SoftCache; /** * Convenient manager for a {@link Grammar}. This class takes care of * {@link Grammar#toProlog(String) normalizations} of input and maintains a * cache for suggestions to improve performance. * @author Stefan Partusch * */ public class GrammarManager { private SoftCache<String, Set<String>> suggestionsCache; private Grammar grammar; private Analyzer analyzer; /** * Initializes a new {@link Grammar} and a new cache. * @param res Resources to locate the Grammar with * @param analyzer Analyzer to use for creating queries */ public GrammarManager(final Resources res, final Analyzer analyzer) { File startFile = res.getFile("nasfi.StartFile", "/WEB-INF/classes/grammar/start_vf.pl"); if (startFile == null) { throw new IllegalArgumentException("Start file not found"); } grammar = new Grammar(startFile); suggestionsCache = new SoftCache<String, Set<String>>(); this.analyzer = analyzer; } /** * Generates suggestions. This method maintains a cache with suggestions * to improve its performance. * @param input Input to generate suggestions for * @return Suggestions for <code>input</code> * @see {@link Grammar#suggest(String) Grammar.suggest} */ public final Set<String> suggest(final String input) { String normInput = Grammar.toProlog(input); Set<String> suggestions = suggestionsCache.get(normInput); if (suggestions != null) { return suggestions; } else { suggestions = grammar.suggest(normInput); if (suggestions != null) { suggestionsCache.put(normInput, suggestions); } return suggestions; } } /** * Creates a {@link NQuery} according to <code>input</code>. * @param input Input to parse * @return Query according to <code>input</code> * @throws QueryNodeException If parsing fails * @see {@link Grammar#parse(String, Analyzer) Grammar.parse} */ public final NQuery parse(final String input) throws QueryNodeException { return grammar.parse(Grammar.toProlog(input), analyzer); } /** * Generates an answer in natural language. * @param input Question to answer * @param values Values to insert into the answer * @return Natural language answer * @see {@link Grammar#generate(String, Map) Grammar.generate} */ public final String generate(final String input, final Map<String, Set<String>> values) { return grammar.generate(Grammar.toProlog(input), values); } }