/** * * Copyright * 2009-2015 Jayway Products AB * 2016-2017 Föreningen Sambruk * * Licensed under AGPL, Version 3.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.gnu.org/licenses/agpl.txt * * 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 se.streamsource.dci.restlet.client.responsereader; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.qi4j.api.injection.scope.Structure; import org.qi4j.api.structure.Module; import org.qi4j.api.util.DateFunctions; import org.restlet.Response; import org.restlet.data.MediaType; import org.restlet.data.Status; import org.restlet.resource.ResourceException; import se.streamsource.dci.restlet.client.ResponseReader; import se.streamsource.dci.value.table.TableBuilder; import se.streamsource.dci.value.table.TableValue; import java.text.ParseException; import java.text.SimpleDateFormat; /** * JAVADOC */ public class TableResponseReader implements ResponseReader { @Structure Module module; public Object readResponse( Response response, Class<?> resultType ) throws ResourceException { if (response.getEntity().getMediaType().equals( MediaType.APPLICATION_JSON) && TableValue.class.isAssignableFrom( resultType )) { String jsonValue = response.getEntityAsText(); try { JSONObject jsonObject = new JSONObject(jsonValue); JSONObject table = jsonObject.getJSONObject( "table" ); TableBuilder builder = new TableBuilder(module.valueBuilderFactory()); JSONArray cols = table.getJSONArray( "cols" ); for (int i = 0; i < cols.length(); i++) { JSONObject col = cols.getJSONObject( i ); builder.column( col.optString( "id" ), col.getString( "label" ), col.getString( "type" )); } JSONArray rows = table.getJSONArray( "rows" ); for (int i = 0; i < rows.length(); i++) { builder.row(); JSONObject row = rows.getJSONObject( i ); JSONArray cells = row.getJSONArray( "c" ); for (int j = 0; j < cells.length(); j++) { JSONObject cell = cells.getJSONObject( j ); Object value = cell.opt( "v" ); String formatted = cell.optString("f"); if (cols.getJSONObject( j ).getString( "type" ).equals("datetime") && value != null) value = DateFunctions.fromString( value.toString() ); else if (cols.getJSONObject( j ).getString( "type" ).equals("date") && value != null) try { value = new SimpleDateFormat( "yyyy-MM-dd").parse( value.toString() ); } catch (ParseException e) { throw new ResourceException(e); } else if (cols.getJSONObject( j ).getString( "type" ).equals("timeofday") && value != null) try { value = new SimpleDateFormat( "HH:mm:ss").parse( value.toString() ); } catch (ParseException e) { throw new ResourceException(e); } builder.cell( value, formatted ); } builder.endRow(); } return builder.newTable(); } catch (JSONException e) { throw new ResourceException( Status.CLIENT_ERROR_UNPROCESSABLE_ENTITY, e); } } return null; } }