Unknown type: METHOD_DEF

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Unknown type: METHOD_DEF

Mohan Radhakrishnan



Hi,
         I am new to groovy. Here I tried to create
a simple wrapper around 'sleep'.
I see the error in the subject at 'def'. What's wrong ?
Thanks,
Mohan

/**
* Our custom sleep logic.
*/
trait ThreadSleeper {
long ms
Closure cl = {}

/*Sleep with an action taken*/
def sleeperWithAction() {
try{

Thread.sleep ms, cl

}catch( InterruptedException ie ){
throw new SleepInterruptedException( ie, "Thread.sleep is interrupted for "+
"some reason [" + ie.getMessage() +"]");
}
}


/*If there is no action to be taken then we call this*/
def sleeper() {
try{

Thread.sleep ms

}catch( InterruptedException ie ){
throw new SleepInterruptedException( ie, "Thread.sleep is interrupted for "+
"some reason [" + ie.getMessage() +"]");
}
}
}
Reply | Threaded
Open this post in threaded view
|

Re: Unknown type: METHOD_DEF

Keith Suderman
What error are you seeing?  Do you see the error at runtime or in your IDE?  Your code works for me (Groovy 2.4.9) so maybe check for unbalanced braces elsewhere in your code.

However, you shouldn't catch/rethrow the InterruptedException as you do. The InterruptedException is not thrown for "some reason", it is thrown when another thread calls Thread.interrupt() on your thread (e.g. to wake your thread up so it can check its state).  For example:

Thread t = Thread.start {
boolean running = true
while (running) {
doSomeWork()
try {
Thread.sleep(1000) 
}
catch (InterruptedException e) {
running = shouldIKeepRunning()
return true
}
}
}
// At program shutdown/cleanup
t.interrupt()
t.join()
println "Our thread has termintated."

The Closure passed to the Thread.sleep method can be used in place of the try/catch block.  That is the closure will be called when Thread.interrupt() is called on your thread i.e.:

Thread t = Thread.start {
boolean running = false
while(running) {
doSomeWork()
Thread.sleep(1000) {
// Called then Thread.sleep() is interrupted.
running = false
return true
}
}
}
// ...
t.interrupt()
t.join()


Finally, if you are doing complicated threading work you should really be using GPars or Java's Executors, ThreadPools, et al.

Cheers,
Keith

On Jan 5, 2018, at 11:01 AM, Mohan Radhakrishnan <[hidden email]> wrote:




Hi,
         I am new to groovy. Here I tried to create
a simple wrapper around 'sleep'.
I see the error in the subject at 'def'. What's wrong ?
Thanks,
Mohan

/**
* Our custom sleep logic.
*/
trait ThreadSleeper {
long ms
Closure cl = {}

/*Sleep with an action taken*/
def sleeperWithAction() {
try{

Thread.sleep ms, cl

}catch( InterruptedException ie ){
throw new SleepInterruptedException( ie, "Thread.sleep is interrupted for "+
"some reason [" + ie.getMessage() +"]");
}
}


/*If there is no action to be taken then we call this*/
def sleeper() {
try{

Thread.sleep ms

}catch( InterruptedException ie ){
throw new SleepInterruptedException( ie, "Thread.sleep is interrupted for "+
"some reason [" + ie.getMessage() +"]");
}
}
}

----------------------
Keith Suderman
Research Associate
Department of Computer Science
Vassar College, Poughkeepsie NY




Reply | Threaded
Open this post in threaded view
|

Re: Unknown type: METHOD_DEF

Mohan Radhakrishnan
Hi Keith,

The error when I run Maven test is this.

