Sample Program

import java.util.*;

import java.io.*;

import java.text.SimpleDateFormat;

import com.basis.filesystem.*;

import com.basis.filesystem.util.*;

 

/**

* Class used as a utility to display file information.

*

* @version $Revision: 2.78 $

*/

public class FileInfo

{

    /**

    * Private constructor...

    */

    private FileInfo ()

    {

    }

    // Usage information...

    private static void usage ()

    {

        System.err.println("<id> [-h] <file path> ...");

    }

    /**

    * Function for command line file information. This function

    * will open all files specified on the command line (in turn)

    * and display file information.

    *

    * @param p_argv Command line arguments.

    */

    public static void main (String []p_argv)

    {

        // All files calls will go through this ConnectionMgr.

        ConnectionMgr connectionMgr = Filesystem.getConnectionMgr();

        connectionMgr.setUser(System.getProperty("user.name"));

        try

        {

            // Initialize the license connection for the

            // ConnectionMgr. This must be done before

            // any calls are made.

            connectionMgr.initLocalConnection();

        }

        catch (FilesystemException ex)

        {

            // An error occurred. Just print it out and exit.

            ex.printStackTrace();

            System.exit(1);

        }

        // Print header information only?

        boolean headerOnly = false;

        // List of files to get information on.

        List read = new LinkedList();

        // Interpret/read command line arguments.

        try

        {

            for (int i = 0; i < p_argv.length; i++)

            {

                if (p_argv[i].startsWith("-"))

                {

                    if (p_argv[i].equals("-h"))

                    {

                        headerOnly = true;

                    }

                    else

                    {

                        System.err.println("Unknown option: " + p_argv[i]);

                        usage();

                        System.exit(1);

                    }

                }

                else

                {

                    read.add(p_argv[i]);

                }

            }

        }

        catch (Exception ex)

        {

            System.err.println("Error reading options.");

            usage();

            System.exit(1);

        }

        // PrintWriter to display all file information on.

        PrintWriter out = new PrintWriter(System.out);

        // Iterate over the files getting file information.

        Iterator iter = read.iterator();

        while (iter.hasNext())

        {

            String filepath = (String)iter.next();

            FilePosition pos = null;

            try

            {

                // Open the file read-only.

                pos = connectionMgr.open(filepath,true,true);

            }

            catch (FilesystemException ex)

            {    

                out.println("Unable to open file '"

                    + filepath

                    + "': "

                    + ex.getMessage());

                out.flush();

                continue;

            }

            // Print file information.

            printHeader (pos,out);

            out.flush();

            if (!headerOnly)

            {

                // Print file contents.

                printData(pos,out);

                out.flush();

            }

            try

            {

                // Close the file.

                pos.close();

            }

            catch (FilesystemException ex)

            {

                // Ignore...

            }

        }

        out.flush();

    }

    /**

    * Print file header information.

    *

    * @param p_pos <code>FilePosition</code> to print the header for.

    * @param p_out <code>PrintWriter</code> to print information to.

    */

    public static void printHeader (FilePosition p_pos,

        PrintWriter p_out)

