Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

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(); // detach element from parent
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 }