Logger injection example
Javadoc for this example.
src_examples/net/sourceforge/anotherfsm/examples/loggerinjection/package-info.java
/*
 *  Copyright 2013 Michal Turek, AnotherFSM
 *
 *      http://anotherfsm.sourceforge.net/
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
 
/**
 * Example to show how to inject unsupported logger to AnotherFSM.
 * Log4j (http://logging.apache.org/log4j/1.2/) will be used for demonstration.
 *
 * <h3>Classes</h3>
 * 
 * <ul>
 * <li>{@link net.sourceforge.anotherfsm.examples.loggerinjection.Log4jLogger}
 *            Wrapper of log4j's logger.</li>
 * <li>{@link net.sourceforge.anotherfsm.examples.loggerinjection.Log4jLoggerFactory}
 *            Factory for wrapper of log4j's logger.</li>
 * <li>{@link net.sourceforge.anotherfsm.examples.loggerinjection.LoggerInjectionExample}
 *            Defines main() method, log sample messages using log4j wrapper.</li>
 * </ul>
 *
 * @author Michal Turek
 */
package net.sourceforge.anotherfsm.examples.loggerinjection;
src_examples/net/sourceforge/anotherfsm/examples/loggerinjection/Log4jLogger.java
/*
 *  Copyright 2013 Michal Turek, AnotherFSM
 *
 *      http://anotherfsm.sourceforge.net/
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
 
package net.sourceforge.anotherfsm.examples.loggerinjection;
 
import net.sourceforge.anotherfsm.logger.FsmLogger;
 
import org.apache.log4j.Logger;
 
/**
 * Wrapper of log4j's logger.
 * 
 * @author Michal Turek
 */
class Log4jLogger implements FsmLogger {
    /** The wrapped log4j logger. */
    private final Logger logger;
 
    /**
     * Create the object.
     * 
     * @param clazz
     *            the class
     */
    public Log4jLogger(Class<?> clazz) {
        logger = Logger.getLogger(clazz);
    }
 
    /**
     * Create the object.
     * 
     * @param name
     *            the logger name
     */
    public Log4jLogger(String name) {
        logger = Logger.getLogger(name);
    }
 
    @Override
    public String getName() {
        return logger.getName();
    }
 
    @Override
    public void fatal(String message) {
        logger.fatal(message);
    }
 
    @Override
    public void fatal(String message, Throwable throwable) {
        logger.fatal(message, throwable);
    }
 
    @Override
    public void error(String message) {
        logger.error(message);
    }
 
    @Override
    public void error(String message, Throwable throwable) {
        logger.error(message, throwable);
    }
 
    @Override
    public void warn(String message) {
        logger.warn(message);
    }
 
    @Override
    public void warn(String message, Throwable throwable) {
        logger.warn(message, throwable);
    }
 
    @Override
    public void info(String message) {
        logger.info(message);
    }
 
    @Override
    public void info(String message, Throwable throwable) {
        logger.info(message, throwable);
    }
 
    @Override
    public void debug(String message) {
        logger.debug(message);
    }
 
    @Override
    public void debug(String message, Throwable throwable) {
        logger.debug(message, throwable);
    }
 
    @Override
    public void trace(String message) {
        logger.trace(message);
    }
 
    @Override
    public void trace(String message, Throwable throwable) {
        logger.trace(message, throwable);
    }
 
    @Override
    public boolean isInfoEnabled() {
        return logger.isInfoEnabled();
    }
 
    @Override
    public boolean isDebugEnabled() {
        return logger.isDebugEnabled();
    }
 
    @Override
    public boolean isTraceEnabled() {
        return logger.isTraceEnabled();
    }
}
 
src_examples/net/sourceforge/anotherfsm/examples/loggerinjection/Log4jLoggerFactory.java
/*
 *  Copyright 2013 Michal Turek, AnotherFSM
 *
 *      http://anotherfsm.sourceforge.net/
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
 
package net.sourceforge.anotherfsm.examples.loggerinjection;
 
import net.sourceforge.anotherfsm.AnotherFsm;
import net.sourceforge.anotherfsm.Helpers;
import net.sourceforge.anotherfsm.logger.FsmLogger;
import net.sourceforge.anotherfsm.logger.FsmLoggerFactory;
 
/**
 * Factory for wrapper of log4j's logger.
 * 
 * Note AnotherFSM supports by default the following factories/backends.
 * 
 * <ul>
 * <li>{@link net.sourceforge.anotherfsm.logger.NoLoggerFactory}
 *            Disable logging at all.</li>
 * <li>{@link net.sourceforge.anotherfsm.logger.BasicLoggerFactory}
 *            Redirecting of the messages to the standard streams.</li>
 * <li>@link {@link net.sourceforge.anotherfsm.logger.StdStreamLoggerFactory}
 *            Logging to standard output and standard error output.</li>
 * <li>{@link net.sourceforge.anotherfsm.logger.JavaLoggerFactory}
 *            Logging to java.util.logging subsystem.</li>
 * </ul>
 * 
 * @author Michal Turek
 * 
 * @see AnotherFsm#setLoggerFactory(FsmLoggerFactory)
 */
