Sunday, January 30, 2011

ANTLR - Java source code rewrite

See ANTLR4 for other solution using Listener
https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Parse+Tree+Listeners
http://media.pragprog.com/titles/tpantlr2/listener.pdf

Using examples from chapter 9 in http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference

Java tree grammar used for rewrite example
http://www.antlr.org/grammar/1207932239307/Java1_5Grammars
Dieter Habelitz - A Java 1.5 grammar that builds trees and a tree grammar. Not derived from Java grammar Terence wrote.
original link broken - http://www.antlr3.org/grammar/1207932239307/Java1_5Grammars

Try this on  github
https://github.com/grammarware/slps/tree/master/topics/grammars/java-5/habelitz 

Add template rewrite call into tree grammar JavaTreeParser.g
  |   ^(METHOD_CALL  primaryExpression {$primaryExpression::isMethodCall=true;} genericTypeArgumentList? arguments)
      -> methodCall(methodCallText={$text})


Create template file JavaTreeTemplate.stg
group Java;

methodCall(methodCallText) ::= <<
$methodCallText$;
log("Called $methodCallText$")
>>


import java.io.FileReader;

import generated.JavaLexer;
import generated.JavaParser;
import generated.JavaTreeParser;

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.TokenRewriteStream;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.CommonTreeNodeStream;
import org.antlr.stringtemplate.StringTemplateGroup;
import org.antlr.stringtemplate.language.AngleBracketTemplateLexer;
import org.antlr.stringtemplate.language.DefaultTemplateLexer;


public class JavaTreeWalker {
    
    public static void main(String[] args) throws Exception {
        
        String templateFileName = "src/JavaTreeTemplate.stg";
        StringTemplateGroup templates = new StringTemplateGroup(new FileReader(templateFileName),
                            DefaultTemplateLexer.class);
        
        ANTLRFileStream input = new ANTLRFileStream(args[0]);
        
        JavaLexer lexer = new JavaLexer(input);
        
        TokenRewriteStream tokens = new TokenRewriteStream(lexer);
        
        JavaParser parser = new JavaParser(tokens);
        
        JavaParser.javaSource_return r = parser.javaSource();
        
        CommonTree t = (CommonTree)r.getTree();
        
        System.out.println(t.toStringTree());
        
        CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
        
        nodes.setTokenStream(tokens);
        
        JavaTreeParser walker = new JavaTreeParser(nodes);
        
        walker.setTemplateLib(templates);
        
        System.out.println("\nWalk tree:\n");
        printTree(t,0);
        
        walker.javaSource();
        
        System.out.println(tokens.toString());
        
    }
    
    public static void printTree(CommonTree t, int indent) {
        if ( t != null ) {
            StringBuffer sb = new StringBuffer(indent);
            for ( int i = 0; i < indent; i++ )
                sb = sb.append("   ");
            for ( int i = 0; i < t.getChildCount(); i++ ) {
                System.out.println(sb.toString() + t.getChild(i).toString());
                printTree((CommonTree)t.getChild(i), indent+1);
            }
        }
    }


}


Original HelloWorld Java program
public class HelloWorld {

    static int x;

    /**
     * This is test class for ANTLR Java source code transformation
     * @param args
     */
    public static void main(String args[]) {

        int x;
        int y;
        
        x = 1; 
        print(x);

        System.out.println("Hello,world!");

    }
    
    private static  void print(int x){
        System.out.println(x);
    }

}


Program after rewrite by ANTLR
public class HelloWorld {

    static int x;

    /**
     * This is test class for ANTLR Java source code transformation
     * @param args
     */
    public static void main(String args[]) {

        int x;
        int y;
        
        x = 1; 
        print(x);
log("Called print(x)");

        System.out.println("Hello,world!");
log("Called System.out.println("Hello,world!")");

    }
    
    private static  void print(int x){
        System.out.println(x);
log("Called System.out.println(x)");
    }

}


