diff --git a/pom.xml b/pom.xml
index 731ccfc951c5fc345dee53d5a75e9c164836f067..1dce8a8ddae448a08eb9d04d75847638ad966530 100644
--- a/pom.xml
+++ b/pom.xml
@@ -177,6 +177,12 @@
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
+</dependency>
+<dependency>
+ <groupId>org.postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <version>9.4-1206-jdbc42</version>
+ <scope>provided</scope>
</dependency>
</dependencies>
diff --git a/src/main/java/no/nibio/vips/logic/messaging/MessageRecipient.java b/src/main/java/no/nibio/vips/logic/messaging/MessageRecipient.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d229880eca1ef256110d5f8105b219cbe3753d3
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/messaging/MessageRecipient.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2015 NIBIO <http://www.nibio.no/>.
+ *
+ * This file is part of VIPSLogic.
+ * VIPSLogic is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ *
+ * VIPSLogic is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * NIBIO Open Source License for more details.
+ *
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSLogic. If not, see <http://www.nibio.no/licenses/>.
+ *
+ */
+
+package no.nibio.vips.logic.messaging;
+
+/**
+ * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+public class MessageRecipient {
+ private String type;
+ private String msgDeliveryAddress;
+ private String name;
+ private String recipientId;
+
+ public MessageRecipient(
+ String recipientId,
+ String name,
+ String type,
+ String msgDeliveryAddress
+ )
+ {
+ this.recipientId = recipientId;
+ this.name = name;
+ this.type=type;
+ this.msgDeliveryAddress = msgDeliveryAddress;
+ }
+
+ /**
+ * @return the type
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * @param type the type to set
+ */
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ /**
+ * @return the msgDeliveryAddress
+ */
+ public String getMsgDeliveryAddress() {
+ return msgDeliveryAddress;
+ }
+
+ /**
+ * @param msgDeliveryAddress the msgDeliveryAddress to set
+ */
+ public void setMsgDeliveryAddress(String msgDeliveryAddress) {
+ this.msgDeliveryAddress = msgDeliveryAddress;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name the name to set
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return the recipientId
+ */
+ public String getRecipientId() {
+ return recipientId;
+ }
+
+ /**
+ * @param recipientId the recipientId to set
+ */
+ public void setRecipientId(String recipientId) {
+ this.recipientId = recipientId;
+ }
+}
diff --git a/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java b/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..f4e55ca3f42266b23445cf65c0331a0de7d21b7e
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2015 NIBIO <http://www.nibio.no/>.
+ *
+ * This file is part of VIPSLogic.
+ * VIPSLogic is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ *
+ * VIPSLogic is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * NIBIO Open Source License for more details.
+ *
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSLogic. If not, see <http://www.nibio.no/licenses/>.
+ *
+ */
+
+package no.nibio.vips.logic.messaging;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import no.nibio.vips.logic.entity.Message;
+import no.nibio.vips.logic.entity.MessageLocale;
+import no.nibio.vips.logic.entity.VipsLogicUser;
+import no.nibio.vips.logic.util.SessionControllerGetter;
+
+/**
+ * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+@Stateless
+public class MessagingBean {
+ @PersistenceContext(unitName="VIPSLogic-PU")
+ EntityManager em;
+
+ public void testStoreUniversalMessage()
+ {
+ List<VipsLogicUser> allUsers=SessionControllerGetter.getUserBean().getAllUsers();
+ Message m = SessionControllerGetter.getMessageBean().getMessage(5);
+ MessageLocale ml = m.getLocalMessage("nn");
+ UniversalMessage um = new UniversalMessage(
+ ml.getHeading(), ml.getLeadParagraph(), ml.getBody(), "http://localhost:8000/messages/" + m.getMessageId()
+ );
+ um.setExpiresAt(new Date());
+ List<MessageRecipient> distributionList = new ArrayList<>();
+ for(VipsLogicUser user : allUsers)
+ {
+ MessageRecipient r = new MessageRecipient(
+ String.valueOf(user.getUserId()),
+ user.getFirstName() + " " + user.getLastName(),
+ "Mail",
+ user.getEmail()
+ );
+ distributionList.add(r);
+ }
+ um.setDistributionList(distributionList);
+ //em.persist(um);
+
+ List<UniversalMessage> ums = em.createNamedQuery("UniversalMessage.findAll").getResultList();
+ for(UniversalMessage uMe : ums)
+ {
+ System.out.println(uMe.getMsgSubject());
+ }
+ }
+}
diff --git a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
new file mode 100644
index 0000000000000000000000000000000000000000..f93819584030cfad72cf3b0d45b36d817130f015
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 2015 NIBIO <http://www.nibio.no/>.
+ *
+ * This file is part of VIPSLogic.
+ * VIPSLogic is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ *
+ * VIPSLogic is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * NIBIO Open Source License for more details.
+ *
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSLogic. If not, see <http://www.nibio.no/licenses/>.
+ *
+ */
+
+package no.nibio.vips.logic.messaging;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRawValue;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Convert;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+import no.nibio.vips.logic.util.PostgresJSONStringConverter;
+import no.nibio.vips.logic.util.StringJsonUserType;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+import org.hibernate.annotations.TypeDefs;
+
+/**
+ * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+@Entity
+@Table(name = "universal_message", schema = "messaging")
+@XmlRootElement
+@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
+@NamedQueries({
+ @NamedQuery(name = "UniversalMessage.findAll", query = "SELECT u FROM UniversalMessage u"),
+ @NamedQuery(name = "UniversalMessage.findByUniversalMessageId", query = "SELECT u FROM UniversalMessage u WHERE u.universalMessageId = :universalMessageId"),
+ @NamedQuery(name = "UniversalMessage.findByMsgSubject", query = "SELECT u FROM UniversalMessage u WHERE u.msgSubject = :msgSubject"),
+ @NamedQuery(name = "UniversalMessage.findByMsgLeadParagraph", query = "SELECT u FROM UniversalMessage u WHERE u.msgLeadParagraph = :msgLeadParagraph"),
+ @NamedQuery(name = "UniversalMessage.findByMsgBody", query = "SELECT u FROM UniversalMessage u WHERE u.msgBody = :msgBody"),
+ @NamedQuery(name = "UniversalMessage.findByMsgDownloadUrl", query = "SELECT u FROM UniversalMessage u WHERE u.msgDownloadUrl = :msgDownloadUrl"),
+ @NamedQuery(name = "UniversalMessage.findByExpiresAt", query = "SELECT u FROM UniversalMessage u WHERE u.expiresAt = :expiresAt")})
+public class UniversalMessage implements Serializable {
+ private static final long serialVersionUID = 1L;
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Basic(optional = false)
+ @Column(name = "universal_message_id")
+ private Integer universalMessageId;
+ @Size(max = 2047)
+ @Column(name = "msg_subject")
+ private String msgSubject;
+ @Size(max = 2147483647)
+ @Column(name = "msg_lead_paragraph")
+ private String msgLeadParagraph;
+ @Size(max = 2147483647)
+ @Column(name = "msg_body")
+ private String msgBody;
+ @Size(max = 1023)
+ @Column(name = "msg_download_url")
+ private String msgDownloadUrl;
+ @Column(name = "expires_at")
+ @Temporal(TemporalType.TIMESTAMP)
+ private Date expiresAt;
+ //@Column(name = "distribution_list", columnDefinition = "json")
+ //@Convert(converter = PostgresJSONStringConverter.class)
+ // Documentation on StackOverflow: http://stackoverflow.com/questions/15974474/mapping-postgresql-json-column-to-hibernate-value-type
+ @Type(type = "StringJsonObject")
+ @Column(name = "distribution_list")
+ private String distributionList;
+
+
+ public UniversalMessage() {
+ }
+
+ public UniversalMessage(
+ String msgSubject,
+ String msgLeadParagraph,
+ String msgBody,
+ String msgDownloadUrl
+ )
+ {
+ this.msgSubject = msgSubject;
+ this.msgLeadParagraph = msgLeadParagraph;
+ this.msgBody = msgBody;
+ this.msgDownloadUrl = msgDownloadUrl;
+ }
+
+ public UniversalMessage(Integer universalMessageId) {
+ this.universalMessageId = universalMessageId;
+ }
+
+ @JsonIgnore
+ public Integer getUniversalMessageId() {
+ return universalMessageId;
+ }
+
+ public void setUniversalMessageId(Integer universalMessageId) {
+ this.universalMessageId = universalMessageId;
+ }
+
+ public String getMsgSubject() {
+ return msgSubject;
+ }
+
+ public void setMsgSubject(String msgSubject) {
+ this.msgSubject = msgSubject;
+ }
+
+ public String getMsgLeadParagraph() {
+ return msgLeadParagraph;
+ }
+
+ public void setMsgLeadParagraph(String msgLeadParagraph) {
+ this.msgLeadParagraph = msgLeadParagraph;
+ }
+
+ public String getMsgBody() {
+ return msgBody;
+ }
+
+ public void setMsgBody(String msgBody) {
+ this.msgBody = msgBody;
+ }
+
+ public String getMsgDownloadUrl() {
+ return msgDownloadUrl;
+ }
+
+ public void setMsgDownloadUrl(String msgDownloadUrl) {
+ this.msgDownloadUrl = msgDownloadUrl;
+ }
+
+ @JsonIgnore
+ public Date getExpiresAt() {
+ return expiresAt;
+ }
+
+ public void setExpiresAt(Date expiresAt) {
+ this.expiresAt = expiresAt;
+ }
+
+ @JsonRawValue
+ public String getDistributionList() {
+ return distributionList;
+ }
+
+ public void setDistributionList(String distributionList) {
+ this.distributionList = distributionList;
+ }
+
+ public void setDistributionList(List<MessageRecipient> distributionList) {
+ try {
+ this.distributionList = new ObjectMapper().writeValueAsString(distributionList);
+ } catch (JsonProcessingException ex) {
+ Logger.getLogger(UniversalMessage.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 0;
+ hash += (universalMessageId != null ? universalMessageId.hashCode() : 0);
+ return hash;
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ // TODO: Warning - this method won't work in the case the id fields are not set
+ if (!(object instanceof UniversalMessage)) {
+ return false;
+ }
+ UniversalMessage other = (UniversalMessage) object;
+ if ((this.universalMessageId == null && other.universalMessageId != null) || (this.universalMessageId != null && !this.universalMessageId.equals(other.universalMessageId))) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "no.nibio.vips.logic.messaging.UniversalMessage[ universalMessageId=" + universalMessageId + " ]";
+ }
+
+}
diff --git a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..91eb2526d2c22fac7249420ddd889bc0f03ab9c0
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessagingServiceClient.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2015 NIBIO <http://www.nibio.no/>.
+ *
+ * This file is part of VIPSLogic.
+ * VIPSLogic is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ *
+ * VIPSLogic is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * NIBIO Open Source License for more details.
+ *
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSLogic. If not, see <http://www.nibio.no/licenses/>.
+ *
+ */
+
+package no.nibio.vips.logic.messaging;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+
+/**
+ * @copyright 2015 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ */
+@Path("/")
+public interface UniversalMessagingServiceClient {
+
+ @POST
+ @Path("vips_msg_ws_01/rest/send_vips_msg")
+ @Consumes("application/json;charset=UTF-8")
+ @Produces("application/json;charset=UTF-8")
+ public Response sendMessage(UniversalMessage universalMessage);
+
+ @POST
+ @Path("vips_msg_ws_01/rest/send_vips_msg")
+ @Consumes("application/json;charset=UTF-8")
+ @Produces("application/json;charset=UTF-8")
+ public Response sendMessage(String universalMessage);
+}
diff --git a/src/main/java/no/nibio/vips/logic/util/JsonPostgreSQLDialect.java b/src/main/java/no/nibio/vips/logic/util/JsonPostgreSQLDialect.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec41d5de02b55b86c9b203fbf48c96c598c86b30
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/util/JsonPostgreSQLDialect.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2015 NIBIO <http://www.nibio.no/>.
+ *
+ * This file is part of VIPSLogic.
+ * VIPSLogic is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ *
+ * VIPSLogic is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * NIBIO Open Source License for more details.
+ *
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSLogic. If not, see <http://www.nibio.no/licenses/>.
+ *
+ */
+
+package no.nibio.vips.logic.util;
+
+import java.sql.Types;
+import org.hibernate.dialect.PostgreSQL9Dialect;
+
+/**
+ * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+public class JsonPostgreSQLDialect extends PostgreSQL9Dialect{
+ public JsonPostgreSQLDialect() {
+
+ super();
+
+ this.registerColumnType(Types.JAVA_OBJECT, "json");
+ }
+}
diff --git a/src/main/java/no/nibio/vips/logic/util/PostgresJSONStringConverter.java b/src/main/java/no/nibio/vips/logic/util/PostgresJSONStringConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d8e51ca5f330ff9285f5b0cc443e7d120a1fb48
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/util/PostgresJSONStringConverter.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015 NIBIO <http://www.nibio.no/>.
+ *
+ * This file is part of VIPSLogic.
+ * VIPSLogic is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ *
+ * VIPSLogic is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * NIBIO Open Source License for more details.
+ *
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSLogic. If not, see <http://www.nibio.no/licenses/>.
+ *
+ */
+
+package no.nibio.vips.logic.util;
+
+import java.sql.SQLException;
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+import org.postgresql.util.PGobject;
+
+/**
+ * NOT IN USE. Does not work with current configuration. Use StringJsonUserType instead
+ * Based on this example: http://stackoverflow.com/questions/20339580/are-jpa-eclipselink-custom-types-possible/26126168#26126168
+ * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+@Converter
+public class PostgresJSONStringConverter implements AttributeConverter<String, PGobject> {
+
+ @Override
+ public PGobject convertToDatabaseColumn(String x) {
+ System.out.println("I'm being used, actually!!!! JSON = " + x);
+
+ try {
+ PGobject po = new PGobject();
+ // here we tell Postgres to use JSON as type to treat our json
+ po.setType("json");
+ // this is Jackson already added as dependency to project, it could be any JSON marshaller
+ po.setValue(x);
+ return po;
+ } catch (SQLException e) {
+ e.printStackTrace();
+ System.out.println("convertToDatabaseColumn failed");
+ return null;
+ }
+ }
+
+ @Override
+ public String convertToEntityAttribute(PGobject y) {
+ return y.getValue();
+ }
+
+}
diff --git a/src/main/java/no/nibio/vips/logic/util/RESTAuthenticator.java b/src/main/java/no/nibio/vips/logic/util/RESTAuthenticator.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c2f05c28379136d4c4c0761b1e3df92ea43fd3a
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/util/RESTAuthenticator.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2015 NIBIO <http://www.nibio.no/>.
+ *
+ * This file is part of VIPSCommon.
+ * VIPSCommon is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ *
+ * VIPSCommon is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * NIBIO Open Source License for more details.
+ *
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSCommon. If not, see <http://www.nibio.no/licenses/>.
+ *
+ */
+
+package no.nibio.vips.logic.util;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.xml.bind.DatatypeConverter;
+
+
+/**
+ * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+public class RESTAuthenticator implements ClientRequestFilter {
+
+ private final String user;
+ private final String password;
+
+ public RESTAuthenticator(String user, String password) {
+ this.user = user;
+ this.password = password;
+ }
+
+ public void filter(ClientRequestContext requestContext) throws IOException {
+ MultivaluedMap<String, Object> headers = requestContext.getHeaders();
+ final String basicAuthentication = getBasicAuthentication();
+ headers.add("Authorization", basicAuthentication);
+
+ }
+
+ private String getBasicAuthentication() {
+ String token = this.user + ":" + this.password;
+ try {
+ return "Basic " +
+ DatatypeConverter.printBase64Binary(token.getBytes("UTF-8"));
+ } catch (UnsupportedEncodingException ex) {
+ throw new IllegalStateException("Cannot encode with UTF-8", ex);
+ }
+ }
+}
diff --git a/src/main/java/no/nibio/vips/logic/util/SessionControllerGetter.java b/src/main/java/no/nibio/vips/logic/util/SessionControllerGetter.java
index 570654b903916ba6e151b7d87027d0b6f7bc0f9e..8b99f3d65ba45833845fbb6d8965e3adc6050a88 100644
--- a/src/main/java/no/nibio/vips/logic/util/SessionControllerGetter.java
+++ b/src/main/java/no/nibio/vips/logic/util/SessionControllerGetter.java
@@ -28,6 +28,7 @@ import javax.naming.NamingException;
import no.nibio.vips.logic.controller.session.MessageBean;
import no.nibio.vips.logic.controller.session.ObservationBean;
import no.nibio.vips.logic.controller.session.OrganismBean;
+import no.nibio.vips.logic.messaging.MessagingBean;
/**
* @copyright 2013-2014 <a href="http://www.nibio.no/">NIBIO</a>
@@ -124,6 +125,20 @@ public class SessionControllerGetter {
}
}
+ public static MessagingBean getMessagingBean(){
+ try
+ {
+ InitialContext ic = new InitialContext();
+ MessagingBean retVal = (MessagingBean) ic.lookup(SessionControllerGetter.getJndiPath(MessagingBean.class));
+ return retVal;
+ }
+ catch(NamingException ne)
+ {
+ System.out.println("Could not find " + MessagingBean.class.getSimpleName());
+ return null;
+ }
+ }
+
public static ObservationBean getObservationBean()
{
try
diff --git a/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java b/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java
new file mode 100644
index 0000000000000000000000000000000000000000..92286a7aa42f40ebe0c3dafa68207456272b8281
--- /dev/null
+++ b/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2015 NIBIO <http://www.nibio.no/>.
+ *
+ * This file is part of VIPSLogic.
+ * VIPSLogic is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ *
+ * VIPSLogic is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * NIBIO Open Source License for more details.
+ *
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSLogic. If not, see <http://www.nibio.no/licenses/>.
+ *
+ */
+
+package no.nibio.vips.logic.util;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SessionImplementor;
+import org.hibernate.usertype.UserType;
+
+/**
+ * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
+ */
+
+public class StringJsonUserType implements UserType {
+
+ /**
+ * Return the SQL type codes for the columns mapped by this type. The
+ * codes are defined on <tt>java.sql.Types</tt>.
+ *
+ * @return int[] the typecodes
+ * @see java.sql.Types
+ */
+ @Override
+ public int[] sqlTypes() {
+ return new int[] { Types.JAVA_OBJECT};
+ }
+
+ /**
+ * The class returned by <tt>nullSafeGet()</tt>.
+ *
+ * @return Class
+ */
+ @Override
+ public Class returnedClass() {
+ return String.class;
+ }
+
+ /**
+ * Compare two instances of the class mapped by this type for persistence "equality".
+ * Equality of the persistent state.
+ *
+ * @param x
+ * @param y
+ * @return boolean
+ */
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+
+ if( x== null){
+
+ return y== null;
+ }
+
+ return x.equals( y);
+ }
+
+ /**
+ * Get a hashcode for the instance, consistent with persistence "equality"
+ */
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+
+ return x.hashCode();
+ }
+
+ /**
+ * Retrieve an instance of the mapped class from a JDBC resultset. Implementors
+ * should handle possibility of null values.
+ *
+ * @param rs a JDBC result set
+ * @param names the column names
+ * @param session
+ * @param owner the containing entity @return Object
+ * @throws org.hibernate.HibernateException
+ *
+ * @throws java.sql.SQLException
+ */
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
+ if(rs.getString(names[0]) == null){
+ return null;
+ }
+ return rs.getString(names[0]);
+ }
+
+ /**
+ * Write an instance of the mapped class to a prepared statement. Implementors
+ * should handle possibility of null values. A multi-column type should be written
+ * to parameters starting from <tt>index</tt>.
+ *
+ * @param st a JDBC prepared statement
+ * @param value the object to write
+ * @param index statement parameter index
+ * @param session
+ * @throws org.hibernate.HibernateException
+ *
+ * @throws java.sql.SQLException
+ */
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
+ if (value == null) {
+ st.setNull(index, Types.OTHER);
+ return;
+ }
+
+ st.setObject(index, value, Types.OTHER);
+ }
+
+ /**
+ * Return a deep copy of the persistent state, stopping at entities and at
+ * collections. It is not necessary to copy immutable objects, or null
+ * values, in which case it is safe to simply return the argument.
+ *
+ * @param value the object to be cloned, which may be null
+ * @return Object a copy
+ */
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+
+ return value;
+ }
+
+ /**
+ * Are objects of this type mutable?
+ *
+ * @return boolean
+ */
+ @Override
+ public boolean isMutable() {
+ return true;
+ }
+
+ /**
+ * Transform the object into its cacheable representation. At the very least this
+ * method should perform a deep copy if the type is mutable. That may not be enough
+ * for some implementations, however; for example, associations must be cached as
+ * identifier values. (optional operation)
+ *
+ * @param value the object to be cached
+ * @return a cachable representation of the object
+ * @throws org.hibernate.HibernateException
+ *
+ */
+ @Override
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (String)this.deepCopy( value);
+ }
+
+ /**
+ * Reconstruct an object from the cacheable representation. At the very least this
+ * method should perform a deep copy if the type is mutable. (optional operation)
+ *
+ * @param cached the object to be cached
+ * @param owner the owner of the cached object
+ * @return a reconstructed object from the cachable representation
+ * @throws org.hibernate.HibernateException
+ *
+ */
+ @Override
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return this.deepCopy( cached);
+ }
+
+ /**
+ * During merge, replace the existing (target) value in the entity we are merging to
+ * with a new (original) value from the detached entity we are merging. For immutable
+ * objects, or null values, it is safe to simply return the first parameter. For
+ * mutable objects, it is safe to return a copy of the first parameter. For objects
+ * with component values, it might make sense to recursively replace component values.
+ *
+ * @param original the value from the detached entity being merged
+ * @param target the value in the managed entity
+ * @return the value to be merged
+ */
+ @Override
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+
+
+}
diff --git a/src/main/setup/jboss-ds.xml b/src/main/setup/jboss-ds.xml
index d3623fe9d8db480415c5223daa4f8772833091e2..7efd3dba56f87b794258307a8ed27c7042ae6042 100644
--- a/src/main/setup/jboss-ds.xml
+++ b/src/main/setup/jboss-ds.xml
@@ -20,4 +20,14 @@
<max-pool-size>20</max-pool-size>
<idle-timeout-minutes>5</idle-timeout-minutes>
</local-tx-datasource>
+ <local-tx-datasource>
+ <jndi-name>MessagingSchema</jndi-name>
+ <connection-url>jdbc:postgresql://localhost/vipslogic</connection-url>
+ <driver-class>org.postgresql.Driver</driver-class>
+ <user-name>vipslogic</user-name>
+ <password>VIPS123</password>
+ <min-pool-size>5</min-pool-size>
+ <max-pool-size>20</max-pool-size>
+ <idle-timeout-minutes>5</idle-timeout-minutes>
+ </local-tx-datasource>
</datasources>
diff --git a/src/test/java/no/nibio/vips/logic/messaging/UniversalMessagingTest.java b/src/test/java/no/nibio/vips/logic/messaging/UniversalMessagingTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a3f41fce093d964c51d3972fc91d40c9140bb469
--- /dev/null
+++ b/src/test/java/no/nibio/vips/logic/messaging/UniversalMessagingTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2015 NIBIO <http://www.nibio.no/>.
+ *
+ * This file is part of VIPSLogic.
+ * VIPSLogic is free software: you can redistribute it and/or modify
+ * it under the terms of the NIBIO Open Source License as published by
+ * NIBIO, either version 1 of the License, or (at your option) any
+ * later version.
+ *
+ * VIPSLogic is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * NIBIO Open Source License for more details.
+ *
+ * You should have received a copy of the NIBIO Open Source License
+ * along with VIPSLogic. If not, see <http://www.nibio.no/licenses/>.
+ *
+ */
+package no.nibio.vips.logic.messaging;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.core.Response;
+import no.nibio.vips.logic.util.RESTAuthenticator;
+import org.jboss.resteasy.client.jaxrs.ResteasyClient;
+import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
+import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author treinar
+ */
+public class UniversalMessagingTest {
+
+ public UniversalMessagingTest() {
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ // TODO add test methods here.
+ // The methods must be annotated with annotation @Test. For example:
+ //
+ // @Test
+ // public void hello() {}
+
+ @Test
+ public void serviceTest()
+ {
+ System.out.println("serviceTest");
+ String result = null;
+ try
+ {
+ UniversalMessage um = new UniversalMessage(
+ "Bladveps funnet på Kyrksæterøra",
+ "Se opp for svermende veps med brodder",
+ "Lorem ipsum Dolores Sanctum Nobliatarus Factorum des nomine in sanctus spiritu benedictus qui venit dies irae",
+ "http://www.nibio.no/"
+ );
+
+
+ String[][] recipients = {
+ {"1","Tor-Einar Skog","Mail","tor-einar.skog@nibio.no"},
+ {"1","Tor-Einar Skog","Sms","+47 91303819"},
+ {"2","Lars Aksel Opsahl", "Mail","lars.opsahl@nibio.no"}
+ };
+
+ List<MessageRecipient> rList = new ArrayList<>();
+ for(String[] recipient:recipients)
+ {
+ rList.add(new MessageRecipient(
+ recipient[0],
+ recipient[1],
+ recipient[2],
+ recipient[3]
+ )
+ );
+ }
+ um.setDistributionList(rList);
+
+ ResteasyClient client = new ResteasyClientBuilder().build();
+ client.register(new RESTAuthenticator("user", "userPass"));
+ ResteasyWebTarget target = client.target("http://kart13utv.ad.skogoglandskap.no:8080");
+ UniversalMessagingServiceClient umClient = target.proxy(UniversalMessagingServiceClient.class);
+
+
+ System.out.println(new ObjectMapper().writeValueAsString(um));
+ Response r = umClient.sendMessage(new ObjectMapper().writeValueAsString(um));
+
+ result = r.readEntity(String.class);
+ System.out.println(result);
+//Response r = umClient.sendMessage(um);
+ }
+ catch(IOException | IllegalArgumentException | NullPointerException e)
+ {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ assertNotNull(result);
+ }
+}