/*
 * 
 * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * The contents of this file are subject to the Sun Community Source
 * License v3.0/Jini Technology Specific Attachment v 1.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://wwws.sun.com/software/jini/licensing/SCSL3_JiniTSA1.html.
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and limitations
 * under the License.
 * 
 * The Reference Code is Jini Technology Core Platform code, v2.0. The
 * Developer of the Reference Code is Sun Microsystems, Inc.
 * 
 * Contributor(s): Sun Microsystems, Inc.
 * 
 * The contents of this file comply with the Jini Technology Core
 * Platform Compatibility Kit, v2.0A.
 * 
 * Tester(s): Sun Microsystems, Inc.
 * 
 * Test Platform(s):
 * Java 2 SDK, Standard Edition, Version 1.4.2_03 for Solaris(TM)SPARC/x86
 * Java 2 SDK, Standard Edition, Version 1.4.2_03 for Linux (Intel x86)
 * Java 2 SDK, Standard Edition, Version 1.4.2_03 for Windows (Intel Platform)
 * 
 */
package com.sun.jini.example.browser;

import java.lang.reflect.Field;
import java.lang.reflect.Array;
import java.lang.reflect.Modifier;

/**
 * Introspection related methods
 *
 * @author Sun Microsystems, Inc.
 *
 * @version 0.2 06/04/98
 *
 */

class Introspector {

  public static boolean isHidden(Field f){
    int m = f.getModifiers();

    if(Modifier.isPrivate(m) || Modifier.isStatic(m))
      return true;

    return false;
  }

  public static boolean isString(Class clazz){
    if("java.lang.String".equals(clazz.getName()))
      return true;
    return false;
  }

  public static boolean isWrapper(Class clazz){
    String name = clazz.getName();

    if("java.lang.Integer".equals(name) ||
       "java.lang.Boolean".equals(name) ||
       "java.lang.Byte".equals(name) ||
       "java.lang.Char".equals(name) ||
       "java.lang.Double".equals(name) ||
       "java.lang.Float".equals(name) ||
       "java.lang.Long".equals(name)){
      return true;
    }
    return false;
  }

  /** Return the name of an interface or primitive type, handling arrays. */
  public static String getTypename(Class t, boolean showPackage) {
    String brackets = "";
    while(t.isArray()) {
      brackets += "[]";
      t = t.getComponentType();
    }

    if(showPackage)
      return t.getName() + brackets;
    else
      return extractClassName(t.getName()) + brackets;
  }

  /** Return a string version of modifiers, handling spaces nicely. */
  public static String getModifierString(int m) {
    if(m == 0)
      return "";
    else
      return Modifier.toString(m) + " ";
  }

  /** Print the modifiers, type, and name of a field. */
  public static String getFieldString(Field f, boolean showModifier, boolean showPackage) {
    String fstring = "";
    
    if(showModifier)
      fstring += getModifierString(f.getModifiers());

    fstring += getTypename(f.getType(), showPackage);
    fstring += " ";
    fstring += f.getName();

    return fstring;
  }

  public static String extractClassName(String fullName){
    int index = fullName.lastIndexOf(".");
    
    return fullName.substring(index + 1);
  }
}
