1 package org.sim0mq.message.federatestarter; 2 3 import org.djutils.exceptions.Throw; 4 import org.sim0mq.Sim0MQException; 5 import org.sim0mq.message.Sim0MQMessage; 6 7 /** 8 * FederateKilled, FS.4. Message sent by the Federate Starter to the Federation Manager in response to message FM.8. 9 * <p> 10 * Copyright (c) 2016-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br> 11 * BSD-style license. See <a href="http://sim0mq.org/docs/current/license.html">Sim0MQ License</a>. 12 * </p> 13 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 14 */ 15 public class FS4FederateKilledMessage extends Sim0MQMessage 16 { 17 /** */ 18 private static final long serialVersionUID = 20170422L; 19 20 /** The sender id of the model that was started and now has to be terminated. */ 21 private final Object instanceId; 22 23 /** Did the termination of the model succeed? */ 24 private final boolean status; 25 26 /** If there was an error, the error message is sent as well. Otherwise this field is an empty string. */ 27 private final String error; 28 29 /** the unique message id. */ 30 private static final String MESSAGETYPE = "FS.4"; 31 32 /** 33 * @param federationId the federation id can be coded using different types. Examples are two 64-bit longs indicating a 34 * UUID, or a String with a UUID number, a String with meaningful identification, or a short or an int with a 35 * simulation run number. 36 * @param senderId The sender id can be used to send back a message to the sender at some later time. 37 * @param receiverId The receiver id can be used to check whether the message is meant for us, or should be discarded (or an 38 * error can be sent if we receive a message not meant for us). 39 * @param messageId The unique message number is meant to confirm with a callback that the message has been received 40 * correctly. The number is unique for the sender, so not globally within the federation. 41 * @param instanceId The sender id of the model that was killed or had an error while killing. This is exactly the same as 42 * the instanceId sent by the Federation Manager in the KillFederate message. 43 * @param status Did the termination of the model succeed? 44 * @param error If there was an error with the model termination, the error message is sent as well. Otherwise this field is 45 * an empty string. 46 * @throws Sim0MQException on unknown data type 47 * @throws NullPointerException when one of the parameters is null 48 */ 49 public FS4FederateKilledMessage(final Object federationId, final Object senderId, final Object receiverId, 50 final Object messageId, final Object instanceId, final boolean status, final String error) 51 throws Sim0MQException, NullPointerException 52 { 53 this(new Object[] {Sim0MQMessage.VERSION, true, federationId, senderId, receiverId, MESSAGETYPE, messageId, 3, 54 instanceId, status, error}); 55 } 56 57 /** 58 * @param objectArray Object[]; the fields that constitute the message 59 * @throws Sim0MQException on unknown data type 60 * @throws NullPointerException when one of the parameters is null 61 */ 62 public FS4FederateKilledMessage(final Object[] objectArray) throws Sim0MQException, NullPointerException 63 { 64 super(objectArray, 3, MESSAGETYPE); 65 this.instanceId = objectArray[8]; 66 Throw.when(!(objectArray[9] instanceof Boolean), Sim0MQException.class, "status (field 9) should be a Boolean"); 67 this.status = ((Boolean) objectArray[9]).booleanValue(); 68 Throw.when(!(objectArray[10] instanceof String), Sim0MQException.class, "error (field 10) should be a String"); 69 this.error = objectArray[10].toString(); 70 } 71 72 /** 73 * @return instanceId 74 */ 75 public Object getInstanceId() 76 { 77 return this.instanceId; 78 } 79 80 /** 81 * @return status 82 */ 83 public boolean isStatus() 84 { 85 return this.status; 86 } 87 88 /** 89 * @return error 90 */ 91 public String getError() 92 { 93 return this.error; 94 } 95 96 /** 97 * @return messagetype 98 */ 99 public static final String getMessageType() 100 { 101 return MESSAGETYPE; 102 } 103 104 /** 105 * Builder for the FederateStarted Message. Can string setters together, and call build() at the end to build the actual 106 * message. 107 * <p> 108 * Copyright (c) 2016-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 109 * <br> 110 * BSD-style license. See <a href="http://sim0mq.org/docs/current/license.html">Sim0MQ License</a>. 111 * </p> 112 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 113 */ 114 public static class Builder extends Sim0MQMessage.Builder<FS4FederateKilledMessage.Builder> 115 { 116 /** 117 * The sender id of the model that was started or had an error while starting. This is exactly the same as the 118 * instanceId sent by the Federation Manager in the StartFederate message. 119 */ 120 private String instanceId; 121 122 /** Did the termination of the model succeed? */ 123 private boolean status; 124 125 /** If there was an error, the error message is sent as well. Otherwise this field is an empty string. */ 126 private String error; 127 128 /** 129 * Empty constructor. 130 */ 131 public Builder() 132 { 133 // nothing to do. 134 } 135 136 /** 137 * @param newInstanceId set instanceId 138 * @return the original object for chaining 139 */ 140 public final Builder setInstanceId(final String newInstanceId) 141 { 142 this.instanceId = newInstanceId; 143 return this; 144 } 145 146 /** 147 * @param newStatus set status 148 * @return the original object for chaining 149 */ 150 public final Builder setStatus(final boolean newStatus) 151 { 152 this.status = newStatus; 153 return this; 154 } 155 156 /** 157 * @param newError set error 158 * @return the original object for chaining 159 */ 160 public final Builder setError(final String newError) 161 { 162 this.error = newError; 163 return this; 164 } 165 166 @Override 167 public FS4FederateKilledMessage build() throws Sim0MQException, NullPointerException 168 { 169 return new FS4FederateKilledMessage(this.federationId, this.senderId, this.receiverId, this.messageId, 170 this.instanceId, this.status, this.error); 171 } 172 173 } 174 }