/* * $Id: CachedBuilderPage.java,v 1.4.2.1 2007/01/12 19:31:47 idegaweb Exp $ * * Copyright (C) 2001-2004 Idega hf. All Rights Reserved. * * This software is the proprietary information of Idega hf. * Use is subject to license terms. * */ package com.idega.builder.business; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.StringReader; import java.util.Iterator; import java.util.List; import java.util.Vector; import com.idega.core.builder.data.ICPage; import com.idega.core.builder.data.ICPageHome; import com.idega.core.view.DefaultViewNode; import com.idega.core.view.ViewNode; import com.idega.data.IDOLookup; import com.idega.exception.PageDoesNotExist; /** * An abstract class that represents a cached instance of a Builder page. * Subclasses of this class handle pages of different formats such as IBXML,HTML and JSP. * * @author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson</a>, * <a href="mailto:palli@idega.is">Pall Helgason</a> * * @version 1.0 */ public abstract class CachedBuilderPage extends DefaultViewNode implements ViewNode { public final static String TYPE_PAGE = XMLConstants.PAGE_TYPE_PAGE; public final static String TYPE_TEMPLATE = XMLConstants.PAGE_TYPE_TEMPLATE; protected final static String TYPE_DRAFT = XMLConstants.PAGE_TYPE_DRAFT; protected final static String TYPE_DPT_TEMPLATE = XMLConstants.PAGE_TYPE_DPT_TEMPLATE; protected final static String TYPE_DPT_PAGE = XMLConstants.PAGE_TYPE_DPT_PAGE; private String type=TYPE_PAGE; private String _key; private String pageFormat; private String sourceAsString; private List pageKeysUsingThisTemplate; private String pageUri; /** public IBXMLPage(){ //Default constructor } private IBXMLPage(boolean verify) { setVerifyXML(verify); //_parser = new XMLParser(verify); }*/ public CachedBuilderPage(String key) { super(key,BuilderLogic.getInstance().getBuilderPageRootViewNode()); //this(verify); //setVerifyXML(verifyXML); setPageKey(key); } protected abstract void readPageStream(InputStream stream) throws PageDoesNotExist; /** * Gets the key for the page that this instance represents. * This is typically an id to a ICPage or ib_page. */ public void setSourceFromString(String xmlRepresentation) throws Exception { //htmlSource = htmlRepresentation; //super.setSourceFromString(htmlRepresentation); this.sourceAsString=xmlRepresentation; } public String getSourceAsString(){ return this.sourceAsString; } public String getPageKey() { return this._key; } public void setPageKey(String key){ this._key=key; } public String getType(){ return this.type; } public void setType(String type){ this.type=type; } /** * @return Returns the pageFormat. */ public String getPageFormat() { return this.pageFormat; } /** * @param pageFormat The pageFormat to set. */ public void setPageFormat(String pageFormat) { this.pageFormat = pageFormat; } public void addPageUsingThisTemplate(String id) { if (this.pageKeysUsingThisTemplate == null) { this.pageKeysUsingThisTemplate = new Vector(); } if (!this.pageKeysUsingThisTemplate.contains(id)) { this.pageKeysUsingThisTemplate.add(id); } } public void removePageAsUsingThisTemplate(String id) { if (this.pageKeysUsingThisTemplate == null) { return; } if (this.pageKeysUsingThisTemplate.contains(id)) { this.pageKeysUsingThisTemplate.remove(id); } } public List getUsingTemplate() { if (this.pageKeysUsingThisTemplate == null) { findAllPagesUsingThisTemplate(); } return this.pageKeysUsingThisTemplate; } private void findAllPagesUsingThisTemplate() { this.pageKeysUsingThisTemplate = new Vector(); List l = IBPageFinder.getAllPagesExtendingTemplate(Integer.parseInt(getPageKey())); if (l == null) { return; } Iterator i = l.iterator(); while (i.hasNext()) { ICPage p = (ICPage) i.next(); addPageUsingThisTemplate(p.getPrimaryKey().toString()); } } protected void invalidateAllPagesUsingThisTemplate() { List l = getUsingTemplate(); if (l != null) { Iterator i = l.iterator(); while (i.hasNext()) { String invalid = (String) i.next(); CachedBuilderPage child = getPageCacher().getCachedBuilderPageIfInCache(invalid); if (child != null) { if (child.getType().equals(TYPE_TEMPLATE)) { child.invalidateAllPagesUsingThisTemplate(); } getPageCacher().flagPageInvalid(invalid); } } } } protected BuilderLogic getBuilderLogic(){ return BuilderLogic.getInstance(); } protected PageCacher getPageCacher(){ return getBuilderLogic().getPageCacher(); } /** * This method is called from setPageKey to initialize the page document. * @return * @throws PageDoesNotExist */ protected void setICPage(ICPage ibpage){ try{ setPageFormat(ibpage.getFormat()); readPageStream(ibpage.getPageValue()); if (ibpage.isPage()) { setType(TYPE_PAGE); } else if (ibpage.isDraft()) { setType(TYPE_DRAFT); } else if (ibpage.isTemplate()) { setType(TYPE_TEMPLATE); } else if (ibpage.isDynamicTriggeredTemplate()) { setType(TYPE_DPT_TEMPLATE); } else if (ibpage.isDynamicTriggeredPage()) { setType(TYPE_DPT_PAGE); } else { setType(TYPE_PAGE); } } catch (PageDoesNotExist pe) { int template = ibpage.getTemplateId(); String templateString = null; if (template != -1) { templateString = Integer.toString(template); } if (ibpage.isPage()) { setPageAsEmptyPage(TYPE_PAGE, templateString); } else if (ibpage.isDraft()) { setPageAsEmptyPage(TYPE_DRAFT, templateString); } else if (ibpage.isTemplate()) { setPageAsEmptyPage(TYPE_TEMPLATE, templateString); } else if (ibpage.isDynamicTriggeredTemplate()) { setPageAsEmptyPage(TYPE_DPT_TEMPLATE, templateString); } else if (ibpage.isDynamicTriggeredPage()) { setPageAsEmptyPage(TYPE_DPT_PAGE, templateString); } else { setPageAsEmptyPage(TYPE_PAGE, templateString); } } } public void setPageAsEmptyPage(String pageType,String templateString){ //does nothing by default } protected ICPage getICPage(){ try { ICPageHome icPageHome = (ICPageHome) IDOLookup.getHome(ICPage.class); return icPageHome.findByPrimaryKey(getPageKey()); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } public synchronized boolean store() { try { ICPage icPage = getICPage(); icPage.setFormat(this.getPageFormat()); OutputStream stream = icPage.getPageValueForWrite(); storeStream(stream); icPage.store(); } catch (NumberFormatException ne) { /*try { OutputStream stream = new FileOutputStream(_key); store(stream); } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); }*/ } catch (Exception e) { e.printStackTrace(System.err); } //setPopulatedPage(XMLReader.getPopulatedPage(this)); //setPopulatedPage(null); if (getType().equals(TYPE_TEMPLATE)) { invalidateAllPagesUsingThisTemplate(); } return true; } /** * Writes this page to the given OutputStream stream. * Called from the update method * @param stream */ protected synchronized void storeStream(OutputStream stream) { try { //convert the string to utf-8 //String theString = new String(this.toString().getBytes(),"ISO-8859-1"); //String theString = new String(this.toString().getBytes(),"UTF-8"); String theString = this.toString(); StringReader sr = new StringReader(theString); OutputStreamWriter out = new OutputStreamWriter(stream,"UTF-8"); int bufferlength=1000; char[] buf = new char[bufferlength]; int read = sr.read(buf); while (read!=-1){ out.write(buf,0,read); read = sr.read(buf); } sr.close(); out.close(); stream.close(); } catch (IOException e) { e.printStackTrace(System.err); } } public String toString() { String s = getSourceAsString(); if(s!=null){ return s; } else{ return super.toString(); } } public String getName() { try { return getICPage().getName(); } catch (Exception e) { return ""; } } public String getTemplateKey() { try { return Integer.toString(getICPage().getTemplateId()); } catch (Exception e) { return "-1"; } } public void setTemplateKey(String templateKey) { try { int id = Integer.parseInt(templateKey); ICPage page = getICPage(); page.setTemplateId(id); page.store(); } catch (Exception e) { e.printStackTrace(); } } public void setName(String name) { try { ICPage page = getICPage(); page.setName(name); page.store(); } catch (Exception e) { e.printStackTrace(); } } public String getPageUri(){ return this.pageUri; } public void setPageUri(String pageUri){ this.pageUri=pageUri; } public String getURI(){ ViewNode parent = getParent(); String parentUri = parent.getURI(); if(parentUri.endsWith(SLASH)){ //strip the last slash off: parentUri = parentUri.substring(0,parentUri.length()-1); } String theReturn = parentUri+this.getPageUri(); return theReturn; } public void initializeEmptyPage(){ //meant to be overrided in subclasses. } }