/*
* 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.
*/

using System;
using Apache.Geode.Client;

namespace Apache.Geode.Examples.Serializer
{
  public class Program
  {
    public static void Main(string[] args)
    {
      var cacheFactory = new CacheFactory()
          .Set("log-level", "none");
      var cache = cacheFactory.Create();

      Console.WriteLine("Registering for data serialization");

      cache.TypeRegistry.RegisterPdxType(Order.CreateDeserializable);

      var poolFactory = cache.GetPoolFactory()
          .AddLocator("localhost", 10334);
      poolFactory.Create("pool");

      var regionFactory = cache.CreateRegionFactory(RegionShortcut.PROXY)
          .SetPoolName("pool");
      var orderRegion = regionFactory.Create<int, Order>("example_orderobject");

      Console.WriteLine("Storing order object in the region");

      const int orderKey = 65;

      var order = new Order(orderKey, "Donuts", 12);

      Console.WriteLine("order to put is " + order);
      orderRegion.Put(orderKey, order, null);

      Console.WriteLine("Successfully put order, getting now...");
      var orderRetrieved = orderRegion.Get(orderKey, null);

      Console.WriteLine("Order key: " + orderKey + " = " + orderRetrieved);

      cache.Close();
    }
  }
}


