blob: 5300f2299537f58e4d7ef5e1be20b2d09ce1b30a [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* more patents listed at http://www.pivotal.io/patents.
*========================================================================
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using GemStone.GemFire.Cache;
namespace ProductBrowser
{
public partial class ProductBrowser : Form, ICacheListener
{
//Cache cache = null;
GemStone.GemFire.Cache.Region prodRegion = null;
private string logLevel = "debug";
private string logFile = "productBrowserLog";
public ProductBrowser()
{
InitializeComponent();
Serializable.RegisterType(Product.CreateInstance);
/*
* Initialize Cache system properties
*/
GemStone.GemFire.Cache.Properties prop = GemStone.GemFire.Cache.Properties.Create();
prop.Insert("log-file", logFile);
prop.Insert("log-level", logLevel);
prop.Insert("name", "ProductCache");
CacheFactory cacheFactory = CacheFactory.CreateCacheFactory(prop);
try
{
/*
* Create the GemFire Client cache
*/
Cache cache = cacheFactory.SetSubscriptionEnabled(true).Create();
/*
* Specify required region attributes
*/
RegionFactory regionFactory = cache.CreateRegionFactory(RegionShortcut.CACHING_PROXY);
/*
* Create the region and register interest in all keys
*/
prodRegion = regionFactory
.SetCachingEnabled(true)
.SetCacheListener(this)
.Create("product");
prodRegion.RegisterAllKeys();
}
catch (Exception e)
{
MessageBox.Show("Error during client initialization. " + e.Message);
}
}
private void btnCreate_Click(object sender, EventArgs e)
{
Product prd = new Product();
prd.productId = Convert.ToInt32(txtProdId.Text);
prd.name = txtProdName.Text;
prd.productNumber = txtProdNum.Text;
prd.makeFlag = "false";
prd.finishedGoodsFlag = "false";
prd.color = "Black";
prd.safetyLockLevel = Convert.ToInt32(txtStock.Text);
prd.reorderPoint = Convert.ToInt32(txtReorder.Text);
prd.standardCost = Convert.ToDouble(txtCost.Text);
prd.listPrice = Convert.ToDouble(txtList.Text);
prd.daysToManufacture = Convert.ToInt32(txtMfgDays.Text);
prd.sellStartDate = txtSellDate.Text;
prd.discontinuedDate = txtDiscDate.Text;
try
{
// as the unique identifier is ProductId, we can use this as the key
CacheableString key = new CacheableString(txtProdId.Text);
prodRegion.Put(key, prd);
}
catch (Exception ex)
{
MessageBox.Show("Error creating a new product. " + ex.Message);
}
}
private void btnSearch_Click(object sender, EventArgs e)
{
// perform a search based upon the ProductId. If the ProductId is not specified, thrown an exception.
if (txtProdId.Text == null)
{
MessageBox.Show("Searching enabled on Product ID only");
}
else
{
string prodId = txtProdId.Text;
clearTxtBoxes();
Product prod = (Product)prodRegion.Get(prodId);
if (prod == null)
{
MessageBox.Show("Unable to find a product with a ProductId of " + prodId);
}
else
{
txtProdId.Text = Convert.ToString(prodId);
txtProdName.Text = prod.name;
txtProdNum.Text = prod.productNumber;
txtStock.Text = Convert.ToString(prod.safetyLockLevel);
txtReorder.Text = Convert.ToString(prod.reorderPoint);
txtCost.Text = Convert.ToString(prod.standardCost);
txtList.Text = Convert.ToString(prod.listPrice);
txtMfgDays.Text = Convert.ToString(prod.daysToManufacture);
txtSellDate.Text = prod.sellStartDate;
txtDiscDate.Text = prod.discontinuedDate;
}
}
}
private void btnClear_Click(object sender, EventArgs e)
{
clearTxtBoxes();
}
private void clearTxtBoxes()
{
txtCost.Clear();
txtList.Clear();
txtMfgDays.Clear();
txtProdId.Clear();
txtProdName.Clear();
txtProdNum.Clear();
txtReorder.Clear();
txtStock.Clear();
txtSellDate.ResetText();
txtDiscDate.ResetText();
txtEvent.ResetText();
}
#region ICacheListener Members
public void AfterCreate(EntryEvent ev)
{
string createMessage;
ICacheableKey cKey = ev.Key;
CacheableString cStr = cKey as CacheableString;
Product newProd = (Product)ev.NewValue;
createMessage = string.Format("Product ID {1} has been created. " +
"Product details are:{0}\tProduct Name : {2}{0}\tProduct Number : " +
"{3}{0}\tColor : {4}{0}\tStock Level : {5}{0}\tReorder Point : " +
"{6}{0}\tProduct Cost : {7}{0}\tList Price : " +
"{8}{0}\tAvailable as of : {9}{0}\tDiscontinued as of : {10}",
Environment.NewLine, cStr.Value, newProd.name, newProd.productNumber,
newProd.color, newProd.safetyLockLevel, newProd.reorderPoint,
newProd.standardCost, newProd.listPrice, newProd.sellStartDate,
newProd.discontinuedDate);
}
public void AfterDestroy(EntryEvent ev)
{
string destroyMessage;
ICacheableKey cKey = ev.Key;
CacheableString cStr = cKey as CacheableString;
destroyMessage = "Product ID " + cStr.Value + " has been destroyed";
}
public void AfterInvalidate(EntryEvent ev)
{
string invalidateMessage;
ICacheableKey cKey = ev.Key;
CacheableString cStr = cKey as CacheableString;
invalidateMessage = "Product ID " + cStr.Value + " has been invalidated";
}
public void AfterRegionDestroy(RegionEvent ev)
{
txtEvent.Text = ev.Region.Name + " has been destroyed";
}
public void AfterRegionClear(RegionEvent ev)
{
txtEvent.Text = ev.Region.Name + " has been cleared";
}
public void AfterRegionInvalidate(RegionEvent ev)
{
txtEvent.Text = ev.Region.Name + " has been invalidated";
}
/*
* AfterUpdate is invoked after an entry has been updated. It provide access to the
* old and new values of the entry
*/
public void AfterUpdate(EntryEvent ev)
{
// text string containing the 'delta' between the two objects
string updateMessage = null;
try
{
ICacheableKey cKey = ev.Key;
CacheableString cStr = cKey as CacheableString;
updateMessage = "Product ID " + cStr.Value + " has been updated." +
Environment.NewLine;
Product newProduct = (Product)ev.NewValue;
Product oldProduct = (Product)ev.OldValue;
if (oldProduct != null)
{
updateMessage = updateMessage + Environment.NewLine +
"\tProduct Name : " + oldProduct.name + " ---> " +
newProduct.name + Environment.NewLine +
"\tProduct Number : " + oldProduct.productNumber + " ---> " +
newProduct.productNumber + Environment.NewLine +
"\tColor : " + oldProduct.color + " ---> " +
newProduct.color + Environment.NewLine +
"\tStock Level : " + oldProduct.safetyLockLevel + " ---> " +
newProduct.safetyLockLevel + Environment.NewLine +
"\tReorder Point : " + oldProduct.reorderPoint + " ---> " +
newProduct.reorderPoint + Environment.NewLine +
"\tProduct Cost : " + oldProduct.standardCost + " ---> " +
newProduct.standardCost + Environment.NewLine +
"\tList Price : " + oldProduct.listPrice + " ---> " +
newProduct.listPrice + Environment.NewLine +
"\tAvailable as of : " + oldProduct.sellStartDate + " ---> " +
newProduct.sellStartDate + Environment.NewLine +
"\tDiscontinued as of : " + oldProduct.discontinuedDate + " ---> " +
newProduct.discontinuedDate + Environment.NewLine;
txtEvent.Text = updateMessage;
}
else
{
updateMessage = "Product ID " + cStr.Value + " has been updated. " +
"A prior value does not exist. Product details are: " + Environment.NewLine + Environment.NewLine +
"\tProduct Name : " + newProduct.name + Environment.NewLine +
"\tProduct Number : " + newProduct.productNumber + Environment.NewLine +
"\tColor : " + newProduct.color + Environment.NewLine +
"\tStock Level : " + newProduct.safetyLockLevel + Environment.NewLine +
"\tReorder Point : " + newProduct.reorderPoint + Environment.NewLine +
"\tProduct Cost : " + newProduct.standardCost + Environment.NewLine +
"\tList Price : " + newProduct.listPrice + Environment.NewLine +
"\tAvailable as of : " + newProduct.sellStartDate + Environment.NewLine +
"\tDiscontinued as of : " + newProduct.discontinuedDate + Environment.NewLine;
}
}
catch (Exception e)
{
txtEvent.Text = "AfterUpdate exception." +
Environment.NewLine + e.Message;
}
}
public void AfterRegionLive(RegionEvent ev)
{
txtEvent.Text = ev.Region.Name + " is live";
}
public void Close(GemStone.GemFire.Cache.Region region)
{
txtEvent.Text = region.Name + " has closed";
}
public void AfterRegionDisconnected(GemStone.GemFire.Cache.Region region)
{
txtEvent.Text = region.Name + " has disconnected";
}
#endregion
private void btnDestroy_Click(object sender, EventArgs e)
{
// Destroy an entry based upon the ProductId (key). If the ProductId is not specified, notify the user.
if (txtProdId.Text.Length == 0)
{
MessageBox.Show("Please specify a Product Id to destroy.");
}
else
{
string prodId = txtProdId.Text;
try
{
prodRegion.Destroy(prodId);
clearTxtBoxes();
}
catch (Exception re)
{
MessageBox.Show("Unable to destroy entry." +
Environment.NewLine + re.Message);
}
}
}
private void btnInvalidate_Click(object sender, EventArgs e)
{
// Invalidate an entry based upon the ProductId (key). If the ProductId is not specified, notify the user.
if (txtProdId.Text.Length == 0)
{
MessageBox.Show("Please specify a Product Id to invalidate.");
}
else
{
string prodId = txtProdId.Text;
try
{
prodRegion.Invalidate(prodId);
clearTxtBoxes();
}
catch (Exception re)
{
MessageBox.Show("Unable to invalidate entry." +
Environment.NewLine + re.Message);
}
}
}
}
}