From 31da6f93e7078135157ea5944e3977550eedef3e Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 27 Jul 2016 12:07:23 +0000
Subject: [PATCH] code cleanup

---
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/Utilities.java |  544 ++++++++++++++++++++++++-----------------------------
 1 files changed, 245 insertions(+), 299 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/Utilities.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/Utilities.java
index b606029..0ed7b7b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/Utilities.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/Utilities.java
@@ -16,10 +16,9 @@
  */
 package org.opends.guitools.controlpanel.util;
 
-import static org.opends.server.util.SchemaUtils.getElementSchemaFile;
-
 import static com.forgerock.opendj.cli.Utils.*;
 import static com.forgerock.opendj.util.OperatingSystem.*;
+
 import static org.forgerock.opendj.ldap.DereferenceAliasesPolicy.*;
 import static org.forgerock.opendj.ldap.SearchScope.*;
 import static org.forgerock.opendj.ldap.requests.Requests.*;
@@ -107,8 +106,8 @@
 import org.forgerock.opendj.ldap.schema.SchemaBuilder;
 import org.forgerock.opendj.ldap.schema.SchemaElement;
 import org.forgerock.opendj.ldap.schema.Syntax;
-import org.forgerock.opendj.ldif.ConnectionEntryReader;
 import org.opends.admin.ads.util.ConnectionWrapper;
+import org.opends.admin.ads.util.PreferredConnection.Type;
 import org.opends.guitools.controlpanel.ControlPanel;
 import org.opends.guitools.controlpanel.browser.IconPool;
 import org.opends.guitools.controlpanel.datamodel.CategorizedComboBoxElement;
@@ -160,8 +159,8 @@
   private static ImageIcon warningIcon;
   private static ImageIcon requiredIcon;
 
-  private final static LocalizableMessage NO_VALUE_SET = INFO_CTRL_PANEL_NO_MONITORING_VALUE.get();
-  private final static LocalizableMessage NOT_IMPLEMENTED = INFO_CTRL_PANEL_NOT_IMPLEMENTED.get();
+  private static final LocalizableMessage NO_VALUE_SET = INFO_CTRL_PANEL_NO_MONITORING_VALUE.get();
+  private static final LocalizableMessage NOT_IMPLEMENTED = INFO_CTRL_PANEL_NOT_IMPLEMENTED.get();
 
   /**
    * Creates a combo box.
@@ -500,16 +499,14 @@
   public static JMenu createMenu(LocalizableMessage msg, LocalizableMessage description)
   {
     JMenu menu = new JMenu(msg.toString());
-    menu.getAccessibleContext().setAccessibleDescription(
-        description.toString());
+    menu.getAccessibleContext().setAccessibleDescription(description.toString());
     return menu;
   }
 
   /**
-   * Creates a label of type 'primary' (with bigger font than usual) with no
-   * text.
-   * @return the label of type 'primary' (with bigger font than usual) with no
-   * text.
+   * Creates a label of type 'primary' (with bigger font than usual) with no text.
+   *
+   * @return the label of type 'primary' (with bigger font than usual) with no text.
    */
   public static JLabel createPrimaryLabel()
   {
@@ -596,7 +593,7 @@
           BorderFactory.createMatteBorder(1, 1, 0, 0,
               ColorAndFontConstants.gridColor));
     }