ANTLR AST
(JAVA_SOURCE ANNOTATION_LIST (class (MODIFIER_LIST public) HelloWorld (CLASS_TOP_LEVEL_SCOPE (VAR_DECLARATION (MODIFIER_LIST static) (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR x))) (VOID_METHOD_DECL (MODIFIER_LIST public static) main (FORMAL_PARAM_LIST (FORMAL_PARAM_STD_DECL LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT String)) (args (ARRAY_DECLARATOR_LIST ARRAY_DECLARATOR)))) (BLOCK_SCOPE (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR x))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR y))) (EXPR (= x 1)) (EXPR (METHOD_CALL print (ARGUMENT_LIST (EXPR x)))) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR "Hello,world!")))))) (VOID_METHOD_DECL (MODIFIER_LIST private static) print (FORMAL_PARAM_LIST (FORMAL_PARAM_STD_DECL LOCAL_MODIFIER_LIST (TYPE int) x)) (BLOCK_SCOPE (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR x)))))))))

Walk tree:

ANNOTATION_LIST
class
   MODIFIER_LIST
      public
   HelloWorld
   CLASS_TOP_LEVEL_SCOPE
      VAR_DECLARATION
         MODIFIER_LIST
            static
         TYPE
            int
         VAR_DECLARATOR_LIST
            VAR_DECLARATOR
               x
      VOID_METHOD_DECL
         MODIFIER_LIST
            public
            static
         main
         FORMAL_PARAM_LIST
            FORMAL_PARAM_STD_DECL
               LOCAL_MODIFIER_LIST
               TYPE
                  QUALIFIED_TYPE_IDENT
                     String
               args
                  ARRAY_DECLARATOR_LIST
                     ARRAY_DECLARATOR
         BLOCK_SCOPE
            VAR_DECLARATION
               LOCAL_MODIFIER_LIST
               TYPE
                  int
               VAR_DECLARATOR_LIST
                  VAR_DECLARATOR
                     x
            VAR_DECLARATION
               LOCAL_MODIFIER_LIST
               TYPE
                  int
               VAR_DECLARATOR_LIST
                  VAR_DECLARATOR
                     y
            EXPR
               =
                  x
                  1
            EXPR
               METHOD_CALL
                  print
                  ARGUMENT_LIST
                     EXPR
                        x
            EXPR
               METHOD_CALL
                  .
                     .
                        System
                        out
                     println
                  ARGUMENT_LIST
                     EXPR
                        "Hello,world!"
      VOID_METHOD_DECL
         MODIFIER_LIST
            private
            static
         print
         FORMAL_PARAM_LIST
            FORMAL_PARAM_STD_DECL
               LOCAL_MODIFIER_LIST
               TYPE
                  int
               x
         BLOCK_SCOPE
            EXPR
               METHOD_CALL
                  .
                     .
                        System
                        out
                     println
                  ARGUMENT_LIST
                     EXPR
                        x

Saturday, January 29, 2011

ANTLR - Java source tree walker

Java 1.5 grammar for ANTLR v3 that builds trees
 
Dieter Habelitz - A Java 1.5 grammar that builds trees and a tree grammar. Not derived from Java grammar Terence wrote.
original link broken - http://www.antlr3.org/grammar/1207932239307/Java1_5Grammars

Try this on  github
https://github.com/grammarware/slps/tree/master/topics/grammars/java-5/habelitz

Compile grammars
java org.antlr.Tool -o generated Java.g
java org.antlr.Tool -o generated JavaTreeParser.g


Creates following files:
 ls -l generated/
total 1588
-rw-------. 1 dave vesedan  145133 Jan 29 12:20 JavaLexer.java
-rw-------. 1 dave vesedan 1046974 Jan 29 12:20 JavaParser.java
-rw-r--r--. 1 dave vesedan    3687 Jan 29 12:10 Java.tokens
-rw-r--r--. 1 dave vesedan  386412 Jan 29 13:11 JavaTreeParser.java
-rw-r--r--. 1 dave vesedan    3687 Jan 29 13:11 JavaTreeParser.tokens


import generated.JavaLexer;
import generated.JavaParser;
import generated.JavaTreeParser;

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.CommonTreeNodeStream;


public class JavaTreeWalker {
    
    public static void main(String[] args) throws Exception {
        
        ANTLRFileStream input = new ANTLRFileStream(args[0]);
        
        JavaLexer lexer = new JavaLexer(input);
        
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        
        JavaParser parser = new JavaParser(tokens);
        
        JavaParser.javaSource_return r = parser.javaSource();
        
        CommonTree t = (CommonTree)r.getTree();
        
        System.out.println(t.toStringTree());
        
        CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
        
        nodes.setTokenStream(tokens);
        
        JavaTreeParser walker = new JavaTreeParser(nodes);
        
        System.out.println("\nWalk tree:\n");
        
        walker.javaSource();
        
        System.out.println(tokens.toString());
        
    }

}