    {

        // FID information.

        try

        {

            p_out.println("Filename: '" + p_pos.getFilename() + "'");

            int type = p_pos.getFileType();

            String name;

            switch (type & Filesystem.TYPEMASK)

            {

            case Filesystem.INDEXED_FILE:

                name = "INDEXED";

                break;

            case Filesystem.SERIAL_FILE:

                name = "SERIAL";

                break;

            case Filesystem.DIRECT_FILE:

                name = "DIRECT";

                break;

            case Filesystem.STRING_FILE:

                name = "STRING";

                break;

            case Filesystem.PROGRAM_FILE:

                name = "PROGRAM";

                break;    

            case Filesystem.DIRECTORY_FILE:

                name = "DIRECTORY";

                break;

            case Filesystem.MKEYED_FILE:

                name = "MKEYED";

                break;

            case Filesystem.XKEYED_FILE:

                name = "XKEYED";

                break;

            default:

                name = "UNKNOWN";

                break;

            }

            p_out.println("File type ("

                + String.valueOf(type & Filesystem.TYPEMASK)

                + "): " + name);

            String mod = "";

            int modifier = (type & ~Filesystem.TYPEMASK) & 0xFF;

            switch (modifier)

            {

            case 0:

                mod = "NONE";

                break;

            case Filesystem.MKEYED_64BIT:

                mod = "64 BIT";

                break;

            case Filesystem.MKEYED_4GIG:

                mod = "4 GIG";

                break;

            case Filesystem.MKEYED_TAGRECORD:

                mod = "TAGGED RECORD";

                break;

            case (Filesystem.MKEYED_4GIG | Filesystem.MKEYED_TAGRECORD):

                mod = "TAGGED RECORD 4 GIG";

                break;

            case (Filesystem.MKEYED_64BIT | Filesystem.MKEYED_TAGRECORD):

                mod = "TAGGED RECORD 64 BIT";

                break;

            default:

                mod = "UNKNOWN";

                break;

            }

            p_out.println("MODIFIER ("

                + String.valueOf(modifier)

                + "): " + mod);

            p_out.println("Key size: " + String.valueOf(p_pos.getKeySize()));

            p_out.println("Max number of records: " + String.valueOf(p_pos.getNumberOfRecords()));

            p_out.println("Record size: " + String.valueOf(p_pos.getRecordSize()));

        }

        catch (FilesystemException ex)

        {

            p_out.println("Failed to get FID information for file: " + ex.getMessage());

        }

        // FIN information.

        try

        {

            // Common FIN information.

            p_out.println("File length: " + String.valueOf(p_pos.getLength()));

            SimpleDateFormat cal = new SimpleDateFormat();

            p_out.println("Last modified: " + cal.format(new Date(p_pos.getLastModified())));

            // Getable for every file type.

            p_out.println("Record count: " + String.valueOf(p_pos.getRecordCount()));

            byte []fin = p_pos.getFIN(0);

            // File information dependent on type.

            switch (p_pos.getFileType() & Filesystem.TYPEMASK)

            {

            case Filesystem.INDEXED_FILE:

                p_out.println("NO ADDITIONAL FILE INFORMATION");

                break;

            case Filesystem.SERIAL_FILE:

                {

                    long tmp = ((fin[64] & 0xFFL) << 24)

                        | ((fin[65] & 0xFFL) << 16)

                        | ((fin[66] & 0xFFL) << 8)

                        | (fin[67] & 0xFFL);

                    p_out.println("Next available file index: " + String.valueOf(tmp));

    

                    tmp = ((fin[68] & 0xFFL) << 24)

                        | ((fin[69] & 0xFFL) << 16)

                        | ((fin[70] & 0xFFL) << 8)

                        | (fin[71] & 0xFFL);

                    p_out.println("Number of bytes in file (including header): " + String.valueOf(tmp));

                    tmp = ((fin[72] & 0xFFL) << 8)

                        | (fin[73] & 0xFFL);

                    p_out.println("Number of bytes in last record: " + String.valueOf(tmp));

                }

                break;

            case Filesystem.DIRECT_FILE:

                {

                    long tmp = ((fin[64] & 0xFFL) << 24)

                        | ((fin[65] & 0xFFL) << 16)

                        | ((fin[66] & 0xFFL) << 8)

                        | (fin[67] & 0xFFL);

                    p_out.println("Index of last key removed: " + String.valueOf(tmp));

                    tmp = ((fin[68] & 0xFFL) << 24)

                        | ((fin[69] & 0xFFL) << 16)

                        | ((fin[70] & 0xFFL) << 8)

                        | (fin[71] & 0xFFL);

                    p_out.println("Index of lowest available key: " + String.valueOf(tmp));

                    tmp = ((fin[72] & 0xFFL) << 24)

                        | ((fin[73] & 0xFFL) << 16)

                        | ((fin[74] & 0xFFL) << 8)

                        | (fin[75] & 0xFFL);

                    p_out.println("Index of lowest logical key: " + String.valueOf(tmp));

                    tmp = ((fin[76] & 0xFFL) << 24)

                        | ((fin[77] & 0xFFL) << 16)

                        | ((fin[78] & 0xFFL) << 8)

                        | (fin[79] & 0xFFL);

                    p_out.println("Number of active keys in the file: " + String.valueOf(tmp));

                    tmp = ((fin[80] & 0xFFL) << 24)

                        | ((fin[81] & 0xFFL) << 16)

                        | ((fin[82] & 0xFFL) << 8)

                        | (fin[83] & 0xFFL);

                    p_out.println("Index of highest logical key: " + String.valueOf(tmp));

                }

                break;

            case Filesystem.STRING_FILE:

                p_out.println("NO ADDITIONAL FILE INFORMATION");

                break;

            case Filesystem.PROGRAM_FILE:

                p_out.println("NO ADDITIONAL FILE INFORMATION");

                break;

            case Filesystem.DIRECTORY_FILE:

                p_out.println("NO ADDITIONAL FILE INFORMATION");

                break;

            case Filesystem.MKEYED_FILE:

                {

                    long tmp = ((fin[76] & 0xFFL) << 24)

                        | ((fin[77] & 0xFFL) << 16)

                        | ((fin[78] & 0xFFL) << 8)

                        | (fin[79] & 0xFFL);

                    p_out.println("Number of active keys in the file: " + String.valueOf(tmp));

                    p_out.println("Default KNUM value: " + String.valueOf(fin[84] & 0xFF));

                    if (p_pos.getKeySize() == 0)

                    {

                        List keyDesc = p_pos.getKeyDescriptions();

                        p_out.println("KEYS:");

                        Iterator iter = keyDesc.iterator();

                        while (iter.hasNext())

                        {

                            p_out.println("\t" + String.valueOf(iter.next()));

                        }

                    }

                }    

                break;

            case Filesystem.XKEYED_FILE:

                {

                    long tmp = ((fin[76] & 0xFFL) << 24)

                        | ((fin[77] & 0xFFL) << 16)

                        | ((fin[78] & 0xFFL) << 8)

                        | (fin[79] & 0xFFL);

                    p_out.println("Number of active keys in the file: " + String.valueOf(tmp));

                    p_out.println("Default KNUM value: " + String.valueOf(fin[84] & 0xFF));

                    if (p_pos.getKeySize() == 0)

                    {

                        List keyDesc = p_pos.getKeyDescriptions();

                        p_out.println("KEYS:");

                        Iterator iter = keyDesc.iterator();

                        while (iter.hasNext())

                        {

                            p_out.println("\t" + String.valueOf(iter.next()));

                        }

                    }

                }

                break;

                default:

                    p_out.println("<<UNKNOWN FILE TYPE>>");

                    break;

            }

        }

        catch (FilesystemException ex)

        {

            System.out.println("Failed to get FIN information for file: " + ex.getMessage());

        }

    }

