Package org.openquark.samples.bam

Source Code of org.openquark.samples.bam.TextFileMessageSource

/*
* Copyright (c) 2007 BUSINESS OBJECTS SOFTWARE LIMITED
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
*     * Redistributions of source code must retain the above copyright notice,
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright
*       notice, this list of conditions and the following disclaimer in the
*       documentation and/or other materials provided with the distribution.
*     * Neither the name of Business Objects nor the names of its contributors
*       may be used to endorse or promote products derived from this software
*       without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/


/*
* TextFileMessageSource.java
* Created: 5-Mar-2004
* By: Rick Cameron
*/

package org.openquark.samples.bam;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;

import org.openquark.cal.services.NullaryEnvironment;
import org.openquark.cal.services.ResourcePath;
import org.openquark.samples.bam.model.MessageSourceDescription;
import org.openquark.samples.bam.model.TextFileMessageSourceDescription;
import org.openquark.samples.bam.model.MessageSourceDescription.MessagePropertyDescription;



/**
* This message source reads messages form a text file.
*
*/
public class TextFileMessageSource extends AbstractMessageSource {
   
    private static class ColumnDef {
        final String name;
       
        final int type;
       
        ColumnDef (String name, int type) {
            this.name = name;
            this.type = type;
        }
    }
   
    private final File inputFile;
   
    private ArrayList<ColumnDef> columns = new ArrayList<ColumnDef> (); // of ColumnDefs

    private final String messageType;

    private boolean cancelled = false;
   
    static TextFileMessageSource createInstance (MessageSourceDescription messageSourceDescription) {
        if (messageSourceDescription instanceof TextFileMessageSourceDescription) {
            String textFilename = ((TextFileMessageSourceDescription)messageSourceDescription).getFileName();
           
            return new TextFileMessageSource (textFilename, messageSourceDescription.getName());
        } else {
            return null;
        }
    }
   
    public static Collection<MessagePropertyDescription> getMessagePropertyInfos (TextFileMessageSourceDescription messageSourceDescription) {
        Collection<MessagePropertyDescription> result = null;
       
        TextFileMessageSource messageSource = createInstance(messageSourceDescription);
       
        if (messageSource != null) {
            try {
                result = messageSource.getMessagePropertyInfos();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
       
        return result;
    }


    public TextFileMessageSource (String fileName, String messageType) {
        ResourcePath.FilePath filePath = new ResourcePath.FilePath(fileName.split("/|\\\\"));
        inputFile = NullaryEnvironment.getNullaryEnvironment().getFile(filePath, false);
        this.messageType = messageType;
    }
   
    private Collection<MessagePropertyDescription> getMessagePropertyInfos () throws IOException {
        Collection<MessagePropertyDescription> result = null;
       
        FileReader reader;
        reader = new FileReader (inputFile);
       
        BufferedReader bufferedReader = new BufferedReader (reader);

        try {
            processHeader (bufferedReader);
           
            if (columns.size () > 0) {
                result = new ArrayList<MessagePropertyDescription> ();
               
                for (final ColumnDef columnDef : columns) {
                    result.add (new MessagePropertyDescription (columnDef.name, columnDef.type));
                }
            }
        } finally {
            bufferedReader.close ();
        }
       
        return result;
    }
   
    /**
     * @see org.openquark.samples.bam.MessageSource#start()
     */
    public boolean start() {
        run ();
       
        return true;
    }

    /**
     * @see org.openquark.samples.bam.MessageSource#stop()
     */
    public boolean stop() {
        cancelled = true;
       
        return true;
    }

    private void run () {
        cancelled = false;
       
        Thread t = new Thread () {

            /**
             * @see java.lang.Thread#run()
             */
            @Override
            public void run () {
                FileReader reader;
                try {
                    reader = new FileReader (inputFile);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                   
                    return;
                }
               
                BufferedReader bufferedReader = new BufferedReader (reader);

                try {
                    fireStatusChanged(STATUS_RUNNING);
                   
                    processHeader (bufferedReader);
                    processBody (bufferedReader);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } finally {
                    fireStatusChanged(STATUS_IDLE);
                   
                    try {
                        bufferedReader.close();
                    } catch (IOException e2) {
                        // TODO Auto-generated catch block
                        e2.printStackTrace();
                    }
                }
            }
        };
       
        t.start();
       
    }

    /**
     * Method processHeader
     *
     * @param bufferedReader
     */
    private void processHeader (BufferedReader bufferedReader) throws IOException {
        String line = bufferedReader.readLine();
       
        while (line != null) {
            if (!isComment (line)) {
                String [] pieces = line.split(",");
               
                if (pieces.length == 2) {
                    int type = parseType (pieces [1]);
                   
                    columns.add (new ColumnDef (pieces[0], type));
                } else {
                    break;
                }
            }
           
            line = bufferedReader.readLine();
        }
    }

    /**
     * Method parseType
     *
     * @param string
     * @return Returns the code for the data type represented by the given String
     */
    private int parseType (String string) {
        switch (string.charAt (0)) {
            case 's':
            case 'S':
                return Message.STRING;
               
            case 'i':
            case 'I':
                return Message.INT;

            case 'l':
            case 'L':
                return Message.LONG;

            case 'd':
            case 'D':
                return Message.DOUBLE;

            default:
                throw new IllegalArgumentException ("Invalid type specifier: " + string);
        }
    }

    /**
     * Method isComment
     *
     * @param line
     * @return Returns true iff this line is a comment
     */
    private boolean isComment (String line) {
        return line.length() == 0 || line.startsWith("//");
    }

    /**
     * Method processBody
     *
     * @param bufferedReader
     */
    private void processBody (BufferedReader bufferedReader) throws IOException {
        String line = bufferedReader.readLine();
       
        while (line != null && !cancelled) {
            if (!isComment (line)) {
                processLine (line);
            }               
               
            line = bufferedReader.readLine();
        }
    }

    /**
     * Method processLine
     *
     * @param line
     */
    private void processLine (String line) {
        DefaultMessage message = new DefaultMessage (messageType);
       
        String [] pieces = line.split(",");
       
        if (pieces.length != columns.size()) {
            throw new IllegalArgumentException ("Line does not match schema: " + line);
        }
       
        for (int i = 0; i < pieces.length; i++) {
            String string = pieces[i];
            ColumnDef columnDef = columns.get(i);
           
            message.addValue(columnDef.name, decodeValue (string, columnDef.type));
        }
       
        fireMessageReceived(message);
       
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * Method decodeValue
     *
     */
    private Object decodeValue (String string, int type) {
        switch (type) {
            case Message.STRING:
                return string;
               
            case Message.INT:
                return new Integer (Integer.parseInt(string));
           
            case Message.LONG:
                return new Long (Long.parseLong(string));
           
            case Message.DOUBLE:
                return new Double (Double.parseDouble(string));
           
            default:
                throw new IllegalArgumentException ("Unknown type: " + type);
        }
    }

}
TOP

Related Classes of org.openquark.samples.bam.TextFileMessageSource

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.