All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.languagetool.broker.DefaultResourceDataBroker Maven / Gradle / Ivy

Go to download

LanguageTool is an Open Source proofreading software for English, French, German, Polish, Romanian, and more than 20 other languages. It finds many errors that a simple spell checker cannot detect like mixing up there/their and it detects some grammar problems.

There is a newer version: 6.4
Show newest version
/* LanguageTool, a natural language style checker 
 * Copyright (C) 2006 Daniel Naber (http://www.danielnaber.de)
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
 * USA
 */
package org.languagetool.broker;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.languagetool.JLanguageTool;

import java.io.*;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;

/**
 * Responsible for getting any items from LanguageTool's resource
 * directories. This default data broker assumes that they are accessible
 * directly via class-path and the directory names are like specified in:
 *
 * 
    *
  • {@link ResourceDataBroker#RESOURCE_DIR}
  • *
  • {@link ResourceDataBroker#RULES_DIR}
  • *
*

* * If you'd like to determine another resource directory location this default * data broker provides proper methods. * Assuming your {@code /rules} and {@code /resource} directories are accessible * via class-path with following path information: * *

    *
  • {@code /res/grammarchecker/rulesdirname}
  • *
  • {@code /res/grammarchecker/resourcedirname}
  • *
* * In this case you have to use the constructor with the following arguments: * *
    *
  • {@code /res/grammarchecker/rulesdirname}
  • *
  • {@code /res/grammarchecker/resourcedirname}
  • *
*

* * Make sure that you never obtain any LanguageTool resources by calling * {@code Object.class.getResource(String)} or {@code * Object.class.getResourceAsStream(String)} directly. If you would like to * obtain something from these directories do always use * {@link JLanguageTool#getDataBroker()} which provides proper methods for * reading the directories above. *

* * For example, if you want to get the {@link URL} of {@code * /rules/de/grammar.xml} just invoke * {@link ResourceDataBroker#getFromRulesDirAsUrl(String)} and pass {@code * /de/grammar.xml} as a string. Note: The {@code /rules} directory's name isn't * passed because its name might have changed. The same usage does apply for the * {@code /resource} directory. * * @see ResourceDataBroker * @author PAX * @since 1.0.1 */ public class DefaultResourceDataBroker implements ResourceDataBroker { /** * The directory's name of LanguageTool's resource directory. The * default value equals {@link ResourceDataBroker#RESOURCE_DIR}. */ private final String resourceDir; /** * The directory's name of LanguageTool's rules directory. The * default value equals {@link ResourceDataBroker#RULES_DIR}. */ private final String rulesDir; /** * Instantiates this data broker with the default resource directory names * as specified in: * *

    *
  • {@link ResourceDataBroker#RESOURCE_DIR}
  • *
  • {@link ResourceDataBroker#RULES_DIR}
  • *
*/ public DefaultResourceDataBroker() { this(ResourceDataBroker.RESOURCE_DIR, ResourceDataBroker.RULES_DIR); } /** * Instantiates this data broker with the passed resource directory names. * * @param resourceDir The directory's name of LanguageTool's resource * directory. The default value equals {@link ResourceDataBroker#RESOURCE_DIR}. * @param rulesDir The directory's name of LanguageTool's rules directory. * The default value equals {@link ResourceDataBroker#RULES_DIR}. */ public DefaultResourceDataBroker(String resourceDir, String rulesDir) { this.resourceDir = (resourceDir == null) ? "" : resourceDir; this.rulesDir = (rulesDir == null) ? "" : rulesDir; } /** * See: * {@link ResourceDataBroker#getFromResourceDirAsStream(String)} * * @param path * The relative path to the item inside of the {@code /resource} * directory. Please start your path information with {@code /} * because it will be concatenated with the directory's name: * /resource/yourpath. * @return An {@link InputStream} object to the requested item * @throws RuntimeException if path cannot be found */ @NotNull @Override public InputStream getFromResourceDirAsStream(String path) { String completePath = getCompleteResourceUrl(path); InputStream resourceAsStream = getAsStream(completePath); assertNotNull(resourceAsStream, path, completePath); return resourceAsStream; } /** * See: * {@link ResourceDataBroker#getFromResourceDirAsStream(String)} * * @param path The relative path to the item inside of the {@code /resource}, e.g. {@code /xx/filename} * @return An list of strings, one per line * @throws RuntimeException if path cannot be found * @since 4.9 */ @NotNull public List getFromResourceDirAsLines(String path) { List lines = new ArrayList<>(); try (InputStream stream = getFromResourceDirAsStream(path); InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8); BufferedReader br = new BufferedReader(reader) ) { String line; while ((line = br.readLine()) != null) { lines.add(line); } } catch (IOException e) { throw new RuntimeException(e); } return lines; } /** * {@inheritDoc} */ @Nullable @Override public InputStream getAsStream(String path) { return ResourceDataBroker.class.getResourceAsStream(path); } /** * {@inheritDoc} */ @Nullable @Override public URL getAsURL(String path) { return ResourceDataBroker.class.getResource(path); } /** * {@inheritDoc} */ @Nullable @Override public List getAsURLs(String path) { try { return Collections.list(ResourceDataBroker.class.getClassLoader().getResources(path)); } catch (IOException e) { return null; } } /** * See: * {@link ResourceDataBroker#getFromResourceDirAsUrl(String)} * @param path The relative path to the item inside of the {@code /resource} * directory. Please start your path information with {@code /} * because it will be concatenated with the directory's name: * /resource/yourpath. * @return An {@link URL} object to the requested item * @throws RuntimeException if path cannot be found */ @NotNull @Override public URL getFromResourceDirAsUrl(String path) { String completePath = getCompleteResourceUrl(path); URL resource = getAsURL(completePath); assertNotNull(resource, path, completePath); return resource; } /** * {@inheritDoc} */ @NotNull @Override public List getFromResourceDirAsUrls(String path) { String completePath = getCompleteResourceUrl(path); // remove leading slash character for successful result because we are searching resource from classloader List resources = getAsURLs(completePath.substring(1)); assertNotNull(resources, path, completePath); return resources; } /** * Concatenates the passed resource path with the currently set {@code * resource} directory path. * @param path The relative path to a resource item inside of the {@code resource} directory. * @return The full relative path to the resource including the path to the * {@code resource} directory. */ private String getCompleteResourceUrl(String path) { return appendPath(resourceDir, path); } /** * See: * {@link ResourceDataBroker#getFromRulesDirAsStream(String)} * * @param path The relative path to the item inside of the {@code /rules} * directory. Please start your path information with {@code /} because it * will be concatenated with the directory's name: /rules/yourpath. * @return An {@link InputStream} object to the requested item * @throws RuntimeException if path cannot be found */ @NotNull @Override public InputStream getFromRulesDirAsStream(String path) { String completePath = getCompleteRulesUrl(path); InputStream resourceAsStream = getAsStream(completePath); assertNotNull(resourceAsStream, path, completePath); return resourceAsStream; } /** * See: {@link ResourceDataBroker#getFromRulesDirAsUrl(String)} * @param path The relative path to the item inside of the {@code /rules} * directory. Please start your path information with {@code /} because it * will be concatenated with the directory's name: /rules/yourpath. * @return An {@link URL} object to the requested item * @throws RuntimeException if path cannot be found */ @NotNull @Override public URL getFromRulesDirAsUrl(String path) { String completePath = getCompleteRulesUrl(path); URL resource = getAsURL(completePath); assertNotNull(resource, path, completePath); return resource; } private void assertNotNull(Object object, String path, String completePath) { if (object == null) { throw new RuntimeException("Path " + path + " not found in class path at " + completePath); } } /** * Concatenates the passed resource path with the currently set {@code * rules} directory path. * @param path The relative path to a resource item inside of the {@code rules} directory. * @return The full relative path to the resource including the path to the {@code rules} directory. */ private String getCompleteRulesUrl(String path) { return appendPath(rulesDir, path); } private String appendPath(String baseDir, String path) { StringBuilder completePath = new StringBuilder(baseDir); if (!this.rulesDir.endsWith("/") && !path.startsWith("/")) { completePath.append('/'); } if (this.rulesDir.endsWith("/") && path.startsWith("/") && path.length() > 1) { completePath.append(path.substring(1)); } else { completePath.append(path); } return completePath.toString(); } /** * See: {@link ResourceDataBroker#resourceExists(String)} * * Checks if a resource in LanguageTool's {@code /resource} exists. * @param path Path to an item from the {@code /resource} directory. * @return {@code true} if the resource file exists. */ @Override public boolean resourceExists(String path) { String completePath = getCompleteResourceUrl(path); return getAsURL(completePath) != null; } /** * See: {@link ResourceDataBroker#ruleFileExists(String)} * * Checks if a resource in LanguageTool's {@code /rules} exists. * @param path Path to an item from the {@code /rules} directory. * @return {@code true} if the resource file exists. */ @Override public boolean ruleFileExists(String path) { String completePath = getCompleteRulesUrl(path); return getAsURL(completePath) != null; } /** * @return The directory's name of LanguageTool's resource directory. * The default value equals {@link ResourceDataBroker#RESOURCE_DIR}. */ @Override public String getResourceDir() { return resourceDir; } /** * @return The directory's name of the grammar checker's rules directory. * The default value equals {@link ResourceDataBroker#RULES_DIR}. */ @Override public String getRulesDir() { return rulesDir; } /** * {@inheritDoc} * @exception NullPointerException if baseName or locale is null * @exception MissingResourceException if no resource bundle for the specified base name can be found */ @Override public ResourceBundle getResourceBundle(String baseName, Locale locale) { return ResourceBundle.getBundle(baseName, locale); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy