alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (InterOperableNamingImpl.java)

This example Java source code file (InterOperableNamingImpl.java) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

corba, interoperablenamingimpl, invalidaddress, namecomponent, string, stringbuffer, stringcomponentsfromindices, stringwriter

The InterOperableNamingImpl.java Java example source code

/*
 * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package com.sun.corba.se.impl.naming.cosnaming;

import org.omg.CosNaming.NamingContextExtPackage.*;
import java.io.StringWriter;

// Import general CORBA classes
import org.omg.CORBA.SystemException;
import org.omg.CORBA.Object;

// Import org.omg.CosNaming types
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContext;


/**
 * Class InteroperableNamingImpl implements the methods defined
 * for NamingContextExt which is part of Interoperable Naming
 * Service specifications. This class is added for doing more
 * of Parsing and Building of Stringified names according to INS
 * Spec.
 */
public class InterOperableNamingImpl
{
   /**
     * Method which stringifies the Name Components given as the input
     * parameter.
     *
     * @param n Array of Name Components (Simple or Compound Names)
     * @return string which is the stringified reference.
     */
    public String convertToString( org.omg.CosNaming.NameComponent[]
                                   theNameComponents )
    {
        String theConvertedString =
            convertNameComponentToString( theNameComponents[0] );
        String temp;
        for( int i = 1; i < theNameComponents.length; i++ ) {
            temp = convertNameComponentToString( theNameComponents[i] );
            if( temp != null ) {
                 theConvertedString =
                 theConvertedString + "/" +  convertNameComponentToString(
                     theNameComponents[i] );
            }
        }
        return theConvertedString;
    }

   /** This method converts a single Namecomponent to String, By adding Escapes
    *  If neccessary.
    */
    private String convertNameComponentToString(
        org.omg.CosNaming.NameComponent theNameComponent )
    {
        if( ( ( theNameComponent.id == null )
            ||( theNameComponent.id.length() == 0 ) )
          &&( ( theNameComponent.kind == null )
            ||( theNameComponent.kind.length() == 0 ) ) )
        {
            return ".";
        }
        else if( ( theNameComponent.id == null )
               ||( theNameComponent.id.length() == 0 ) )
        {
            String kind = addEscape( theNameComponent.kind );
            return "." + kind;
        }
        else if( ( theNameComponent.kind == null )
               ||( theNameComponent.kind.length() == 0 ) )
        {
            String id = addEscape( theNameComponent.id );
            return id;
        }
        else {
            String id = addEscape( theNameComponent.id );
            String kind = addEscape( theNameComponent.kind );
            return (id + "." +  kind);
        }
    }


   /** This method adds escape '\' for the Namecomponent if neccessary
    */
   private String addEscape( String value )
   {
        StringBuffer theNewValue;
        if( (value != null) && ( (value.indexOf('.') != -1 ) ||
                                 (value.indexOf('/') != -1)))
        {
            char c;
            theNewValue = new StringBuffer( );
            for( int i = 0; i < value.length( ); i++ ) {
                c = value.charAt( i );
                if( ( c != '.' ) && (c != '/' ) )
                {
                    theNewValue.append( c );
                }
                else {
                    // Adding escape for the "."
                    theNewValue.append( '\\' );
                    theNewValue.append( c );
                }
            }
        }
        else {
            return value;
        }
        return new String( theNewValue );
   }

   /**
     * Method which converts the Stringified name into Array of Name Components.
     *
     * @param string which is the stringified name.
     * @return  Array of Name Components (Simple or Compound Names)
     */
   public org.omg.CosNaming.NameComponent[] convertToNameComponent(
       String theStringifiedName )
       throws org.omg.CosNaming.NamingContextPackage.InvalidName
   {
        String[] theStringifiedNameComponents =
                 breakStringToNameComponents( theStringifiedName );
        if( ( theStringifiedNameComponents == null )
         || (theStringifiedNameComponents.length == 0 ) )
        {
            return null;
        }
        NameComponent[] theNameComponents =
            new NameComponent[theStringifiedNameComponents.length];
        for( int i = 0; i < theStringifiedNameComponents.length; i++ ) {
            theNameComponents[i] = createNameComponentFromString(
                theStringifiedNameComponents[i] );
        }
        return theNameComponents;
   }

