/******************************************************************************* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * 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. ******************************************************************************/ #set( $symbol_pound = '#' ) #set( $symbol_dollar = '$' ) #set( $symbol_escape = '\' ) package ${package}.util; import org.apache.olingo.odata2.api.commons.HttpStatusCodes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URISyntaxException; import java.net.URL; /** * Data generator for annotation sample service. */ public class AnnotationSampleDataGenerator { public static final String HTTP_METHOD_PUT = "PUT"; public static final String HTTP_METHOD_POST = "POST"; public static final String HTTP_HEADER_CONTENT_TYPE = "Content-Type"; public static final String HTTP_HEADER_ACCEPT = "Accept"; public static final String APPLICATION_JSON = "application/json"; private static final Logger LOG = LoggerFactory.getLogger(AnnotationSampleDataGenerator.class); private static final boolean PRINT_RAW_CONTENT = true; public static void main(String[] args) { String serviceUrl = "http://localhost:8080/MyFormula.svc"; if(args.length == 1) { serviceUrl = args[0]; } generateData(serviceUrl); } public static void generateData(String serviceUrl) { AnnotationSampleDataGenerator app = new AnnotationSampleDataGenerator(); app.generateSampleData(serviceUrl); } public void generateSampleData(String serviceUrl) { print("Generate sample data for service on url: " + serviceUrl); String usedFormat = APPLICATION_JSON; String manufacturerStar = "{\"Id\":\"1\",\"Name\":\"Star Powered Racing\",\"Founded\":\"/Date(-489024000000+0060)/\"," + "\"Address\":{\"Street\":\"Star Street 137\",\"City\":\"Stuttgart\",\"ZipCode\":\"70173\",\"Country\":\"Germany\"}}"; String manufacturerHorse = "{\"Id\":\"2\",\"Name\":\"Horse Powered Racing\",\"Founded\":\"/Date(-1266278400000+0060)/\"," + "\"Address\":{\"Street\":\"Horse Street 1\",\"City\":\"Maranello\",\"ZipCode\":\"41053\",\"Country\":\"Italy\"}}"; String manufacturersUri = serviceUrl + "/Manufacturers"; createEntity(manufacturersUri, manufacturerStar, usedFormat); createEntity(manufacturersUri, manufacturerHorse, usedFormat); String carOneWithInlineDriverOne = "{\"Id\":\"1\",\"Model\":\"F1 W02\",\"Price\":\"167189.0\",\"ModelYear\":2011,\"Updated\":\"/Date(1392989833964)/\"," + "\"Driver\":{\"Id\":\"1\",\"Name\":\"Mic\",\"Lastname\":\"Shoemaker\",\"Nickname\":\"The Fast\",\"Birthday\":\"/Date(488671200000)/\"}}"; String carTwoWithInlineDriverTwo = "{\"Id\":\"2\",\"Model\":\"F1 W04\",\"Price\":\"242189.99\",\"ModelYear\":2013,\"Updated\":\"/Date(1392990355793)/\"," + "\"Driver\":{\"Id\":\"2\",\"Name\":\"Nico\",\"Lastname\":\"Mulemountain\",\"Nickname\":null,\"Birthday\":\"/Date(-31366800000)/\"}}"; String carThreeWithInlineDriverThree = "{\"Id\":\"3\",\"Model\":\"FF2013\",\"Price\":\"199189.11\",\"ModelYear\":2013,\"Updated\":\"/Date(1392990355793)/\"," + "\"Driver\":{\"Id\":\"3\",\"Name\":\"Kimi\",\"Lastname\":\"Heikkinen\",\"Nickname\":\"Iceman\",\"Birthday\":\"/Date(308962800000)/\"}}"; String carFour = "{\"Id\":\"4\",\"Model\":\"FF2014\",\"Price\":\"299189.11\",\"ModelYear\":2014,\"Updated\":\"/Date(1392973616419)/\"}"; createEntity(manufacturersUri + "('1')/Cars", carOneWithInlineDriverOne, usedFormat); createEntity(manufacturersUri + "('1')/Cars", carTwoWithInlineDriverTwo, usedFormat); createEntity(manufacturersUri + "('2')/Cars", carThreeWithInlineDriverThree, usedFormat); createEntity(manufacturersUri + "('2')/Cars", carFour, usedFormat); } private void createEntity(String absoluteUri, String content, String contentType) { try { writeEntity(absoluteUri, content, contentType, HTTP_METHOD_POST); } catch (IOException e) { throw new RuntimeException("Exception during data source initialization generation.", e); } catch (URISyntaxException e) { throw new RuntimeException("Exception during data source initialization generation.", e); } } private void writeEntity(String absoluteUri, String content, String contentType, String httpMethod) throws IOException, URISyntaxException { print(httpMethod + " request on uri: " + absoluteUri + ":\n " + content + "\n"); // HttpURLConnection connection = initializeConnection(absoluteUri, contentType, httpMethod); byte[] buffer = content.getBytes("UTF-8"); connection.getOutputStream().write(buffer); // if a entity is created (via POST request) the response body contains the new created entity HttpStatusCodes statusCode = HttpStatusCodes.fromStatusCode(connection.getResponseCode()); if(statusCode == HttpStatusCodes.CREATED) { // get the content as InputStream and de-serialize it into an ODataEntry object InputStream responseContent = connection.getInputStream(); logRawContent(httpMethod + " response:\n ", responseContent, "\n"); } else if(statusCode == HttpStatusCodes.NO_CONTENT) { print("No content."); } else { checkStatus(connection); } // connection.disconnect(); } private void print(String content) { LOG.info(content); } private HttpStatusCodes checkStatus(HttpURLConnection connection) throws IOException { HttpStatusCodes httpStatusCode = HttpStatusCodes.fromStatusCode(connection.getResponseCode()); if (400 <= httpStatusCode.getStatusCode() && httpStatusCode.getStatusCode() <= 599) { connection.disconnect(); throw new RuntimeException("Http Connection failed with status " + httpStatusCode.getStatusCode() + " " + httpStatusCode.toString()); } return httpStatusCode; } private InputStream logRawContent(String prefix, InputStream content, String postfix) throws IOException { if(PRINT_RAW_CONTENT) { byte[] buffer = streamToArray(content); print(prefix + new String(buffer, "UTF-8") + postfix); return new ByteArrayInputStream(buffer); } return content; } private HttpURLConnection initializeConnection(String absoluteUri, String contentType, String httpMethod) throws IOException { URL url = new URL(absoluteUri); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod(httpMethod); connection.setRequestProperty(HTTP_HEADER_ACCEPT, contentType); if(HTTP_METHOD_POST.equals(httpMethod) || HTTP_METHOD_PUT.equals(httpMethod)) { connection.setDoOutput(true); connection.setRequestProperty(HTTP_HEADER_CONTENT_TYPE, contentType); } return connection; } private byte[] streamToArray(InputStream stream) throws IOException { byte[] result = new byte[0]; byte[] tmp = new byte[8192]; int readCount = stream.read(tmp); while(readCount >= 0) { byte[] innerTmp = new byte[result.length + readCount]; System.arraycopy(result, 0, innerTmp, 0, result.length); System.arraycopy(tmp, 0, innerTmp, result.length, readCount); result = innerTmp; readCount = stream.read(tmp); } stream.close(); return result; } }