0

Ok so I'm a noob at Java and this just got me.

I have a button that calls a class in which some background code runs to check if the tape drive is online, offline or busy.

Button Code:

private void btnRunBckActionPerformed(java.awt.event.ActionEvent evt) {                                          
    // TODO add your handling code here:
    btnRunBackup runBackupObject = new btnRunBackup();

    runBackupObject.checkStatus();

    lblRunBck.setText("Errors go here");
}

Then I have my separate class file btnRunBackup.

public class btnRunBackup{
    public void checkStatus(){
        /*
        Here I simply create a tempfile and run some
        linux commands via getRuntime and print the
        output to the tempfile

        Then I call my second method passing the
        absolute file path of the tempfile
        */
        this.statusControl(path);
    }catch(IOException e){          
            e.printStackTrace();

    public void statusControl(String param) throws FileNotFoundException, IOException{
        /*
        Here I use BufferedReader to go through the
        tempfile and look for as series of 3 
        different strings.

        I use a if else if statement for flow control
        depending on what string was found.

        string 1 will call a new Jframe

        if string 2, 3 or none of them are found the 
        is where I am stuck at

    }
}

I want to return a String value back to btnRunBckActionPerformed(). The reason is lblRunBck will initially show no text at all but for instance the user clicks on the button and the resource happens to be busy then i want to run lblRunBck.setText(param); on lblRunBck while refusing the user permission to continue


private void btnRunBckActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:
        String text;

        btnRunBackup runBackupObject = new btnRunBackup();

        runBackupObject.checkStatus();

        lblRunBck.setText("Errors go here");
    }    

here is my btnRunBackup class

public class btnRunBackup {    
private String s;

public void checkStatus() {

    String s, path = null;
    Process p;


    try{//try1

        //create a temp file named tempfilexxx.tmp
        File temp = File.createTempFile("tempfile", ".tmp"); 
        //get file path
        path = temp.getAbsolutePath();
        System.out.println("checkStatus:  " + path);


    //write to tempfilexxx.tmp
        BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
        try{// try2
            //set p = to the content of ls home
            p = Runtime.getRuntime().exec("ls /home | grep ariel");
            BufferedReader br = new BufferedReader(
                new InputStreamReader(p.getInputStream()));
            //write content of p to tempfilexxx.tmp line by line
            while ((s = br.readLine()) != null)
                bw.write(s + "\n");
            //close BufferedReader
            br.close();
        }catch (Exception e){} //END OF try2

        //close BufferedWriter
        bw.close();

        /*
        Now that we ran the 'mt -f /dev/nst0 status command under home we 
        will filter for one of the following strings 
        (for testing we will use ls -la /home and filter for ariel)

        We will do this by calling the checkStatus method
        */

        this.statusControl(path);

    }catch(IOException e){          
        e.printStackTrace();

    }// END OF try1

}// END OF listDir

//throws FileNotFoundException for bufferedReader if file not found
public void statusControl(String param) throws FileNotFoundException, IOException{
    /*
    On production code there will be 4 possible conditions:
        1.  ONLINE - ready to write (currently we will use ariel)
        2.  DR_OPEN - no tape available
        3.  /dev/nst0: Device or resource busy - resource bussy
        4.  If other than stated above give error 1000
    */
    System.out.println("statusControl:  " + param);

    String ONLINE = "arielvz", 
            OPEN = "DR_OPEN", 
            BUSSY = "Device or resource busy", 
            sCurrentLine;

    //Scan file line by line for one of the above options
    BufferedReader br = new BufferedReader(new FileReader(param));
    while ((sCurrentLine = br.readLine()) != null){
        //Tape is online and ready for writing
        if (sCurrentLine.contains(ONLINE)){
            System.out.println("found ariel");
        }
        //There is no tape in the tape drive
        else if (sCurrentLine.contains(OPEN)){
            //lblRunBck should tell the user to put a tape in the drive
            System.out.println("No tap in tape drive");
        }
        else if (sCurrentLine.contains(BUSSY)){
            //lblRunBck should notify user that the resource is in use
            System.out.println("Device or resource bussy");
        }
        else{
            //Something unexpected happend
            System.out.println("Error 1001:  Please notify Administrator");
        }

    }

}//END OF statusControl

public String returnHandler(String param){
    return param;
    }
}

Maby This will make it more clear

JavaHopper
  • 5,567
  • 1
  • 19
  • 27
  • I think you want to implement a "callback". Have a look at http://stackoverflow.com/questions/18279302/how-do-i-perform-a-java-callback-between-classes – Tobias S Aug 02 '16 at 14:26
  • Hi, Thanks but not it, I failed to mention this runs locally on the server. That will help with some later stuff though. – Ariel van Zyl Aug 02 '16 at 14:35
  • Then..where is the problem to return a string from the statusControl to checkStatus? I do not see the current problem :\ – Tobias S Aug 02 '16 at 14:37
  • Updated the question with my actual code, hope it helps. Have to go now but will take another look later tonight. – Ariel van Zyl Aug 02 '16 at 14:45

1 Answers1

1

If you want checkStatus to return a status, then do not make it returning nothing (a void function)

public class btnRunBackup {    
    private String s;

    public void checkStatus() {

but make it returning error as a String like:

public class btnRunBackup {    
    private String s;

    public String checkStatus() {
        String error = null; // by default no error
          ... do whatever you need to find out the error
              .... 
              error = "error is: xxx ";
        return error; // return null (no error ) or what you found
    }

change you logic in you calling code to display what error have been returned by checkStatus

private void btnRunBckActionPerformed(java.awt.event.ActionEvent evt)     
{

        // TODO add your handling code here:
        String error;

        btnRunBackup runBackupObject = new btnRunBackup();

        error = runBackupObject.checkStatus();

        lblRunBck.setText(error == null ? "No error" : error);
}
ARA
  • 1,296
  • 10
  • 18