   /** Step1 in converting Stringified name into  array of Name Component
     * is breaking the String into multiple name components
     */
   private String[] breakStringToNameComponents( String theStringifiedName ) {
       int[] theIndices = new int[100];
       int theIndicesIndex = 0;

       for(int index = 0; index <= theStringifiedName.length(); ) {
           theIndices[theIndicesIndex] = theStringifiedName.indexOf( '/',
                index );
           if( theIndices[theIndicesIndex] == -1 ) {
               // This is the end of all the occurence of '/' and hence come
               // out of the loop
               index = theStringifiedName.length()+1;
           }
           else {
               // If the '/' is found, first check whether it is
               // preceded by escape '\'
               // If not then set theIndices and increment theIndicesIndex
               // and also set the index else just ignore the '/'
               if( (theIndices[theIndicesIndex] > 0 )
               && (theStringifiedName.charAt(
                   theIndices[theIndicesIndex]-1) == '\\') )
               {
                  index = theIndices[theIndicesIndex] + 1;
                  theIndices[theIndicesIndex] = -1;
               }
               else {
                  index = theIndices[theIndicesIndex] + 1;
                  theIndicesIndex++;
               }
           }
        }
        if( theIndicesIndex == 0 ) {
            String[] tempString = new String[1];
            tempString[0] = theStringifiedName;
            return tempString;
        }
        if( theIndicesIndex != 0 ) {
            theIndicesIndex++;
        }
        return StringComponentsFromIndices( theIndices, theIndicesIndex,
                                            theStringifiedName );
    }

   /** This method breaks one big String into multiple substrings based
     * on the array of index passed in.
     */
   private String[] StringComponentsFromIndices( int[] theIndices,
          int indicesCount, String theStringifiedName )
   {
       String[] theStringComponents = new String[indicesCount];
       int firstIndex = 0;
       int lastIndex = theIndices[0];
       for( int i = 0; i < indicesCount; i++ ) {
           theStringComponents[i] = theStringifiedName.substring( firstIndex,
             lastIndex );
           if( ( theIndices[i] < theStringifiedName.length() - 1 )
             &&( theIndices[i] != -1 ) )
           {
               firstIndex = theIndices[i]+1;
           }
           else {
               firstIndex = 0;
               i = indicesCount;
           }
           if( (i+1 < theIndices.length)
            && (theIndices[i+1] < (theStringifiedName.length() - 1))
            && (theIndices[i+1] != -1) )
           {
               lastIndex = theIndices[i+1];
           }
           else {
               i = indicesCount;
           }
           // This is done for the last component
           if( firstIndex != 0 && i == indicesCount ) {
               theStringComponents[indicesCount-1] =
               theStringifiedName.substring( firstIndex );
           }
       }
       return theStringComponents;
   }

   /** Step 2: After Breaking the Stringified name into set of NameComponent
     * Strings, The next step is to create Namecomponents from the substring
     * by removing the escapes if there are any.
     */
   private NameComponent createNameComponentFromString(
        String theStringifiedNameComponent )
        throws org.omg.CosNaming.NamingContextPackage.InvalidName