public class Log4jLoggerFactory implements FsmLoggerFactory {
    @Override
    public FsmLogger getLogger(Class<?> clazz) {
        return new Log4jLogger(clazz);
    }
 
    @Override
    public FsmLogger getLogger(Class<?> clazz, String instance) {
        // Instance part is not supported by log4j directly
        return new Log4jLogger(clazz.getName()
                + Helpers.CLASS_INSTANCE_DELIMITER + instance);
    }
 
    @Override
    public FsmLogger getLogger(String name) {
        return new Log4jLogger(name);
    }
}
 
src_examples/net/sourceforge/anotherfsm/examples/loggerinjection/LoggerInjectionExample.java
/*
 *  Copyright 2013 Michal Turek, AnotherFSM
 *
 *      http://anotherfsm.sourceforge.net/
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
 
package net.sourceforge.anotherfsm.examples.loggerinjection;
 
import net.sourceforge.anotherfsm.AnotherFsm;
import net.sourceforge.anotherfsm.ContainerEvent;
import net.sourceforge.anotherfsm.DeterministicStateMachine;
import net.sourceforge.anotherfsm.FsmException;
import net.sourceforge.anotherfsm.State;
import net.sourceforge.anotherfsm.StateMachine;
import net.sourceforge.anotherfsm.Transition;
import net.sourceforge.anotherfsm.logger.FsmLogger;
 
import org.apache.log4j.BasicConfigurator;
 
/**
 * Log a message using log4j library.
 * 
 * @author Michal Turek
 */
public class LoggerInjectionExample {
    static {
        // Register factory of loggers before any logger is created
        AnotherFsm.setLoggerFactory(new Log4jLoggerFactory());
 
        // Configure log4j somehow, this may be at the beginning of main()
        BasicConfigurator.configure();
    }
 
    /** The logger object for this class. */
    private final static FsmLogger logger = AnotherFsm
            .getLogger(LoggerInjectionExample.class);
 
    /**
     * The application start function.
     * 
     * @param args
     *            the input arguments, unused
     */
    public static void main(String[] args) {
        // Log something using the log4j wrapper
        logger.info("Hello world.");
 
        // Create state machine to demonstrate that log4j is used internally
        try (StateMachine machine = new DeterministicStateMachine("test")) {
            State state = new State("state");
            Transition transition = new Transition(state,
                    new ContainerEvent<String>("event"));
 
            machine.addState(state);
            machine.addTransition(transition);
            machine.setStartState(state);
 
            // Messages should be logged using log4j here
            machine.start();
            machine.process(new ContainerEvent<String>("event"));
        } catch (FsmException e) {
            // Process any exception that may occur
            logger.fatal("Unexpected exception occurred", e);
        }
 
        logger.debug("End of main()");
    }
}
 
Sample outputs
0 [main] INFO net.sourceforge.anotherfsm.examples.loggerinjection.LoggerInjectionExample  - Hello world.
13 [main] INFO net.sourceforge.anotherfsm.DeterministicStateMachine.test  - Transition started:  @INITIAL@ -> StartEvent -> state
14 [main] INFO net.sourceforge.anotherfsm.DeterministicStateMachine.test  - Transition finished: @INITIAL@ -> StartEvent -> state
14 [main] INFO net.sourceforge.anotherfsm.DeterministicStateMachine.test  - Transition started:  state -> ContainerEvent(event) -> state
14 [main] INFO net.sourceforge.anotherfsm.DeterministicStateMachine.test  - Transition finished: state -> ContainerEvent(event) -> state
14 [main] DEBUG net.sourceforge.anotherfsm.examples.loggerinjection.LoggerInjectionExample  - End of main()