1

I need to be able to create an instance of the following class in my web Services Method and for some reason there is an error.

Question: Why would I not be able to declare and instance of my class in my Java WEBServices?

    **GetTheFileListClass FindArrayListOfFiles = new GetTheFileListClass(fileName);**

Error:

The source was saved, but was not compiled due to the following errors:
C:\SoftwareAG\IntegrationServer\packages\DssAccessBackup\code\source\DssAccessBackup\services\flow.java:48: non-static variable this cannot be referenced from a static context

        GetTheFileListClass FindArrayListOfFiles = new GetTheFileListClass(fileName);
  1 error

Code:

public final class ReturnListOfValidFileNames_SVC

{

    /** 
     * The primary method for the Java service
     *
     * @param pipeline
     *            The IData pipeline
     * @throws ServiceException
     */
    public static final void ReturnListOfValidFileNames(IData pipeline)
            throws ServiceException {
        IDataCursor pipelineCursor = pipeline.getCursor();
        String fileName  = IDataUtil.getString(pipelineCursor,"FileName");
        ArrayList<String> listOfFileName = new ArrayList<String>(); 

        //This will get the file list and set it to the local parameter for the Service

        **GetTheFileListClass FindArrayListOfFiles = new GetTheFileListClass(fileName);**

        listOfFileName = FindArrayListOfFiles.getMyFileList();

        IDataUtil.put( pipelineCursor,"ListOfFileNames",listOfFileName.toArray());
        pipelineCursor.destroy();   
    }

    // --- <<IS-BEGIN-SHARED-SOURCE-AREA>> ---

    public class GetTheFileListClass {
        String fileName = new String();
        ArrayList<String> MyFileList = new ArrayList<String>();
        String InputFile = new String();

        GetTheFileListClass(String workFile){
            setInputFile(workFile);
        }

        public void setMyFileList(ArrayList<String> myList, String newFileValueToAdd) {
            myList.add(newFileValueToAdd);
        }

        public ArrayList<String> getMyFileList() {
            return MyFileList;
        }

        public void setInputFile(String wFile) {
            fileName = wFile;
        }

        public String getInputFile(){
            return fileName;
        }

        private String returnFileName(String a) {
           String matchEqualSign = "=";
           String returnFile = new String();
           int index = 0;

           index = a.indexOf(matchEqualSign,index);
           index++;

           while (a.charAt(index) != ' ' && a.charAt(index) != -1) {
               returnFile += a.charAt(index);
               //System.out.println(returnFile);
               index++;
           }

           return returnFile;
        }

        private void locatedFileName(String s, String FoundFile, ArrayList<String> myFileListParm) {
            final String REGEX = ("(?i)\\./\\s+ADD\\s+NAME\\s*=");
            Pattern validStringPattern = Pattern.compile(REGEX);
            Matcher validRegMatch = validStringPattern.matcher(s);
            boolean wasValidRegMatched = validRegMatch.find();

            if (wasValidRegMatched) {
                FoundFile = returnFileName(s); //OUTPUT variable should go here
                setMyFileList(myFileListParm,FoundFile);
            } 
        }

        //This is the methods that needs to be called from the main method
        private void testReadTextFile() throws IOException {
                BufferedReader reader = new BufferedReader(new FileReader(fileName));
                String FileLine = null;
                while ((FileLine = reader.readLine()) != null) {
                    locatedFileName(FileLine,fileName,MyFileList); //test to see if the "./ Add name=" is found in any of the strings
                }
        }

        private void printArrayFileList(ArrayList<String> myList) {
            for (String myIndexFileListVariable : myList) {
                System.out.println("File Name: " + myIndexFileListVariable);
            }
        }
    }

    // --- <<IS-END-SHARED-SOURCE-AREA>> ---
}
Doug Hauf
  • 3,025
  • 8
  • 46
  • 70

2 Answers2

3

your inner class is not static, try

public static class GetTheFileListClass { ....
kiar
  • 76
  • 2
  • Thank you. That worked. So all of those classes have to be public static. I did notice that WEBMethods does not let you place classes outside of the main class like you can do in Java. This is my first morning with WEBMethods so it is a learning experience. Is there a good book on this subject. – Doug Hauf Jan 30 '14 at 20:03
3

The rules of scope still apply, even though GetTheFileListClass is (a) a class and is (b) public. Because it is declared inside of ReturnListOfValidFileNames_SVC, that is its enclosing class, so any non-static reference to it must follow the rules of scope.

So you have two options (I'm using main to simulate your static method):

Declare the inner class static:

public final class Outer {

  public static void main(String[] args) {
    Inner inner = new Inner ();
    inner.doIt();
  }

  public static class Inner {
    public void doIt() {
      System.out.println("Do it");
    }
  }

}

OR

Within your static method, create an instance of the enclosing class and use the new operator on it like this

public final class Outer {

  public static void main(String[] args) {
    Outer outer = new Outer();// Now we have an enclosing instance!
    Inner inner = outer.new Inner ();
    inner.doIt();
  }

  public class Inner {
    public void doIt() {
      System.out.println("Do it");
    }
  }

}

Have fun!

J Steven Perry
  • 1,711
  • 1
  • 17
  • 28