/*
* 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 net.jini.lookup.ui.attribute;
import java.util.Locale;
import java.util.Iterator;
import java.util.Set;
import java.util.List;
import java.util.Collections;
import com.artima.lookup.util.ConsistentSet;
/**
* UI attribute that lists the locales supported
* by a generated UI.
*
* @author Bill Venners
*/
public class Locales implements java.io.Serializable {
private static final long serialVersionUID = -8904904794408873606L;
/**
* @serial A <code>Set</code> of <code>java.util.Locale</code> objects,
* each of which represents one locale supported by the UI generated
* by the UI factory stored in marshalled form in the same
* <code>UIDescriptor</code>.
*/
private Set supportedLocales;
/**
* Constructs a <CODE>Locales</CODE> using the
* passed <CODE>Set</CODE>. The <CODE>Set</CODE> can
* be mutable or immutable, and must contain only
* <CODE>java.util.Locale</CODE> objects. Each <CODE>Locale</CODE> must
* represent a locale that is supported by the UI generated
* by the UI factory stored in marshalled form in the
* same <CODE>UIDescriptor</CODE>. This constructor copies
* the contents of the passed <code>Set</code> into a
* serializable read-only <code>Set</code> that has a
* consistent serialized form across all VMs.
*
* @param locales A <CODE>Set</CODE> of <CODE>Locale</CODE>
* objects. Each element must be non-null and an instance
* of <CODE>java.util.Locale</CODE>.
*
* @throws NullPointerException if <CODE>locales</CODE>
* is <CODE>null</CODE> or any element of <CODE>locales</CODE>
* set is <CODE>null</CODE>.
*
* @throws IllegalArgumentException if any non-null element of
* <CODE>locales</CODE> set is not an instance of
* <CODE>java.util.Locale</CODE>.
*/
public Locales(Set locales) {
if (locales == null) {
throw new NullPointerException();
}
Iterator it = locales.iterator();
while (it.hasNext()) {
Object o = it.next();
if (o == null) {
throw new NullPointerException();
}
if (!(o instanceof Locale)) {
throw new IllegalArgumentException();
}
}
supportedLocales = new ConsistentSet(locales);
}
/**
* Indicates whether or not a locale is supported
* by the UI generated by the UI factory stored in
* the marshalled object of the same <CODE>UIDescriptor</CODE>.
* This method returns <CODE>true</CODE> only if the passed
* <CODE>Locale</CODE> exactly matches a <CODE>Locale</CODE>
* supported by the UI, as defined by the <CODE>equals()</CODE>
* method of class <CODE>java.util.Locale</CODE>. For example, imagine the UI supports the
* "en" (General English) locale, but not the "en_US" (US English) locale.
* Then, if "en_US" is passed to this method, the method will return
* <CODE>false</CODE>.
*
* @param locale the locale to check
* @throws NullPointerException if <CODE>locale</CODE>
* is <CODE>null</CODE>.
*/
public boolean isLocaleSupported(Locale locale) {
if (locale == null) {
throw new NullPointerException();
}
return supportedLocales.contains(locale);
}
/**
* Looks through the passed array of <CODE>Locale</CODE>s
* (in the order they appear in the array)
* and returns the first <CODE>Locale</CODE> that is
* supported by the UI (as defined by <CODE>isLocaleSupported()</CODE>),
* or <CODE>null</CODE>, if none of the <CODE>Locale</CODE>s in
* the passed array are supported by the UI.
*
* @param locales an array of locales in order of most desired to
* least desired
* @throws NullPointerException if <CODE>locales</CODE>
* is <CODE>null</CODE>.
*/
public Locale getFirstSupportedLocale(Locale[] locales) {
if (locales == null) {
throw new NullPointerException();
}
for (int i = 0; i < locales.length; ++i) {
if (supportedLocales.contains(locales[i])) {
return locales[i];
}
}
return null;
}
/**
* Iterates through the passed <CODE>List</CODE> of <CODE>Locale</CODE>s
* and returns the first <CODE>Locale</CODE> that is
* supported by the UI (as defined by <CODE>isLocaleSupported()</CODE>),
* or <CODE>null</CODE>, if none of the <CODE>Locale</CODE>s in
* the passed array are supported by the UI.
*
* @param locales a <code>List</code> of locales in order of most
* desired to least desired
* @throws NullPointerException if <CODE>locales</CODE>
* is <CODE>null</CODE>.
*/
public Locale getFirstSupportedLocale(List locales) {
if (locales == null) {
throw new NullPointerException();
}
for (int i = 0; i < locales.size(); ++i) {
if (supportedLocales.contains(locales.get(i))) {
try {
return (Locale) locales.get(i);
}
catch (ClassCastException cce) {
// This should never happen given
// the checks in the constructor.
continue;
}
}
}
return null;
}
/**
* Returns an iterator over the set of <CODE>java.util.Locale</CODE>
* objects, one for each locale supported
* by the UI generated by the UI factory stored in
* the marshalled object of the same <CODE>UIDescriptor</CODE>.
* The returned <CODE>Iterator</CODE> does not support
* <CODE>remove()</CODE>.
*
* @return an iterator over the set of supported locales
*/
public Iterator iterator() {
// Since ConsistentSet is used for supportedLocales,
// can simply return its iterator, which is known
// to not support remove.
return supportedLocales.iterator();
}
/**
* Returns an unmodifiable <CODE>java.util.Set</CODE> that contains
* <CODE>java.util.Locale</CODE> objects, one for each locale supported
* by the UI generated by the UI factory stored in
* the marshalled object of the same <CODE>UIDescriptor</CODE>.
*
* @return an unmodifiable set of the supported locales
*/
public Set getLocales() {
// Since ConsistentSet is used, can just return it. It is known
// to be unmodifiable.
return supportedLocales;
}
/**
* Compares the specified object (the <CODE>Object</CODE> passed
* in <CODE>o</CODE>) with this <CODE>Locales</CODE>
* object for equality. Returns true if the specified object
* is not null, if the specified object's class is
* <CODE>Locales</CODE>, if the two sets of
* supported locales are the same size, and if every locale mentioned in the
* specified <CODE>Locales</CODE> object (passed in <CODE>o</CODE>) is also mentioned
* in this <CODE>Locales</CODE> object.
*
* @param o the object to compare against
* @return <code>true</code> if the objects are the same,
* <code>false</code> otherwise.
*/
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (o.getClass() != Locales.class) {
return false;
}
Locales locales = (Locales) o;
if (!supportedLocales.equals(locales.supportedLocales)) {
return false;
}
return true;
}
/**
* Returns the hash code value for this <CODE>Locales</CODE> object.
*
* @return the hashcode for this object
*/
public int hashCode() {
return supportedLocales.hashCode();
}
}