%@page contentType="text/html"
	import="java.io.*,
		org.xml.sax.*,
		org.apache.xerces.parsers.DOMParser,
		org.apache.xerces.dom.*,
		org.apache.xml.serialize.*,
		org.w3c.dom.*" %>
<%!
	DocumentImpl oDoc = null;//new DocumentImpl();
	//初始化Document为null,这里使用null作为一个是否已经加载的标志
	//DocumentTypeImpl oDT = new DocumentTypeImpl( oDoc, "http://cyfer.topcool.net/test", null, "notepad.dtd");
	XMLSerializer oSerializer = null;
	File oDir = new File("/mytest/Data");
	File oXMLFile = new File( oDir, "notepad.xml");
	//下面的方法是保存文件的方法
	void saveTree()
	{
		try
		{
			FileWriter oFileWriter = new FileWriter( oXMLFile);
			oSerializer = new XMLSerializer( oFileWriter,
					new OutputFormat( Method.XML , "GB2312" , true ));
			oSerializer.asDOMSerializer();
			oSerializer.serialize( oDoc);
			oFileWriter.flush();
			oFileWriter.close();
		}
		catch(IOException e)
		{
		}
	}
	//下面的方法是向文档树中插入新的元素的方法
	void insertElement2Tree(String strRootID, String strUserName, String strTitle, String strContent )
	{
		Element oRoot;
		if( null == strRootID || 0 == strRootID.length()) oRoot = oDoc.getDocumentElement();
		else oRoot = (Element)oDoc.getElementsByTagName( strRootID ).item(0).getParentNode();
		insertElement2Tree(oRoot, strUserName, strTitle, strContent);
	}
	//插入方法的另一个版本,实际的插入工作在这格方法内完成
	void insertElement2Tree( Element oRoot, String strUserName, String strTitle, String strContent)
	{
		 Element uname = oDoc.createElement("uname");
		 Text uname_t= oDoc.createTextNode(strUserName);
		 uname.appendChild(uname_t);
		 Element title = oDoc.createElement("title");
		 Text title_t = oDoc.createTextNode(strTitle);
		 title.appendChild(title_t);
		 Element content = oDoc.createElement("content");
		 Text content_t = oDoc.createTextNode(strContent);
		 content.appendChild(content_t);
		 Element oId = oDoc.createElement("id"+String.valueOf( System.currentTimeMillis()));
		 Element oNoteItem = oDoc.createElement("noteitem");
		 oNoteItem.appendChild(oId);
		 oNoteItem.appendChild(uname);
		 oNoteItem.appendChild(title);
		 oNoteItem.appendChild(content);
		 oRoot.appendChild( oNoteItem);
	}
	//下面的方法输出文档信息
	String strCurrentId = null;
	void put(Writer out, Element oTarget)
	{
		try
		{
			if( null == oTarget) return;
			NodeList oChildList = oTarget.getChildNodes();
			if( null == oChildList)
			{
				out.write("Error!");
				return;
			}
			int ChildCount = oChildList.getLength();
			if( oTarget.getNodeName().equals("notepad") || oTarget.getNodeName().equals("noteitem"))
			{
				if( oTarget.getNodeName().equals("noteitem")) out.write("
");
				out.write("");
				for( int i = 0 ; i < ChildCount ; i ++)
				{
					if( oChildList.item(i) instanceof Element)
					{
						put(out, (Element)oChildList.item(i));
					}
				}
				out.write("
");
				if( oTarget.getNodeName().equals("noteitem")) out.write("");
			}
			else if( 0 == oTarget.getNodeName().indexOf("id") )
			{
				strCurrentId = oTarget.getNodeName();
			}
			else if( oTarget.getNodeName().equals("uname") || oTarget.getNodeName().equals("content"))
			{
				out.write("");
				if(oTarget.getNodeName().equals("uname"))
					out.write("用户名为:");
				else
					out.write("内容为:");
				NodeList oTextList = oTarget.getChildNodes();
				for( int i = 0 ; i < oTextList.getLength() ; i ++ )
				{
					out.write( ((Text)oTextList.item(i)).getData());
				}
				out.write("");
			}
			else if( oTarget.getNodeName().equals("title"))
			{
				out.write("标题为:");
				NodeList oTextList = oTarget.getChildNodes();
				for( int i = 0 ; i < oTextList.getLength() ; i ++ )
				{
					out.write( ((Text)oTextList.item(i)).getData());
				}
				out.write("");
			}
		}
		catch(IOException e)
		{
		}
	}
%>
<%
	//下面是获取客户端请求信息的部分
	String strUserName 	= request.getParameter("uname");
	String strTitle 	= request.getParameter("title");
	String strContent 	= request.getParameter("content");
	String strTarget	= request.getParameter("replytarget");
	String strObject	= request.getParameter("uobject");
	String strReply2	= request.getParameter("reply2");
	//检查XML文档是否存在
	if( false == oDir.exists())	oDir.mkdir();
	if( false == oXMLFile.exists())
	{
		//不存在则创建
		oDoc = new DocumentImpl();
		oXMLFile.createNewFile();
		Element root = oDoc.createElement("notepad");
		oDoc.appendChild(root);
		insertElement2Tree( (String)null, "SysOp", "welcome", "congratulations");
		saveTree();
		put(out, root );
	}
	else
	{
		if( null == oDoc)
		{
			//如果文档不存在,则使用解析器进行文档解析
			DOMParser oParser = new DOMParser();
			try
			{
				oParser.parse(
					new InputSource(
						new FileReader(
							new File(
								request.getRealPath("/")+"Data/notepad.xml" ))));
				oDoc = (DocumentImpl)oParser.getDocument();
			}
			catch(Exception e )
			{
				//错误处理
				out.println("Errer occured!");
				out.println(e.toString());
				out.println(request.getRealPath("/"));
			}
		}
		if( null == strReply2)
		{
			//下面几行非常懒惰,必须重写,记住
			if( null == strUserName || 0 == strUserName.length() ) out.println(" uname is null!");
			else if( null == strTitle || 0 == strTitle.length()) out.println(" title is null!");
			else if( null == strContent || 0 == strContent.length() ) out.println(" content is null!");
			else
			{
				//out.println(strUserName+" "+strTitle+" "+ strContent);
				insertElement2Tree( strObject, strUserName, strTitle, strContent);
				saveTree();
			}
		}
		else
		{%>您正在回复
		<%}
		put(out, oDoc.getDocumentElement() );
	}
%>