FileDocCategorySizeDatePackage
LookupAPI.javaAPI DocExample10008Sat Jan 24 10:44:40 GMT 2004je3.sql

LookupAPI

public class LookupAPI extends Object
This program uses the database created by MakeAPIDB. It opens a connection to a database using the same property file used by MakeAPIDB. Then it queries that database in several interesting ways to obtain useful information about Java APIs. It can be used to look up the fully-qualified name of a member, class, or package, or it can be used to list the members of a class or package.

Fields Summary
Constructors Summary
Methods Summary
public static voidlist(java.sql.Connection conn, java.lang.String target)
This method looks for classes with the specified name, or packages that contain the specified name. For each class it finds, it displays all methods and fields of the class. For each package it finds, it displays all classes in the package.

        // Create two Statement objects to query the database with
        Statement s = conn.createStatement();
        Statement t = conn.createStatement();
	
        // Look for a class with the given name
        s.executeQuery("SELECT package.name, class.name " + 
		       "FROM package, class " + 
		       "WHERE class.name='" + target + "' " +
		       "  AND class.packageId=package.id");
        // Loop through all matches
        ResultSet r = s.getResultSet();
        while(r.next()) {
            String p = r.getString(1);  // package name
            String c = r.getString(2);  // class name
            // Print out the matching class name
            System.out.println("class " + p + "." + c + " {");
            
            // Now query all members of the class
            t.executeQuery("SELECT DISTINCT member.name, member.isField " + 
			   "FROM package, class, member " + 
			   "WHERE package.name = '" + p + "' " +
			   "  AND class.name = '" + c + "' " + 
			   "  AND member.classId=class.id " +
			   "  AND class.packageId=package.id " +
			   "ORDER BY member.isField, member.name");
	    
            // Loop through the ordered list of all members, and print them out
            ResultSet r2 = t.getResultSet();
            while(r2.next()) {
                String m = r2.getString(1);
                int isField = r2.getInt(2);
                System.out.println("  " + m + ((isField == 1)?"":"()"));
            }
            // End the class listing
            System.out.println("}");
        }
        
        // Now go look for a package that matches the specified name
        s.executeQuery("SELECT name FROM package " +
		       "WHERE name='" + target + "'" +
		       "   OR name LIKE '%." + target + ".%' " +
		       "   OR name LIKE '" + target + ".%' " +
		       "   OR name LIKE '%." + target + "'");
        // Loop through any matching packages
        r = s.getResultSet();
        while(r.next()) {
            // Display the name of the package
            String p = r.getString(1);
            System.out.println("Package " + p + ": ");
            
            // Get a list of all classes and interfaces in the package
            t.executeQuery("SELECT class.name FROM package, class " + 
			   "WHERE package.name='" + p + "' " +
			   "  AND class.packageId=package.id " +
			   "ORDER BY class.name");
            // Loop through the list and print them out.
            ResultSet r2 = t.getResultSet();
            while(r2.next()) System.out.println("  " + r2.getString(1));
        }
	
        // Finally, close both Statement objects
        s.close(); t.close();
    
public static voidlookup(java.sql.Connection c, java.lang.String target)
This method looks up all matches for the specified target string in the database. First, it prints the full name of any members by that name. Then it prints the full name of any classes by that name. Then it prints the name of any packages that contain the specified name

        // Create the Statement object we'll use to query the database
        Statement s = c.createStatement();
        
        // Go find all class members with the specified name
        s.executeQuery("SELECT DISTINCT " + 
		       "package.name, class.name, member.name, member.isField"+
		       " FROM package, class, member" + 
		       " WHERE member.name='" + target + "'" +
		       "   AND member.classId=class.id " +
		       "   AND class.packageId=package.id");
        
        // Loop through the results, and print them out (if there are any).
        ResultSet r = s.getResultSet();
        while(r.next()) {
            String pkg = r.getString(1);       // package name
            String cls = r.getString(2);       // class name
            String member = r.getString(3);    // member name
            boolean isField = r.getBoolean(4); // is the member a field?
            // Display this match
            System.out.println(pkg + "." + cls + "." + member + 
			       (isField?"":"()"));
        }
        
        // Now look for a class with the specified name
        s.executeQuery("SELECT package.name, class.name " + 
		       "FROM package, class " + 
		       "WHERE class.name='" + target + "' " +
		       "  AND class.packageId=package.id");
        // Loop through the results and print them out
        r = s.getResultSet();
        while(r.next()) System.out.println(r.getString(1) + "." +
					   r.getString(2));
        
        // Finally, look for a package that matches a part of of the name.
        // Note the use of the SQL LIKE keyword and % wildcard characters
        s.executeQuery("SELECT name FROM package " + 
		       "WHERE name='" + target + "'" +
		       "   OR name LIKE '%." + target + ".%' " +
		       "   OR name LIKE '" + target + ".%' " +
		       "   OR name LIKE '%." + target + "'");
        // Loop through the results and print them out
        r = s.getResultSet();
        while(r.next()) System.out.println(r.getString(1));
	
        // Finally, close the Statement object
        s.close();
    
public static voidmain(java.lang.String[] args)

        Connection c = null;                // JDBC connection to the database
        try {
            // Some default values
            String target = null;             // The name to look up
            boolean list = false;             // List members or lookup name?
            String propfile = "APIDB.props";  // The file of db parameters
	    
            // Parse the command-line arguments
            for(int i = 0; i < args.length; i++) {
                if (args[i].equals("-l")) list = true;
                else if (args[i].equals("-p")) propfile = args[++i];
                else if (target != null) 
                    throw new IllegalArgumentException("Unexpected argument: "
						       + args[i]);
                else target = args[i];
            }
            if (target == null)
                throw new IllegalArgumentException("No target specified");

            // Now determine the values needed to set up the database
            // connection The program attempts to read a property file
            // named "APIDB.props", or optionally specified with the
            // -p argument.  This property file may contain "driver",
            // "database", "user", and "password" properties that
            // specify the necessary values for connecting to the db.
            // If the properties file does not exist, or does not
            // contain the named properties, defaults will be used.
            Properties p = new Properties();               // Empty properties
            try { p.load(new FileInputStream(propfile)); } // Try to load props
            catch (Exception e) {}

            // Read values from Properties file
            String driver = p.getProperty("driver");
            String database = p.getProperty("database");
            String user = p.getProperty("user", "");
            String password = p.getProperty("password", "");

	    // The driver and database properties are mandatory
	    if (driver == null) 
		throw new IllegalArgumentException("No driver specified!");
	    if (database == null) 
		throw new IllegalArgumentException("No database specified!");

            // Load the database driver
            Class.forName(driver);

            // And set up a connection to the specified database
            c = DriverManager.getConnection(database, user, password);

            // Tell it we will not do any updates.
	    // This hint may improve efficiency.
            c.setReadOnly(true);

            // If the "-l" option was given, then list the members of
            // the named package or class.  Otherwise, lookup all
            // matches for the specified member, class, or package.
            if (list) list(c, target);
            else lookup(c, target);
        }
        // If anything goes wrong, print the exception and a usage message.  If
        // a SQLException is thrown, display the state message it includes.
        catch (Exception e) {
            System.out.println(e);
            if (e instanceof SQLException) 
                System.out.println(((SQLException) e).getSQLState());
            System.out.println("Usage: java LookupAPI [-l] [-p <propfile>] " +
			       "target");
        }
        // Always close the DB connection when we're done with it.
        finally {
            try { c.close(); } catch (Exception e) {}
        }