/*
* SMART FP7 - Search engine for MultimediA enviRonment generated contenT
* Webpage: http://smartfp7.eu
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* The Original Code is Copyright (c) 2012-2013 of Atos
* All Rights Reserved
*
* Contributor(s):
* Sinan Yurtsever,
* Nines Sanguino, maria.sanguino at atos dot net
*/
package eu.smartfp7.linkeddatamanager.interfaces;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Logger;
import org.json.JSONObject;
import eu.smartfp7.linkeddatamanager.datatypes.Mapping;
import eu.smartfp7.linkeddatamanager.logic.MappingManager;
import eu.smartfp7.linkeddatamanager.logic.SPARQLtoJSON;
import eu.smartfp7.linkeddatamanager.logic.SimpleQueryBuilder;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.DefaultValue;
@Path("structuredSearch")
public class StructuredSearch {
private static final Logger logger = Logger.getLogger(StructuredSearch.class.getCanonicalName());
// @GET
// @Path("test")
// public Response test (){
// return Response.ok("ok").build();
// }
/**
* Finding locations within a geo-spatial rectangle identified by the exact geographical coordinates of its lower-left corner and its upper-right corner
* @param lat1: Between 0 and 90 degrees. Positive (North) o negative (South)
* @param long1: Between 0 and 180 degrees. Positive (East) o negative (West)
* @param lat2: Between 0 and 90 degrees. Positive (North) o negative (South)
* @param long2: Between 0 and 180 degrees. Positive (East) o negative (West)
* @param dataset: The dataset in which perform the search. By default Factforge
* @return A JSON file format with the found venues
* @throws IOException
*/
@GET
@Path("locRec")
@Produces({MediaType.APPLICATION_JSON})
public Response sLocRec (@QueryParam("lat1") float lat1,
@QueryParam("long1") float long1,
@QueryParam("lat2") float lat2,
@QueryParam("long2") float long2,
@QueryParam("dataset") @DefaultValue("factforge") String dataset) throws IOException{
logger.info("Invoking search Location by coordinates, rectangule");
logger.info("Dataset: " + dataset);
logger.info("Lat1: " + lat1);
logger.info("Long1: " + long1);
logger.info("Lat2: " + lat2);
logger.info("Long2: " + long2);
InputStream in = null;
Mapping m = new MappingManager().getMapping(dataset);
SimpleQueryBuilder builder = new SimpleQueryBuilder (m);
builder.setCriteria("", "", "", lat1, long1, lat2, long2, -1);
String query = builder.printQuery();
SPARQLtoJSON queryer = new SPARQLtoJSON (m.getEndpoint(), m);
try{
JSONObject res = queryer.executeSPARQL(query);
in = new ByteArrayInputStream(res.toString().getBytes());
}
catch (Exception e){
e.printStackTrace();
return Response.serverError().build();
}
logger.info("Invoked search Location by coordinates, rectangule");
return Response.ok(in).build();
}
/**
* Finding locations located within a geo-spatial circle identified by the geo-graphical coordinates (a pair of latitude and longitude) of its centre and its radius
* @param lat1: The latitude coordinate indicating the centre. Between 0 and 90 degrees. Positive (North) o negative (South)
* @param long1: The longitude coordinate indicating the centre. Between 0 and 180 degrees. Positive (East) o negative (West)
* @param radius: The radio from the centre
* @param dataset: The dataset in which perform the search. By default Factforge
* @return A JSON file format with the found venues
* @throws IOException
*/
@GET
@Path("locCirc")
@Produces({MediaType.APPLICATION_JSON})
public Response sLocCirc (@QueryParam("lat1") float lat1,
@QueryParam("long1") float long1,
@QueryParam("radius") float radius,
@QueryParam("dataset") @DefaultValue("factforge") String dataset) throws IOException{
logger.info("Invoking search Locations by coordinates, circule");
logger.info("Dataset: " + dataset);
logger.info("Lat1: " + lat1);
logger.info("Long1: " + long1);
logger.info("Radius: " + radius);
InputStream in = null;
Mapping m = new MappingManager().getMapping(dataset);
SimpleQueryBuilder builder = new SimpleQueryBuilder (m);
builder.setCriteria("", "", "", lat1, long1, -91, -81, radius);
String query = builder.printQuery();
SPARQLtoJSON queryer = new SPARQLtoJSON (m.getEndpoint(), m);
try{
JSONObject res = queryer.executeSPARQL(query);
in = new ByteArrayInputStream(res.toString().getBytes());
}
catch (Exception e){
e.printStackTrace();
return Response.serverError().build();
}
logger.info("Invoked search locations by coordinates, circule");
return Response.ok(in).build();
}
/**
* Finding activities within a geo-spatial rectangle identified by the exact geographical coordinates of its lower-left corner and its upper-right corner
* @param lat1: Between 0 and 90 degrees. Positive (North) o negative (South)
* @param long1: Between 0 and 180 degrees. Positive (East) o negative (West)
* @param lat2: Between 0 and 90 degrees. Positive (North) o negative (South)
* @param long2: Between 0 and 180 degrees. Positive (East) o negative (West)
* @param since: To delimit the date (an optional requirement)
* @param until: To delimit the date (an optional requirement)
* @param dataset. The dataset in which perform the search. By default Factforge
* @return A JSON file format with the found activities
* @throws IOException
*/
@GET
@Path("actRec")
@Produces({MediaType.APPLICATION_JSON})
public Response sActRec (@QueryParam("lat1") float lat1,
@QueryParam("long1") float long1,
@QueryParam("lat2") float lat2,
@QueryParam("long2") float long2,
@QueryParam("since") @DefaultValue("") String since,
@QueryParam("until") @DefaultValue("") String until,
@QueryParam("dataset") @DefaultValue("factforge") String dataset) throws IOException{
logger.info("Invoking search activities by coordinates, rectangule");
logger.info("Dataset: " + dataset);
logger.info("Lat1: " + lat1);
logger.info("Long1: " + long1);
logger.info("Lat2: " + lat2);
logger.info("Long2: " + long2);
logger.info("Since: " + since);
logger.info("Until: " + until);
InputStream in = null;
Mapping m = new MappingManager().getMapping(dataset);
SimpleQueryBuilder builder = new SimpleQueryBuilder (m);
builder.setCriteria("activity", since, until, lat1, long1, lat2, long2, -1);
String query = builder.printQuery();
SPARQLtoJSON queryer = new SPARQLtoJSON (m.getEndpoint(), m);
try{
JSONObject res = queryer.executeSPARQL(query);
in = new ByteArrayInputStream(res.toString().getBytes());
}
catch (Exception e){
e.printStackTrace();
return Response.serverError().build();
}
logger.info("Invoked search activities by coordinates, rectangule");
return Response.ok(in).build();
}
/**
* Finding locations located within a geo-spatial circle identified by the geo-graphical coordinates (a pair of latitude and longitude) of its centre and its radius
* @param lat1: The latitude coordinate indicating the centre. Between 0 and 90 degrees. Positive (North) o negative (South)
* @param long1: The longitude coordinate indicating the centre. Between 0 and 180 degrees. Positive (East) o negative (West)
* @param radius: The radio from the centre
* @param since: To delimit the date (an optional requirement)
* @param until: To delimit the date (an optional requirement)
* @param dataset: The dataset in which perform the search. By default Factforge
* @return A JSON file format with the found activities
* @throws IOException
*/
@GET
@Path("actCirc")
@Produces({MediaType.APPLICATION_JSON})
public Response sActCirc (@QueryParam("lat1") float lat1,
@QueryParam("long1") float long1,
@QueryParam("radius") float radius,
@QueryParam("since") @DefaultValue("") String since,
@QueryParam("until") @DefaultValue("") String until,
@QueryParam("dataset") @DefaultValue("factforge") String dataset) throws IOException{
logger.info("Invoking search activities by coordinates, circule");
logger.info("Dataset: " + dataset);
logger.info("Lat1: " + lat1);
logger.info("Long1: " + long1);
logger.info("Radius: " + radius);
logger.info("Since: " + since);
logger.info("Until: " + until);
InputStream in = null;
Mapping m = new MappingManager().getMapping(dataset);
SimpleQueryBuilder builder = new SimpleQueryBuilder (m);
builder.setCriteria("activity", since, until, lat1, long1, -91, -81, radius);
String query = builder.printQuery();
SPARQLtoJSON queryer = new SPARQLtoJSON (m.getEndpoint(), m);
try{
JSONObject res = queryer.executeSPARQL(query);
in = new ByteArrayInputStream(res.toString().getBytes());
}
catch (Exception e){
e.printStackTrace();
return Response.serverError().build();
}
logger.info("Invoked search activities by coordinates, circule");
return Response.ok(in).build();
}
// /**
// * Finding activities within a geo-spatial rectangle identified by the exact geographical coordinates of its lower-left corner and its upper-right corner
// * @param label: The activity
// * @param lang: the language in which is expresed the activity
// * @param lat1. Between 0 y 90 positive North o negative South
// * @param long1. Between 0 y 180 positive East o negative West
// * @param lat2. Between 0 y 90 positive North o negative South
// * @param long2. Between 0 y 180 positive East o negative West
// * @param since
// * @param until
// * @param page
// * @param pageSize
// * @throws IOException
// */
// @GET
// @Path("actLocRec")
// @Produces({MediaType.APPLICATION_JSON})
// public void searchActLocRec(String label, String lang, float lat1, float lon1, float lat2, float lon2, String since, String until, int page, int pageSize) throws IOException{
//
// Mapping m = new MappingManager().getMapping("factforge");
// System.out.println("Sacados los mappins de: " + m.getName());
// SimpleQueryBuilder builder = new SimpleQueryBuilder (m);
// // Metemos solo la primera latitud y longitud y el radious para buscar en el circulo
// builder.setCriteria("activity", since, until, lat1, lon1, lat2, lon2, -1);
// }
//
// /**
// * Busca actividades concretas en un circulo
// * @param label: The activity
// * @param lang: The language in which is expresed the activity
// * @param lat: The latitude
// * @param lon: The longitude
// * @param radius: The radius
// * @param page: the page
// * @param pageSize: The page size
// * @throws IOException
// */
// @GET
// @Path("actLocCirc")
// @Produces({MediaType.APPLICATION_JSON})
// public void searchActLocCirc(String label, String lang, float lat, float lon, float radius, String since, String until, int page, int pageSize) throws IOException{
//
// Mapping m = new MappingManager().getMapping("geosparql");
// System.out.println("Sacados los mappins de: " + m.getName());
// SimpleQueryBuilder builder = new SimpleQueryBuilder (m);
// // Metemos solo la primera latitud y longitud y el radious para buscar en el circulo
// builder.setCriteria("activity", since, until, lat, lon, -91, -81, radius);
// }
//
//
// public static void main(String args[]) throws IOException
// {
// StructuredSearch structured_search_demo = new StructuredSearch();
//
// // Primer metodo que busca cualquier localizacion en un rectangulo
// structured_search_demo.sLocRec(51.139725f, -0.895386f, 51.833232f, 0.645447f, "geosparql");
//
//// // Segundo metodo que busca cualquier localizacion en un circulo
//// structured_search_demo.sLocCirc(51.139725f, -0.895386f, 30, 1, 1);
////
//// // Tercer metodo que busca actividades en un rectangulo
//// structured_search_demo.searchActLocRec ("", "", 51.139725f, -0.895386f, 51.833232f, 0.645447f, "", "", 1, 1);
// }
}