/* * (c) 1998-2016 University Corporation for Atmospheric Research/Unidata */ package thredds.server.ncss.view.dsg.point; import org.springframework.http.HttpHeaders; import thredds.server.ncss.exception.NcssException; import thredds.server.ncss.params.NcssParamsBean; import thredds.server.ncss.util.NcssRequestUtils; import thredds.util.ContentType; import ucar.ma2.Array; import ucar.nc2.VariableSimpleIF; import ucar.nc2.constants.CDM; import ucar.nc2.ft.FeatureDatasetPoint; import ucar.nc2.ft.PointFeature; import ucar.nc2.time.CalendarDateFormatter; import ucar.unidata.geoloc.EarthLocation; import ucar.unidata.util.Format; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; /** * Created by cwardgar on 2014/06/02. */ public class PointSubsetWriterCSV extends AbstractPointSubsetWriter { final protected PrintWriter writer; public PointSubsetWriterCSV(FeatureDatasetPoint fdPoint, NcssParamsBean ncssParams, OutputStream out) throws NcssException, IOException { super(fdPoint, ncssParams); this.writer = new PrintWriter(new OutputStreamWriter(out, CDM.utf8Charset)); } @Override public HttpHeaders getHttpHeaders(String datasetPath, boolean isStream) { HttpHeaders httpHeaders = new HttpHeaders(); if (!isStream) { httpHeaders.set("Content-Location", datasetPath); String fileName = NcssRequestUtils.getFileNameForResponse(datasetPath, ".csv"); httpHeaders.set("Content-Disposition", "attachment; filename=\"" + fileName + "\""); httpHeaders.add(ContentType.HEADER, ContentType.csv.getContentHeader()); } else { // The problem is that the browser won't display text/csv inline. httpHeaders.add(ContentType.HEADER, ContentType.text.getContentHeader()); } return httpHeaders; } @Override public void writeHeader(PointFeature pf) throws Exception { writer.print("time,latitude[unit=\"degrees_north\"],longitude[unit=\"degrees_east\"]"); for (VariableSimpleIF wantedVar : wantedVariables) { writer.print(","); writer.print(wantedVar.getShortName()); if (wantedVar.getUnitsString() != null) writer.print("[unit=\"" + wantedVar.getUnitsString() + "\"]"); } writer.println(); } @Override public void writePoint(PointFeature pointFeat) throws Exception { EarthLocation loc = pointFeat.getLocation(); writer.print(CalendarDateFormatter.toDateTimeStringISO(pointFeat.getObservationTimeAsCalendarDate())); writer.print(','); writer.print(Format.dfrac(loc.getLatitude(), 3)); writer.print(','); writer.print(Format.dfrac(loc.getLongitude(), 3)); for (VariableSimpleIF wantedVar : wantedVariables) { writer.print(','); Array dataArray = pointFeat.getData().getArray(wantedVar.getShortName()); writer.print(dataArray.toString().trim()); } writer.println(); } @Override public void writeFooter() throws Exception { writer.flush(); } }