From commits-return-6943-archive-asf-public=cust-asf.ponee.io@juneau.apache.org Tue Oct 13 18:16:09 2020 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mailroute1-lw-us.apache.org (mailroute1-lw-us.apache.org [207.244.88.153]) by mx-eu-01.ponee.io (Postfix) with ESMTPS id 1FF1B18060E for ; Tue, 13 Oct 2020 20:16:09 +0200 (CEST) Received: from mail.apache.org (localhost [127.0.0.1]) by mailroute1-lw-us.apache.org (ASF Mail Server at mailroute1-lw-us.apache.org) with SMTP id 4ED0D123057 for ; Tue, 13 Oct 2020 18:16:08 +0000 (UTC) Received: (qmail 68672 invoked by uid 500); 13 Oct 2020 18:16:08 -0000 Mailing-List: contact commits-help@juneau.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@juneau.apache.org Delivered-To: mailing list commits@juneau.apache.org Received: (qmail 68663 invoked by uid 99); 13 Oct 2020 18:16:08 -0000 Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 13 Oct 2020 18:16:08 +0000 Received: by gitbox.apache.org (ASF Mail Server at gitbox.apache.org, from userid 33) id 03A8281A5C; Tue, 13 Oct 2020 18:16:08 +0000 (UTC) Date: Tue, 13 Oct 2020 18:16:07 +0000 To: "commits@juneau.apache.org" Subject: [juneau] branch master updated: Remove deprecated code. MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Message-ID: <160261296794.2838.13542168080649145519@gitbox.apache.org> From: jamesbognar@apache.org X-Git-Host: gitbox.apache.org X-Git-Repo: juneau X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: cf6a152a7ef94db5b44963d2b04ca9bd0c394104 X-Git-Newrev: 0ccd646df55634c43bf6ec00ad399e34dcc74585 X-Git-Rev: 0ccd646df55634c43bf6ec00ad399e34dcc74585 X-Git-NotificationType: ref_changed_plus_diff X-Git-Multimail-Version: 1.5.dev Auto-Submitted: auto-generated This is an automated email from the ASF dual-hosted git repository. jamesbognar pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/juneau.git The following commit(s) were added to refs/heads/master by this push: new 0ccd646 Remove deprecated code. 0ccd646 is described below commit 0ccd646df55634c43bf6ec00ad399e34dcc74585 Author: JamesBognar AuthorDate: Tue Oct 13 14:16:03 2020 -0400 Remove deprecated code. --- .../org/apache/juneau/utils/MessageBundle.java | 396 --------------------- .../apache/juneau/utils/MockHttpConnection.java | 39 -- .../org/apache/juneau/utils/MockHttpRequest.java | 70 ---- .../org/apache/juneau/utils/MockHttpResponse.java | 58 --- .../java/org/apache/juneau/utils/PojoRest.java | 54 --- 5 files changed, 617 deletions(-) diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MessageBundle.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MessageBundle.java deleted file mode 100644 index bef0de8..0000000 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MessageBundle.java +++ /dev/null @@ -1,396 +0,0 @@ -// *************************************************************************************************************************** -// * 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.juneau.utils; - -import static org.apache.juneau.internal.StringUtils.*; -import static org.apache.juneau.internal.ThrowableUtils.*; - -import java.text.*; -import java.util.*; -import java.util.concurrent.*; - -import org.apache.juneau.collections.*; - -/** - * Wraps a {@link ResourceBundle} to provide some useful additional functionality. - * - *
    - *
  • - * Instead of throwing {@link MissingResourceException}, the {@link #getString(String)} method - * will return "{!!key}" if the bundle was not found, and "{!key}" if bundle - * was found but the key is not in the bundle. - *
  • - * A client locale can be set as a {@link ThreadLocal} object using the static {@link #setClientLocale(Locale)} - * so that client localized messages can be retrieved using the {@link #getClientString(String, Object...)} - * method on all instances of this class. - *
  • - * Resource bundles on parent classes can be added to the search path for this class by using the - * {@link #addSearchPath(Class, String)} method. - * This allows messages to be retrieved from the resource bundles of parent classes. - *
  • - * Locale-specific bundles can be retrieved by using the {@link #getBundle(Locale)} method. - *
  • - * The {@link #getString(Locale, String, Object...)} method can be used to retrieve locale-specific messages. - *
  • - * Messages in the resource bundle can optionally be prefixed with the simple class name. - * For example, if the class is MyClass and the properties file contains "MyClass.myMessage", - * the message can be retrieved using getString("myMessage"). - *
- * - *
    - *
  • - * This class is thread-safe. - *
- * @deprecated Use {@link org.apache.juneau.cp.Messages}. - */ -@Deprecated -public class MessageBundle extends ResourceBundle { - - private static final ThreadLocal clientLocale = new ThreadLocal<>(); - - private final ResourceBundle rb; - private final String bundlePath, className; - private final Class forClass; - private final long creationThreadId; - - // A map that contains all keys [shortKeyName->keyName] and [keyName->keyName], where shortKeyName - // refers to keys prefixed and stripped of the class name (e.g. "foobar"->"MyClass.foobar") - private final Map keyMap = new ConcurrentHashMap<>(); - - // Contains all keys present in all bundles in searchBundles. - private final ConcurrentSkipListSet allKeys = new ConcurrentSkipListSet<>(); - - // Bundles to search through to find properties. - // Typically this will be a list of resource bundles for each class up the class hierarchy chain. - private final CopyOnWriteArrayList searchBundles = new CopyOnWriteArrayList<>(); - - // Cache of message bundles per locale. - private final ConcurrentHashMap localizedBundles = new ConcurrentHashMap<>(); - - /** - * Sets the locale for this thread so that calls to {@link #getClientString(String, Object...)} return messages in - * that locale. - * - * @param locale The new client locale. - */ - public static void setClientLocale(Locale locale) { - MessageBundle.clientLocale.set(locale); - } - - /** - * Constructor. - * - *

- * When this method is used, the bundle path is determined by searching for the resource bundle - * in the following locations: - *

    - *
  • [package].ForClass.properties - *
  • [package].nls.ForClass.properties - *
  • [package].i18n.ForClass.properties - *
- * - * @param forClass The class - * @return A new message bundle belonging to the class. - */ - public static final MessageBundle create(Class forClass) { - return create(forClass, findBundlePath(forClass)); - } - - /** - * Constructor. - * - *

- * A shortcut for calling new MessageBundle(forClass, bundlePath). - * - * @param forClass The class - * @param bundlePath The location of the resource bundle. - * @return A new message bundle belonging to the class. - */ - public static final MessageBundle create(Class forClass, String bundlePath) { - return new MessageBundle(forClass, bundlePath); - } - - private static final String findBundlePath(Class forClass) { - String path = forClass.getName(); - if (tryBundlePath(forClass, path)) - return path; - path = forClass.getPackage().getName() + ".nls." + forClass.getSimpleName(); - if (tryBundlePath(forClass, path)) - return path; - path = forClass.getPackage().getName() + ".i18n." + forClass.getSimpleName(); - if (tryBundlePath(forClass, path)) - return path; - return null; - } - - private static final boolean tryBundlePath(Class c, String path) { - try { - path = c.getName(); - ResourceBundle.getBundle(path, Locale.getDefault(), c.getClassLoader()); - return true; - } catch (MissingResourceException e) { - return false; - } - } - - /** - * Constructor. - * - * @param forClass The class using this resource bundle. - * @param bundlePath - * The path of the resource bundle to wrap. - * This can be an absolute path (e.g. "com.foo.MyMessages") or a path relative to the package of the - * forClass (e.g. "MyMessages" if forClass is "com.foo.MyClass"). - */ - public MessageBundle(Class forClass, String bundlePath) { - this(forClass, bundlePath, Locale.getDefault()); - } - - private MessageBundle(Class forClass, String bundlePath, Locale locale) { - this.forClass = forClass; - this.className = forClass.getSimpleName(); - if (bundlePath == null) - throw new RuntimeException("Bundle path was null."); - if (bundlePath.endsWith(".properties")) - throw new RuntimeException("Bundle path should not end with '.properties'"); - this.bundlePath = bundlePath; - this.creationThreadId = Thread.currentThread().getId(); - ClassLoader cl = forClass.getClassLoader(); - ResourceBundle trb = null; - try { - trb = ResourceBundle.getBundle(bundlePath, locale, cl); - } catch (MissingResourceException e) { - try { - trb = ResourceBundle.getBundle(forClass.getPackage().getName() + '.' + bundlePath, locale, cl); - } catch (MissingResourceException e2) { - } - } - this.rb = trb; - if (rb != null) { - - // Populate keyMap with original mappings. - for (Enumeration e = getKeys(); e.hasMoreElements();) { - String key = e.nextElement(); - keyMap.put(key, key); - } - - // Override/augment with shortname mappings (e.g. "foobar"->"MyClass.foobar") - String c = className + '.'; - for (Enumeration e = getKeys(); e.hasMoreElements();) { - String key = e.nextElement(); - if (key.startsWith(c)) { - String shortKey = key.substring(className.length() + 1); - keyMap.put(shortKey, key); - } - } - - allKeys.addAll(keyMap.keySet()); - } - searchBundles.add(this); - } - - - /** - * Add another bundle path to this resource bundle. - * - *

- * Order of property lookup is first-to-last. - * - *

- * This method must be called from the same thread as the call to the constructor. - * This eliminates the need for synchronization. - * - * @param forClass The class using this resource bundle. - * @param bundlePath The bundle path. - * @return This object (for method chaining). - */ - public MessageBundle addSearchPath(Class forClass, String bundlePath) { - assertSameThread(creationThreadId, "This method can only be called from the same thread that created the object."); - MessageBundle srb = new MessageBundle(forClass, bundlePath); - if (srb.rb != null) { - allKeys.addAll(srb.keySet()); - searchBundles.add(srb); - } - return this; - } - - @Override /* ResourceBundle */ - public boolean containsKey(String key) { - return allKeys.contains(key); - } - - /** - * Similar to {@link ResourceBundle#getString(String)} except allows you to pass in {@link MessageFormat} objects. - * - * @param key The resource bundle key. - * @param args Optional {@link MessageFormat}-style arguments. - * @return - * The resolved value. Never null. - * "{!!key}" if the bundle is missing. - * "{!key}" if the key is missing. - */ - public String getString(String key, Object...args) { - String s = getString(key); - if (s.length() > 0 && s.charAt(0) == '{') - return s; - return format(s, args); - } - - /** - * Same as {@link #getString(String, Object...)} but allows you to specify the locale. - * - * @param locale The locale of the resource bundle to retrieve message from. - * @param key The resource bundle key. - * @param args Optional {@link MessageFormat}-style arguments. - * @return - * The resolved value. Never null. - * "{!!key}" if the bundle is missing. - * "{!key}" if the key is missing. - */ - public String getString(Locale locale, String key, Object...args) { - if (locale == null) - return getString(key, args); - return getBundle(locale).getString(key, args); - } - - /** - * Same as {@link #getString(String, Object...)} but uses the locale specified on the call to {@link #setClientLocale(Locale)}. - * - * @param key The resource bundle key. - * @param args Optional {@link MessageFormat}-style arguments. - * @return - * The resolved value. Never null. - * "{!!key}" if the bundle is missing. - * "{!key}" if the key is missing. - */ - public String getClientString(String key, Object...args) { - return getString(clientLocale.get(), key, args); - } - - /** - * Looks for all the specified keys in the resource bundle and returns the first value that exists. - * - * @param keys The list of possible keys. - * @return The resolved value, or null if no value is found or the resource bundle is missing. - */ - public String findFirstString(String...keys) { - if (rb == null) - return null; - for (String k : keys) { - if (containsKey(k)) - return getString(k); - } - return null; - } - - /** - * Same as {@link #findFirstString(String...)}, but uses the specified locale. - * - * @param locale The locale of the resource bundle to retrieve message from. - * @param keys The list of possible keys. - * @return The resolved value, or null if no value is found or the resource bundle is missing. - */ - public String findFirstString(Locale locale, String...keys) { - MessageBundle srb = getBundle(locale); - return srb.findFirstString(keys); - } - - @Override /* ResourceBundle */ - public Set keySet() { - return Collections.unmodifiableSet(allKeys); - } - - /** - * Returns all keys in this resource bundle with the specified prefix. - * - * @param prefix The prefix. - * @return The set of all keys in the resource bundle with the prefix. - */ - public Set keySet(String prefix) { - Set set = new HashSet<>(); - for (String s : keySet()) { - if (s.equals(prefix) || (s.startsWith(prefix) && s.charAt(prefix.length()) == '.')) - set.add(s); - } - return set; - } - - @Override /* ResourceBundle */ - public Enumeration getKeys() { - if (rb == null) - return new Vector(0).elements(); - return rb.getKeys(); - } - - @Override /* ResourceBundle */ - protected Object handleGetObject(String key) { - for (MessageBundle srb : searchBundles) { - if (srb.rb != null) { - String key2 = srb.keyMap.get(key); - if (key2 != null) { - try { - return srb.rb.getObject(key2); - } catch (Exception e) { - return "{!"+key+"}"; - } - } - } - } - if (rb == null) - return "{!!"+key+"}"; - return "{!"+key+"}"; - } - - /** - * Returns this resource bundle as an {@link OMap}. - * - *

- * Useful for debugging purposes. - * Note that any class that implements a swap() method will automatically be serialized by - * calling this method and serializing the result. - * - *

- * This method always constructs a new {@link OMap} on each call. - * - * @return A new map containing all the keys and values in this bundle. - */ - public OMap swap() { - OMap om = new OMap(); - for (String k : allKeys) - om.put(k, getString(k)); - return om; - } - - /** - * Returns the resource bundle for the specified locale. - * - * @param locale The client locale. - * @return The resource bundle for the specified locale. Never null. - */ - public MessageBundle getBundle(Locale locale) { - MessageBundle mb = localizedBundles.get(locale); - if (mb != null) - return mb; - mb = new MessageBundle(forClass, bundlePath, locale); - List l = new ArrayList<>(searchBundles.size()-1); - for (int i = 1; i < searchBundles.size(); i++) { - MessageBundle srb = searchBundles.get(i); - srb = new MessageBundle(srb.forClass, srb.bundlePath, locale); - l.add(srb); - mb.allKeys.addAll(srb.keySet()); - } - mb.searchBundles.addAll(l); - localizedBundles.putIfAbsent(locale, mb); - return localizedBundles.get(locale); - } -} \ No newline at end of file diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MockHttpConnection.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MockHttpConnection.java deleted file mode 100644 index 577adcc..0000000 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MockHttpConnection.java +++ /dev/null @@ -1,39 +0,0 @@ -// *************************************************************************************************************************** -// * 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.juneau.utils; - -/** - * Represent the basic connection for mock HTTP requests. - * - *

- * Used as a shim between the server and client APIs that allow the RestClient - * class to send and receive mocked requests using the MockRest interface. - * - *

- * Deprecated - Use org.apache.juneau.rest.mock2 - *
- */ -@Deprecated -public interface MockHttpConnection { - - /** - * Creates a mocked HTTP request. - * - * @param method The HTTP request method. - * @param path The HTTP request path. - * @param body The HTTP request body. - * @return A new mock request. - * @throws Exception - */ - MockHttpRequest request(String method, String path, Object body) throws Exception; -} diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MockHttpRequest.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MockHttpRequest.java deleted file mode 100644 index dfb64a9..0000000 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MockHttpRequest.java +++ /dev/null @@ -1,70 +0,0 @@ -// *************************************************************************************************************************** -// * 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.juneau.utils; - -/** - * Represent the basic interface for an HTTP rquest. - * - *

- * Used as a shim between the server and client APIs that allow the RestClient - * class to send and receive mocked requests using the MockRest interface. - * - *

- * Deprecated - Use org.apache.juneau.rest.mock2 - *
- */ -@Deprecated -public interface MockHttpRequest { - - /** - * Sets the URI of the request. - * - * @param uri The URI of the request. - * @return This object (for method chaining). - */ - MockHttpRequest uri(String uri); - - /** - * Sets the URI of the request. - * - * @param method The URI of the request. - * @return This object (for method chaining). - */ - MockHttpRequest method(String method); - - /** - * Sets a header on the request. - * - * @param name The header name. - * @param value The header value. - * @return This object (for method chaining). - */ - MockHttpRequest header(String name, Object value); - - /** - * Sets the body of the request. - * - * @param body The body of the request. - * @return This object (for method chaining). - */ - MockHttpRequest body(Object body); - - /** - * Executes the request and returns the response. - * - * @return The response for the request. - * @throws Exception - */ - MockHttpResponse execute() throws Exception; - -} diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MockHttpResponse.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MockHttpResponse.java deleted file mode 100644 index 391b095..0000000 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MockHttpResponse.java +++ /dev/null @@ -1,58 +0,0 @@ -// *************************************************************************************************************************** -// * 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.juneau.utils; - -import java.util.*; - -/** - * Represent the basic interface for an HTTP response. - * - *

- * Used as a shim between the server and client APIs that allow the RestClient - * class to send and receive mocked requests using the MockRest interface. - * - *

- * Deprecated - Use org.apache.juneau.rest.mock2 - *
- */ -@Deprecated -public interface MockHttpResponse { - - /** - * Returns the status code of the response. - * - * @return The status code of the response. - */ - int getStatus(); - - /** - * Returns the status message of the response. - * - * @return The status message of the response. - */ - String getMessage(); - - /** - * Returns the headers of the response. - * - * @return The headers of the response. - */ - Map getHeaders(); - - /** - * Returns the body of the response. - * - * @return The body of the response. - */ - byte[] getBody(); -} diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/PojoRest.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/PojoRest.java index 27f5d81..6a44011 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/PojoRest.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/PojoRest.java @@ -522,19 +522,6 @@ public final class PojoRest { /** * Returns the specified entry value converted to a {@link Map}. * - * @param url The key. - * @return The converted value, or null if the map contains no mapping for this key. - * @throws InvalidDataConversionException If value cannot be converted. - * @deprecated Use {@link #getOMap(String)} - */ - @Deprecated - public ObjectMap getObjectMap(String url) { - return get(url, ObjectMap.class); - } - - /** - * Returns the specified entry value converted to a {@link Map}. - * *

* Shortcut for get(OMap.class, key). * @@ -549,20 +536,6 @@ public final class PojoRest { /** * Returns the specified entry value converted to a {@link ObjectMap}. * - * @param url The key. - * @param defVal The default value if the map doesn't contain the specified mapping. - * @return The converted value, or the default value if the map contains no mapping for this key. - * @throws InvalidDataConversionException If value cannot be converted. - * @deprecated Use {@link #getOMap(String, OMap)} - */ - @Deprecated - public ObjectMap getObjectMap(String url, ObjectMap defVal) { - return getWithDefault(url, defVal, ObjectMap.class); - } - - /** - * Returns the specified entry value converted to a {@link ObjectMap}. - * *

* Shortcut for get(OMap.class, key, defVal). * @@ -576,19 +549,6 @@ public final class PojoRest { } /** - * Returns the specified entry value converted to a {@link ObjectList}. - * - * @param url The key. - * @return The converted value, or null if the map contains no mapping for this key. - * @throws InvalidDataConversionException If value cannot be converted. - * @deprecated Use {@link #getOList(String)} - */ - @Deprecated - public ObjectList getObjectList(String url) { - return get(url, ObjectList.class); - } - - /** * Returns the specified entry value converted to a {@link OList}. * *

@@ -603,20 +563,6 @@ public final class PojoRest { } /** - * Returns the specified entry value converted to a {@link ObjectList}. - * - * @param url The key. - * @param defVal The default value if the map doesn't contain the specified mapping. - * @return The converted value, or the default value if the map contains no mapping for this key. - * @throws InvalidDataConversionException If value cannot be converted. - * @deprecated Use {@link #getOList(String)} - */ - @Deprecated - public ObjectList getObjectList(String url, ObjectList defVal) { - return getWithDefault(url, defVal, ObjectList.class); - } - - /** * Returns the specified entry value converted to a {@link OList}. * *