PagesElement.java
00001 package edu.virtualschool.jwaa.xml;
00002 import java.io.BufferedInputStream;
00003 import java.io.FileInputStream;
00004 import java.io.IOException;
00005 import java.util.ArrayList;
00006 import java.util.Iterator;
00007 import java.util.List;
00008
00009 import org.apache.log4j.Logger;
00010 import org.jdom.Document;
00011 import org.jdom.Element;
00012 import org.jdom.JDOMException;
00013 import org.jdom.input.SAXBuilder;
00014
00015 import edu.virtualschool.jwaa.Fault;
00016 import edu.virtualschool.jwaa.GenericIdentifiable;
00017 import edu.virtualschool.jwaa.IOFault;
00018 import edu.virtualschool.jwaa.field.*;
00019 import edu.virtualschool.jwaa.field.FieldUtil;
00020 import edu.virtualschool.jwaa.field.Validatable;
00021
00028 public class PagesElement extends GenericIdentifiable
00029 {
00030 final ApplicationElement app;
00031 final FileField fileMonitor;
00032 final ArrayList pageList = new ArrayList();
00033 boolean needsCommit = false;
00034
00035 final static Logger logger = Logger.getLogger(PagesElement.class.getName());
00036
00037 PagesElement(ApplicationElement parent, Element element) throws Fault
00038 {
00039 super(element.getAttributeValue("id"));
00040 this.app = parent;
00041 String path = element.getAttributeValue("path");
00042 this.fileMonitor = new FileField(parent.getDirectory().toString(), path);
00043 FieldUtil.validateFields(new Validatable[] { fileMonitor});
00044 logger.info("Constructing pages "+fileMonitor);
00045 }
00046 void update() throws Fault
00047 {
00048 if (!fileMonitor.isUpToDate())
00049 {
00050 logger.info("Updating pages "+fileMonitor);
00051 try
00052 {
00053 FileInputStream fis = new FileInputStream(fileMonitor.file);
00054 BufferedInputStream bis = new BufferedInputStream(fis);
00055 SAXBuilder builder = new SAXBuilder();
00056
00057 Document dom = builder.build(fis);
00058 Element rootElement = dom.getRootElement();
00059 if (!rootElement.getName().equals("pages"))
00060 throw new ValidationFault("requires pages as root element, got "+rootElement);
00061
00062 pageList.clear();
00063 List list = rootElement.getChildren("page", rootElement.getNamespace());
00064 for (Iterator iterator = list.iterator(); iterator.hasNext(); )
00065 {
00066 Element element = (Element)iterator.next();
00067 PageElement page = new PageElement(this, element);
00068 if (findPage(page.id) != null)
00069 throw new ValidationFault(fileMonitor+" contains a multiply defined page id: "+page.id);
00070 pageList.add(page);
00071 iterator.remove();
00072 }
00073 fis.close();
00074 }
00075 catch (IOException e)
00076 {
00077 throw new IOFault("IOFault loading " + fileMonitor, e);
00078 }
00079 catch (JDOMException e)
00080 {
00081 throw new ValidationFault
00082 ("Validation fault in "+fileMonitor+"\n"+e.getMessage());
00083 }
00084 fileMonitor.update();
00085 needsCommit = true;
00086 }
00087 }
00088 public void commit() throws ValidationFault
00089 {
00090 if (needsCommit)
00091 {
00092 for (Iterator iterator = pageList.iterator(); iterator.hasNext(); )
00093 {
00094 PageElement page = (PageElement)iterator.next();
00095 page.commit();
00096 }
00097 }
00098 }
00099
00100 public final PageElement getFirstPage()
00101 {
00102 if (pageList.size() < 1)
00103 return null;
00104 else
00105 return (PageElement)pageList.get(0);
00106 }
00107 public final PageElement findPage(String id)
00108 {
00109 for (Iterator iterator = pageList.iterator(); iterator.hasNext(); )
00110 {
00111 PageElement page = (PageElement)iterator.next();
00112 if (page.id.equals(id))
00113 return page;
00114 }
00115 return null;
00116 }
00117 public final ApplicationElement getApplication()
00118 {
00119 return app;
00120 }
00121 public final ArrayList getPages()
00122 {
00123 return pageList;
00124 }
00125 public String getFilePath()
00126 {
00127 return fileMonitor.file.toString();
00128 }
00129 }