private void configureGeogigDataStore() throws Exception {

    helper.insertAndAdd(helper.lines1);
    helper.getGeogig().command(CommitOp.class).call();

    Catalog catalog = getCatalog();
    CatalogFactory factory = catalog.getFactory();
    NamespaceInfo ns = factory.createNamespace();
    ns.setPrefix(WORKSPACE);
    ns.setURI(NAMESPACE);
    catalog.add(ns);
    WorkspaceInfo ws = factory.createWorkspace();
    ws.setName(ns.getName());
    catalog.add(ws);

    DataStoreInfo ds = factory.createDataStore();
    ds.setEnabled(true);
    ds.setDescription("Test Geogig DataStore");
    ds.setName(STORE);
    ds.setType(GeoGigDataStoreFactory.DISPLAY_NAME);
    ds.setWorkspace(ws);
    Map<String, Serializable> connParams = ds.getConnectionParameters();

    Optional<URI> geogigDir = helper.getGeogig().command(ResolveGeogigURI.class).call();
    File repositoryUrl = new File(geogigDir.get()).getParentFile();
    assertTrue(repositoryUrl.exists() && repositoryUrl.isDirectory());

    connParams.put(GeoGigDataStoreFactory.REPOSITORY.key, repositoryUrl);
    connParams.put(GeoGigDataStoreFactory.DEFAULT_NAMESPACE.key, ns.getURI());
    catalog.add(ds);

    DataStoreInfo dsInfo = catalog.getDataStoreByName(WORKSPACE, STORE);
    assertNotNull(dsInfo);
    assertEquals(GeoGigDataStoreFactory.DISPLAY_NAME, dsInfo.getType());
    DataAccess<? extends FeatureType, ? extends Feature> dataStore = dsInfo.getDataStore(null);
    assertNotNull(dataStore);
    assertTrue(dataStore instanceof GeoGigDataStore);

    FeatureTypeInfo fti = factory.createFeatureType();
    fti.setNamespace(ns);
    fti.setCatalog(catalog);
    fti.setStore(dsInfo);
    fti.setSRS("EPSG:4326");
    fti.setName("Lines");
    fti.setAdvertised(true);
    fti.setEnabled(true);
    fti.setCqlFilter("INCLUDE");
    fti.setProjectionPolicy(ProjectionPolicy.FORCE_DECLARED);
    ReferencedEnvelope bounds = new ReferencedEnvelope(-180, 180, -90, 90, CRS.decode("EPSG:4326"));
    fti.setNativeBoundingBox(bounds);
    fti.setLatLonBoundingBox(bounds);
    catalog.add(fti);

    fti = catalog.getFeatureType(fti.getId());

    FeatureSource<? extends FeatureType, ? extends Feature> featureSource;
    featureSource = fti.getFeatureSource(null, null);
    assertNotNull(featureSource);
  }
  @Test
  public void testCommitsSurviveShutDown() throws Exception {
    GeoGIG geogig = helper.getGeogig();

    insert();
    update();

    List<RevCommit> expected = ImmutableList.copyOf(geogig.command(LogOp.class).call());

    File repoDir = helper.getRepositoryDirectory();
    assertTrue(repoDir.exists() && repoDir.isDirectory());
    // shut down server
    destroyGeoServer();

    TestPlatform testPlatform = new TestPlatform(repoDir);
    Context context = new CLITestContextBuilder(testPlatform).build();
    geogig = new GeoGIG(context);
    try {
      assertNotNull(geogig.getRepository());
      List<RevCommit> actual = ImmutableList.copyOf(geogig.command(LogOp.class).call());
      assertEquals(expected, actual);
    } finally {
      geogig.close();
    }
  }
  /**
   * Test case to expose issue https://github.com/boundlessgeo/geogig/issues/310 "Editing Features
   * changes the feature type"
   *
   * @see #testUpdateDoesntChangeFeatureType()
   */
  @Test
  public void testInsertDoesntChangeFeatureType() throws Exception {
    String xml =
        "<wfs:Transaction service=\"WFS\" version=\"1.1.0\" " //
            + " xmlns:wfs=\"http://www.opengis.net/wfs\" " //
            + " xmlns:gml=\"http://www.opengis.net/gml\" " //
            + " xmlns:geogig=\""
            + NAMESPACE
            + "\">" //
            + "<wfs:Insert>" //
            + "<geogig:Lines gml:id=\"Lines.1000\">" //
            + "    <geogig:sp>added</geogig:sp>" //
            + "    <geogig:ip>7</geogig:ip>" //
            + "    <geogig:pp>" //
            + "        <gml:LineString srsDimension=\"2\" srsName=\"EPSG:4326\">" //
            + "            <gml:posList>1 2 3 4</gml:posList>" //
            + "        </gml:LineString>" //
            + "    </geogig:pp>" //
            + "</geogig:Lines>" //
            + "</wfs:Insert>" //
            + "</wfs:Transaction>";

    GeoGIG geogig = helper.getGeogig();
    final NodeRef initialTypeTreeRef =
        geogig.command(FindTreeChild.class).setChildPath("Lines").call().get();
    assertFalse(initialTypeTreeRef.getMetadataId().isNull());

    Document dom = postAsDOM("wfs", xml);
    try {
      assertEquals("wfs:TransactionResponse", dom.getDocumentElement().getNodeName());
    } catch (AssertionError e) {
      print(dom);
      throw e;
    }

    try {
      assertEquals(
          "1", getFirstElementByTagName(dom, "wfs:totalInserted").getFirstChild().getNodeValue());
    } catch (AssertionError e) {
      print(dom);
      throw e;
    }

    final NodeRef finalTypeTreeRef =
        geogig.command(FindTreeChild.class).setChildPath("Lines").call().get();
    assertFalse(initialTypeTreeRef.equals(finalTypeTreeRef));
    assertFalse(finalTypeTreeRef.getMetadataId().isNull());

    assertEquals(
        "Feature type tree metadataId shouuldn't change upon edits",
        initialTypeTreeRef.getMetadataId(),
        finalTypeTreeRef.getMetadataId());

    Iterator<NodeRef> featureRefs = geogig.command(LsTreeOp.class).setReference("Lines").call();
    while (featureRefs.hasNext()) {
      NodeRef ref = featureRefs.next();
      assertEquals(finalTypeTreeRef.getMetadataId(), ref.getMetadataId());
      assertFalse(ref.toString(), ref.getNode().getMetadataId().isPresent());
    }
  }
  /**
   * Test case to expose issue https://github.com/boundlessgeo/geogig/issues/310 "Editing Features
   * changes the feature type"
   *
   * @see #testInsertDoesntChangeFeatureType()
   */
  @Test
  public void testUpdateDoesntChangeFeatureType() throws Exception {
    String xml =
        "<wfs:Transaction service=\"WFS\" version=\"1.1.0\"" //
            + " xmlns:geogig=\""
            + NAMESPACE
            + "\"" //
            + " xmlns:ogc=\"http://www.opengis.net/ogc\"" //
            + " xmlns:gml=\"http://www.opengis.net/gml\"" //
            + " xmlns:wfs=\"http://www.opengis.net/wfs\">" //
            + " <wfs:Update typeName=\"geogig:Lines\">" //
            + "   <wfs:Property>" //
            + "     <wfs:Name>geogig:pp</wfs:Name>" //
            + "     <wfs:Value>"
            + "        <gml:LineString srsDimension=\"2\" srsName=\"EPSG:4326\">" //
            + "            <gml:posList>3 4 5 6</gml:posList>" //
            + "        </gml:LineString>" //
            + "     </wfs:Value>" //
            + "   </wfs:Property>" //
            + "   <ogc:Filter>" //
            + "     <ogc:PropertyIsEqualTo>" //
            + "       <ogc:PropertyName>ip</ogc:PropertyName>" //
            + "       <ogc:Literal>1000</ogc:Literal>" //
            + "     </ogc:PropertyIsEqualTo>" //
            + "   </ogc:Filter>" //
            + " </wfs:Update>" //
            + "</wfs:Transaction>";

    GeoGIG geogig = helper.getGeogig();
    final NodeRef initialTypeTreeRef =
        geogig.command(FindTreeChild.class).setChildPath("Lines").call().get();
    assertFalse(initialTypeTreeRef.getMetadataId().isNull());

    Document dom = postAsDOM("wfs", xml);
    assertEquals("wfs:TransactionResponse", dom.getDocumentElement().getNodeName());

    assertEquals(
        "1", getFirstElementByTagName(dom, "wfs:totalUpdated").getFirstChild().getNodeValue());

    final NodeRef finalTypeTreeRef =
        geogig.command(FindTreeChild.class).setChildPath("Lines").call().get();
    assertFalse(initialTypeTreeRef.equals(finalTypeTreeRef));
    assertFalse(finalTypeTreeRef.getMetadataId().isNull());

    assertEquals(
        "Feature type tree metadataId shouuldn't change upon edits",
        initialTypeTreeRef.getMetadataId(),
        finalTypeTreeRef.getMetadataId());
    Iterator<NodeRef> featureRefs = geogig.command(LsTreeOp.class).setReference("Lines").call();
    while (featureRefs.hasNext()) {
      NodeRef ref = featureRefs.next();
      assertEquals(finalTypeTreeRef.getMetadataId(), ref.getMetadataId());
      assertFalse(ref.toString(), ref.getNode().getMetadataId().isPresent());
    }
  }