diff --git a/gazelle-proxy-datamodel/pom.xml b/gazelle-proxy-datamodel/pom.xml index a32a893fee1ac8be71b468b8da63bcc21ec19cbd..7caa0340dc2873afe71b01eeee5359b5871582a3 100644 --- a/gazelle-proxy-datamodel/pom.xml +++ b/gazelle-proxy-datamodel/pom.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <groupId>net.ihe.gazelle.proxy</groupId> @@ -59,6 +60,12 @@ <scope>provided</scope> </dependency> + <dependency> + <groupId>commons-httpclient</groupId> + <artifactId>commons-httpclient</artifactId> + <version>3.1</version> + </dependency> + </dependencies> <build> diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/AbstractMessage.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/AbstractMessage.java index 9b67f4f2469dcaca796dde8f9eeb228aa8caeecc..e395fd73e245bc9b466d9c8edd7364878182b0e6 100644 --- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/AbstractMessage.java +++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/AbstractMessage.java @@ -15,6 +15,8 @@ */ package net.ihe.gazelle.proxy.model.message; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.net.Inet4Address; import java.nio.charset.Charset; import java.util.Arrays; @@ -39,6 +41,8 @@ import net.ihe.gazelle.proxy.enums.ChannelType; import net.ihe.gazelle.proxy.enums.ProxySide; import net.ihe.gazelle.proxy.model.Channel; +import org.apache.commons.httpclient.methods.multipart.ByteArrayPartSource; +import org.apache.commons.httpclient.methods.multipart.PartSource; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.WordUtils; import org.hibernate.validator.NotNull; @@ -105,14 +109,6 @@ public abstract class AbstractMessage { return new String(messageReceived, UTF_8); } - public int getMessageLength() { - if (messageReceived == null) { - return 0; - } else { - return messageReceived.length; - } - } - public abstract ChannelType getChannelType(); public void setMessageReceivedAsString(String messageReceived) { @@ -317,4 +313,20 @@ public abstract class AbstractMessage { return true; } + public int getMessageLength() { + if (messageReceived == null) { + return 0; + } else { + return messageReceived.length; + } + } + + public InputStream getMessageReceivedStream() { + return new ByteArrayInputStream(messageReceived); + } + + public PartSource getPartSource(String messageType) { + return new ByteArrayPartSource(messageType, messageReceived); + } + } diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/DicomMessage.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/DicomMessage.java index e3f33be9c4e83714fa43619d2593311927ee20f7..5ad0d16f75ae4ab3d36db41feba7a03e8da4f5ed 100644 --- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/DicomMessage.java +++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/message/DicomMessage.java @@ -16,7 +16,11 @@ package net.ihe.gazelle.proxy.model.message; import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -38,7 +42,10 @@ import net.ihe.gazelle.proxy.model.Channel; import net.ihe.gazelle.proxy.model.CommandFieldValues; import net.ihe.gazelle.proxy.model.DicomUIDValues; import net.ihe.gazelle.proxy.model.LabelKeywordDescriptionClass; +import net.ihe.gazelle.proxy.util.Preferences; +import org.apache.commons.httpclient.methods.multipart.FilePartSource; +import org.apache.commons.httpclient.methods.multipart.PartSource; import org.hibernate.annotations.CollectionOfElements; import org.hibernate.annotations.IndexColumn; import org.jboss.seam.annotations.Name; @@ -100,7 +107,7 @@ public class DicomMessage extends AbstractMessage implements java.io.Serializabl public ChannelType getChannelType() { return ChannelType.DICOM; } - + // Constructors private static Map<String, String> getMapOfDicomUID(EntityManager entityManager) { @@ -354,4 +361,32 @@ public class DicomMessage extends AbstractMessage implements java.io.Serializabl return true; } + private File getFile() { + File storageFolder = new File(Preferences.getProperty("storage.dicom")); + return new File(storageFolder, getMessageReceivedAsString()); + } + + @Override + public int getMessageLength() { + return (int) getFile().length(); + } + + @Override + public InputStream getMessageReceivedStream() { + try { + return new FileInputStream(getFile()); + } catch (FileNotFoundException e) { + return null; + } + } + + @Override + public PartSource getPartSource(String messageType) { + try { + return new FilePartSource(messageType, getFile()); + } catch (FileNotFoundException e) { + return null; + } + } + } diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/Preferences.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/util/Preferences.java similarity index 100% rename from gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/Preferences.java rename to gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/util/Preferences.java diff --git a/gazelle-proxy-ejb/src/main/resources/prefs.properties b/gazelle-proxy-datamodel/src/main/resources/prefs.properties similarity index 50% rename from gazelle-proxy-ejb/src/main/resources/prefs.properties rename to gazelle-proxy-datamodel/src/main/resources/prefs.properties index 1ee7d86d7620c00839d0de077b1cb1522f10ec66..f1a512f41c08f300cec17100f380520dd5ad3dfe 100644 --- a/gazelle-proxy-ejb/src/main/resources/prefs.properties +++ b/gazelle-proxy-datamodel/src/main/resources/prefs.properties @@ -1 +1,2 @@ evsclient.url=${evsclient.url} +storage.dicom=${storage.dicom} diff --git a/gazelle-proxy-ejb/pom.xml b/gazelle-proxy-ejb/pom.xml index fc70d35e6fd797e3c9c1e39b678a0d52966104ca..9be25705e38e4a8d3bcefa226d209a6327437337 100644 --- a/gazelle-proxy-ejb/pom.xml +++ b/gazelle-proxy-ejb/pom.xml @@ -114,10 +114,11 @@ </dependency> <dependency> - <groupId>commons-httpclient</groupId> - <artifactId>commons-httpclient</artifactId> - <version>3.1</version> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.0.1</version> + <type>jar</type> + <scope>compile</scope> </dependency> - </dependencies> </project> diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessageBean.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessageBean.java index 5cfd97f61fd89f657dedd52e5a17fea46f7b63bd..2ee288e2372ae5cf595edbf9d938910aada7c562 100644 --- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessageBean.java +++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessageBean.java @@ -1,6 +1,7 @@ package net.ihe.gazelle.proxy.action; import java.io.IOException; +import java.io.InputStream; import java.net.URLEncoder; import java.util.Map; @@ -115,16 +116,31 @@ public class MessageBean { public void downloadFile(boolean inline) { try { HttpServletResponse response = (HttpServletResponse) extCtx.getResponse(); - byte[] bytes = message.getMessageReceived(); + InputStream messageStream = message.getMessageReceivedStream(); ServletOutputStream servletOutputStream = response.getOutputStream(); response.setContentType("text/plain"); - response.setContentLength(bytes.length); + response.setContentLength(message.getMessageLength()); if (!inline) { response.setHeader("Content-Disposition", "attachment;filename=\"" + message.getId() + "\""); } - servletOutputStream.write(bytes); - servletOutputStream.flush(); - servletOutputStream.close(); + + byte[] buf = new byte[8192]; + while (true) { + int length = messageStream.read(buf); + if (length < 0) + break; + servletOutputStream.write(buf, 0, length); + } + + try { + messageStream.close(); + } catch (IOException ignore) { + } + try { + servletOutputStream.close(); + } catch (IOException ignore) { + } + facesContext.responseComplete(); } catch (Exception e) { FacesMessages.instance().add(StatusMessage.Severity.ERROR, "Failed to download file", e); @@ -173,11 +189,11 @@ public class MessageBean { // First send the file to EVSClient HttpClient client = new HttpClient(); PostMethod filePost = new PostMethod(Preferences.getProperty("evsclient.url") + "upload"); - + // use the type as file name String messageType = message.getChannelType().name(); - PartSource partSource = new ByteArrayPartSource(messageType, message.getMessageReceived()); + PartSource partSource = message.getPartSource(messageType); Part[] parts = { new FilePart("message", partSource) }; filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams())); int status = -1; diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/listeners/DicomEventListener.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/listeners/DicomEventListener.java index 0df7782dd19b9c2b71f3408625830af8963f527f..2396f93f0d07a1fc4611cf323c70a1a687bcccb2 100644 --- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/listeners/DicomEventListener.java +++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/listeners/DicomEventListener.java @@ -4,16 +4,22 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.Charset; import javax.persistence.EntityManager; +import org.apache.commons.io.FileUtils; + import jp.digitalsensation.ihej.transactionmonitor.dicom.messageexchange.DimseMessage; import net.ihe.gazelle.proxy.model.Channel; import net.ihe.gazelle.proxy.model.message.DicomMessage; import net.ihe.gazelle.proxy.netty.channel.ProxySide; +import net.ihe.gazelle.proxy.util.Preferences; public class DicomEventListener extends SameEventListener<DimseMessage> { + protected static final Charset UTF_8 = Charset.forName("UTF-8"); + public DicomEventListener(Channel channelUsed) { super(channelUsed); } @@ -56,10 +62,32 @@ public class DicomEventListener extends SameEventListener<DimseMessage> { responderPort, channelId, convertProxySide(side)); if (dicom.getDataSet() != null) { try { - File file = new File(dicom.getDataSet().getCanonicalPath()); - byte[] bytes = getBytesFromFile(file); - messageToStore.setMessageReceived(bytes); - file.delete(); + String storageDicom = Preferences.getProperty("storage.dicom"); + File storageDicomFolder = new File(storageDicom); + + String fileName = Long.toHexString(System.nanoTime()); + if (fileName.length() < 3) { + fileName = "000" + fileName; + } + + File targetFolder1 = new File(storageDicomFolder, fileName.substring(0, 1)); + File targetFolder2 = new File(targetFolder1, fileName.substring(1, 2)); + File targetFolder3 = new File(targetFolder2, fileName.substring(2, 3)); + + targetFolder3.mkdirs(); + + File targetFile = new File(targetFolder3, fileName); + + File sourceFile = new File(dicom.getDataSet().getCanonicalPath()); + + FileUtils.copyFile(sourceFile, targetFile); + + String pathToStore = targetFile.getAbsolutePath(); + pathToStore = pathToStore.replace(storageDicom, ""); + + messageToStore.setMessageReceived(pathToStore.getBytes(UTF_8)); + + sourceFile.delete(); } catch (IOException e) { e.printStackTrace(); } diff --git a/pom.xml b/pom.xml index bc579acda5d01131f326c501e3ef0b2f367ff456..277083e21fc5bd71d9615243a2341f72bf9ddcd8 100644 --- a/pom.xml +++ b/pom.xml @@ -202,6 +202,9 @@ <properties> <cas.service>http://127.0.0.1:8080/proxy/</cas.service> <evsclient.url>http://127.0.0.1:8080/EVSClient/</evsclient.url> + + <dicom.storage>/tmp</dicom.storage> + <!-- development mode (disable in production) --> <seam.debug>true</seam.debug> @@ -247,6 +250,9 @@ <properties> <cas.service>http://gazelle.ihe.net/proxy/</cas.service> <evsclient.url>http://jumbo-2.irisa.fr:8080/EVSClient/</evsclient.url> + + <dicom.storage>/opt/proxy/DICOM</dicom.storage> + <!-- development mode (disable in production) --> <seam.debug>false</seam.debug> @@ -282,50 +288,6 @@ </properties> </profile> - <profile> - <id>bento</id> - - <activation> - <activeByDefault>false</activeByDefault> - </activation> - - <properties> - <cas.service>http://bento.irisa.fr:8080/proxy/</cas.service> - <!-- development mode (disable in production) --> - <seam.debug>false</seam.debug> - - <!-- datasource configuration --> - <jdbc.connection.url>jdbc:postgresql://localhost/gazelle-proxy</jdbc.connection.url> - <jdbc.driver.class>org.postgresql.Driver</jdbc.driver.class> - <jdbc.user>gazelle</jdbc.user> - <jdbc.password>gazelle</jdbc.password> - <min.pool.size>10</min.pool.size> - <max.pool.size>50</max.pool.size> - - <!-- pki datasource configuration --> - <jdbc.pki.connection.url>jdbc:postgresql://localhost/gazelle-proxy</jdbc.pki.connection.url> - <jdbc.pki.user>gazelle</jdbc.pki.user> - <jdbc.pki.password>gazelle</jdbc.pki.password> - - <!-- development mode (exclude in production) --> - <exclude.bootstrap>true</exclude.bootstrap> - - <!-- package exploded war file --> - <exploded.war.file>false</exploded.war.file> - - <!-- persistence.xml configuration --> - <hibernate.dialect> - org.hibernate.dialect.PostgreSQLDialect - </hibernate.dialect> - <hibernate.hbm2ddl.auto> - update - </hibernate.hbm2ddl.auto> - <hibernate.show_sql> - false - </hibernate.show_sql> - </properties> - </profile> - <profile> <id>eucat</id> @@ -336,6 +298,10 @@ <properties> <!-- <cas.service>http://131.114.254.7:8080/proxy/</cas.service> --> <cas.service>http://surimi.irisa.fr:8080/proxy/</cas.service> + + <evsclient.url>http://jumbo-2.irisa.fr:8080/EVSClient/</evsclient.url> + <storage.dicom>/opt/proxy/DICOM</storage.dicom> + <!-- development mode (disable in production) --> <seam.debug>false</seam.debug>