11package edu .caltech .ipac .firefly .server .query ;
22
3- import edu .caltech .ipac .firefly .data .*;
3+ import edu .caltech .ipac .firefly .data .DownloadRequest ;
4+ import edu .caltech .ipac .firefly .data .FileInfo ;
5+ import edu .caltech .ipac .firefly .data .HttpResultInfo ;
6+ import edu .caltech .ipac .firefly .data .ServerRequest ;
47import edu .caltech .ipac .firefly .server .ServerContext ;
58import edu .caltech .ipac .firefly .server .db .EmbeddedDbUtil ;
69import edu .caltech .ipac .firefly .server .network .HttpServiceInput ;
912import edu .caltech .ipac .table .DataGroup ;
1013import edu .caltech .ipac .table .MappedData ;
1114import edu .caltech .ipac .table .io .VoTableReader ;
15+ import edu .caltech .ipac .util .FileUtil ;
1216import edu .caltech .ipac .util .download .URLDownload ;
1317
1418import java .io .File ;
1519import java .io .IOException ;
16- import java .util .*;
1720import java .net .URL ;
21+ import java .util .ArrayList ;
22+ import java .util .Arrays ;
23+ import java .util .HashMap ;
24+ import java .util .List ;
25+ import java .util .Map ;
1826
1927import static edu .caltech .ipac .util .FileUtil .getUniqueFileNameForGroup ;
2028import static org .apache .commons .lang .StringUtils .substringAfterLast ;
@@ -55,27 +63,32 @@ private List<FileGroup> computeFileGroup(DownloadRequest request) throws DataAcc
5563 String contentType = tmpFileInfo .getAttribute (HttpResultInfo .CONTENT_TYPE );
5664
5765 String colNames = request .getSearchRequest ().getParam ("templateColNames" );
66+ boolean useSourceUrlFileName = request .getSearchRequest ().getBooleanParam ("useSourceUrlFileName" ,false );
5867 String [] cols = colNames != null ? colNames .split ("," ) : null ;
5968
60- String ext_file_name = getFileName (idx ,cols ,dgDataUrl );
69+ String ext_file_name = getFileName (idx ,cols ,useSourceUrlFileName , dgDataUrl , url );
6170 String extension ;
6271
6372 if (access_format != null ) {
6473 if (access_format .contains ("datalink" )) {
6574 ext_file_name = getUniqueFileNameForGroup (ext_file_name , dataLinkFolders );
66- List <FileInfo > tmpFileInfos = parseDatalink (url , ext_file_name );
75+ List <FileInfo > tmpFileInfos = parseDatalink (url , ext_file_name , useSourceUrlFileName );
6776 fileInfos .addAll (tmpFileInfos );
6877 }
6978 else { //non datalink entry - such as fits,jpg etc.
70- extension = access_format .replaceAll (".*/" , "" );
71- ext_file_name += "." + extension ;
79+ if (!useSourceUrlFileName || !FileUtil .getExtension (ext_file_name ).isEmpty ()) {
80+ extension = access_format .replaceAll (".*/" , "" );
81+ ext_file_name += "." + extension ;
82+ }
7283 FileInfo fileInfo = new FileInfo (tmpFile .getPath (), ext_file_name , 0 );
7384 fileInfos .add (fileInfo );
7485 }
7586 }
7687 else { //access_format is null, so try and get it from the url's Content_Type
77- extension = getExtFromURL (contentType );
78- ext_file_name += "." + extension ;
88+ if (!useSourceUrlFileName || !FileUtil .getExtension (ext_file_name ).isEmpty ()) {
89+ extension = getExtFromURL (contentType );
90+ ext_file_name += "." + extension ;
91+ }
7992 FileInfo fileInfo = new FileInfo (tmpFile .getPath (), ext_file_name , 0 );
8093 fileInfos .add (fileInfo );
8194 }
@@ -89,7 +102,7 @@ private List<FileGroup> computeFileGroup(DownloadRequest request) throws DataAcc
89102 return Arrays .asList (new FileGroup (fileInfos , null , 0 , "ObsCore Download Files" ));
90103 }
91104
92- public static List <FileInfo > parseDatalink (URL url , String prepend_file_name ) {
105+ public static List <FileInfo > parseDatalink (URL url , String prepend_file_name , boolean useSourceUrlFileName ) {
93106 List <FileInfo > fileInfos = new ArrayList <>();;
94107 try {
95108 File tmpFile = File .createTempFile ("datlink-" , ".xml" , ServerContext .getTempWorkDir ());
@@ -125,13 +138,26 @@ public static List<FileInfo> parseDatalink(URL url, String prepend_file_name) {
125138
126139 if (testSem (sem ,"#this" ) || testSem (sem ,"#thumbnail" ) ||testSem (sem ,"#preview" ) ||
127140 testSem (sem ,"#preview-plot" )) {
128- String ext_file_name = prepend_file_name ;
129- ext_file_name = testSem (sem , "#this" ) ? ext_file_name : ext_file_name + "-" + substringAfterLast (sem , "#" );
130- String extension = "unknown" ;
131- extension = content_type != null ? getExtFromURL (content_type ) : getExtFromURL (accessUrl );
132- ext_file_name += "." + extension ;
133- //create a folder only if makeDataLinkFolder is true
134- ext_file_name = makeDataLinkFolder ? prepend_file_name + "/" + ext_file_name : ext_file_name ;
141+
142+ String ext_file_name = null ;
143+ if (useSourceUrlFileName ) {
144+ String fileName = new URL (accessUrl ).getFile ();
145+ String ext = FileUtil .getExtension (fileName );
146+ if (!ext .isEmpty ()) ext_file_name = fileName ;
147+ }
148+ if (ext_file_name ==null ){
149+ ext_file_name = prepend_file_name ;
150+ ext_file_name = testSem (sem , "#this" ) ? ext_file_name : ext_file_name + "-" + substringAfterLast (sem , "#" );
151+ String extension = "unknown" ;
152+ extension = content_type != null ? getExtFromURL (content_type ) : getExtFromURL (accessUrl );
153+ ext_file_name += "." + extension ;
154+ //create a folder only if makeDataLinkFolder is true
155+ ext_file_name = makeDataLinkFolder ? prepend_file_name + "/" + ext_file_name : ext_file_name ;
156+ }
157+
158+
159+
160+
135161 FileInfo fileInfo = new FileInfo (accessUrl , ext_file_name , 0 );
136162 fileInfos .add (fileInfo );
137163 }
@@ -170,13 +196,20 @@ public static String makeValidString(String val) {
170196 //remove spaces and replace all non-(alphanumeric,period,underscore,hyphen) chars with underscore
171197 return val .replaceAll ("\\ s" , "" ).replaceAll ("[^a-zA-Z0-9._-]" , "_" );
172198 }
173- public static String getFileName (int idx , String [] colNames , MappedData dgDataUrl ) {
199+ public static String getFileName (int idx , String [] colNames , boolean useSourceUrlFileName , MappedData dgDataUrl , URL url ) {
174200 String obs_collection = (String ) dgDataUrl .get (idx , "obs_collection" );
175201 String instrument_name = (String ) dgDataUrl .get (idx , "instrument_name" );
176202 String obs_id = (String ) dgDataUrl .get (idx , "obs_id" );
177203 String obs_title = (String ) dgDataUrl .get (idx , "obs_title" );
178204 String file_name = "" ;
179205
206+ //option 0: if useSourceUrlFileName is true the try to get it from the URL
207+ if (useSourceUrlFileName ) {
208+ String fileName = url .getFile ();
209+ String ext = FileUtil .getExtension (fileName );
210+ if (!ext .isEmpty ()) return fileName ;
211+ }
212+
180213 //option 1: use productTitleTemplate (colNames) if available to construct file name
181214 if (colNames != null ) {
182215 for (String col : colNames ) {
0 commit comments