   {
        String id = null;
        String kind = null;
        if( ( theStringifiedNameComponent == null )
         || ( theStringifiedNameComponent.length( ) == 0)
         || ( theStringifiedNameComponent.endsWith(".") ) )
        {
            // If any of the above is true, then we create an invalid Name
            // Component to indicate that it is an invalid name.
            throw new org.omg.CosNaming.NamingContextPackage.InvalidName( );
        }

        int index = theStringifiedNameComponent.indexOf( '.', 0 );
        // The format could be XYZ (Without kind)
        if( index == -1 ) {
            id = theStringifiedNameComponent;
        }
        // The format is .XYZ (Without ID)
        else if( index == 0 ) {
            // This check is for the Namecomponent which is just "." meaning Id
            // and Kinds are null
            if( theStringifiedNameComponent.length( ) != 1 ) {
                kind = theStringifiedNameComponent.substring(1);
            }
        }
        else
        {
            if( theStringifiedNameComponent.charAt(index-1) != '\\' ) {
                id = theStringifiedNameComponent.substring( 0, index);
                kind = theStringifiedNameComponent.substring( index + 1 );
            }
            else {
                boolean kindfound = false;
                while( (index < theStringifiedNameComponent.length() )
                     &&( kindfound != true ) )
                {
                    index = theStringifiedNameComponent.indexOf( '.',index + 1);
                    if( index > 0 ) {
                        if( theStringifiedNameComponent.charAt(
                                index - 1 ) != '\\' )
                        {
                            kindfound = true;
                        }
                    }
                    else
                    {
                        // No more '.', which means there is no Kind
                        index = theStringifiedNameComponent.length();
                    }
                }
                if( kindfound == true ) {
                    id = theStringifiedNameComponent.substring( 0, index);
                    kind = theStringifiedNameComponent.substring(index + 1 );
                }
                else {
                    id = theStringifiedNameComponent;
                }
            }
        }
        id = cleanEscapeCharacter( id );
        kind = cleanEscapeCharacter( kind );
        if( id == null ) {
                id = "";
        }
        if( kind == null ) {
                kind = "";
        }
        return new NameComponent( id, kind );
   }


   /** This method cleans the escapes in the Stringified name and returns the
     * correct String
     */
   private String cleanEscapeCharacter( String theString )
   {
        if( ( theString == null ) || (theString.length() == 0 ) ) {
                return theString;
        }
        int index = theString.indexOf( '\\' );
        if( index == 0 ) {
            return theString;
        }
        else {
            StringBuffer src = new StringBuffer( theString );
            StringBuffer dest = new StringBuffer( );
            char c;
            for( int i = 0; i < theString.length( ); i++ ) {
                c = src.charAt( i );
                if( c != '\\' ) {
                    dest.append( c );
                } else {
                    if( i+1 < theString.length() ) {
                        char d = src.charAt( i + 1 );
                        // If there is a AlphaNumeric character after a \
                        // then include slash, as it is not intended as an
                        // escape character.
                        if( Character.isLetterOrDigit(d) ) {
                            dest.append( c );
                        }
                    }
                }
            }
            return new String(dest);
        }
   }

   /**
     * Method which converts the Stringified name  and Host Name Address into
     * a URL based Name
     *
     * @param address which is ip based host name
     * @param name which is the stringified name.
     * @return  url based Name.
     */
    public String createURLBasedAddress( String address, String name )
        throws InvalidAddress
    {
        String theurl = null;
        if( ( address == null )
          ||( address.length() == 0 ) ) {
            throw new InvalidAddress();
        }
        else {
            theurl = "corbaname:" + address + "#" + encode( name );
        }
        return theurl;
    }

    /** Encodes the string according to RFC 2396 IETF spec required by INS.
     */
    private String encode( String stringToEncode ) {
        StringWriter theStringAfterEscape = new StringWriter();
        int byteCount = 0;
        for( int i = 0; i < stringToEncode.length(); i++ )
        {
            char c = stringToEncode.charAt( i ) ;
            if( Character.isLetterOrDigit( c ) ) {
                theStringAfterEscape.write( c );
            }
            // Do no Escape for characters in this list
            // RFC 2396
            else if((c == ';') || (c == '/') || (c == '?')
            || (c == ':') || (c == '@') || (c == '&') || (c == '=')
            || (c == '+') || (c == '$') || (c == ';') || (c == '-')
            || (c == '_') || (c == '.') || (c == '!') || (c == '~')
            || (c == '*') || (c == ' ') || (c == '(') || (c == ')') )
            {
                theStringAfterEscape.write( c );
            }
            else {
                // Add escape
                theStringAfterEscape.write( '%' );
                String hexString = Integer.toHexString( (int) c );
                theStringAfterEscape.write( hexString );
            }
        }
        return theStringAfterEscape.toString();
    }

}

Other Java examples (source code examples)

Here is a short list of links related to this Java InterOperableNamingImpl.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.