(JAVA_SOURCE ANNOTATION_LIST (import (. generated JavaLexer)) (import (. generated JavaParser)) (import (. generated JavaTreeParser)) (import (. (. (. org antlr) runtime) ANTLRFileStream)) (import (. (. (. org antlr) runtime) CommonTokenStream)) (import (. (. (. (. org antlr) runtime) tree) CommonTree)) (import (. (. (. (. org antlr) runtime) tree) CommonTreeNodeStream)) (class (MODIFIER_LIST public) JavaTreeWalker (CLASS_TOP_LEVEL_SCOPE (VOID_METHOD_DECL (MODIFIER_LIST public static) main (FORMAL_PARAM_LIST (FORMAL_PARAM_STD_DECL LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT String) (ARRAY_DECLARATOR_LIST ARRAY_DECLARATOR)) args)) (THROWS_CLAUSE Exception) (BLOCK_SCOPE (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT ANTLRFileStream)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR input (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT ANTLRFileStream) (ARGUMENT_LIST (EXPR (ARRAY_ELEMENT_ACCESS args (EXPR 0))))))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT JavaLexer)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR lexer (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT JavaLexer) (ARGUMENT_LIST (EXPR input))))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT CommonTokenStream)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR tokens (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT CommonTokenStream) (ARGUMENT_LIST (EXPR lexer))))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT JavaParser)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR parser (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT JavaParser) (ARGUMENT_LIST (EXPR tokens))))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT JavaParser javaSource_return)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR r (EXPR (METHOD_CALL (. parser javaSource) ARGUMENT_LIST))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT CommonTree)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR t (EXPR (CAST_EXPR (TYPE (QUALIFIED_TYPE_IDENT CommonTree)) (METHOD_CALL (. r getTree) ARGUMENT_LIST)))))) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR (METHOD_CALL (. t toStringTree) ARGUMENT_LIST))))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT CommonTreeNodeStream)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR nodes (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT CommonTreeNodeStream) (ARGUMENT_LIST (EXPR t))))))) (EXPR (METHOD_CALL (. nodes setTokenStream) (ARGUMENT_LIST (EXPR tokens)))) (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT JavaTreeParser)) (VAR_DECLARATOR_LIST (VAR_DECLARATOR walker (EXPR (STATIC_ARRAY_CREATOR (QUALIFIED_TYPE_IDENT JavaTreeParser) (ARGUMENT_LIST (EXPR nodes))))))) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR "\nWalk tree:\n")))) (EXPR (METHOD_CALL (. walker javaSource) ARGUMENT_LIST)) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR (METHOD_CALL (. tokens toString) ARGUMENT_LIST))))))))))

Walk tree:

importgenerated.JavaLexer;importgenerated.JavaParser;importgenerated.JavaTreeParser;importorg.antlr.runtime.ANTLRFileStream;importorg.antlr.runtime.CommonTokenStream;importorg.antlr.runtime.tree.CommonTree;importorg.antlr.runtime.tree.CommonTreeNodeStream;publicclassJavaTreeWalker{publicstaticvoidmain(String[]args)throwsException{ANTLRFileStreaminput=newANTLRFileStream(args[0]);JavaLexerlexer=newJavaLexer(input);CommonTokenStreamtokens=newCommonTokenStream(lexer);JavaParserparser=newJavaParser(tokens);JavaParser.javaSource_returnr=parser.javaSource();CommonTreet=(CommonTree)r.getTree();System.out.println(t.toStringTree());CommonTreeNodeStreamnodes=newCommonTreeNodeStream(t);nodes.setTokenStream(tokens);JavaTreeParserwalker=newJavaTreeParser(nodes);System.out.println("\nWalk tree:\n");walker.javaSource();System.out.println(tokens.toString());}}


HelloWorld Java program
public class HelloWord {

  static int x;

  public static void main(String args[]){
    
    int y;

    System.out.println("Hello,world!");

  }

}


AST text output

(JAVA_SOURCE ANNOTATION_LIST (class (MODIFIER_LIST public) HelloWorld (CLASS_TOP_LEVEL_SCOPE (VAR_DECLARATION (MODIFIER_LIST static) (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR x))) (VOID_METHOD_DECL (MODIFIER_LIST public static) main (FORMAL_PARAM_LIST (FORMAL_PARAM_STD_DECL LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT String)) (args (ARRAY_DECLARATOR_LIST ARRAY_DECLARATOR)))) (BLOCK_SCOPE (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR y))) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR "Hello,world!")))))))))