[ERROR] Failed to execute goal org.codehaus.gmaven:gmaven-plugin:1.2:generateStu
bs (default) on project Automation: startup failed:
[ERROR] /D:/Development_Avecto/Automation/src/main/groovy/com/automation/pages/t
ime/ThreadSleeper.groovy: 11: Unknown type: METHOD_DEF at line: 11 column: 5. Fi
le: /D:/Development_Avecto/Automation/src/main/groovy/com/automation/pages/time/
ThreadSleeper.groovy @ line 11, column 5.
[ERROR] def  sleeperWithAction() {
[ERROR] ^
[ERROR]
[ERROR] 1 error

But when I execute a test like this from Intellij it passes.

@Test( expected = SleepInterruptedException.class )
def void interruptedTest() {

Thread.currentThread().interrupt()
def sleeper = new AutomationSleeper( ms : 10)
sleeper.sleeper()
}
I am handling InterruptedException because some Selenium code calls sleep everywhere.
And the calling code isn't prepared to be interrupted. Moreover there is no descriptive
message about what the thread is sleeping on. I plan to add some messages so that code that
calls my 'sleeper' will atleast have messages. The closure could help too.
Even selenium source code has this section probably because that framework isn't required to deal with
'InterruptedException'. It is a web scraping tool.

try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException( e);
}


Thanks,
Mohan

On 6 January 2018 at 03:47, Keith Suderman <[hidden email]> wrote:
What error are you seeing?  Do you see the error at runtime or in your IDE?  Your code works for me (Groovy 2.4.9) so maybe check for unbalanced braces elsewhere in your code.

However, you shouldn't catch/rethrow the InterruptedException as you do. The InterruptedException is not thrown for "some reason", it is thrown when another thread calls Thread.interrupt() on your thread (e.g. to wake your thread up so it can check its state).  For example:

Thread t = Thread.start {
boolean running = true
while (running) {
doSomeWork()
try {
Thread.sleep(1000) 
}
catch (InterruptedException e) {
running = shouldIKeepRunning()
return true
}
}
}
// At program shutdown/cleanup
t.interrupt()
t.join()
println "Our thread has termintated."

The Closure passed to the Thread.sleep method can be used in place of the try/catch block.  That is the closure will be called when Thread.interrupt() is called on your thread i.e.:

Thread t = Thread.start {
boolean running = false
while(running) {
doSomeWork()
Thread.sleep(1000) {
// Called then Thread.sleep() is interrupted.
running = false
return true
}
}
}
// ...
t.interrupt()
t.join()


Finally, if you are doing complicated threading work you should really be using GPars or Java's Executors, ThreadPools, et al.

Cheers,
Keith

On Jan 5, 2018, at 11:01 AM, Mohan Radhakrishnan <[hidden email]> wrote:




Hi,
         I am new to groovy. Here I tried to create
a simple wrapper around 'sleep'.
I see the error in the subject at 'def'. What's wrong ?
Thanks,
Mohan

/**
* Our custom sleep logic.
*/
trait ThreadSleeper {
long ms
Closure cl = {}

/*Sleep with an action taken*/
def sleeperWithAction() {
try{

Thread.sleep ms, cl

}catch( InterruptedException ie ){
throw new SleepInterruptedException( ie, "Thread.sleep is interrupted for "+
"some reason [" + ie.getMessage() +"]");
}
}


/*If there is no action to be taken then we call this*/
def sleeper() {
try{

Thread.sleep ms

}catch( InterruptedException ie ){
throw new SleepInterruptedException( ie, "Thread.sleep is interrupted for "+
"some reason [" + ie.getMessage() +"]");
}
}
}

----------------------
Keith Suderman
Research Associate
Department of Computer Science
Vassar College, Poughkeepsie NY





Reply | Threaded
Open this post in threaded view
|

Re: Unknown type: METHOD_DEF

Mohan Radhakrishnan
I couldn't understand the reason as I my Groovy exp. is less.

But this Maven configuration fixed it.

<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<goals>
<goal>addSources</goal>
<goal>addTestSources</goal>
<goal>compile</goal>
<goal>compileTests</goal>
</goals>
</execution>
</executions>
</plugin>

Thanks,
Mohan

