diff --git a/src/main/java/com/redhat/sso/ninja/ExportController.java b/src/main/java/com/redhat/sso/ninja/ExportController.java index c965d3ab..14a68769 100644 --- a/src/main/java/com/redhat/sso/ninja/ExportController.java +++ b/src/main/java/com/redhat/sso/ninja/ExportController.java @@ -7,9 +7,11 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -30,148 +32,179 @@ import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.redhat.sso.ninja.utils.Json; +import com.redhat.sso.ninja.utils.MapBuilder; @Path("/") public class ExportController{ - enum Format{ - csv,json,xls - }; - - public static void main(String[] asd) throws IOException{ - System.out.println( - new ExportController().export(null, "xls").getEntity() - ); - } - - List order = Lists.newArrayList("id","name","belt","total","points","github","gitlab","trello"); - public int getHeaderOrder(String hdr){ - for(String orderMatcher:order){ - if (hdr.toLowerCase().contains(orderMatcher)){ - return order.indexOf(orderMatcher); - } - } - return -1; - } - + enum Format{ + csv,json,xls + }; + + public static void main(String[] asd) throws IOException{ + System.out.println( +// new ExportController().exportScorecards(null, "xls").getEntity() + new ExportController().exportEvents(null, "csv").getEntity() + ); + } + + /* Comparator to order the header and fields of the exported data */ + class HeaderComparator implements Comparator{ + List order; + public HeaderComparator(String[] orderOfItems){ + order=Lists.newArrayList(orderOfItems); + } + public int compare(String o1, String o2){ + if (!o1.equals(o2)) + return getOrder(o1)-getOrder(o2); + return 0; + } + public int getOrder(String hdr){ + for(String orderMatcher:order){ + if (hdr.toLowerCase().contains(orderMatcher)) + return order.indexOf(orderMatcher); + } + return -1; + } + } + + + @GET + @Path("/events/export/{format}") + public Response exportEvents(@Context HttpServletRequest request, @PathParam("format") String format) throws IOException{ + + List> data=new ManagementController().getAllEvents(); + + Set headerset=new HashSet(); + for(Map row:data) + headerset.addAll(row.keySet()); + List headers=new ArrayList(); + headers.addAll(headerset); + + // Sort the data columns + headers.sort(new HeaderComparator(new String[]{"timestamp","type","text","user"})); + + Map dataHeaderMapping=new MapBuilder().build(); + + // export the data + return writeExportFile("Events", format, headers, data, dataHeaderMapping); + } + + @GET @Path("/scorecards/export/{format}") - public Response export(@Context HttpServletRequest request, @PathParam("format") String format) throws IOException{ + public Response exportScorecards(@Context HttpServletRequest request, @PathParam("format") String format) throws IOException{ + + if (!EnumUtils.isValidEnum(Format.class, format)) throw new RuntimeException("format must be in "+Joiner.on(",").join(EnumUtils.getEnumList(Format.class))); + - if (!EnumUtils.isValidEnum(Format.class, format)) throw new RuntimeException("format must be in "+Joiner.on(",").join(EnumUtils.getEnumList(Format.class))); - - - List headers=new ArrayList(); - String jsonToOutput=(String)new ManagementController().getScorecards().getEntity(); - - // Convert data back from datatables json format back to a flatter format for exporting - Map>> result=Json.newObjectMapper(true).readValue(jsonToOutput, new TypeReference>>>(){}); - List> dataRaw=result.get("data"); - - // Manage Columns (and their data field name) - List> columnsRaw=result.get("columns"); - Map columnFieldName=new HashMap(); - for(Map column:columnsRaw){ - String header=(String)column.get("title"); - columnFieldName.put(header, (String)column.get("data")); - headers.add(header); - } - headers.add("id"); + List headers=new ArrayList(); + String jsonToOutput=(String)new ManagementController().getScorecards().getEntity(); + + // Convert data back from datatables json format back to a flatter format for exporting + Map>> result=Json.newObjectMapper(true).readValue(jsonToOutput, new TypeReference>>>(){}); + List> dataRaw=result.get("data"); + + // Manage Columns (and their data field name) + List> columnsRaw=result.get("columns"); + Map dataHeaderMapping=new HashMap(); + for(Map column:columnsRaw){ + String header=(String)column.get("title"); + dataHeaderMapping.put(header, (String)column.get("data")); + headers.add(header); + } + headers.add("id"); - // Sort the data columns - Collections.sort(headers, new Comparator(){ - public int compare(String o1, String o2){ - if (!o1.equals(o2)){ - return getHeaderOrder(o1)-getHeaderOrder(o2); - } - return 0; - } - }); - - // Normalize the data into a single map/row - // flatten the data from a Map of String->Object to String->String - List> data=new ArrayList>(); - for(Map dataItem:dataRaw){ - Map entry=new HashMap(); - for(Entry die:dataItem.entrySet()){ - entry.put(die.getKey(), String.valueOf(die.getValue())); - } - data.add(entry); - } - - // Sort the data rows by Total Points - Collections.sort(data, new Comparator>(){ - public int compare(Map o1, Map o2){ - int i1=Integer.parseInt(o1.get("total")); - int i2=Integer.parseInt(o2.get("total")); - return i2-i1; - } - }); - - - // export the data - File file=new File("export."+format.toLowerCase()); - FileOutputStream fileOS=new FileOutputStream(file); + // Sort the data columns + Collections.sort(headers, new HeaderComparator(new String[]{"id","name","belt","total","points","github","gitlab","trello"})); + + // Normalize the data into a single map/row + // flatten the data from a Map of String->Object to String->String + List> data=new ArrayList>(); + for(Map dataItem:dataRaw){ + Map entry=new HashMap(); + for(Entry die:dataItem.entrySet()){ + entry.put(die.getKey(), String.valueOf(die.getValue())); + } + data.add(entry); + } + + // Sort the data rows by Total Points + Collections.sort(data, new Comparator>(){ + public int compare(Map o1, Map o2){ + return Integer.parseInt(o2.get("total"))-Integer.parseInt(o1.get("total")); + } + }); + + // export the data + return writeExportFile("Scorecards", format, headers, data, dataHeaderMapping); + } + + private Response writeExportFile(String type, String format, List headers, List> data, Map dataHeaderMapping ){ + File file=new File(type+"."+format.toLowerCase()); try{ switch(Format.valueOf(format)){ case json: - IOUtils.write(Json.newObjectMapper(true).writeValueAsString(data), fileOS); - IOUtils.closeQuietly(fileOS); - return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM) - .header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"" ) //optional - .build(); + writeStringAndClose(Json.newObjectMapper(true).writeValueAsString(data), file); + break; case csv: StringBuffer sb=new StringBuffer(); for(String header:headers) - sb.append(header).append(","); + sb.append(header).append(","); sb.append("\n"); for(Map e:data){ - for(String header:headers){ - String headerName=columnFieldName.containsKey(header)?columnFieldName.get(header):header; - sb.append(e.containsKey(headerName)?e.get(headerName):"").append(","); - } + for(String header:headers){ + String headerField=dataHeaderMapping.containsKey(header)?dataHeaderMapping.get(header):header; + sb.append(e.containsKey(headerField)?e.get(headerField):"").append(","); + } sb.append("\n"); } - IOUtils.write(sb.toString(), fileOS); - IOUtils.closeQuietly(fileOS); - return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM) - .header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"" ) //optional - .build(); - + writeStringAndClose(sb.toString(), file); + break; + case xls: - HSSFWorkbook wb=new HSSFWorkbook(); - HSSFSheet s=wb.createSheet("Scorecards"); - - HSSFRow row=s.createRow(0); - for(int i=0;i e:data){ - row=s.createRow(rowCount); - for(int i=0;i e:data){ + row=s.createRow(rowCount); + for(int i=0;i> getAllEvents() throws JsonGenerationException, JsonMappingException, IOException{ + return getEvents(null, null); + } + public List> getEvents(String user, String event) throws JsonGenerationException, JsonMappingException, IOException{ Database2 db=Database2.get(); - List> events=db.getEvents(); List> result=new ArrayList>(); - if (1>=request.getParameterMap().size()){ - result=events; + if (null==user && null==event){ + result=db.getEvents(); }else{ - for(Map event:events){ - if (event.get(EVENT_FIELDS.USER.v).equals(request.getParameter("user"))) result.add(event); - if (event.get(EVENT_FIELDS.TYPE.v).equals(request.getParameter("event"))) result.add(event); - + for(Map e:db.getEvents()){ + if (e.get(EVENT_FIELDS.USER.v).equals(user)) result.add(e); + if (e.get(EVENT_FIELDS.TYPE.v).equals(event)) result.add(e); } } - - return Response.status(200).entity(Json.newObjectMapper(true).writeValueAsString(result)).build(); + return result; } diff --git a/src/main/webapp/events.jsp b/src/main/webapp/events.jsp index e68a09cc..b37dc142 100644 --- a/src/main/webapp/events.jsp +++ b/src/main/webapp/events.jsp @@ -57,6 +57,21 @@ function loadDataTable(){ }} ] } ); + + var btnExport=` + + `; + document.getElementById("example_filter").innerHTML=btnExport+" "+document.getElementById("example_filter").innerHTML; + } @@ -77,6 +92,28 @@ $(document).ready(function() {

Events

+ +
diff --git a/src/main/webapp/scorecards.jsp b/src/main/webapp/scorecards.jsp index 76748199..b9878fdd 100644 --- a/src/main/webapp/scorecards.jsp +++ b/src/main/webapp/scorecards.jsp @@ -149,19 +149,17 @@ function loadDataTable(){ // position:relative;height:25px;width:75px;left:-18px;top:-3px; // tag the export to the left of the search button var btnExport=` -