396 lines
11 KiB
C#

using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
using Csla.Validation;
namespace ProjectTracker.Library
{
[Serializable()]
public class Resource : BusinessBase<Resource>
{
#region Business Methods
private int _id;
private string _lastName = string.Empty;
private string _firstName = string.Empty;
private byte[] _timestamp = new byte[8];
private ResourceAssignments _assignments = ResourceAssignments.NewResourceAssignments();
[System.ComponentModel.DataObjectField(true, true)]
public int Id
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _id;
}
}
public string LastName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _lastName;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (value == null) value = string.Empty;
if (_lastName != value)
{
_lastName = value;
PropertyHasChanged();
}
}
}
public string FirstName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _firstName;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty();
if (value == null) value = string.Empty;
if (_firstName != value)
{
_firstName = value;
PropertyHasChanged();
}
}
}
public string FullName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
if (CanReadProperty("FirstName") && CanReadProperty("LastName"))
return string.Format("{0}, {1}", _lastName, _firstName);
else
throw new System.Security.SecurityException("Property read not allowed");
}
}
public ResourceAssignments Assignments
{
get { return _assignments; }
}
public override bool IsValid
{
get { return base.IsValid && _assignments.IsValid; }
}
public override bool IsDirty
{
get { return base.IsDirty || _assignments.IsDirty; }
}
protected override object GetIdValue()
{
return _id;
}
#endregion
#region Validation Rules
protected override void AddBusinessRules()
{
ValidationRules.AddRule(new RuleHandler(CommonRules.StringRequired), "FirstName");
ValidationRules.AddRule(new RuleHandler(CommonRules.StringMaxLength),
new CommonRules.MaxLengthRuleArgs("FirstName", 50));
ValidationRules.AddRule(new RuleHandler(CommonRules.StringMaxLength),
new CommonRules.MaxLengthRuleArgs("LastName", 50));
}
#endregion
#region Authorization Rules
protected override void AddAuthorizationRules()
{
// add AuthorizationRules here
AuthorizationRules.AllowWrite("LastName", "ProjectManager");
AuthorizationRules.AllowWrite("FirstName", "ProjectManager");
}
public static bool CanAddObject()
{
return Csla.ApplicationContext.User.IsInRole("ProjectManager");
}
public static bool CanGetObject()
{
return true;
}
public static bool CanDeleteObject()
{
bool result = false;
if (Csla.ApplicationContext.User.IsInRole("ProjectManager"))
result = true;
if (Csla.ApplicationContext.User.IsInRole("Administrator"))
result = true;
return result;
}
public static bool CanEditObject()
{
return Csla.ApplicationContext.User.IsInRole("ProjectManager");
}
#endregion
#region Factory Methods
public static Resource NewResource()
{
if (!CanAddObject())
throw new System.Security.SecurityException(
"User not authorized to add a resource");
return DataPortal.Create<Resource>();
}
public static void DeleteResource(int id)
{
if (!CanDeleteObject())
throw new System.Security.SecurityException(
"User not authorized to remove a resource");
DataPortal.Delete(new Criteria(id));
}
public static Resource GetResource(int id)
{
if (!CanGetObject())
throw new System.Security.SecurityException(
"User not authorized to view a resource");
return DataPortal.Fetch<Resource>(new Criteria(id));
}
public override Resource Save()
{
if (IsDeleted && !CanDeleteObject())
throw new System.Security.SecurityException(
"User not authorized to remove a resource");
else if (IsNew && !CanAddObject())
throw new System.Security.SecurityException(
"User not authorized to add a resource");
else if (!CanEditObject())
throw new System.Security.SecurityException(
"User not authorized to update a resource");
return base.Save();
}
private Resource()
{ /* require use of factory methods */ }
#endregion
#region Data Access
[Serializable()]
private class Criteria
{
private int _id;
public int Id
{
get { return _id; }
}
public Criteria(int id)
{ _id = id; }
}
[RunLocal()]
protected override void DataPortal_Create()
{
// nothing to initialize
ValidationRules.CheckRules();
}
private void DataPortal_Fetch(Criteria criteria)
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getResource";
cm.Parameters.AddWithValue("@id", criteria.Id);
using (SafeDataReader dr =
new SafeDataReader(cm.ExecuteReader()))
{
dr.Read();
_id = dr.GetInt32("Id");
_lastName = dr.GetString("LastName");
_firstName = dr.GetString("FirstName");
dr.GetBytes("LastChanged", 0, _timestamp, 0, 8);
// load child objects
dr.NextResult();
_assignments =
ResourceAssignments.GetResourceAssignments(dr);
}
}
}
}
[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_Insert()
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
ApplicationContext.LocalContext["cn"] = cn;
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "addResource";
cm.Parameters.AddWithValue("@lastName", _lastName);
cm.Parameters.AddWithValue("@firstName", _firstName);
SqlParameter param =
new SqlParameter("@newId",SqlDbType.Int);
param.Direction = ParameterDirection.Output;
cm.Parameters.Add(param);
param = new SqlParameter("@newLastChanged", SqlDbType.Timestamp);
param.Direction = ParameterDirection.Output;
cm.Parameters.Add(param);
cm.ExecuteNonQuery();
_id = (int)cm.Parameters["@newId"].Value;
_timestamp = (byte[])cm.Parameters["@newLastChanged"].Value;
}
// update child objects
_assignments.Update(this);
// removing of item only needed for local data portal
if (ApplicationContext.ExecutionLocation==ApplicationContext.ExecutionLocations.Client)
ApplicationContext.LocalContext.Remove("cn");
}
}
[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_Update()
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
ApplicationContext.LocalContext["cn"] = cn;
if (base.IsDirty)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "updateResource";
cm.Parameters.AddWithValue("@id", _id);
cm.Parameters.AddWithValue("@lastName", _lastName);
cm.Parameters.AddWithValue("@firstName", _firstName);
cm.Parameters.AddWithValue("@lastChanged", _timestamp);
SqlParameter param =
new SqlParameter("@newLastChanged", SqlDbType.Timestamp);
param.Direction = ParameterDirection.Output;
cm.Parameters.Add(param);
cm.ExecuteNonQuery();
_timestamp = (byte[])cm.Parameters["@newLastChanged"].Value;
}
}
// update child objects
_assignments.Update(this);
// removing of item only needed for local data portal
if (ApplicationContext.ExecutionLocation == ApplicationContext.ExecutionLocations.Client)
ApplicationContext.LocalContext.Remove("cn");
}
}
[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_DeleteSelf()
{
DataPortal_Delete(new Criteria(_id));
}
[Transactional(TransactionalTypes.TransactionScope)]
private void DataPortal_Delete(Criteria criteria)
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "deleteResource";
cm.Parameters.AddWithValue("@id", criteria.Id);
cm.ExecuteNonQuery();
}
}
}
#endregion
#region Exists
public static bool Exists(string id)
{
ExistsCommand result;
result = DataPortal.Execute<ExistsCommand>(new ExistsCommand(id));
return result.Exists;
}
[Serializable()]
private class ExistsCommand : CommandBase
{
private string _id;
private bool _exists;
public bool Exists
{
get { return _exists; }
}
public ExistsCommand(string id)
{
_id = id;
}
protected override void DataPortal_Execute()
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "existsResource";
cm.Parameters.AddWithValue("@id", _id);
int count = (int)cm.ExecuteScalar();
_exists = (count > 0);
}
}
}
}
#endregion
}
}