/**
*
*/
package com.idega.builder.business;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.logging.Logger;
import com.idega.builder.facelets.FaceletsUtil;
import com.idega.core.view.ViewNodeBase;
import com.idega.idegaweb.IWMainApplication;
import com.idega.util.CoreConstants;
/**
* <p>
* This is an implementation for a a "Facelet" based Builder page that is rendered through JSF.<br/>
* This means that the page is based on a Facelet page and the rendering is dispatched to the
* Facelets view handler for processing the rendering.
* </p>
* Last modified: $Date: 2009/01/15 08:50:01 $ by $Author: tryggvil $
*
* @author <a href="mailto:tryggvil@idega.com">Tryggvi Larusson</a>
* @version $Revision: 1.2 $
*/
public class FaceletPage extends CachedBuilderPage {
/**
*
*/
private static final long serialVersionUID = 5008461273187175725L;
public String getURIWithContextPath() {
/*String parentUri = getParent().getURI();
String pageUri = getPageUri();
String newUri = parentUri+pageUri;
return newUri;*/
return super.getURIWithContextPath();
}
private static Logger log = Logger.getLogger(IBXML2FaceletPage.class.getName());
private boolean isLoadedToDisk=false;
private static File diskTempDir;
private String resourceURI;
public FaceletPage(String pageId){
super(pageId);
}
protected void readPageStream(InputStream pageStream){
File jspTmpDirectory = getDiskTempDirectory();
File jspFile = new File(jspTmpDirectory,getFileNameOnDisk());
streamToFile(pageStream,jspFile);
setLoadedToDisk(true);
}
private String getFileNameOnDisk(){
StringBuffer buffer = new StringBuffer(FaceletsUtil.BUILDERPAGE_PREFIX);
buffer.append(getPageKey()).append(FaceletsUtil.FACELET_PAGE_EXTENSION_WITH_DOT);
return buffer.toString();
}
private String getDiskFilesFolderName(){
return FaceletsUtil.PAGES_DEFAULT_FOLDER;
}
private File getDiskTempDirectory(){
if(diskTempDir==null){
IWMainApplication iwma = this.getIWMainApplication();
String appRealPath = iwma.getApplicationRealPath();
File appRealDir = new File(appRealPath);
diskTempDir = new File(appRealDir,getDiskFilesFolderName());
if(!diskTempDir.exists()){
diskTempDir.mkdir();
}
}
return diskTempDir;
}
private void streamToFile(InputStream pageStream,File jspFile){
try {
if(!jspFile.exists()){
jspFile.createNewFile();
}
//OutputStream jspStream = new FileOutputStream(jspFile);
/*
log.info("Writing to JSP page: "+jspFile.toString());
//ICPage icPage = getICPage();
//InputStream pageStream = icPage.getPageValue();
int bufferLen=1000;
byte[] buffer = new byte[bufferLen];
int read = pageStream.read(buffer);
while(read!=-1){
jspStream.write(buffer);
read = pageStream.read(buffer);
}
pageStream.close();
jspStream.close();*/
log.finer("Streaming builder page with uri: "+getURIWithContextPath()+" to disk in file: "+jspFile.toURL().toString());
InputStreamReader reader = new InputStreamReader(pageStream,CoreConstants.ENCODING_UTF8);//,encoding);
int bufferlength=1000;
char[] buf = new char[bufferlength];
StringBuffer sbuffer = new StringBuffer();
int read = reader.read(buf);
while(read!=-1){
sbuffer.append(buf,0,read);
read = reader.read(buf);
}
String xml = sbuffer.toString();
this.setSourceFromString(xml);
reader.close();
FileWriter fw = new FileWriter(jspFile);
PrintWriter out = new PrintWriter(fw);
out.write(xml);
out.close();
fw.close();
//jspStream.write();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* @return Returns the isLoadedToDisk.
*/
public boolean isLoadedToDisk() {
return this.isLoadedToDisk;
}
/**
* @param isLoadedToDisk The isLoadedToDisk to set.
*/
public void setLoadedToDisk(boolean isLoadedToDisk) {
this.isLoadedToDisk = isLoadedToDisk;
}
public String getResourceURI(){
if(this.resourceURI==null){
this.resourceURI="/"+getDiskFilesFolderName()+"/"+getFileNameOnDisk();
}
return this.resourceURI;
}
public void initializeEmptyPage(){
String templateKey = this.getTemplateKey();
String templateReference = "";
if(templateKey!=null){
if (!templateKey.equals("-1")){
templateReference="template=\""+FaceletsUtil.getRewrittenTemplateReference(this, templateKey)+"\"";
}
}
String source = "<?xml version=\"1.0\"?>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:ui=\"http://java.sun.com/jsf/facelets\" <ui:composition "+templateReference+">\n</html>";
try {
setSourceFromString(source);
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* The ViewNodeBase is here overrided to plug in the the main ViewHandler
* to dispatch the JSF rendering to the Facelets ViewHandler.
*/
public ViewNodeBase getViewNodeBase(){
return ViewNodeBase.FACELET;
}
/*public XMLElement getPageRootElement() {
//return getRootElement();
return super.getRootElement();
}
@Override
public void setPageAsEmptyPage(String type, String template) {
//XMLElement _rootElement = new XMLElement(IBXMLConstants.ROOT_STRING);
//setRootElement(_rootElement);
XMLElement pageElement = new XMLElement(IBXMLConstants.PAGE_STRING,BUILDER_NAMESPACE);
setRootElement(pageElement);
if (type == null) {
type = IBXMLConstants.PAGE_TYPE_PAGE;
}
if ((type.equals(TYPE_DRAFT)) || (type.equals(TYPE_PAGE)) || (type.equals(TYPE_TEMPLATE)) || (type.equals(TYPE_DPT_TEMPLATE)) || (type.equals(TYPE_DPT_PAGE))) {
pageElement.setAttribute(IBXMLConstants.PAGE_TYPE, type);
setType(type);
}
else {
pageElement.setAttribute(IBXMLConstants.PAGE_TYPE, TYPE_PAGE);
setType(type);
}
if (template != null) {
pageElement.setAttribute(IBXMLConstants.TEMPLATE_STRING, template);
}
this.setXMLDocument(new XMLDocument(pageElement));
//_rootElement.addContent(pageElement);
setPopulatedPage(getBuilderLogic().getIBXMLReader().getPopulatedPage(this));
}*/
}