VN3056REP - Same business logic as View Report for View Cross function from Questionnaire list
Revision as of 04:22, 18 October 2013 by Wikicatglobe (talk | contribs)
<accesscontrol>Main:MyGroup</accesscontrol>
Introduction
The current process of "View cross" function in Questionnaire list:
- Create / Rebuild the default data cache of selected questionnaire.
- Check if the data cache has any axises, if yes redirect to a "nearly" cross viewer page, if no, just render an error message.
Disadvantage:
- The data cache is always rebuilt if there is a change in data of questionnaire.
- If the questionnaire template of questionnaire is changed, it is too difficult to re-setup the data cache.
Design decisions
When "View Cross" function of Questionnaire list is clicked:
- If this is the first time that this function is used for selected questionnaire, create a data cache and redirect to cross viewer page.
- If not, use the same business logic as "View Report" function, show the below dialog
- If option 1 is selected, data cache will be re-setup, rebuild, and then show the cross viewer page.
- If option 2 is selected, just show the cross viewer page with the old data cache.
Design detail
- Re-make a new "Regenerate instant cross" dialog as above.
- There are two main processes for this dialog:
- The Page_Load event:
- Create default data cache
// QuestionnaireObject is a selected Questionnaire
QuestionnaireCacheSpecification qcsObject = DiagramUtilities.CreateNewDCSByQuestionnaire(QuestionnaireObject);
- The Button Ok clicked event:
- Re-setup data cache:
// _dcsId is a questionnaire cache specification ID
// _pqId is a project questionnaire ID
var pq = ProjectQuestionnaire.GetByPrimaryKey(_pqId);
var qcs = QuestionnaireCacheSpecification.GetBy(_dcsId);
var pqs = new List<ProjectQuestionnaire> { pq };
qcs.QuickSetup(pqs, true);
qcs.AxisSet = qcs.CreateDefaultAxisSet();
qcs.Save();
- Rebuild data cache:
// qcsObject is a questionnaire cache specification object
DataCacheManager.Instance.BuildDCSIfNeeded(qcsObject, true, false);
- Re-setup and rebuild data cache in another thread
[ServerMethod]
public bool ResetupAndRebuildDcs(int pqId, int qcsId, string key)
{
var identity = WindowsIdentity.GetCurrent();
var generator = new ResetupDcsForCrossDiagramGenerator(pqId, qcsId, key, identity);
var thread = new Thread(generator.ResetupDcs)
{
CurrentCulture = Thread.CurrentThread.CurrentCulture,
CurrentUICulture = Thread.CurrentThread.CurrentUICulture
};
thread.Start();
return true;
}
- Class diagram of ResetupDcsForCrossDiagramGenerator class
- ResetupDcs() method:
public void ResetupDcs()
{
if (IsInProc())
{
ResetupDcsReal();
return;
}
_identity.Impersonate();
IoC.Resolve<IAccessFactoryFactory>().CreateFactory();
try
{
ResetupDcsReal();
AppDomain.CurrentDomain.SetData(_threadkey, string.Format("Success.{0}", _dcsId));
}
catch (Exception e)
{
Abort(e);
}
finally
{
Commit();
}
}
- ResetupDcsReal() method: note that AccessFactory.CurrentInstance().ConnectionFactory.Commit(); has to be called before building Dcs to get latest data.
private void ResetupDcsReal()
{
var pq = ProjectQuestionnaire.GetByPrimaryKey(_pqId);
var qcs = QuestionnaireCacheSpecification.GetBy(_dcsId);
var pqs = new List<ProjectQuestionnaire> { pq };
qcs.QuickSetup(pqs, true);
qcs.AxisSet = qcs.CreateDefaultAxisSet();
qcs.Save();
AccessFactory.CurrentInstance().ConnectionFactory.Commit();
DataCacheManager.Instance.BuildDCSIfNeeded(qcs, true, true);
}
Document revisions
Version No. | Date | Changed By | Description | Svn revision |
0.1 | 23.03.2010 | Trần Nguyễn Thanh Tùng | Technical design | NA |
0.2 | 01.04.2010 | Trần Nguyễn Thanh Tùng | Update to bug fixed - Finish | NA |