/* 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.rest.repositories; import com.esri.gpt.control.rest.writer.JsonResultSetWriter; import com.esri.gpt.control.rest.writer.ResultSetWriter; import com.esri.gpt.control.rest.writer.XmlResultSetWriter; import com.esri.gpt.framework.context.BaseServlet; import com.esri.gpt.framework.context.RequestContext; import com.esri.gpt.framework.sql.BaseDao; import com.esri.gpt.framework.sql.HttpExpressionBinder; import com.esri.gpt.framework.sql.ManagedConnection; import com.esri.gpt.framework.util.Val; import java.io.PrintWriter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Provides a Rest API for repositories registered within the GPT harvesting tables. * <p/> * This end point does not query remote reposities, it provides information about * what has been registered. * <p/> * Usage: <i>http://host:port/context</i><b>/rest/repositories?f=</b> * <br/><b>f</b> - the response format, json or xml (optional, default=json) */ public class RepositoriesServlet extends BaseServlet { /** * Processes the HTTP request. * @param request the HTTP request. * @param response HTTP response. * @param context request context * @throws Exception if an exception occurs */ @Override protected void execute(HttpServletRequest request, HttpServletResponse response, RequestContext context) throws Exception { handleSites(request,response,context); } /** * Handles a rest based query against registered repository sites. * @param request the HTTP request * @param response HTTP response * @param context request context * @throws Exception if an exception occurs */ private void handleSites(HttpServletRequest request, HttpServletResponse response, RequestContext context) throws Exception { String protocol = Val.chkStr(request.getParameter("protocol")); // initilize the writer based upon the requested format ResultSetWriter writer = null; String format = Val.chkStr(request.getParameter("f")); String callback = Val.chkStr(request.getParameter("callback")); PrintWriter responseWriter = response.getWriter(); if (format.equalsIgnoreCase("xml")) { response.setContentType("text/xml; charset=UTF-8"); writer = new XmlResultSetWriter(responseWriter); } else { response.setContentType("text/plain; charset=UTF-8"); writer = new JsonResultSetWriter(responseWriter); } if (!callback.isEmpty()) { responseWriter.print(callback+"({"); responseWriter.flush(); } writer.begin(response); ManagedConnection mCon = null; Connection con = null; PreparedStatement st = null; ResultSet rs = null; try { // initialize the query string String table = context.getCatalogConfiguration().getResourceTableName(); StringBuffer sql = new StringBuffer(); String[] columnTags = {"id","uuid","protocol","name","url"}; sql.append("SELECT ID,DOCUUID,PROTOCOL_TYPE,TITLE,HOST_URL FROM "+table); // build the bound query expression based upon HTTP parameter input HttpExpressionBinder binder = new HttpExpressionBinder(request); binder.parse("id","ID","=",",",HttpExpressionBinder.PARAMETERTYPE_INTEGER); binder.parse("uuid","DOCUUID",",",false,false); if(protocol.toLowerCase().equals("all")) { binder.parse("","PROTOCOL_TYPE",",",true,false); } else { binder.parse("protocol","PROTOCOL_TYPE",",",true,false); } binder.parse("name","TITLE",null,true,true); binder.parse("url","HOST_URL",null,true,true); // append the bound where clause, // create the prepared statement and apply bindings, // exexute the query and write the response sql.append(" ").append(binder.getExpression(true)); if(sql.toString().toLowerCase().contains(" where ")) { sql.append(" AND "); } else { sql.append(" WHERE "); } sql.append(" ((APPROVALSTATUS = 'approved') ") .append(" OR (APPROVALSTATUS = 'reviewed')) "); sql.append(" AND SEARCHABLE = 'true'"); sql.append(" ORDER BY UPPER(TITLE) ASC"); mCon = context.getConnectionBroker().returnConnection(""); con = mCon.getJdbcConnection(); st = con.prepareStatement(sql.toString()); binder.applyBindings(st,1); //rs = new RepositoriesResultSetWrapper(st.executeQuery()); if(protocol.toLowerCase().equals("all") != true) { rs = st.executeQuery(); } else { rs = new RepositoriesResultSetWrapper(st.executeQuery()); } writer.writeResultSet(rs,0,columnTags); } finally { writer.flush(); if (!callback.isEmpty()) { responseWriter.print("})"); responseWriter.flush(); } BaseDao.closeResultSet(rs); BaseDao.closeStatement(st); context.getConnectionBroker().closeConnection(mCon); writer.close(); } } }