package org.oddjob.framework;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.log4j.Logger;
import org.oddjob.arooa.ArooaConfigurationException;
import org.oddjob.arooa.life.ComponentPersistException;
import org.oddjob.logging.LogEnabled;
/**
* An abstract implementation of a component which provides common functionality to
* concrete sub classes.
*
* @author Rob Gordon
*/
public abstract class BasePrimary extends BaseComponent
implements LogEnabled {
/** provides a unique logger per component. */
private static final AtomicInteger instanceCount = new AtomicInteger();
/** The logger. */
private volatile Logger theLogger;
/**
* @oddjob.property
* @oddjob.description A name, can be any text.
* @oddjob.required No.
*/
private volatile String name;
/**
* Allow sub classes access to the logger.
*
* @return The logger.
*/
protected Logger logger() {
if (theLogger == null) {
theLogger = Logger.getLogger(this.getClass().getName()
+ "." + instanceCount.incrementAndGet());
}
return theLogger;
}
/**
* Called by sub classes to configure this component.
*
* @throws ArooaConfigurationException
*/
protected void configure()
throws ArooaConfigurationException {
configure(this);
}
/*
* (non-Javadoc)
* @see org.oddjob.framework.BaseComponent#save()
*/
protected void save() throws ComponentPersistException {
save(this);
}
/**
* Set the job name. Used by subclasses to set the job name.
*
* @param name The name of the job.
*/
synchronized public void setName(String name) {
stateHandler().assertAlive();
String old = this.name;
this.name = name;
firePropertyChange("name", old, name);
}
/**
* Get the job name.
*
* @return The job name.
*/
public String getName() {
return name;
}
/**
* @return Returns the logger.
*/
public String loggerName() {
return logger().getName();
}
/**
* Rename the logger. Used after de-serialisation.
*
* @param logger The logger to set.
*/
protected void logger(String logger) {
if (logger == null) {
return;
}
if (theLogger != null) {
theLogger.debug("Logger being replaced by [" + logger + "]");
}
theLogger = Logger.getLogger(logger);
}
/**
* Override toString.
*/
public String toString() {
if (getName() == null) {
return getClass().getSimpleName();
}
else {
return getName();
}
}
}