/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.esri.gpt.control.view;
import com.esri.gpt.framework.context.BaseServlet;
import com.esri.gpt.framework.context.RequestContext;
import com.esri.gpt.framework.security.identity.NotAuthorizedException;
import com.esri.gpt.framework.security.metadata.MetadataAcl;
import com.esri.gpt.framework.util.UuidUtil;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.logging.Logger;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Handles the display of local metadata thumbnail images.
* <p>
* Most thumbnails are remote urls and are accessed through standard HTTP. <br/>
* The images for some metadata thumbnails are stored within the DBMS. These
* typically come from metadata that is being created/edited through ArcCatalog.
* These images are retrieved by the browser through this Servlet. A sample url
* to access this servlet:<br/> <img
* src="/GPT9/thumbnail?uuid={6153A394-70A9-4311-A6DC-582F2F9758FF}"/>
*/
public class ThumbnailServlet extends BaseServlet {
/** class variables ========================================================= */
/** The Logger. */
private static Logger LOGGER = Logger.getLogger(ThumbnailServlet.class.getName());
/** methods ================================================================= */
/**
* Executes the request.
* @param request the HTTP request
* @param response the HTTP response
* @throws Exception if an exception occurs
*/
protected void execute(HttpServletRequest request,
HttpServletResponse response, RequestContext context) throws Exception {
// determine the guid for the thumbnail
String uuid = UuidUtil.addCurlies(request.getParameter("uuid"));
Connection con = null;
PreparedStatement st = null;
InputStream bis = null;
ServletOutputStream sos = null;
try {
// open the binary input stream for the thumbnail image (blob)
if (uuid.length() > 0) {
// ensure access to the document
boolean bCheckAccess = true;
if (bCheckAccess) {
MetadataAcl acl = new MetadataAcl(context);
boolean bHasAccess = acl.hasReadAccess(context.getUser(),uuid);
if (!bHasAccess) {
throw new NotAuthorizedException("Access denied");
}
}
con = context.getConnectionBroker().returnConnection("").getJdbcConnection();
String sTbl = context.getCatalogConfiguration().getResourceDataTableName();
String sSql = "SELECT THUMBNAIL FROM " + sTbl + " WHERE DOCUUID=?";
st = con.prepareStatement(sSql);
st.setString(1,uuid);
ResultSet rs = st.executeQuery();
if (rs.next()) {
String database = con.getMetaData().getDatabaseProductName().toLowerCase();
if (database.contains("postgresql")){
bis = rs.getBinaryStream("thumbnail");
}
else{
Blob blob = rs.getBlob(1);
if (blob != null) {
bis = blob.getBinaryStream();
}
}
}
}
// write the image to the response output stream
if (bis != null) {
response.setHeader("Content-Disposition:","attachment;filename=thumbnail");
byte[] aBuffer = new byte[4096];
sos = response.getOutputStream();
while (true) {
int nBytes = bis.read(aBuffer, 0, aBuffer.length);
if (nBytes <= 0) break;
sos.write(aBuffer, 0, nBytes);
}
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
} finally {
try {if (st != null) st.close();} catch (Exception ef) {}
try {if (con != null) con.close();} catch (Exception ef) {}
try {if (bis != null) bis.close();} catch (Exception ef) {}
try {if (sos != null) sos.flush();} catch (Exception ef) {LOGGER.severe(ef.getMessage());}
}
}
}