Walk tree:

publicclassHelloWorld{staticintx;publicstaticvoidmain(Stringargs[]){inty;System.out.println("Hello,world!");}}


With option to keep whitespace set in Java.g
public boolean preserveWhitespacesAndComments = true;


(JAVA_SOURCE ANNOTATION_LIST (class (MODIFIER_LIST public) HelloWorld (CLASS_TOP_LEVEL_SCOPE (VAR_DECLARATION (MODIFIER_LIST static) (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR x))) (VOID_METHOD_DECL (MODIFIER_LIST public static) main (FORMAL_PARAM_LIST (FORMAL_PARAM_STD_DECL LOCAL_MODIFIER_LIST (TYPE (QUALIFIED_TYPE_IDENT String)) (args (ARRAY_DECLARATOR_LIST ARRAY_DECLARATOR)))) (BLOCK_SCOPE (VAR_DECLARATION LOCAL_MODIFIER_LIST (TYPE int) (VAR_DECLARATOR_LIST (VAR_DECLARATOR y))) (EXPR (METHOD_CALL (. (. System out) println) (ARGUMENT_LIST (EXPR "Hello,world!")))))))))

Walk tree:

public class HelloWorld {

  static int x;

  public static void main(String args[]){
    
    int y;

    System.out.println("Hello,world!");

  }

}




AST generated in ANTLR-Works

Saturday, December 25, 2010

Log4j wrapper

package daveutil;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class Log4jWrapper {

/*
* TRACE, DEBUG, INFO, WARN, ERROR, FATAL
*/
Level level = Level.DEBUG;

public static Log4jWrapper LOG;

private Logger logger;

static {
synchronized(Log4jWrapper.class){
if(LOG == null){
LOG = new Log4jWrapper("daveapp");
}
}
}

private Log4jWrapper(String logger) {
this.logger = Logger.getLogger(logger);
}

public void log(Object o) {
logger.log(level, o);
}

public void log(Object o,Throwable e) {
logger.log(level, o, e);
}

public void log(String callerFCQN,Object o,Throwable e) {
logger.log(callerFCQN,level, o, e);
}

public void trace(Object o) {
logger.trace(o);
}

public void trace(Object o,Throwable e) {
logger.trace(o,e);
}

public void debug(Object o) {
logger.debug(o);
}

public void debug(Object o,Throwable e) {
logger.debug(o,e);
}

public void info(Object o) {
logger.info(o);
}

public void info(Object o,Throwable e) {
logger.info(o,e);
}

public void warn(Object o) {
logger.warn(o);
}

public void warn(Object o,Throwable e) {
logger.warn(o,e);
}

public void error(Object o) {
logger.error(o);
}

public void error(Object o,Throwable e) {
logger.error(o,e);
}

public void fatal(Object o) {
logger.fatal(o);
}

public void fatal(Object o,Throwable e) {
logger.fatal(o,e);
}

}





Using log4j wrapper
package daveapp;

import daveutil.Log4jWrapper;

public class TestDaveApp {

public void testDaveApp(){

System.out.println("Use Log4jWrapper");
Log4jWrapper.LOG.info("TestDaveApp info");

Log4jWrapper.LOG.info("TestDaveApp info",new Exception("TestDaveApp"));
}

}


log4j properties configuration
Pattern layout
http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html


Property Configurator

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html

All option values admit variable substitution. The syntax of variable substitution is similar to that of Unix shells. The string between an opening "${" and closing "}" is interpreted as a key. The value of the substituted variable can be defined as a system property or in the configuration file itself.

#log4j.rootLogger=debug, stdout, dave, daveutil

log4j.logger.dave=DEBUG,stdout, dave
log4j.logger.daveutil=DEBUG, stdout, daveutil
log4j.logger.daveapp=DEBUG, stdout, daveapp

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.dave=org.apache.log4j.RollingFileAppender
# do not send to other logs
log4j.additivity.dave=false
log4j.appender.dave.File=${weblogic.Name}.dave.log

log4j.appender.dave.MaxFileSize=10KB
# Keep one backup file
log4j.appender.dave.MaxBackupIndex=5

