code: public static Ipv6 parse(final String ipv6Address) {
          try {
              String ipv6String = Validate.notNull(ipv6Address).trim();
              Validate.isTrue(!ipv6String.isEmpty());
  
              final boolean isIpv6AddressWithEmbeddedIpv4 = ipv6String.contains(".");
              if (isIpv6AddressWithEmbeddedIpv4) {
                  ipv6String = getIpv6AddressWithIpv4SectionInIpv6Notation(ipv6String);
              }
  
              final int indexOfDoubleColons = ipv6String.indexOf("::");
              final boolean isShortened = indexOfDoubleColons != -1;
              if (isShortened) {
                  Validate.isTrue(indexOfDoubleColons == ipv6String.lastIndexOf("::"));
                  ipv6String = expandMissingColons(ipv6String, indexOfDoubleColons);
              }
  
              final String[] split = ipv6String.split(COLON, TOTAL_OCTETS);
              Validate.isTrue(split.length == TOTAL_OCTETS);
              BigInteger ipv6value = BigInteger.ZERO;
              for (String part : split) {
                  Validate.isTrue(part.length() <= MAX_PART_LENGTH);
                  Validate.checkRange(Integer.parseInt(part, BITS_PER_PART), MIN_PART_VALUE, MAX_PART_VALUE);
                  ipv6value = ipv6value.shiftLeft(BITS_PER_PART).add(new BigInteger(part, BITS_PER_PART));
              }
              return new Ipv6(ipv6value);
          } catch (Exception e) {
              throw new IllegalArgumentException(String.format(DEFAULT_PARSING_ERROR_MESSAGE, ipv6Address), e);
          }
      }
docs: Parses a <tt>String</tt> into an {@link Ipv6} address.
  
  @param ipv6Address a text representation of an IPv6 address as defined in rfc4291
  @return a new {@link Ipv6}
  @throws NullPointerException if the string argument is <tt>null</tt>
  @throws IllegalArgumentException if the string cannot be parsed
  @see <a href="http://tools.ietf.org/html/rfc4291">rfc4291 - IP Version 6 Addressing Architecture</a>