78e3ca505c524705d6ee78b5dd79c14d9cf6b94e
[portal/sdk.git] /
1 /*-
2  * ================================================================================
3  * ECOMP Portal SDK
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ================================================================================
19  */
20 package org.openecomp.portalsdk.analytics.system.fusion.controller;
21 /**
22  * Raptor Blob Extract Servlet
23  * 
24  */
25
26 import java.io.BufferedInputStream;
27 import java.io.BufferedOutputStream;
28 import java.io.File;
29 import java.io.FileInputStream;
30 import java.io.IOException;
31 import java.io.InputStream;
32 import java.io.OutputStream;
33 import java.sql.Blob;
34 import java.util.HashMap;
35 import java.util.List;
36 import java.util.Map;
37
38 import javax.servlet.http.HttpServletRequest;
39 import javax.servlet.http.HttpServletResponse;
40
41 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
42 import org.openecomp.portalsdk.core.service.DataAccessService;
43 import org.springframework.web.servlet.ModelAndView;;
44
45
46 public class FileServletController  {
47
48         private DataAccessService dataAccessService;
49
50         EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(FileServletController.class);
51
52
53         public ModelAndView handleRequestInternal(HttpServletRequest request,
54                         HttpServletResponse response) throws Exception {
55                 logger.debug(EELFLoggerDelegate.debugLogger, ("FileServletController:: f=" + request.getParameter("f")));
56
57                 String fname = request.getParameter("f");
58
59                 try {
60                         Map params = new HashMap();
61                         params.put("fname", fname);
62
63                         logger.debug(EELFLoggerDelegate.debugLogger, ("executing query: select file_blob from cr_report_file_history where file_name = :"
64                                         + fname));
65
66                         List<Object> fileFromDB = (List<Object>) getDataAccessService().executeNamedQuery("getFileWithName", params, null);
67
68                         byte[] allBytesInBlob = null;
69
70                         if (fileFromDB != null && fileFromDB.size() > 0) {
71
72                                 logger.debug(EELFLoggerDelegate.debugLogger, ("reading file blob from DB..."));
73                                 try {
74                                         
75                             /*for weblogic setup
76                              * if(Globals.isWeblogicServer()) {
77                                 weblogic.jdbc.vendor.oracle.OracleThinBlob aBlob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) ((org.hibernate.lob.SerializableBlob) fileFromDB
78                                                                 .get(0)).getWrappedBlob();
79                                 InputStream inBlob = ((java.sql.Blob) aBlob).getBinaryStream();
80                                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
81                                 byte[] buf = new byte[1024];
82                                 int n = 0;
83                                 while ((n=inBlob.read(buf))>=0) {
84                                         baos.write(buf, 0, n);
85                                 }
86                                 inBlob.close();
87                                 allBytesInBlob = baos.toByteArray();
88                              } else { */
89                                         /* works in Hinernate3  [       oracle.sql.BLOB aBlob = (oracle.sql.BLOB) ((org.hibernate.lob.SerializableBlob) fileFromDB
90                                                                         .get(0)).getWrappedBlob();
91                                                         allBytesInBlob = aBlob.getBytes(1, (int) aBlob.length()); ] */
92                             // }
93                                         
94                                         Object fileFromDBType = fileFromDB.get(0);
95                                         if(fileFromDBType instanceof byte[] ) // postgres
96                                                 allBytesInBlob = (byte[]) fileFromDB.get(0);
97                                         else if (fileFromDBType instanceof Blob ) // oracle
98                                                 allBytesInBlob = ((Blob) fileFromDB.get(0)).getBytes(1, (int) ((Blob) fileFromDB.get(0)).length());
99                                         
100                                         
101                                         
102                                 } catch (Exception e) {
103                                         logger.error(EELFLoggerDelegate.debugLogger, ("An exception has occurred: " + e.getMessage()));
104                                         throw (e);
105                                 }
106
107                         } else {
108                                 logger.error(EELFLoggerDelegate.debugLogger, ("ERROR: No BLOB returned from DB..."));
109                                 throw (new Exception("ERROR: No BLOB returned from DB..."));
110                         }
111
112                         serveFile(response, allBytesInBlob, fname);
113                         return null;
114                 } catch (Exception e) {
115                         logger.error(EELFLoggerDelegate.debugLogger, ("Exception occurred..." + e.getMessage()));
116                         Map<String, Object> errView = new HashMap<String, Object>();
117                         errView.put("error", "The requested resource was not found.");
118                         //return new ModelAndView(getExceptionView(), "model", errView);
119                         return null;
120                 }
121
122         }
123
124         private void serveFile(HttpServletResponse response, File inFile)
125                         throws Exception {
126                 OutputStream os = null;
127                 InputStream is = null;
128                 try {
129                         response.reset();
130                         is = new BufferedInputStream(new FileInputStream(inFile));
131                         os = new BufferedOutputStream(response.getOutputStream());
132                         response.setContentLength((int) inFile.length());
133                         response.setContentType("application/octet-stream");
134                         response.setHeader("Content-disposition", "attachment; filename=\""
135                                         + inFile.getName() + "\"");
136                         copyStream(is, os);
137                         os.flush();
138                 } catch (Exception ex) {
139                         if (os == null)
140                                 throw new Exception("Could not open output stream for file ");
141                         if (is == null)
142                                 throw new Exception("Could not open input stream for file ");
143                 } finally {
144                         if (os != null) {
145                                 os.close();
146                         }
147                         if (is != null)
148                                 is.close();
149                 }
150         }
151
152         private void serveFile(HttpServletResponse response, byte[] outStream,
153                         String name) throws Exception {
154                 OutputStream os = null;
155                 InputStream is = null;
156                 try {
157                         response.reset();
158                         response.setContentLength((int) outStream.length);
159                         response.setContentType("application/octet-stream");
160                         response.setHeader("Content-disposition", "attachment; filename=\""
161                                         + name + "\"");
162                         copyStream(response, outStream);
163                 } catch (Exception ex) {
164                         if (os == null)
165                                 throw new Exception("Could not open output stream for file ");
166                         if (is == null)
167                                 throw new Exception("Could not open input stream for file ");
168                 } finally {
169                         if (os != null) {
170                                 os.close();
171                         }
172                         if (is != null)
173                                 is.close();
174                 }
175         }
176
177         private int copyStream(InputStream in, OutputStream out) throws IOException {
178                 int bytes, totalBytes = 0;
179
180                 byte[] b = new byte[4096];
181
182                 while ((bytes = in.read(b, 0, b.length)) != -1) {
183                         totalBytes += bytes;
184                         out.write(b, 0, bytes);
185                 }
186                 return totalBytes;
187         }
188
189         private int copyStream(HttpServletResponse response, byte[] outStream)
190                         throws IOException {
191                 
192                 OutputStream os = new BufferedOutputStream(response.getOutputStream());
193                 os.write(outStream);
194                 os.flush();
195                 return outStream.length;
196         }
197
198         public DataAccessService getDataAccessService() {
199                 return dataAccessService;
200         }
201
202         public void setDataAccessService(DataAccessService dataAccessService) {
203                 this.dataAccessService = dataAccessService;
204         }
205
206 }