On 8 January 2018 at 09:14, Mohan Radhakrishnan <[hidden email]> wrote:
Hi Keith,

The error when I run Maven test is this.

[ERROR] Failed to execute goal org.codehaus.gmaven:gmaven-plugin:1.2:generateStu
bs (default) on project Automation: startup failed:
[ERROR] /D:/Development_Avecto/Automation/src/main/groovy/com/automation/pages/t
ime/ThreadSleeper.groovy: 11: Unknown type: METHOD_DEF at line: 11 column: 5. Fi
le: /D:/Development_Avecto/Automation/src/main/groovy/com/automation/pages/time/
ThreadSleeper.groovy @ line 11, column 5.
[ERROR] def  sleeperWithAction() {
[ERROR] ^
[ERROR]
[ERROR] 1 error

But when I execute a test like this from Intellij it passes.

@Test( expected = SleepInterruptedException.class )
def void interruptedTest() {

Thread.currentThread().interrupt()
def sleeper = new AutomationSleeper( ms : 10)
sleeper.sleeper()
}
I am handling InterruptedException because some Selenium code calls sleep everywhere.
And the calling code isn't prepared to be interrupted. Moreover there is no descriptive
message about what the thread is sleeping on. I plan to add some messages so that code that
calls my 'sleeper' will atleast have messages. The closure could help too.
Even selenium source code has this section probably because that framework isn't required to deal with
'InterruptedException'. It is a web scraping tool.

try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException( e);
}


Thanks,
Mohan

On 6 January 2018 at 03:47, Keith Suderman <[hidden email]> wrote:
What error are you seeing?  Do you see the error at runtime or in your IDE?  Your code works for me (Groovy 2.4.9) so maybe check for unbalanced braces elsewhere in your code.

However, you shouldn't catch/rethrow the InterruptedException as you do. The InterruptedException is not thrown for "some reason", it is thrown when another thread calls Thread.interrupt() on your thread (e.g. to wake your thread up so it can check its state).  For example:

Thread t = Thread.start {
boolean running = true
while (running) {
doSomeWork()
try {
Thread.sleep(1000) 
}
catch (InterruptedException e) {
running = shouldIKeepRunning()
return true
}
}
}
// At program shutdown/cleanup
t.interrupt()
t.join()
println "Our thread has termintated."

The Closure passed to the Thread.sleep method can be used in place of the try/catch block.  That is the closure will be called when Thread.interrupt() is called on your thread i.e.:

Thread t = Thread.start {
boolean running = false
while(running) {
doSomeWork()
Thread.sleep(1000) {
// Called then Thread.sleep() is interrupted.
running = false
return true
}
}
}
// ...
t.interrupt()
t.join()


Finally, if you are doing complicated threading work you should really be using GPars or Java's Executors, ThreadPools, et al.

Cheers,
Keith

On Jan 5, 2018, at 11:01 AM, Mohan Radhakrishnan <[hidden email]> wrote:




Hi,
         I am new to groovy. Here I tried to create
a simple wrapper around 'sleep'.
I see the error in the subject at 'def'. What's wrong ?
Thanks,
Mohan

/**
* Our custom sleep logic.
*/
trait ThreadSleeper {
long ms
Closure cl = {}

/*Sleep with an action taken*/
def sleeperWithAction() {
try{

Thread.sleep ms, cl

}catch( InterruptedException ie ){
throw new SleepInterruptedException( ie, "Thread.sleep is interrupted for "+
"some reason [" + ie.getMessage() +"]");
}
}


/*If there is no action to be taken then we call this*/
def sleeper() {
try{

Thread.sleep ms

}catch( InterruptedException ie ){
throw new SleepInterruptedException( ie, "Thread.sleep is interrupted for "+
"some reason [" + ie.getMessage() +"]");
}
}
}

----------------------
Keith Suderman
Research Associate
Department of Computer Science
Vassar College, Poughkeepsie NY