This is a JAVA PROGRAM: In this program, we make several extensions to our syste
ID: 3871507 • Letter: T
Question
This is a JAVA PROGRAM:
In this program, we make several extensions to our system:
>Add specialized toString() to Receiver.java and Transmitter.java
>Add a three message queue to the Receiver.java
>Define a logger to stdout for logging events
>Add JUnit unit testing for Transmitter.java, Receiver.java, Message.java
Transmitter.java modifications:
Modify Transmitter such that:
>one can connect a PrintLogger to it
>it send log entries to the connected PrintLogger (if any) for any actions that cause state changes and when sending a message
>it has a meaningful toString()
More specifically, the following methods should be added or modified to Transmitter:
>void addLog(PrintLogger printLogger) shall add a PrintLogger to the Transmitter.
>String toString() shall return a string consisting of “Transmitter(address)”.
>update other methods to add meaningful logging for any actions that cause state changes and when sending a message.
Receiver.java modifications:
Modify Receiver such that:
>one can connect a PrintLogger to it
>it send log entries to the connected PrintLogger (if any) for any actions that cause state changes
>it has a meaningful toString()
More specifically, the following methods should be added or modified to Receiver:
>void addLog(PrintLogger printLogger) shall add a PrintLogger to the Receiver.
>String toString() shall return a string consisting of “Receiver(address)”.
>update other methods to add meaningful logging for any actions that cause state changes.
Create a PrintLogger class:
>An I/O class for conditionally outputting strings to stdout. PrintLogger implements a concept of a level where nothing will print if the level of the request does not equal or exceed the level at which the printLogger is operating at.
--Constructor:
PrintLogger(int logLevel)
--Commands:
void setLogLevel(int newLogLevel);
where
>newLogLevel is the level that must be met or exceeded when the logger is asked to log (print) something
void log(int level, String logEntry);
where
>level is a value noting the type of the information where common values are given in the table below
>logEntry is a text to be part of the printed log
which prints a string to stdout if level is active. The printing routine will add a newline to the logEntry.
SO FAR THIS IS WHAT I GOT FOR: Message.java, Transmitter.java, and Receiver.java. I need to modifyTransmitter.java and Receiver.java as mention above with those requirements. Then this TestP3.java is the main class (It will connected message.java, transmitter.java, and receiver.java).
This is the code for Message.java:
public class Message {
private String message;
private String contentType = "text/plain";
private String source ="unset";
private String destination = "unset";
private static int count = 0;
private int messageUID= 10000;
public Message() {
this.message = "";
messageUID = messageUID + count;
count++;
}
public Message(String content) {
this.message = content;
messageUID = messageUID + count;
count++;
}
public long getUID() {
return messageUID;
}
public String getSource() {
return source;
}
public String getDestination() {
return destination;
}
@Override
public String toString() {
return message;
}
public String getType() {
return contentType;
}
public String dump() {
String lineSeparator = System.getProperty("line.separator");
return "UID: "+ messageUID+" " + "Source: "+ source+ " " + "Destination: " + destination + lineSeparator +
"ContentType:" +" "+ contentType + lineSeparator +
"Message:" + lineSeparator +
">>"+message+"<<";
}
public void setContent(String text) {
this.message = text;
}
public void setSource(String address) {
source = address;
}
public void setDestination(String address) {
destination = address;
}
}
This is the code so far for Receiver.java (but need to modify):
public class Receiver {
private String address;
private Message message;
private boolean status = false;
public Receiver() {
this.address = "unknown";
this.message = null;
}
public Receiver(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
public boolean overrun() {
return status;
}
public boolean available(){
return (message != null);
}
public void deliver(Message message){
if ( this.message != null){
status = true;
}
this.message = message;
}
public Message getMessage(){
Message m = message;
message = null;
return m;
}
public void reset() {
message = null;
status = false;
}
}
This is the code so far for Transmitter.java (but need to modify):
public class Transmitter {
private Receiver linkReceiver = null;
private String address;
public Transmitter(){
this.address = "unknown";
}
public Transmitter(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
public void connect(Receiver receiver) {
this.linkReceiver = receiver;
}
public void send(Message message) {
if ( linkReceiver != null) {
message.setDestination( linkReceiver.getAddress());
message.setSource(address);
linkReceiver.deliver(message);
}
}
public void disconnect(){
linkReceiver = null;
}
}
This is the code for TestP3.java (this is the main class and connect message, receiver and transmitter):
public class TestP3 {
public static void main(String[] args) {
PrintLogger logger = new PrintLogger();
Transmitter t1 = new Transmitter("tx");
t1.addLog(logger);
Receiver r1 = new Receiver("rx");
r1.addLog(logger);
Message m1 = new Message();
Message m2 = new Message("m2 contents");
Message m3 = new Message("m3 contents");
// check Messages (left to guarantee start at 10000)
passFail(m1.getUID() == 10000, "test1");
for (int i = 0; i < 2; i++ ) {
if ( i == 1 ) {
logger.setLogLevel(PrintLogger.ERROR);
System.out.println("Second pass, log only errors ********");
}
/*
*
* UID: nnnnn Source: sourceaddr destination: destaddr
* ContentType: text/plain
* Message:
* Text of message
*
*/
String lineSeparator = System.getProperty("line.separator");
String messageDump
= "UID: 10001 Source: unset Destination: unset" + lineSeparator
+ "ContentType: text/plain" + lineSeparator
+ "Message:" + lineSeparator
+ ">>m2 contents<<";
String mDump = m2.dump();
if ( i == 0 ) {
passFail(mDump.equals(messageDump), "test2");
}
// send before connecting a transmitter
t1.send(m3);
// connect r1 to t1 and send a message
t1.connect(r1);
t1.send(m2);
Message m = r1.getMessage();
messageDump
= "UID: 10001 Source: tx Destination: rx" + lineSeparator
+ "ContentType: text/plain" + lineSeparator
+ "Message:" + lineSeparator
+ ">>m2 contents<<";
mDump = m.dump();
passFail(mDump.equals(messageDump), "test3");
// check overrun behavior followed by reset
t1.send(m2);
t1.send(m3);
t1.send(m3);
t1.send(m3);
passFail(r1.overrun(), "test4");
r1.reset();
passFail(!r1.overrun(), "test5");
passFail(r1.getMessage() == null, "test6");
t1.disconnect();
}
}
// Helper function to print results of test
private static void passFail(boolean test, String name) {
System.out.println("Test " + name + (test ? " passes" : " fails"));
}
}
After run TestP3.java, this should be the expected output:
Test test1 passes
Test test2 passes
Transmitter(tx): no connected receiver.
Transmitter(tx): connected receiver: Receiver(rx)
Receiver(rx): delivery of message: m2 contents
Transmitter(tx): sending message to Receiver(rx)
Transmitter(tx): delivering message: m2 contents
Receiver(rx): retrieving message: m2 contents
Test test3 passes
Receiver(rx): delivery of message: m2 contents
Transmitter(tx): sending message to Receiver(rx)
Transmitter(tx): delivering message: m2 contents
Receiver(rx): delivery of message: m3 contents
Transmitter(tx): sending message to Receiver(rx)
Transmitter(tx): delivering message: m3 contents
Receiver(rx): delivery of message: m3 contents
Transmitter(tx): sending message to Receiver(rx)
Transmitter(tx): delivering message: m3 contents
Receiver(rx): overrun caused by delivery of message: m3 contents
Transmitter(tx): sending message to Receiver(rx)
Transmitter(tx): delivering message: m3 contents
Test test4 passes
Receiver(rx): reseting
Test test5 passes
Receiver(rx): attempt to get non-existent message
Test test6 passes
Transmitter(tx): Receiver(rx) disconnected.
Second pass, log only errors ********
Transmitter(tx): no connected receiver.
Test test3 passes
Receiver(rx): overrun caused by delivery of message: m3 contents
Test test4 passes
Test test5 passes
Receiver(rx): attempt to get non-existent message
Test test6 passes
**NOTE: I just need to modify (as in adding some more code to the Transmitter.java and Receiver.java) and create PrintLogger class. This is just a beginner java course
Explanation / Answer
package org.smpp;
import java.io.IOException;
import org.smpp.pdu.GenericNack;
import org.smpp.pdu.InvalidPDUException;
import org.smpp.pdu.PDU;
import org.smpp.pdu.PDUException;
import org.smpp.pdu.UnknownCommandIdException;
import org.smpp.util.Queue;
import org.smpp.util.Unprocessed;
public class Receiver extends ReceiverBase {
private static final String RECEIVER_THREAD_NAME = "Receiver";
private Transmitter transmitter = null;
private Connection connection = null;
private Queue pduQueue = new Queue();
private long queueWaitTimeout = Data.QUEUE_TIMEOUT;
private boolean receiver = false;
private Unprocessed unprocessed = new Unprocessed();
private ServerPDUEventListener pduListener = null;
private boolean asynchronous = false;
private boolean automaticNack = true;
public Receiver(Connection connection) {
this.connection = connection;
}
public Receiver(Transmitter transmitter, Connection connection) {
this.transmitter = transmitter;
this.connection = connection;
}
public boolean isReceiver() {
return receiver;
}
public synchronized void setServerPDUEventListener(ServerPDUEventListener pduListener) {
this.pduListener = pduListener;
this.asynchronous = pduListener != null;
if (asynchronous) {
PDU pdu;
int queueSize;
synchronized (pduQueue) {
queueSize = pduQueue.size();
for (int i = 0; i < queueSize; i++) {
pdu = (PDU) pduQueue.dequeue();
process(pdu);
}
}
}
}
public void start() {
debug.write(DRXTX, "Receiver starting");
receiver = true;
unprocessed.reset();
super.start();
debug.write(DRXTX, "Receiver started");
}
public void stop() {
debug.write(DRXTX, "Receiver stoping");
if (isReceiver()) {
super.stop();
receiver = false;
}
debug.write(DRXTX, "Receiver stoped");
}
public synchronized PDU receive(long timeout)
throws UnknownCommandIdException, TimeoutException, NotSynchronousException, PDUException, IOException {
PDU pdu = null;
if (!asynchronous) {
pdu = tryReceivePDUWithTimeout(connection, null, timeout);
}
return pdu;
}
public synchronized PDU receive(PDU expectedPDU)
throws UnknownCommandIdException, TimeoutException, NotSynchronousException, PDUException, IOException {
PDU pdu = null;
if (!asynchronous) {
pdu = tryReceivePDUWithTimeout(connection, expectedPDU);
}
return pdu;
}
protected PDU tryReceivePDU(Connection connection, PDU expectedPDU)
throws UnknownCommandIdException, TimeoutException, PDUException, IOException {
PDU pdu = null;
if (receiver) {
debug.write(DRXTXD2, "Is receiver/transciever => trying to get from queue.");
synchronized (pduQueue) {
if (expectedPDU == null) { // i.e. any pdu is acceptable
if (!pduQueue.isEmpty()) {
pdu = (PDU) pduQueue.dequeue();
}
} else {
pdu = (PDU) pduQueue.dequeue(expectedPDU);
}
if (pdu == null) {
try {
pduQueue.wait(getQueueWaitTimeout());
} catch (InterruptedException e) {
// we don't care
debug.write(DRXTX, "tryReceivePDU got interrupt waiting for queue");
}
}
}
} else {
debug.write(DRXTX, "Is transmitter trying to receive from connection.");
pdu = receivePDUFromConnection(connection, unprocessed);
if (pdu != null) {
if ((expectedPDU == null) || !pdu.equals(expectedPDU)) {
debug.write(DRXTX, "This is not the pdu we expect, processing" + pdu.debugString());
enqueue(pdu);
pdu = null;
}
}
}
return pdu;
}
protected void receiveAsync() {
PDU pdu = null;
try {
debug.write(DRXTXD2, "Receiver.receiveAsync() going to receive pdu.");
pdu = receivePDUFromConnection(connection, unprocessed);
} catch (InvalidPDUException e) {
event.write(e, "Receiver.receiveAsync(): received PDU is invalid.");
PDU expdu = e.getPDU();
int seqNr = expdu == null ? 0 : expdu.getSequenceNumber();
if(automaticNack) {
sendGenericNack(Data.ESME_RINVMSGLEN, seqNr);
} else {
pdu = new GenericNack(Data.ESME_RINVMSGLEN, seqNr);
}
} catch (UnknownCommandIdException e) {
// if received unknown pdu, we must send generic nack
event.write(e, "Receiver.receiveAsync(): Unknown command id.");
if(automaticNack) {
sendGenericNack(Data.ESME_RINVCMDID, e.getSequenceNumber());
} else {
pdu = new GenericNack(Data.ESME_RINVCMDID, e.getSequenceNumber());
}
} catch (TimeoutException e) {
// too long had unprocessed data
debug.write(DRXTX, "Receiver.receiveAsync() too long had an uncomplete message.");
} catch (PDUException e) {
// something wrong with the PDU
event.write(e, "Receiver.receiveAsync()");
PDU expdu = e.getPDU();
int seqNr = expdu == null ? 0 : expdu.getSequenceNumber();
if(automaticNack) {
sendGenericNack(e.getErrorCode(), seqNr);
} else {
pdu = new GenericNack(e.getErrorCode(), seqNr);
}
} catch (Exception e) {
// don't know what happen, let's end the show
event.write(e, "Receiver.receiveAsync()");
stopProcessing(e);
}
if (pdu != null) {
debug.write(DRXTX, "Receiver.receiveAsync(): PDU received, processing " + pdu.debugString());
if (asynchronous) {
process(pdu);
} else {
enqueue(pdu);
}
}
}
private void process(PDU pdu) {
debug.write(DRXTX, "receiver passing pdu to ServerPDUEventListener");
if (pduListener != null) {
ServerPDUEvent pduReceived = new ServerPDUEvent(this, connection, pdu);
pduListener.handleEvent(pduReceived);
debug.write(DRXTX, "ServerPDUEventListener received pdu");
} else {
debug.write(
DRXTX,
"async receiver doesn't have ServerPDUEventListener, " + "discarding " + pdu.debugString());
}
}
private void enqueue(PDU pdu) {
debug.write(DRXTX, "receiver enqueuing pdu.");
synchronized (pduQueue) {
pduQueue.enqueue(pdu);
pduQueue.notifyAll();
}
// HNK -- If you just received unbind_resp, don't block on
// socket in TCPIPConnection.receive(), call stopProcessing()
if (Data.UNBIND_RESP == pdu.getCommandId()) {
stopProcessing(null);
}
}
private void sendGenericNack(int commandStatus, int sequenceNumber) {
if (transmitter != null) {
try {
GenericNack gnack = new GenericNack(commandStatus, sequenceNumber);
transmitter.send(gnack);
} catch (IOException gnacke) {
event.write(gnacke, "Receiver.run(): IOException sending generic_nack.");
} catch (Exception gnacke) {
event.write(gnacke, "Receiver.run(): an exception sending generic_nack.");
stopProcessing(gnacke);
}
}
}
public void setQueueWaitTimeout(long timeout) {
queueWaitTimeout = timeout;
}
public long getQueueWaitTimeout() {
return queueWaitTimeout;
}
// ProcessingThread's getThreadName override
public String getThreadName() {
return RECEIVER_THREAD_NAME;
}
public void setAutomaticNack(boolean automaticNack) {
this.automaticNack = automaticNack;
}
public boolean isAutomaticNack() {
return automaticNack;
}
}
import javax.sound.midi.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class Main {
public static Sequencer sequencer;
public static Sequence sequence;
public static Receiver synthRcvr;
public static Transmitter seqTrans;
public static void main(String[] args) {
try {
sequencer = MidiSystem.getSequencer();
sequence = MidiSystem.getSequence(new File("test.midi"));
seqTrans = sequencer.getTransmitter();
synthRcvr = sequencer.getReceiver();
seqTrans.setReceiver(synthRcvr);
sequencer.open();
sequencer.setSequence(sequence);
sequencer.start();
} catch (IOException | MidiUnavailableException | InvalidMidiDataException e) {
System.out.println(e);
}
}
import javax.sound.midi.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class Main {
public static Receiver synthRcvr = new CustomReceiver();
public static Transmitter seqTrans;
public static Synthesizer synth;
public static void main(String[] args) {
try {
sequencer = MidiSystem.getSequencer();
sequence = MidiSystem.getSequence(new File("test.midi"));
Sequencer sequencer = MidiSystem.getSequencer();
seqTrans = sequencer.getTransmitter();
seqTrans.setReceiver(synthRcvr);
sequencer.open();
sequencer.setSequence(sequence);
sequencer.start();
} catch (IOException | MidiUnavailableException | InvalidMidiDataException e) {
System.out.println(e);
}
}
import javax.sound.midi.MidiMessage;
import javax.sound.midi.Receiver;
public class CustomReceiver implements Receiver {
public CustomReceiver() {
}
@Override
public void send(MidiMessage message, long timeStamp) {
// Process midi messages here
}
@Override
public void close() {
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.