# HG changeset patch # User Raimund Renkert # Date 1376656957 -7200 # Node ID b9295222ff06506fcbe98dc4616db6542572ab66 # Parent f0e1caad60270d28b257854c018c7c82b2473144# Parent 71284b42ba39e3ce844001f93868b161cb687ce1 merged. diff -r 71284b42ba39 -r b9295222ff06 src/main/java/de/intevation/lada/data/LProbeRepository.java --- a/src/main/java/de/intevation/lada/data/LProbeRepository.java Fri Aug 16 12:27:43 2013 +0200 +++ b/src/main/java/de/intevation/lada/data/LProbeRepository.java Fri Aug 16 14:42:37 2013 +0200 @@ -1,5 +1,7 @@ package de.intevation.lada.data; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -9,9 +11,12 @@ import javax.inject.Named; import javax.persistence.EntityExistsException; import javax.persistence.EntityManager; +import javax.persistence.Query; import javax.persistence.TransactionRequiredException; import javax.persistence.criteria.CriteriaQuery; +import javax.ws.rs.core.MultivaluedMap; +import de.intevation.lada.auth.Authorization; import de.intevation.lada.manage.Manager; import de.intevation.lada.model.LProbe; import de.intevation.lada.model.LProbeInfo; @@ -47,6 +52,10 @@ @Named("lprobevalidator") private Validator validator; + @Inject + @Named("dataauthorization") + private Authorization authorization; + public EntityManager getEntityManager() { return this.em; } @@ -62,6 +71,34 @@ return new Response(true, 200, result); } + public Response filterFree( + String sql, + List filters, + List results, + MultivaluedMap params) { + Query query = em.createNativeQuery(sql); + for (String filter: filters) { + query.setParameter(filter, params.get(filter)); + } + List result = query.getResultList(); + List> res = new ArrayList>(); + for (Object[] row: result) { + Map set = new HashMap(); + for (int i = 0; i < row.length; i++) { + set.put(results.get(i), row[i]); + if (results.get(i).equals("probeId")) { + if (authorization.isReadOnly((String)row[i])) { + set.put("readonly", Boolean.TRUE); + } + else { + set.put("readonly", Boolean.FALSE); + } + } + } + res.add(set); + } + return new Response(true, 200, res); + } /** * Get all objects. * diff -r 71284b42ba39 -r b9295222ff06 src/main/java/de/intevation/lada/rest/LProbeService.java --- a/src/main/java/de/intevation/lada/rest/LProbeService.java Fri Aug 16 12:27:43 2013 +0200 +++ b/src/main/java/de/intevation/lada/rest/LProbeService.java Fri Aug 16 14:42:37 2013 +0200 @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.logging.Logger; import javax.enterprise.context.RequestScoped; @@ -19,16 +20,23 @@ import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.UriInfo; +import org.apache.commons.io.IOUtils; +import org.jboss.resteasy.plugins.providers.multipart.InputPart; +import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + import de.intevation.lada.auth.Authentication; import de.intevation.lada.auth.AuthenticationException; import de.intevation.lada.auth.AuthenticationResponse; import de.intevation.lada.auth.Authorization; +import de.intevation.lada.data.LProbeRepository; import de.intevation.lada.data.QueryBuilder; import de.intevation.lada.data.Repository; import de.intevation.lada.model.LProbe; import de.intevation.lada.model.LProbeInfo; - -import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; +import de.intevation.lada.utils.QueryTools; /** * This class produces a RESTful service to read, write and update @@ -134,38 +142,52 @@ new QueryBuilder( repository.getEntityManager(), LProbeInfo.class); - builder.or("netzbetreiberId", auth.getNetzbetreiber()); - builder.or("fertig", Boolean.TRUE); + MultivaluedMap params = info.getQueryParameters(); - if (params.isEmpty()) { + if (params.isEmpty() || !params.containsKey("qid")) { return repository.filter(builder.getQuery()); } - QueryBuilder mstBuilder = builder.getEmptyBuilder(); - if (params.keySet().contains("mstId")) { - String[] paramValues = params.getFirst("mstId").split(","); - for (String pv: paramValues) { - mstBuilder.or("mstId", pv); + String qid = params.getFirst("qid"); + JSONObject query = QueryTools.getQueryById(qid); + List filters = new ArrayList(); + List results = new ArrayList(); + String sql = ""; + try { + sql = query.getString("sql"); + JSONArray jFilters = query.getJSONArray("filters"); + for (int i = 0; i < jFilters.length(); i++) { + JSONObject jFilter = jFilters.getJSONObject(i); + filters.add(jFilter.getString("dataIndex")); } - builder.and(mstBuilder); + JSONArray jResults = query.getJSONArray("result"); + for (int i = 0; i < jResults.length(); i++) { + JSONObject jResult = jResults.getJSONObject(i); + results.add(jResult.getString("dataIndex")); + } } - QueryBuilder umwBuilder = builder.getEmptyBuilder(); - if (params.keySet().contains("umwId")) { - String[] paramValues = params.getFirst("umwId").split(","); - for (String pv: paramValues) { - umwBuilder.or("umwId", pv); - } - builder.and(umwBuilder); + catch (JSONException e) { + return new Response(false, 603, new ArrayList()); } - QueryBuilder beginBuilder = builder.getEmptyBuilder(); - if (params.keySet().contains("bedin")) { - String[] paramValues = params.getFirst("begin").split(","); - for (String pv: paramValues) { - beginBuilder.or("probeentnahmeBegin", pv); + + if (sql == null || sql.length() == 0) { + return new Response(false, 603, new ArrayList()); + } + LProbeRepository lpr = (LProbeRepository)repository; + String subselect = "(select * from l_probe_info where "; + List netzbetreiberIds = auth.getNetzbetreiber(); + boolean first = true; + for (String netzbetreiberId: netzbetreiberIds) { + if (first) { + subselect += "netzbetreiber_id = '" + netzbetreiberId + "' "; + first = false; } - builder.and(beginBuilder); + else { + subselect += "or netzbetreiber_id = '" + netzbetreiberId + "' "; + } } - builder.distinct(); - return repository.filter(builder.getQuery()); + subselect += "or fertig = true) as lp"; + sql = sql.replace("l_probe", subselect); + return lpr.filterFree(sql, filters, results, params); } catch(AuthenticationException ae) { return new Response(false, 699, new ArrayList()); diff -r 71284b42ba39 -r b9295222ff06 src/main/java/de/intevation/lada/utils/QueryTools.java --- a/src/main/java/de/intevation/lada/utils/QueryTools.java Fri Aug 16 12:27:43 2013 +0200 +++ b/src/main/java/de/intevation/lada/utils/QueryTools.java Fri Aug 16 14:42:37 2013 +0200 @@ -65,8 +65,8 @@ ResultConfig config = new ResultConfig(); config.setDataIndex(result.getString("dataIndex")); config.setHeader(result.getString("header")); - config.setWidth(result.optInt("width")); - config.setFlex(result.optInt("flex")); + config.setWidth(result.optInt("width", 100)); + config.setFlex(result.optInt("flex", 0)); sResults.add(config); } qConf.setResults(sResults);