/*******************************************************************************
 * Copyright (c) 2008, 2011 Attensity Europe GmbH and brox IT Solutions GmbH. All rights reserved. This program and the
 * accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this
 * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: Juergen Schumacher (Attensity Europe GmbH) - initial implementation
 **********************************************************************************************************************/
package org.eclipse.smila.objectstore.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.DeleteMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PutMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.eclipse.smila.datamodel.Any;
import org.eclipse.smila.datamodel.AnyMap;
import org.eclipse.smila.datamodel.DataFactory;
import org.eclipse.smila.datamodel.Record;
import org.eclipse.smila.http.server.util.RequestHandler;
import org.eclipse.smila.objectstore.httphandler.StoreObjectHandler;

/**
 * Test for {@link StoreObjectHandler}.
 */
public class TestStoreObjectHandler extends AStoreHandlerTest {

  /** test store name. */
  protected static final String STORE_NAME = "teststore";

  protected static final String TEST_URL = BASE_URL + STORE_NAME + "/";

  /** {@inheritDoc} */
  @Override
  protected void setUp() throws Exception {
    super.setUp();
    _store.ensureStore(STORE_NAME);
    _store.clearStore(STORE_NAME);
  }

  /** check handler implementation class. */
  public void testHandlerClass() throws Exception {
    super.setUp();
    final RequestHandler requestHandler =
      getService(RequestHandler.class, "(uriPattern=/store/\\([^/]+\\)/\\(.+\\)$)");
    assertNotNull(requestHandler);
    assertTrue(requestHandler instanceof StoreObjectHandler);
  }

  /** test standard behavior. */
  public void testBonObject() throws Exception {
    final String objectId = "4711";
    final AnyMap object = createObject();
    _store.putObject(STORE_NAME, objectId, _anyWriter.writeBinaryObject(object));
    final AnyMap response = getUrlContent(TEST_URL + objectId);
    assertEquals(object, response);
  }

  /** test fallback to JSON parsing. */
  public void testJsonObject() throws Exception {
    final String objectId = "4711.json";
    final AnyMap object = createObject();
    _store.putObject(STORE_NAME, objectId, _anyWriter.writeJsonObject(object).getBytes());
    final AnyMap response = getUrlContent(TEST_URL + objectId);
    assertEquals(object, response);
  }

  /** test record bulk streaming. */
  public void testBonBulk() throws Exception {
    final String objectId = "4711.app";
    final AnyMap object = createObject();
    final int noOfRecords = 10;
    for (int i = 0; i < noOfRecords; i++) {
      object.put("number", i);
      _store.appendToObject(STORE_NAME, objectId, _anyWriter.writeBinaryObject(object));
    }
    final URL url = new URL(TEST_URL + objectId);
    final URLConnection conn = url.openConnection();
    final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
    String jsonLine = null;
    int count = 0;
    while ((jsonLine = reader.readLine()) != null) {
      object.put("number", count);
      final Record readRecord = _recordReader.readJsonObject(jsonLine);
      assertEquals(object, readRecord.getMetadata());
      ++count;
    }
    assertEquals(noOfRecords, count);
  }

  /** test error on empty file. */
  public void testEmptyObject() throws Exception {
    final String objectId = "4712";
    final byte[] binaryObject = new byte[0];
    _store.putObject(STORE_NAME, objectId, binaryObject);
    final GetMethod method = new GetMethod(TEST_URL + objectId);
    final int code = _client.executeMethod(method);
    assertEquals(HttpStatus.SC_NO_CONTENT, code);
  }

  /** test error on object with no BON content. */
  public void testErrorNoBon() throws Exception {
    final String objectId = "4713";
    _store.putObject(STORE_NAME, objectId, "no-bon".getBytes());
    final GetMethod method = new GetMethod(TEST_URL + objectId);
    final int code = _client.executeMethod(method);
    assertEquals(HttpStatus.SC_BAD_REQUEST, code);
  }

  /** test error not-existing object. */
  public void testErrorNoObject() throws Exception {
    final String objectId = "no-such-object";
    final GetMethod method = new GetMethod(TEST_URL + objectId);
    final int code = _client.executeMethod(method);
    assertEquals(HttpStatus.SC_NOT_FOUND, code);
  }

  /** test error on object with no BON content. */
  public void testWriteBon() throws Exception {
    final String objectId = "4714";
    final AnyMap object = createObject();
    final String jsonObject = _anyWriter.writeJsonObject(object);
    final PutMethod method = new PutMethod(TEST_URL + objectId);
    method.setRequestEntity(new StringRequestEntity(jsonObject, "application/json", "utf-8"));
    final int code = _client.executeMethod(method);
    assertEquals(HttpStatus.SC_OK, code);
    assertTrue(_store.existsObject(STORE_NAME, objectId));
    final byte[] content = _store.getObject(STORE_NAME, objectId);
    final Any readObject = _anyReader.readBinaryObject(content);
    assertEquals(object, readObject);
  }

  /** test for deleting one existing object. */
  public void testRemoveObject() throws Exception {
    final String objectId = "0815";
    _store.putObject(STORE_NAME, objectId, objectId.getBytes());
    final DeleteMethod method = new DeleteMethod(TEST_URL + objectId);
    final int code = _client.executeMethod(method);
    assertEquals(HttpStatus.SC_OK, code);
  }

  /** test for deleting non existing object. */
  public void testRemoveNonExistingObject() throws Exception {
    final String objectId = "no-such-object";
    final DeleteMethod method = new DeleteMethod(TEST_URL + objectId);
    final int code = _client.executeMethod(method);
    assertEquals(HttpStatus.SC_OK, code);
  }

  /** create a simple test object. */
  private AnyMap createObject() {
    final AnyMap object = DataFactory.DEFAULT.createAnyMap();
    object.put("foo", "bar");
    object.put("SMILA", "i like");
    return object;
  }
}