    /**

    * Print file data.

    *

    * @param p_pos <code>FilePosition</code> to print the data for.

    * @param p_out <code>PrintWriter</code> to print information to.

    */

    public static void printData (FilePosition p_pos,PrintWriter p_out)

    {

        p_out.println("FILE DATA:");

        try

        {

            byte [][]key = null;

            byte []record = null;

            // Check for record size and allocate buffer.

            if (p_pos.getRecordSize() > 0)

            {

                record = new byte[p_pos.getRecordSize()];

            }

            else

            {

                record = new byte[100];

            }

            // Check for single-keyed file.

            if (p_pos.getKeySize() > 0)

            {

                key = new byte[1][p_pos.getKeySize()];

            }

            else if (((p_pos.getFileType() & Filesystem.TYPEMASK) == Filesystem.MKEYED_FILE)

                || ((p_pos.getFileType() & Filesystem.TYPEMASK) == Filesystem.XKEYED_FILE))

            {

                // This is a multi-keyed MKEYED or XKEYED file.

                // get KeyDescriptions and the size of each key.

                List keyDesc = p_pos.getKeyDescriptions();

                key = new byte[keyDesc.size()][];

                for (int i = 0; i < key.length; i++)

                {

                    KeyDescription desc = (KeyDescription)keyDesc.get(i);

                    key[i] = new byte[desc.getKeySize()];

                }

            }

            try

            {

                // Iterate over all of the file records.

                while (true)

                {

                    // If this is a keyed file, get all of the keys.

                    if (key != null)

                    {

                        for (int i = 0; i < key.length; i++)

                        {

                            int len = p_pos.getKey(key[i],key[i].length,i);

                            p_out.print("KEY_" + String.valueOf(i) + ": ");

                            printByteArray(key[i],len,p_out);

                        }

                    }

                    // Read the current record and iterate to the next record.

                    if (record == null)

                    {

                        p_pos.read(null,0,1,5,false);

                    }

                    else

                    {

                        int len = p_pos.read(record,record.length,1,5,false);

                        p_out.print("RECORD: ");

                        printByteArray(record,len,p_out);

                    }

                    p_out.println();

                }

            }

            catch (FilesystemEOFException ex)

            {

                // End of iteration...

            }

        }

        catch (FilesystemException ex)

        {

            p_out.println("Failed to get data from file: " + ex.getMessage());

        }

    }

    /**

    * Helper function to print an array of bytes.

    *

    * @param p_bytes Array of bytes to print.

    * @param p_len Length of bytes to print.

    * @param p_out <code>PrintWriter</code> to print bytes to.

    */

    private static void printByteArray (byte []p_bytes, int p_len,PrintWriter p_out)

    {

        p_out.print("[");

        int i = 0;

        for (i = 0; i < (p_len-1); i++)

        {

            p_out.print(String.valueOf(p_bytes[i] & 0xFF) + ", ");

        }

        if (p_len > 0)

        {

            p_out.print(String.valueOf(p_bytes[i] & 0xFF));

        }

        p_out.println("]");

    }

}