org.apache.commons.codec.language.bm.Languages Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of commons-codec Show documentation
Show all versions of commons-codec Show documentation
The codec package contains simple encoder and decoders for
various formats such as Base64 and Hexadecimal. In addition to these
widely used encoders and decoders, the codec package also maintains a
collection of phonetic encoding utilities.
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.commons.codec.language.bm;
import java.io.InputStream;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.Set;
/**
*
* Language codes.
*
*
* Language codes are typically loaded from resource files. These are UTF-8 encoded text files. They are systematically named following the
* pattern:
*
* org/apache/commons/codec/language/bm/${{@link NameType#getName()} languages.txt
*
* The format of these resources is the following:
*
*
* - Language: a single string containing no whitespace
* - End-of-line comments: Any occurance of '//' will cause all text following on that line to be discarded as a comment.
* - Multi-line comments: Any line starting with '/*' will start multi-line commenting mode. This will skip all content until a
* line ending in '*' and '/' is found.
* - Blank lines: All blank lines will be skipped.
*
*
* Ported from language.php
*
*
* @author Apache Software Foundation
* @since 1.6
*/
public class Languages {
// Iimplementation note: This class is divided into two sections. The first part is a static factory interface that
// exposes org/apache/commons/codec/language/bm/%s_languages.txt for %s in NameType.* as a list of supported
// languages, and a second part that provides instance methods for accessing this set fo supported languages.
/**
* A set of languages.
*/
public static abstract class LanguageSet {
public static LanguageSet from(Set langs) {
return langs.isEmpty() ? NO_LANGUAGES : new SomeLanguages(langs);
}
public abstract boolean contains(String language);
public abstract String getAny();
public abstract boolean isEmpty();
public abstract boolean isSingleton();
public abstract LanguageSet restrictTo(LanguageSet other);
}
/**
* Some languages, explicitly enumerated.
*/
public static final class SomeLanguages extends LanguageSet {
private final Set languages;
private SomeLanguages(Set languages) {
this.languages = Collections.unmodifiableSet(languages);
}
@Override
public boolean contains(String language) {
return this.languages.contains(language);
}
@Override
public String getAny() {
return this.languages.iterator().next();
}
public Set getLanguages() {
return this.languages;
}
@Override
public boolean isEmpty() {
return this.languages.isEmpty();
}
@Override
public boolean isSingleton() {
return this.languages.size() == 1;
}
@Override
public LanguageSet restrictTo(LanguageSet other) {
if (other == NO_LANGUAGES) {
return other;
} else if (other == ANY_LANGUAGE) {
return this;
} else {
SomeLanguages sl = (SomeLanguages) other;
if (sl.languages.containsAll(languages)) {
return this;
} else {
Set ls = new HashSet(this.languages);
ls.retainAll(sl.languages);
return from(ls);
}
}
}
@Override
public String toString() {
return "Languages(" + languages.toString() + ")";
}
}
public static final String ANY = "any";
private static final Map LANGUAGES = new EnumMap(NameType.class);
static {
for (NameType s : NameType.values()) {
LANGUAGES.put(s, getInstance(langResourceName(s)));
}
}
public static Languages getInstance(NameType nameType) {
return LANGUAGES.get(nameType);
}
public static Languages getInstance(String languagesResourceName) {
// read languages list
Set ls = new HashSet();
InputStream langIS = Languages.class.getClassLoader().getResourceAsStream(languagesResourceName);
if (langIS == null) {
throw new IllegalArgumentException("Unable to resolve required resource: " + languagesResourceName);
}
Scanner lsScanner = new Scanner(langIS, ResourceConstants.ENCODING);
boolean inExtendedComment = false;
while (lsScanner.hasNextLine()) {
String line = lsScanner.nextLine().trim();
if (inExtendedComment) {
if (line.endsWith(ResourceConstants.EXT_CMT_END)) {
inExtendedComment = false;
} else {
// skip
}
} else {
if (line.startsWith(ResourceConstants.EXT_CMT_START)) {
inExtendedComment = true;
} else if (line.length() > 0) {
ls.add(line);
} else {
// skip blank lines
}
}
}
return new Languages(Collections.unmodifiableSet(ls));
}
private static String langResourceName(NameType nameType) {
return String.format("org/apache/commons/codec/language/bm/%s_languages.txt", nameType.getName());
}
private final Set languages;
/**
* No languages at all.
*/
public static final LanguageSet NO_LANGUAGES = new LanguageSet() {
@Override
public boolean contains(String language) {
return false;
}
@Override
public String getAny() {
throw new NoSuchElementException("Can't fetch any language from the empty language set.");
}
@Override
public boolean isEmpty() {
return true;
}
@Override
public boolean isSingleton() {
return false;
}
@Override
public LanguageSet restrictTo(LanguageSet other) {
return this;
}
@Override
public String toString() {
return "NO_LANGUAGES";
}
};
/**
* Any/all languages.
*/
public static final LanguageSet ANY_LANGUAGE = new LanguageSet() {
@Override
public boolean contains(String language) {
return true;
}
@Override
public String getAny() {
throw new NoSuchElementException("Can't fetch any language from the any language set.");
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean isSingleton() {
return false;
}
@Override
public LanguageSet restrictTo(LanguageSet other) {
return other;
}
@Override
public String toString() {
return "ANY_LANGUAGE";
}
};
private Languages(Set languages) {
this.languages = languages;
}
public Set getLanguages() {
return this.languages;
}
}