log4j.appender.dave.layout=org.apache.log4j.PatternLayout
log4j.appender.dave.layout.ConversionPattern=%p %t %c - %m%n

log4j.appender.daveutil=org.apache.log4j.RollingFileAppender
# do not send to other logs
log4j.additivity.daveutil=false
log4j.appender.daveutil.File=${weblogic.Name}.daveutil.log

log4j.appender.daveutil.MaxFileSize=10KB
# Keep one backup file
log4j.appender.daveutil.MaxBackupIndex=5

log4j.appender.daveutil.layout=org.apache.log4j.PatternLayout
log4j.appender.daveutil.layout.ConversionPattern=%p %t %c - %m%n

log4j.appender.daveapp=org.apache.log4j.RollingFileAppender
# do not send to other logs
log4j.additivity.daveapp=false
log4j.appender.daveapp.File=${weblogic.Name}.daveapp.log

log4j.appender.daveapp.MaxFileSize=10KB
# Keep one backup file
log4j.appender.daveapp.MaxBackupIndex=5

log4j.appender.daveapp.layout=org.apache.log4j.PatternLayout
log4j.appender.daveapp.layout.ConversionPattern=%p %t %c - %m%n



Using FCQN - fully qualified class name
Log4jWrapper.LOG.log(TestDaveApp.class.getName(),"TestDaveApp info",new Exception("TestDaveApp"));



INFO (Log4jWrapper.java:62) - TestDaveApp info


DEBUG (TestDave.java:22) - TestDaveApp info

Log into separate files according to package

log4j.properties

#log4j.rootLogger=debug, stdout, dave, daveutil

log4j.logger.dave=DEBUG, dave
log4j.logger.daveutil=DEBUG, daveutil

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.dave=org.apache.log4j.RollingFileAppender
# do not send to other logs
log4j.additivity.dave=false
log4j.appender.dave.File=dave.log

log4j.appender.dave.MaxFileSize=10KB
# Keep one backup file
log4j.appender.dave.MaxBackupIndex=5

log4j.appender.dave.layout=org.apache.log4j.PatternLayout
log4j.appender.dave.layout.ConversionPattern=%p %t %c - %m%n


log4j.appender.daveutil=org.apache.log4j.RollingFileAppender
# do not send to other logs
log4j.additivity.daveutil=false
log4j.appender.daveutil.File=daveutil.log

log4j.appender.daveutil.MaxFileSize=10KB
# Keep one backup file
log4j.appender.daveutil.MaxBackupIndex=5

log4j.appender.daveutil.layout=org.apache.log4j.PatternLayout
log4j.appender.daveutil.layout.ConversionPattern=%p %t %c - %m%n




configure log4j in application lifecycle listener

package start;


import java.net.URL;

import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.helpers.Loader;

import weblogic.application.ApplicationLifecycleEvent;
import weblogic.application.ApplicationLifecycleListener;

public class DaveStart extends ApplicationLifecycleListener {


public void preStart(ApplicationLifecycleEvent event){

System.out.println("DaveStart preStart");
}

public void postStart(ApplicationLifecycleEvent event){

System.out.println("DaveStart postStart");

// configure log4j
URL url = Loader.getResource("log4j.properties");
PropertyConfigurator.configure(url);

System.out.println("DaveStart log4j initialized");

}


}



using defined logger
package daveutil;

import org.apache.log4j.Logger;

public class TestDave {

static Logger logger = Logger.getLogger(TestDave.class.getName());

public String hello(String name) {

System.out.println("TestDave: START ");
logger.info("TestDave: START ");

System.out.println("Hello from TestDave to " + name);
logger.info("Hello from TestDave to " + name);

System.out.println("Using fast-swap");
logger.info("Using fast-swap");

return name;
}

}


created logs
[dave@dave base_domain]$ ls -lt
total 84
-rw-r-----. 1 dave vesedan 1112 Dec 25 15:37 dave.log
-rw-r-----. 1 dave vesedan 4888 Dec 25 15:37 daveutil.log
-rw-r-----. 1 dave vesedan 10830 Dec 25 15:37 dave.log.1



dave.log
[dave@dave base_domain]$ more dave.log
INFO [ACTIVE] ExecuteThread: '19' for queue: 'weblogic.kernel.Default (self-tuning)' dave.TestSesssionEJB - timeFromBegin2 timeToLive180000
0



