/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.commons.gui.protocol;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import de.cismet.commons.gui.protocol.listener.ProtocolStepListener;
import de.cismet.commons.gui.protocol.listener.ProtocolStepListenerEvent;
/**
* DOCUMENT ME!
*
* @author jruiz
* @version $Revision$, $Date$
*/
@Getter
@Setter
public abstract class AbstractProtocolStep implements ProtocolStep {
//~ Static fields/initializers ---------------------------------------------
private static final transient org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(
AbstractProtocolStep.class);
protected static final transient ObjectMapper MAPPER = new ObjectMapper();
//~ Instance fields --------------------------------------------------------
@Setter(AccessLevel.PACKAGE)
@JsonIgnore private transient boolean isInited;
@JsonProperty(required = true)
private ProtocolStepMetaInfo metaInfo;
@JsonProperty(required = true)
private Date date;
@Getter(AccessLevel.PRIVATE)
private final transient ProtocolStepListenerHandler listenerHandler = new ProtocolStepListenerHandler();
//~ Constructors -----------------------------------------------------------
/**
* Creates a new AbstractProtocolStep object.
*/
protected AbstractProtocolStep() {
this.metaInfo = createMetaInfo();
this.date = new Date();
}
//~ Methods ----------------------------------------------------------------
@Override
public void init() {
setInited(false);
initParameters();
setInited(true);
fireParametersChanged(new ProtocolStepListenerEvent(this));
}
/**
* Is called before visualize() is called. E.g constructut and set serializable object properties (those annotated
* with @JsonProperty)
*/
public void initParameters() {
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
protected abstract ProtocolStepMetaInfo createMetaInfo();
@Override
public String toJsonString() throws JsonProcessingException {
synchronized (MAPPER) {
return MAPPER.writeValueAsString(this);
}
}
/**
* DOCUMENT ME!
*
* @param jsonString DOCUMENT ME!
* @param protocolStep DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IOException DOCUMENT ME!
*/
public static ProtocolStep fromJsonString(final String jsonString,
final Class<? extends AbstractProtocolStep> protocolStep) throws IOException {
synchronized (MAPPER) {
return (AbstractProtocolStep)MAPPER.readValue(jsonString, protocolStep);
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public ProtocolStepConfiguration getConfiguration() {
if ((getMetaInfo() != null) && (getMetaInfo().getKey() != null)) {
return ProtocolHandler.getInstance().getProtocolStepConfiguration(getMetaInfo().getKey());
} else {
return null;
}
}
@Override
public abstract AbstractProtocolStepPanel visualize();
@Override
public boolean addProtocolStepListener(final ProtocolStepListener listener) {
return listenerHandler.addProtocolStepListener(listener);
}
@Override
public boolean removeProtocolStepListener(final ProtocolStepListener listener) {
return listenerHandler.removeProtocolStepListener(listener);
}
/**
* DOCUMENT ME!
*
* @param event DOCUMENT ME!
*/
protected void fireParametersChanged(final ProtocolStepListenerEvent event) {
listenerHandler.parametersChanged(event);
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
class ProtocolStepListenerHandler implements ProtocolStepListener {
//~ Instance fields ----------------------------------------------------
private final Collection<ProtocolStepListener> listeners = new ArrayList<ProtocolStepListener>();
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param listener DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean addProtocolStepListener(final ProtocolStepListener listener) {
return listeners.add(listener);
}
/**
* DOCUMENT ME!
*
* @param listener DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean removeProtocolStepListener(final ProtocolStepListener listener) {
return listeners.remove(listener);
}
@Override
public void parametersChanged(final ProtocolStepListenerEvent event) {
for (final ProtocolStepListener listener : listeners) {
listener.parametersChanged(event);
}
}
}
}