code: public static AppIdNamespace parseEncodedAppIdNamespace( String encodedAppIdNamespace ) {
          if ( encodedAppIdNamespace == null ) {
              throw new IllegalArgumentException( "appIdNamespaceString may not be null" );
          }
          int index = encodedAppIdNamespace.indexOf( NamespaceResources.NAMESPACE_SEPARATOR );
          if ( index == -1 ) {
              return new AppIdNamespace( encodedAppIdNamespace, "" );
          }
          String appId = encodedAppIdNamespace.substring( 0, index );
          String namespace = encodedAppIdNamespace.substring( index + 1 );
          if ( namespace.length() == 0 ) {
              throw new IllegalArgumentException(
                      "encodedAppIdNamespace with empty namespace may not contain a '" +
                              NamespaceResources.NAMESPACE_SEPARATOR + "'" );
          }
          return new AppIdNamespace( appId, namespace );
      }
docs: Converts an encoded appId/namespace to {@link AppIdNamespace}.
  <p>
  <p>Only one form of an appId/namespace pair will be allowed. i.e. "app!"
  is an illegal form and must be encoded as "app".
  <p>
  <p>An appId/namespace pair may contain at most one "!" character.
  
  @param encodedAppIdNamespace The encoded application Id/namespace string.