daveutil.log
[dave@dave base_domain]$ more daveutil.log 
INFO [ACTIVE] ExecuteThread: '20' for queue: 'weblogic.kernel.Default (self-tuning)' daveutil.TestDave - TestDave: START
INFO [ACTIVE] ExecuteThread: '20' for queue: 'weblogic.kernel.Default (self-tuning)' daveutil.TestDave - Hello from TestDave to dave
INFO [ACTIVE] ExecuteThread: '20' for queue: 'weblogic.kernel.Default (self-tuning)' daveutil.TestDave - Using fast-swap
INFO [ACTIVE] ExecuteThread: '20' for queue: 'weblogic.kernel.Default (self-tuning)' daveutil.TestDave - TestDave: START
INFO [ACTIVE] ExecuteThread: '20' for queue: 'weblogic.kernel.Default (self-tuning)' daveutil.TestDave - Hello from TestDave to dave
INFO [ACTIVE] ExecuteThread: '20' for queue: 'weblogic.kernel.Default (self-tuning)' daveutil.TestDave - Using fast-swap

Friday, December 24, 2010

Using FastSwap

Using FastSwap Deployment to Minimize Redeployment

http://download.oracle.com/docs/cd/E12839_01/web.1111/e13702/deployunits.htm




Ant build script using FastSwap ant task

<project basedir="." default="deploy" name="deploy">
<property environment="env"/>

<property name="wl.home" value="/app/wlserver_10.3"/>
<property name="application.dir" value="/home/dave/workspace/wls1033/.metadata/.plugins/org.eclipse.core.resources/.projects/testEAR/beadep/base_domain/testEAR/" />

<echo message="${wl.home}/server/lib"/>

<path id="wlappc.classpath">
<fileset dir="${wl.home}/server/lib">
<include name="weblogic.jar"/>
</fileset>
</path>

<echo message="${toString:wlappc.classpath}"/>

<taskdef name="wlappc" classpathref="wlappc.classpath" classname="weblogic.ant.taskdefs.j2ee.Appc"/>
<taskdef name="wldeploy" classpathref="wlappc.classpath" classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<taskdef name='fast-swap' classpathref="wlappc.classpath" classname='com.bea.wls.redef.ant.FastSwapTask'/>


<target name="deploy">
<wldeploy user="weblogic"
password="weblogic123"
verbose="true"
adminurl="t3://localhost:7001"
targets="AdminServer"
action="deploy"
source="${application.dir}"
name = "testEAR"
/>
</target>


<target name="fast-swap">
<fast-swap user="weblogic"
password="weblogic123"
adminurl="t3://localhost:7001"
server="AdminServer"
application = "testEAR"
/>
</target>

</project>





Ant build script output
Buildfile: /home/dave/workspace/wls1033/testEAR/build.xml
[echo] /app/wlserver_10.3/server/lib
[echo] /app/wlserver_10.3/server/lib/weblogic.jar
fast-swap:
[fast-swap] Performing FastSwap.
[fast-swap] adminUrl: t3://localhost:7001
[fast-swap] server: AdminServer
[fast-swap] application: testEAR
[fast-swap] module: null
[fast-swap] classes:
[fast-swap] Using JMX Connector to connect to service:jmx:t3://localhost:7001/jndi/weblogic.management.mbeanservers.runtime
[fast-swap] Processed 1 classes from 1 candidate classes.
[fast-swap] FastSwap operation completed successfully.
[fast-swap] ----------------------------------------------------
BUILD SUCCESSFUL


AdminServer log
####<Dec 24, 2010 8:33:14 AM CET> <Info> <FastSwap> <dave> <AdminServer> <[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1293175994484> <BEA-2154001> <Starting FastSwap operation on application "testEAR".> 
####<Dec 24, 2010 8:33:14 AM CET> <Info> <FastSwap> <dave> <AdminServer> <[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1293175994527> <BEA-2154002> <Finished FastSwap operation on application "testEAR" with status FINISHED.>



<!--
Redefine classes which have changed since they were last loaded.
Required parameters:
adminUrl: Connection url
user: User name
password: User password
server: Managed server name
application: Deployed application name
Optional parameters:
module: Name of the module within the application.
If not specified, all modules within the application
will be processed.
failonerror: Default=true. If true, task will fail if fast-swap failed.
Otherwise, a message will be displayed and the task will
return success.
timeout: Default=300. Timeout in seconds.
classnames: Comma separated list of classnames to process. If not
specified, all classes within specified modules (if any)
in the application will be considered.
-->

