using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using System.Xml;
namespace Quiz
{
///
/// Service1 の概要の説明です。
///
[WebService(Namespace="http://jomora.bne.jp/Quiz/")]
public class QuizService : System.Web.Services.WebService
{
private static ArrayList questionList;
private System.Random random = new System.Random();
public QuizService()
{
//CODEGEN: この呼び出しは、ASP.NET Web サービス デザイナで必要です。
InitializeComponent();
if (questionList == null || questionList.Count == 0) {
this.loadQuestion();
}
}
#region コンポーネント デザイナで生成されたコード
//Web サービス デザイナで必要です。
private IContainer components = null;
///
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
///
private void InitializeComponent()
{
}
///
/// 使用されているリソースに後処理を実行します。
///
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
[WebMethod]
[System.Web.Services.Protocols.SoapRpcMethodAttribute("http://jomora.bne.jp/Quiz/loadQuestion",
RequestNamespace="http://jomora.bne.jp/Quiz/",
ResponseNamespace="http://jomora.bne.jp/Quiz/")]
public int loadQuestion() {
questionList = new ArrayList();
lock(questionList.SyncRoot) {
string qmlDir = System.Configuration.ConfigurationSettings.AppSettings["qmlDir"];
string[] files = System.IO.Directory.GetFiles(qmlDir, "*.qml");
// +.qmlファイルの読み込み
foreach (string file in files) {
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(file);
//
XmlNodeList questionNodeList = xmldoc.SelectNodes("/quiz/group/question");
foreach (XmlNode questionNode in questionNodeList) {
try {
Question question = new Question();
//
question.sentence = questionNode.SelectSingleNode("sentence").InnerText;
//
XmlNodeList choiceNodeList = questionNode.SelectNodes("choice");
ArrayList choiceList = new ArrayList(choiceNodeList.Count);
foreach (XmlNode choiceNode in choiceNodeList) {
Choice choice = new Choice();
choice.correct = Boolean.Parse(choiceNode.SelectSingleNode("@correct").Value);
choice.text = choiceNode.InnerText;
choiceList.Add(choice);
}
question.choices = choiceList.ToArray(typeof(Choice)) as Choice[];
//
question.comment = questionNode.SelectSingleNode("comment").InnerText;
//
question.quizTitle = questionNode.SelectSingleNode("../../title").InnerText;
//
question.groupName = questionNode.SelectSingleNode("../@name").Value;
questionList.Add(question);
} catch (Exception exp) {
System.Diagnostics.Trace.WriteLine(exp);
}
}
}
}
return questionList.Count;
}
[WebMethod]
[System.Web.Services.Protocols.SoapRpcMethodAttribute("http://jomora.bne.jp/Quiz/getQuestion",
RequestNamespace="http://jomora.bne.jp/Quiz/",
ResponseNamespace="http://jomora.bne.jp/Quiz/")]
public Question getQuestion() {
int num = random.Next(0, questionList.Count);
Question question = ((Question)questionList[num]).copy();
try {
Array.Sort(question.choices, new RandamComparer());
} catch(Exception exp) {
System.Diagnostics.Trace.WriteLine(exp);
}
return question;
}
}
public class RandamComparer : System.Collections.IComparer {
private const int MAX_NUM = 20;
private System.Random random = new System.Random();
public int Compare(object x, object y) {
if (x.Equals(y)) return 0;
return random.Next(-1 * MAX_NUM, MAX_NUM);
}
}
}