package envoy.client; import java.time.Instant; import java.util.Arrays; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Response; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import envoy.schema.Message; import envoy.schema.Message.MetaData.MessageState; import envoy.schema.Messages; import envoy.schema.ObjectFactory; import envoy.schema.User; import envoy.schema.Users; /** * Project: envoy-client
* File: Client.java
* Created: 28 Sep 2019
* * @author Kai S. K. Engelbart * @author Maximilian Käfer * @author Leon Hofmeister * @since Envoy 0.1 */ public class Client { private ObjectFactory objectFactory = new ObjectFactory(); private DatatypeFactory datatypeFactory; private Config config; private User user; public Client(Config config, String username) { this.config = config; try { datatypeFactory = DatatypeFactory.newInstance(); } catch (DatatypeConfigurationException e) { e.printStackTrace(); } user = getUser(username); System.out.printf("Mein Name ist %s und ich habe die ID %d%n", user.getName(), user.getID()); } /** * Sends a message with text content to the server.
* Because sending a request is a blocking operation, it is executed * asynchronously. * * @param sender Name of the sender * @param recipient Name of the recipient * @param textContent Content (text) of the message */ public void sendMessage(Message message) { new Thread(() -> { // Wrap single message into messages list Messages messages = wrapMessage(message); // Print message XML to console JAXBContext jc; try { jc = JAXBContext.newInstance("envoy.schema"); Marshaller m = jc.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); m.marshal(messages, System.out); } catch (JAXBException e) { e.printStackTrace(); } // Send message javax.ws.rs.client.Client client = ClientBuilder.newClient(); WebTarget target = client .target(String.format("%s:%d/envoy-server/rest/message/send", config.getServer(), config.getPort())); Response response = target.request().post(Entity.entity(messages, "application/xml")); System.out.println("Response code: " + response.getStatus()); response.close(); client.close(); }).start(); } /** * Creates a {@link Message} object serializable to XML. * * @param senderID The ID of the sender * @param recipientID The ID of the recipient * @param textContent The content (text) of the message * @return Prepared {@link Message} object */ public Message createMessage(long senderID, long recipientID, String textContent) { Message.MetaData metaData = objectFactory.createMessageMetaData(); metaData.setSender(senderID); metaData.setRecipient(recipientID); metaData.setState(MessageState.WAITING); metaData.setDate(datatypeFactory.newXMLGregorianCalendar(Instant.now().toString())); Message.Content content = objectFactory.createMessageContent(); content.setType("text"); content.setText(textContent); Message message = objectFactory.createMessage(); message.setMetaData(metaData); message.getContent().add(content); return message; } public Messages wrapMessage(Message... messages) { Messages wrapper = objectFactory.createMessages(); wrapper.getMessage().addAll(Arrays.asList(messages)); return wrapper; } public Users getUsersListXml() { javax.ws.rs.client.Client client = ClientBuilder.newClient(); WebTarget target = client .target(String.format("%s:%d/envoy-server/rest/user", config.getServer(), config.getPort())); Response response = target.request("application/xml").get(); Users users = response.readEntity(Users.class); System.out.println("Response code: " + response.getStatus()); response.close(); client.close(); return users; } /** * Returns the user by name. * * @param name - the name of the user * @return an user object * @since Envoy 0.1 */ private User getUser(String name) { javax.ws.rs.client.Client client = ClientBuilder.newClient(); WebTarget target = client .target(String.format("%s:%d/envoy-server/rest/user/sender?name=" + name, config.getServer(), config.getPort())); Response response = target.request("application/xml").get(); Users users = response.readEntity(Users.class); System.out.println("Response code: " + response.getStatus()); response.close(); client.close(); return users.getUser().get(0); } }