You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
4.3 KiB
175 lines
4.3 KiB
package de.srsoftware.web4rail.actions; |
|
|
|
import java.util.HashMap; |
|
import java.util.List; |
|
import java.util.Map.Entry; |
|
import java.util.TreeMap; |
|
|
|
import org.json.JSONObject; |
|
import org.slf4j.Logger; |
|
import org.slf4j.LoggerFactory; |
|
|
|
import de.keawe.tools.translations.Translation; |
|
import de.srsoftware.tools.Tag; |
|
import de.srsoftware.web4rail.Application; |
|
import de.srsoftware.web4rail.BaseClass; |
|
import de.srsoftware.web4rail.Plan.Direction; |
|
import de.srsoftware.web4rail.Route; |
|
import de.srsoftware.web4rail.Window; |
|
import de.srsoftware.web4rail.moving.Train; |
|
import de.srsoftware.web4rail.tags.Label; |
|
import de.srsoftware.web4rail.tags.Select; |
|
import de.srsoftware.web4rail.tiles.Block; |
|
import de.srsoftware.web4rail.tiles.Contact; |
|
|
|
/** |
|
* Base Class for all other actions |
|
* @author Stephan Richter, SRSoftware |
|
* |
|
*/ |
|
public abstract class Action extends BaseClass { |
|
private static final HashMap<Integer,Action> actions = new HashMap<Integer, Action>(); |
|
public static final Logger LOG = LoggerFactory.getLogger(Action.class); |
|
private static final String PREFIX = Action.class.getPackageName(); |
|
protected int id; |
|
|
|
public static class Context { |
|
public Contact contact = null; |
|
public Route route = null; |
|
public Train train = null; |
|
public Block block = null; |
|
public Direction direction = null; |
|
|
|
public Context(Contact c) { |
|
contact = c; |
|
setRoute(contact.route()); |
|
} |
|
|
|
public Context(Train train) { |
|
setTrain(train); |
|
} |
|
|
|
public Context(Route route) { |
|
setRoute(route); |
|
} |
|
|
|
private void setRoute(Route route) { |
|
this.route = route; |
|
if (isSet(route)) setTrain(route.train); |
|
|
|
} |
|
|
|
private void setTrain(Train train) { |
|
this.train = train; |
|
if (isSet(train)) { |
|
if (isNull(route)) route = train.route; |
|
setBlock(train.currentBlock()); |
|
setDirection(train.direction()); |
|
} |
|
} |
|
|
|
private void setDirection(Direction dir) { |
|
direction = dir; |
|
} |
|
|
|
private void setBlock(Block block) { |
|
this.block = block; |
|
} |
|
|
|
@Override |
|
public String toString() { |
|
StringBuffer sb = new StringBuffer(getClass().getSimpleName()); |
|
sb.append("("); |
|
sb.append(t("Train: {}",train)); |
|
if (isSet(route)) sb.append(", "+t("Route: {}",route)); |
|
if (isSet(contact)) sb.append(", "+t("Contact: {}",contact)); |
|
sb.append(")"); |
|
return sb.toString(); |
|
} |
|
} |
|
|
|
public Action() { |
|
id = Application.createId(); |
|
actions.put(id, this); |
|
} |
|
|
|
public static Action create(String type) { |
|
try { |
|
return (Action) Class.forName(PREFIX+"."+type).getDeclaredConstructor().newInstance(); |
|
} catch (Exception e) { |
|
e.printStackTrace(); |
|
} |
|
return null; |
|
} |
|
|
|
public boolean equals(Action other) { |
|
return this.toString().equals(other.toString()); |
|
} |
|
|
|
public abstract boolean fire(Context context); |
|
|
|
public static Action get(int actionId) { |
|
return actions.get(actionId); |
|
} |
|
|
|
public int id() { |
|
return id; |
|
} |
|
|
|
public JSONObject json() { |
|
return new JSONObject().put(TYPE, getClass().getSimpleName()); |
|
} |
|
|
|
public static List<Class<? extends Action>> list() { |
|
return List.of( |
|
ConditionalAction.class, |
|
DelayedAction.class, |
|
DetermineTrainInBlock.class, |
|
FinishRoute.class, |
|
SendCommand.class, |
|
SetPower.class, |
|
SetRelay.class, |
|
SetSignal.class, |
|
SetSpeed.class, |
|
ShowText.class, |
|
StopAllTrains.class, |
|
StopAuto.class, |
|
TriggerContact.class, |
|
TurnTrain.class |
|
); |
|
} |
|
|
|
public Action load(JSONObject json) { |
|
return this; |
|
} |
|
|
|
public static Tag selector() { |
|
Select select = new Select(TYPE); |
|
TreeMap<String, String> names = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER); |
|
|
|
for (Class<? extends Action> clazz : Action.list()) { |
|
String s = t(clazz.getSimpleName()); |
|
names.put(s, clazz.getSimpleName()); |
|
} |
|
|
|
for (Entry<String, String> entry : names.entrySet()) select.addOption(entry.getValue(), entry.getKey()); |
|
return select.addTo(new Label(t("Action type:")+NBSP)); |
|
} |
|
|
|
public Window properties(HashMap<String, String> params) { |
|
return new Window("action-props-"+id, t("Properties of {}",this.getClass().getSimpleName())); |
|
} |
|
|
|
protected static String t(String tex,Object...fills) { |
|
return Translation.get(Application.class, tex, fills); |
|
} |
|
|
|
@Override |
|
public String toString() { |
|
return t(getClass().getSimpleName()); |
|
} |
|
|
|
protected Object update(HashMap<String, String> params) { |
|
return t("Nothing changed"); |
|
} |
|
}
|
|
|