Thursday, December 23, 2010

Weblogic tool appc for EJB pre-compilation

<project basedir="." default="appc-ejb" name="appc-ejb">
<property environment="env"/>

<property name="wl.home" value="/app/wlserver_10.3"/>
<property name="application.dir" value="/home/dave/workspace/wls1033/testEJBGen/build/classes" />

<echo message="${wl.home}/server/lib"/>

<path id="wlappc.classpath">
<fileset dir="${wl.home}/server/lib">
<include name="*.jar"/>
</fileset>
</path>

<echo message="${toString:wlappc.classpath}"/>

<taskdef name="wlappc" classpathref="wlappc.classpath" classname="weblogic.ant.taskdefs.j2ee.Appc"/>

<target name="appc-ejb">
<wlappc source="${application.dir}"
keepgenerated="true"
verbose="true"
classpathref="wlappc.classpath"/>
</target>
</project>


Buildfile: /home/dave/workspace/wls1033/testEJBGen/build.xml
[echo] /app/wlserver_10.3/server/lib
[echo] /app/wlserver_10.3/server/lib/weblogic.jar
appc-ejb:
[wlappc] <Dec 23, 2010 9:28:28 PM CET> <Warning> <EJB> <BEA-010212> <The EJB 'TestSessionEJBGen(Jar: /home/dave/workspace/wls1033/testEJBGen/build/classes)' contains at least one method without an explicit transaction attribute setting. The default transaction attribute of Supports will be used for the following methods: remote[helloEJBGen(java.lang.String)] >
[wlappc] <Dec 23, 2010 9:28:31 PM CET> <Info> <J2EE> <BEA-160220> <Compilation completed successfully>
BUILD SUCCESSFUL


[dave@dave dave]$ pwd
/home/dave/workspace/wls1033/testEJBGen/build/classes/dave
[dave@dave dave]$ ls -lt
total 196
-rw-r--r--. 1 dave vesedan 3834 Dec 23 21:28 TestSessionEJBGen_pq6ajk_EOImpl_1033_WLStub.class
-rw-r--r--. 1 dave vesedan 1003 Dec 23 21:28 TestSessionEJBGen_pq6ajk_EOImplRTD.xml
-rw-r--r--. 1 dave vesedan 3387 Dec 23 21:28 TestSessionEJBGen_pq6ajk_EOImpl_WLSkel.class
-rw-r--r--. 1 dave vesedan 4957 Dec 23 21:28 TestSessionEJBGen_pq6ajk_HomeImpl_1033_WLStub.class
-rw-r--r--. 1 dave vesedan 4172 Dec 23 21:28 TestSessionEJBGen_pq6ajk_HomeImpl_WLSkel.class
-rw-r--r--. 1 dave vesedan 2635 Dec 23 21:28 TestSessionEJBGen_pq6ajk_ELOImpl.class
-rw-r--r--. 1 dave vesedan 4447 Dec 23 21:28 TestSessionEJBGen_pq6ajk_EOImpl.class
-rw-r--r--. 1 dave vesedan 3152 Dec 23 21:28 TestSessionEJBGen_pq6ajk_HomeImpl.class
-rw-r--r--. 1 dave vesedan 1087 Dec 23 21:28 TestSessionEJBGen_pq6ajk_HomeImplRTD.xml
-rw-r--r--. 1 dave vesedan 3763 Dec 23 21:28 TestSessionEJBGen_pq6ajk_Impl.class
-rw-r--r--. 1 dave vesedan 416 Dec 23 21:28 TestSessionEJBGen_pq6ajk_Intf.class
-rw-r--r--. 1 dave vesedan 2732 Dec 23 21:28 TestSessionEJBGen_pq6ajk_LocalHomeImpl.class
-rw-r--r--. 1 dave vesedan 2594 Dec 23 21:28 TestSessionEJBGen_pq6ajk_ELOImpl.java
-rw-r--r--. 1 dave vesedan 4006 Dec 23 21:28 TestSessionEJBGen_pq6ajk_EOImpl.java
-rw-r--r--. 1 dave vesedan 2999 Dec 23 21:28 TestSessionEJBGen_pq6ajk_HomeImpl.java
-rw-r--r--. 1 dave vesedan 4083 Dec 23 21:28 TestSessionEJBGen_pq6ajk_Impl.java
-rw-r--r--. 1 dave vesedan 626 Dec 23 21:28 TestSessionEJBGen_pq6ajk_Intf.java
-rw-r--r--. 1 dave vesedan 2540 Dec 23 21:28 TestSessionEJBGen_pq6ajk_LocalHomeImpl.java
-rw-r--r--. 1 dave vesedan 1447 Dec 23 20:53 TestSessionEJBGen.class
-rw-r--r--. 1 dave vesedan 162 Dec 23 20:53 TestSessionEJBGenLocal.class
-rw-r--r--. 1 dave vesedan 275 Dec 23 20:53 TestSessionEJBGenLocalHome.class
-rw-r--r--. 1 dave vesedan 275 Dec 23 20:53 TestSessionEJBGenRemote.class
-rw-r--r--. 1 dave vesedan 305 Dec 23 20:53 TestSessionEJBGenRemoteHome.class