-    if (isWindows())
+    else if (isWindows())
     {
       table.getTableHeader().setBorder(
           BorderFactory.createMatteBorder(1, 1, 0, 1,
@@ -671,8 +668,7 @@
    * @param cols the columns of the text area.
    * @return a text area.
    */
-  public static JTextArea createTextArea(LocalizableMessage text, int rows,
-      int cols)
+  public static JTextArea createTextArea(LocalizableMessage text, int rows, int cols)
   {
     JTextArea ta = new JTextArea(text.toString(), rows, cols);
     ta.setFont(ColorAndFontConstants.defaultFont);
@@ -726,7 +722,6 @@
     return tf;
   }
 
-
   /**
    * Creates a text field with the default size.
    * @return the created text field.
@@ -740,7 +735,7 @@
   }
 
   /**
-   * Creates a pasword text field.
+   * Creates a password text field.
    * @return the created password text field.
    */
   public static JPasswordField createPasswordField()
@@ -752,7 +747,7 @@
   }
 
   /**
-   * Creates a pasword text field.
+   * Creates a password text field.
    * @param cols the columns of the password text field.
    * @return the created password text field.
    */
@@ -772,14 +767,9 @@
    */
   public static void setBorder(JComponent comp, Border border)
   {
-    if (comp.getBorder() != null)
-    {
-      comp.setBorder(BorderFactory.createCompoundBorder(comp.getBorder(), border));
-    }
-    else
-    {
-      comp.setBorder(border);
-    }
+    comp.setBorder(comp.getBorder() != null
+        ? BorderFactory.createCompoundBorder(comp.getBorder(), border)
+        : border);
   }
 
   /**
@@ -793,14 +783,9 @@
     int width1 = table.getPreferredScrollableViewportSize().width;
     int width2 = scroll.getViewport().getWidth();
 
-    if (width1 > width2)
-    {
-      table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-    }
-    else
-    {
-      table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
-    }
+    table.setAutoResizeMode(width1 > width2
+        ? JTable.AUTO_RESIZE_OFF
+        : JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
   }
 
   /**
@@ -942,11 +927,11 @@
 
 
   /**
-   * Returns an ImageIcon or <CODE>null</CODE> if the path was invalid.
+   * Returns an ImageIcon or {@code null} if the path was invalid.
    * @param path the path of the image.
    * @param loader the class loader to use to load the image.  If
-   * <CODE>null</CODE> this class class loader will be used.
-   * @return an ImageIcon or <CODE>null</CODE> if the path was invalid.
+   * {@code null} this class class loader will be used.
+   * @return an ImageIcon or {@code null} if the path was invalid.
    */
   public static ImageIcon createImageIcon(String path, ClassLoader loader) {
     if (loader == null)
@@ -958,9 +943,9 @@
   }
 
   /**
-   * Returns an ImageIcon or <CODE>null</CODE> if the path was invalid.
+   * Returns an ImageIcon or {@code null} if the path was invalid.
    * @param path the path of the image.
-   * @return an ImageIcon or <CODE>null</CODE> if the path was invalid.
+   * @return an ImageIcon or {@code null} if the path was invalid.
    */
   public static ImageIcon createImageIcon(String path) {
     return createImageIcon(path, null);
@@ -1099,8 +1084,7 @@
       {
         if (s.length() >= i + HTML_SPACE.length())
         {
-          if (HTML_SPACE.equalsIgnoreCase(s.substring(i, i
-              + HTML_SPACE.length())))
+          if (HTML_SPACE.equalsIgnoreCase(s.substring(i, i + HTML_SPACE.length())))
           {
             if (lastLineLength < nCols)
             {
@@ -1261,10 +1245,10 @@
   }
 
   /**
-   * Returns the parent frame of a component.  <CODE>null</CODE> if this
+   * Returns the parent frame of a component.  {@code null} if this
    * component is not contained in any frame.
    * @param comp the component.
-   * @return the parent frame of a component.  <CODE>null</CODE> if this
+   * @return the parent frame of a component.  {@code null} if this
    * component is not contained in any frame.
    */
   public static JFrame getFrame(Component comp)
@@ -1278,10 +1262,10 @@
   }
 
   /**
-   * Returns the parent dialog of a component.  <CODE>null</CODE> if this
+   * Returns the parent dialog of a component.  {@code null} if this
    * component is not contained in any dialog.
    * @param comp the component.
-   * @return the parent dialog of a component.  <CODE>null</CODE> if this
+   * @return the parent dialog of a component.  {@code null} if this
    * component is not contained in any dialog.
    */
   public static Window getParentDialog(Component comp)
@@ -1317,131 +1301,8 @@
                 && StaticUtils.isHexDigit(stringBytes[i+1])
                 && StaticUtils.isHexDigit(stringBytes[i+2]))
         {
-          // Convert hex-encoded UTF-8 to 16-bit chars.
-          byte b;
-
-          byte escapedByte1 = stringBytes[++i];
-          switch (escapedByte1)
-          {
-          case '0':
-            b = (byte) 0x00;
-            break;
-          case '1':
-            b = (byte) 0x10;
-            break;
-          case '2':
-            b = (byte) 0x20;
-            break;
-          case '3':
-            b = (byte) 0x30;
-            break;
-          case '4':
-            b = (byte) 0x40;
-            break;
-          case '5':
-            b = (byte) 0x50;
-            break;
-          case '6':
-            b = (byte) 0x60;
-            break;
-          case '7':
-            b = (byte) 0x70;
-            break;
-          case '8':
-            b = (byte) 0x80;
-            break;
-          case '9':
-            b = (byte) 0x90;
-            break;
-          case 'a':
-          case 'A':
-            b = (byte) 0xA0;
-            break;
-          case 'b':
-          case 'B':
-            b = (byte) 0xB0;
-            break;
-          case 'c':
-          case 'C':
-            b = (byte) 0xC0;
-            break;
-          case 'd':
-          case 'D':
-            b = (byte) 0xD0;
-            break;
-          case 'e':
-          case 'E':
-            b = (byte) 0xE0;
-            break;
-          case 'f':
-          case 'F':
-            b = (byte) 0xF0;
-            break;
-          default:
-            throw new RuntimeException("Unexpected byte: "+escapedByte1);
-          }
-
-          byte escapedByte2 = stringBytes[++i];
-          switch (escapedByte2)
-          {
-          case '0':
-            break;
-          case '1':
-            b |= 0x01;
-            break;
-          case '2':
-            b |= 0x02;
-            break;
-          case '3':
-            b |= 0x03;
-            break;
-          case '4':
-            b |= 0x04;
-            break;
-          case '5':
-            b |= 0x05;
-            break;
-          case '6':
-            b |= 0x06;
-            break;
-          case '7':
-            b |= 0x07;
-            break;
-          case '8':
-            b |= 0x08;
-            break;
-          case '9':
-            b |= 0x09;
-            break;
-          case 'a':
-          case 'A':
-            b |= 0x0A;
-            break;
-          case 'b':
-          case 'B':
-            b |= 0x0B;
-            break;
-          case 'c':
-          case 'C':
-            b |= 0x0C;
-            break;
-          case 'd':
-          case 'D':
-            b |= 0x0D;
-            break;
-          case 'e':
-          case 'E':
-            b |= 0x0E;
-            break;
-          case 'f':
-          case 'F':
-            b |= 0x0F;
-            break;
-          default:
-            throw new RuntimeException("Unexpected byte: "+escapedByte2);
-          }
-
-          decodedBytes[pos++] = b;
+          decodedBytes[pos++] = convertHexEncodedUtf8To16BitChars(stringBytes, i);
+          i += 2;
         }
         else {
           decodedBytes[pos++] = stringBytes[i];
@@ -1449,13 +1310,142 @@
       }
       return new String(decodedBytes, 0, pos, "UTF-8");
     }
-    catch (UnsupportedEncodingException uee)
+    catch (UnsupportedEncodingException unexpected)
     {
-//    This is a bug, UTF-8 should be supported always by the JVM
-      throw new RuntimeException("UTF-8 encoding not supported", uee);
+      // This is a bug, UTF-8 should be supported always by the JVM
+      throw new RuntimeException("UTF-8 encoding not supported", unexpected);
     }
   }
 
+  /** Convert hex-encoded UTF-8 to 16-bit chars. */
+  private static byte convertHexEncodedUtf8To16BitChars(byte[] bytes, int i)
+  {
+    byte b;
+
+    byte escapedByte1 = bytes[i + 1];
+    switch (escapedByte1)
+    {
+    case '0':
+      b = (byte) 0x00;
+      break;
+    case '1':
+      b = (byte) 0x10;
+      break;
+    case '2':
+      b = (byte) 0x20;
+      break;
+    case '3':
+      b = (byte) 0x30;
+      break;
+    case '4':
+      b = (byte) 0x40;
+      break;
+    case '5':
+      b = (byte) 0x50;
+      break;
+    case '6':
+      b = (byte) 0x60;
+      break;
+    case '7':
+      b = (byte) 0x70;
+      break;
+    case '8':
+      b = (byte) 0x80;
+      break;
+    case '9':
+      b = (byte) 0x90;
+      break;
+    case 'a':
+    case 'A':
+      b = (byte) 0xA0;
+      break;
+    case 'b':
+    case 'B':
+      b = (byte) 0xB0;
+      break;
+    case 'c':
+    case 'C':
+      b = (byte) 0xC0;
+      break;
+    case 'd':
+    case 'D':
+      b = (byte) 0xD0;
+      break;
+    case 'e':
+    case 'E':
+      b = (byte) 0xE0;
+      break;
+    case 'f':
+    case 'F':
+      b = (byte) 0xF0;
+      break;
+    default:
+      throw new RuntimeException("Unexpected byte: " + escapedByte1);
+    }
+
+    byte escapedByte2 = bytes[i + 2];
+    switch (escapedByte2)
+    {
+    case '0':
+      break;
+    case '1':
+      b |= 0x01;
+      break;
+    case '2':
+      b |= 0x02;
+      break;
+    case '3':
+      b |= 0x03;
+      break;
+    case '4':
+      b |= 0x04;
+      break;
+    case '5':
+      b |= 0x05;
+      break;
+    case '6':
+      b |= 0x06;
+      break;
+    case '7':
+      b |= 0x07;
+      break;
+    case '8':
+      b |= 0x08;
+      break;
+    case '9':
+      b |= 0x09;
+      break;
+    case 'a':
+    case 'A':
+      b |= 0x0A;
+      break;
+    case 'b':
+    case 'B':
+      b |= 0x0B;
+      break;
+    case 'c':
+    case 'C':
+      b |= 0x0C;
+      break;
+    case 'd':
+    case 'D':
+      b |= 0x0D;
+      break;
+    case 'e':
+    case 'E':
+      b |= 0x0E;
+      break;
+    case 'f':
+    case 'F':
+      b |= 0x0F;
+      break;
+    default:
+      throw new RuntimeException("Unexpected byte: " + escapedByte2);
+    }
+
+    return b;
+  }
+
   /**
    * Returns whether the provided strings represent the same DN.
    *
@@ -1488,7 +1478,7 @@
   }
 
   /** The pattern for control characters. */
-  private final static Pattern cntrl_pattern = Pattern.compile("\\p{Cntrl}", Pattern.MULTILINE);
+  private static final Pattern cntrl_pattern = Pattern.compile("\\p{Cntrl}", Pattern.MULTILINE);
 
   /**
    * Checks if a string contains control characters.
@@ -2024,11 +2014,7 @@
       return configurationSchemaFileNames.contains(fileName);
     }
     String xOrigin = getElementOrigin(fileElement);
-    if (xOrigin != null)
-    {
-      return configurationSchemaOrigins.contains(xOrigin);
-    }
-    return false;
+    return xOrigin != null && configurationSchemaOrigins.contains(xOrigin);
   }
 
   /**
@@ -2157,21 +2143,9 @@
   public static ConnectionWrapper getAdminDirContext(ControlPanelInfo controlInfo, String bindDN, String pwd)
       throws NamingException, IOException, ConfigReadException
   {
-    String usedUrl = controlInfo.getAdminConnectorURL();
-    if (usedUrl == null)
-    {
-      throw new ConfigReadException(
-          ERR_COULD_NOT_FIND_VALID_LDAPURL.get());
-    }
-
-    // Search for the config to check that it is the directory manager.
-    ConnectionWrapper conn = new ConnectionWrapper(
-        usedUrl, LDAPS, bindDN, pwd, controlInfo.getConnectTimeout(), controlInfo.getTrustManager());
-    checkCanReadConfig(conn);
-    return conn;
+    return createConnection(controlInfo.getAdminConnectorURL(), LDAPS, bindDN, pwd, controlInfo);
   }
 
-
   /**
    * Returns the connection to connect to the server using the
    * information in the ControlCenterInfo object (which provides the host, port
@@ -2190,41 +2164,30 @@
   public static ConnectionWrapper getUserDataDirContext(ControlPanelInfo controlInfo,
       String bindDN, String pwd) throws NamingException, IOException, ConfigReadException
   {
-    ConnectionWrapper conn;
     if (controlInfo.connectUsingStartTLS())
     {
-      String usedUrl = controlInfo.getStartTLSURL();
-      if (usedUrl == null)
-      {
-        throw new ConfigReadException(
-            ERR_COULD_NOT_FIND_VALID_LDAPURL.get());
-      }
-      conn = new ConnectionWrapper(usedUrl, START_TLS,
-          bindDN, pwd, controlInfo.getConnectTimeout(), controlInfo.getTrustManager());
+      return createConnection(controlInfo.getStartTLSURL(), START_TLS, bindDN, pwd, controlInfo);
     }
     else if (controlInfo.connectUsingLDAPS())
     {
-      String usedUrl = controlInfo.getLDAPSURL();
-      if (usedUrl == null)
-      {
-        throw new ConfigReadException(
-            ERR_COULD_NOT_FIND_VALID_LDAPURL.get());
-      }
-      conn = new ConnectionWrapper(usedUrl, LDAPS,
-          bindDN, pwd, controlInfo.getConnectTimeout(), controlInfo.getTrustManager());
+      return createConnection(controlInfo.getLDAPSURL(), LDAPS, bindDN, pwd, controlInfo);
     }
     else
     {
-      String usedUrl = controlInfo.getLDAPURL();
-      if (usedUrl == null)
-      {
-        throw new ConfigReadException(
-            ERR_COULD_NOT_FIND_VALID_LDAPURL.get());
-      }
-      conn = new ConnectionWrapper(usedUrl, LDAP,
-          bindDN, pwd, controlInfo.getConnectTimeout(), controlInfo.getTrustManager());
+      return createConnection(controlInfo.getLDAPURL(), LDAP, bindDN, pwd, controlInfo);
+    }
+  }
+
+  private static ConnectionWrapper createConnection(String usedUrl, Type connectionType, String bindDN, String bindPwd,
+      ControlPanelInfo controlInfo) throws NamingException, IOException, ConfigReadException
+  {
+    if (usedUrl == null)
+    {
+      throw new ConfigReadException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get());
     }
 
+    ConnectionWrapper conn = new ConnectionWrapper(usedUrl, connectionType,
+        bindDN, bindPwd, controlInfo.getConnectTimeout(), controlInfo.getTrustManager());
     checkCanReadConfig(conn);
     return conn;
   }
@@ -2241,13 +2204,8 @@
   {
     // Search for the config to check that it is the directory manager.
     SearchRequest request = newSearchRequest("cn=config", BASE_OBJECT, "objectclass=*", NO_ATTRIBUTES);
-    try (ConnectionEntryReader entryReader = conn.getConnection().search(request))
-    {
-      while (entryReader.hasNext())
-      {
-        entryReader.readEntry();
-      }
-    }
+    // rely on exception being thrown if we cannot read
+    conn.getConnection().searchSingleEntry(request);
   }
 
   /**
@@ -2265,7 +2223,7 @@
         .setSizeLimit(0)
         .setTimeLimit(0)
         .setDereferenceAliasesPolicy(NEVER);
-    connWrapper.getConnection().search(request);
+    connWrapper.getConnection().search(request).close();
   }
 
   /**
@@ -2354,10 +2312,10 @@
   }
 
   /**
-   * Returns the scrolpane where the provided component is contained.
-   * <CODE>null</CODE> if the component is not contained in any scrolpane.
+   * Returns the scrollpane where the provided component is contained.
+   * {@code null} if the component is not contained in any scrollpane.
    * @param comp the component.
-   * @return the scrolpane where the provided component is contained.
+   * @return the scrollpane where the provided component is contained.
    */
   public static JScrollPane getContainingScroll(Component comp)
   {
@@ -2430,7 +2388,7 @@
    * entry.
    *
    * @param sr
-   *          the entry. It may be <CODE>null</CODE>.
+   *          the entry. It may be {@code null}.
    * @param attrName
    *          the attribute name.
    * @return the first value as a String for a given attribute in the provided
@@ -2565,7 +2523,7 @@
    * @param newElements the new items for the combo box model.
    * @param model the combo box model to be updated.
    * @param comparator the object that will be used to compare the objects in
-   * the model.  If <CODE>null</CODE>, the equals method will be used.
+   * the model.  If {@code null}, the equals method will be used.
    */
   public static void updateComboBoxModel(Collection<?> newElements,
       DefaultComboBoxModel model,
@@ -2651,95 +2609,84 @@
   {
     for (String attrName : attrNames)
     {
-      int possibleResult;
-      if (monitor1 == null)
+      possibleResults.add(compareForAttribute(monitor1, monitor2, attrName));
+    }
+  }
+
+  private static int compareForAttribute(SearchResultEntry monitor1, SearchResultEntry monitor2, String attrName)
+  {
+    if (monitor1 == null)
+    {
+      return monitor2 == null ? 0 : -1;
+    }
+    else if (monitor2 == null)
+    {
+      return 1;
+    }
+    else
+    {
+      Object v1 = getFirstMonitoringValue(monitor1.getAttribute(attrName));
+      Object v2 = getFirstMonitoringValue(monitor2.getAttribute(attrName));
+      if (v1 == null)
       {
-        if (monitor2 == null)
-        {
-          possibleResult = 0;
-        }
-        else
-        {
-          possibleResult = -1;
-        }
+        return v2 == null ? 0 : -1;
       }
-      else if (monitor2 == null)
+      else if (v2 == null)
       {
-        possibleResult = 1;
+        return 1;
       }
-      else
+      else if (v1 instanceof Number)
       {
-        Object v1 = getFirstMonitoringValue(monitor1.getAttribute(attrName));
-        Object v2 = getFirstMonitoringValue(monitor2.getAttribute(attrName));
-        if (v1 == null)
+        if (v2 instanceof Number)
         {
-          if (v2 == null)
+          if (v1 instanceof Double || v2 instanceof Double)
           {
-            possibleResult = 0;
-          }
-          else
-          {
-            possibleResult = -1;
-          }
-        }
-        else if (v2 == null)
-        {
-          possibleResult = 1;
-        }
-        else if (v1 instanceof Number)
-        {
-          if (v2 instanceof Number)
-          {
-            if (v1 instanceof Double || v2 instanceof Double)
+            double n1 = ((Number) v1).doubleValue();
+            double n2 = ((Number) v2).doubleValue();
+            if (n1 > n2)
             {
-              double n1 = ((Number) v1).doubleValue();
-              double n2 = ((Number) v2).doubleValue();
-              if (n1 > n2)
-              {
-                possibleResult = 1;
-              }
-              else if (n1 < n2)
-              {
-                possibleResult = -1;
-              }
-              else
-              {
-                possibleResult = 0;
-              }
+              return 1;
+            }
+            else if (n1 < n2)
+            {
+              return -1;
             }
             else
             {
-              long n1 = ((Number) v1).longValue();
-              long n2 = ((Number) v2).longValue();
-              if (n1 > n2)
-              {
-                possibleResult = 1;
-              }
-              else if (n1 < n2)
-              {
-                possibleResult = -1;
-              }
-              else
-              {
-                possibleResult = 0;
-              }
+              return 0;
             }
           }
           else
           {
-            possibleResult = 1;
+            long n1 = ((Number) v1).longValue();
+            long n2 = ((Number) v2).longValue();
+            if (n1 > n2)
+            {
+              return 1;
+            }
+            else if (n1 < n2)
+            {
+              return -1;
+            }
+            else
+            {
+              return 0;
+            }
           }
         }
-        else if (v2 instanceof Number)
-        {
-          possibleResult = -1;
-        }
         else
         {
-          possibleResult = v1.toString().compareTo(v2.toString());
+          return 1;
         }
       }
-      possibleResults.add(possibleResult);
+      else if (v2 instanceof Number)
+      {
+        return -1;
+      }
+      else
+      {
+        return v1.toString().compareTo(v2.toString());
+      }
     }
   }
 
@@ -2751,8 +2698,7 @@
    * @param exceptions
    *          A list of exceptions.
    * @throws E
-   *           The first element of the provided list (if the list is not
-   *           empty).
+   *           The first element of the provided list (if the list is not empty).
    */
   public static <E extends Exception> void throwFirstFrom(List<? extends E> exceptions) throws E
   {

--
Gitblit v1.10.0