strolch-plc/plc-gw-server/src/main/java/li/strolch/plc/gw/server/policy/execution/PlcExecutionPolicy.java

147 lines
4.3 KiB
Java

package li.strolch.plc.gw.server.policy.execution;
import static li.strolch.model.StrolchModelConstants.BAG_PARAMETERS;
import static li.strolch.model.log.LogMessageState.*;
import static li.strolch.plc.gw.server.PlcGwSrvI18n.*;
import static li.strolch.plc.model.PlcConstants.PARAM_PLC_ID;
import static li.strolch.runtime.StrolchConstants.SYSTEM_USER_AGENT;
import java.util.HashSet;
import java.util.Set;
import li.strolch.execution.ExecutionHandler;
import li.strolch.execution.policy.SimpleExecution;
import li.strolch.model.activity.Action;
import li.strolch.model.log.LogMessage;
import li.strolch.model.log.LogMessageState;
import li.strolch.model.log.LogSeverity;
import li.strolch.model.parameter.StringParameter;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.plc.gw.server.PlcAddressResponseListener;
import li.strolch.plc.gw.server.PlcGwServerHandler;
import li.strolch.plc.gw.server.PlcGwSrvI18n;
import li.strolch.plc.gw.server.PlcNotificationListener;
import li.strolch.plc.model.PlcAddressKey;
import li.strolch.plc.model.PlcAddressResponse;
public abstract class PlcExecutionPolicy extends SimpleExecution
implements PlcNotificationListener, PlcAddressResponseListener {
protected PlcGwServerHandler plcHandler;
protected Set<PlcAddressKey> registeredKeys;
private String plcId;
public PlcExecutionPolicy(StrolchTransaction tx) {
super(tx);
this.registeredKeys = new HashSet<>();
}
protected String getPlcId() {
return this.plcId;
}
@Override
public void initialize(Action action) {
super.initialize(action);
StringParameter plcIdP = action.findParameter(BAG_PARAMETERS, PARAM_PLC_ID, true);
this.plcId = plcIdP.getValue();
this.plcHandler = getComponent(PlcGwServerHandler.class);
}
public String getActionType() {
return this.actionType;
}
protected void register(PlcAddressKey key) {
this.plcHandler.register(getPlcId(), key, this);
this.registeredKeys.add(key);
}
protected void unregisterAll() {
this.registeredKeys.forEach(k -> this.plcHandler.unregister(getPlcId(), k, this));
}
@Override
protected void handleStopped() {
unregisterAll();
super.handleStopped();
}
protected boolean isPlcConnected() {
return this.plcHandler.isPlcConnected(getPlcId());
}
protected boolean assertPlcConnected() {
if (this.plcHandler.isPlcConnected(getPlcId()))
return true;
toError(msgPlcNotConnected());
return false;
}
protected boolean assertResponse(PlcAddressResponse response) {
if (response.getState().isFailed()) {
toError(msgFailedToSendMessage(response));
return false;
}
return true;
}
protected void send(PlcAddressKey key, boolean value) {
this.plcHandler.sendMessage(key, getPlcId(), value, this);
}
protected void send(PlcAddressKey key, int value) {
this.plcHandler.sendMessage(key, getPlcId(), value, this);
}
protected void send(PlcAddressKey key, double value) {
this.plcHandler.sendMessage(key, getPlcId(), value, this);
}
protected void send(PlcAddressKey key, String value) {
this.plcHandler.sendMessage(key, getPlcId(), value, this);
}
protected void send(PlcAddressKey key) {
this.plcHandler.sendMessage(key, getPlcId(), this);
}
@Override
public void handleResponse(PlcAddressResponse response) throws Exception {
assertResponse(response);
}
@Override
public abstract void handleNotification(PlcAddressKey key, Object value) throws Exception;
@Override
public void handleConnectionLost() {
toError(msgConnectionLostToPlc());
}
protected LogMessage msgPlcNotConnected() {
return new LogMessage(this.realm, getLogMessageUsername(), this.actionLoc, LogSeverity.Error, Information,
bundle, "execution.plc.notConnected").value("plc", getPlcId());
}
protected String getLogMessageUsername() {
return SYSTEM_USER_AGENT;
}
protected LogMessage msgFailedToSendMessage(PlcAddressResponse response) {
PlcAddressKey key = response.getPlcAddressKey();
return new LogMessage(this.realm, getLogMessageUsername(), this.actionLoc, LogSeverity.Error, Information,
bundle, "execution.plc.sendMessage.failed") //
.value("plc", getPlcId()) //
.value("key", key) //
.value("msg", response.getStateMsg());
}
protected LogMessage msgConnectionLostToPlc() {
return new LogMessage(this.realm, getLogMessageUsername(), this.actionLoc, LogSeverity.Error, Information,
bundle, "execution.plc.connectionLost").value("plc", getPlcId());
}
}