Wednesday, December 15, 2010

Get Weblogic Transaction details - timeout, time to live

weblogic.transaction.TransactionHelper
http://download.oracle.com/docs/cd/E14571_01/apirefs.1111/e13941/weblogic/transaction/TransactionHelper.html

weblogic.transaction.Transaction - extends javax.transaction.Transaction
http://download.oracle.com/docs/cd/E14571_01/apirefs.1111/e13941/weblogic/transaction/Transaction.html


EJB 3.0 Metadata Annotations Reference
http://download.oracle.com/docs/cd/E12840_01/wls/docs103/ejb30/annotations.html#wp1438355

package dave;

import java.sql.Connection;
import weblogic.javaee.TransactionTimeoutSeconds;
import java.sql.SQLException;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import javax.transaction.SystemException;

import weblogic.transaction.Transaction;
import weblogic.transaction.TransactionHelper;

/**
* Session Bean implementation class TestSesssionEJB
*/
@Stateless(mappedName = "TestSesssionEJB")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@TransactionTimeoutSeconds(1800)
public class TestSesssionEJB implements TestSesssionEJBRemote, TestSesssionEJBLocal {

/**
* Default constructor.
*/
public TestSesssionEJB() {
}


public int testTransactionTimeout(int timeout) {

int out = 0;

TransactionHelper th = weblogic.transaction.TransactionHelper.getTransactionHelper();

weblogic.transaction.Transaction transaction = (Transaction) th.getTransaction();

System.out.println("Transaction: "+ transaction);

try {
System.out.println("Transaction status: "+ transaction.getStatus());
} catch (SystemException e) {
e.printStackTrace();
}

long timeFromBegin = transaction.getMillisSinceBegin();
long timeToLive = transaction.getTimeToLiveMillis();

System.out.println("timeFromBegin" + timeFromBegin + " timeToLive" + timeToLive);

return out;

}

}




Default 900s set in JTA
Transaction:  Name=[EJB dave.TestSesssionEJB.testTransactionTimeout(int)],Xid=BEA1-000002B089C73057A4BD(11628244),Status=Active,
numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=899,activeThread=Thread[[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads],SCInfo[base_domain+AdminServer]=(state=active),properties=({weblogic.transaction.name=[EJB dave.TestSesssionEJB.testTransactionTimeout(int)]}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=AdminServer+localhost:7001+base_domain+t3+,
XAResources={WSATGatewayRM_AdminServer_base_domain},NonXAResources={})],
CoordinatorURL=AdminServer+localhost:7001+base_domain+t3+)
Transaction status: 0
timeFromBegin934 timeToLive899000



Changed on EJB to 1800s
Transaction:  Name=[EJB dave.TestSesssionEJB.testTransactionTimeout(int)],Xid=BEA1-000302B089C73057A4BD(11110649),Status=Active,
numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=1800,
activeThread=Thread[[ACTIVE] ExecuteThread: '5' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads],SCInfo[base_domain+AdminServer]=(state=active),properties=({weblogic.transaction.name=[EJB dave.TestSesssionEJB.testTransactionTimeout(int)]}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=AdminServer+localhost:7001+base_domain+t3+, XAResources={WSATGatewayRM_AdminServer_base_domain},NonXAResources={})],
CoordinatorURL=AdminServer+localhost:7001+base_domain+t3+)
Transaction status: 0
timeFromBegin12 timeToLive1800000