All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zkoss.zk.ui.metainfo.PageDefinitions Maven / Gradle / Ivy

There is a newer version: 10.0.0-jakarta
Show newest version
/* PageDefinitions.java

	Purpose:
		
	Description:
		
	History:
		Tue May 31 12:34:43     2005, Created by tomyeh

Copyright (C) 2005 Potix Corporation. All Rights Reserved.

{{IS_RIGHT
	This program is distributed under LGPL Version 2.1 in the hope that
	it will be useful, but WITHOUT ANY WARRANTY.
}}IS_RIGHT
*/
package org.zkoss.zk.ui.metainfo;

import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.net.URL;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zkoss.idom.Document;
import org.zkoss.lang.Classes;
import org.zkoss.lang.Library;
import org.zkoss.util.resource.Locator;
import org.zkoss.web.util.resource.ResourceCache;
import org.zkoss.web.util.resource.ResourceCaches;
import org.zkoss.web.util.resource.ResourceLoader;
import org.zkoss.web.util.resource.ServletContextLocator;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.UiException;
import org.zkoss.zk.ui.WebApp;

/**
 * Utilities to retrieve page definitions.
 *
 * @author tomyeh
 */
public class PageDefinitions {
	private static final Logger log = LoggerFactory.getLogger(PageDefinitions.class);
	private static final String ATTR_PAGE_CACHE = "org.zkoss.zk.ui.PageCache";

	/** Returns the page definition of the specified raw content; never null.
	 *
	 * 

This is the lowest method that other getPageDefinitionDirectly depends. * *

Dependency: Execution.createComponentsDirectly -& Execution.getPageDefinitionDirectly * -& UiFactory.getPageDefiitionDirectly -& PageDefintions.getPageDefinitionDirectly * * @param locator the locator used to locate taglib and other resources. * If null, wapp is assumed ({@link WebApp} is also assumed). * @param extension the default extension if the content doesn't specify * an language. In other words, if * the content doesn't specify an language, {@link LanguageDefinition#getByExtension} * is called. * If extension is null and the content doesn't specify a language, * the language called "xul/html" is assumed. * @exception UiException if failed to parse */ public static final PageDefinition getPageDefinitionDirectly(WebApp wapp, Locator locator, String content, String extension) { try { return getPageDefinitionDirectly( wapp, locator, new StringReader(content), extension); } catch (IOException ex) { throw UiException.Aide.wrap(ex); } } /** Returns the page definition of the raw content from the specified * reader; never null. * * @param locator the locator used to locate taglib and other resources. * If null, wapp is assumed ({@link WebApp} is also assumed). * @param extension the default extension if the content doesn't specify * an language. In other words, if * the content doesn't specify an language, {@link LanguageDefinition#getByExtension} * is called. * If extension is null and the content doesn't specify a language, * the language called "xul/html" is assumed. * @exception UiException if failed to parse */ public static final PageDefinition getPageDefinitionDirectly(WebApp wapp, Locator locator, Reader reader, String extension) throws IOException { try { return new Parser(wapp, locator).parse(reader, extension); } catch (IOException ex) { throw ex; } catch (Exception ex) { throw UiException.Aide.wrap(ex); } } /** Returns the page definition of the specified raw content in DOM; * never null. * * @param locator the locator used to locate taglib and other resources. * If null, wapp is assumed ({@link WebApp} is also assumed). * @param extension the default extension if the content doesn't specify * an language. In other words, if * the content doesn't specify an language, {@link LanguageDefinition#getByExtension} * is called. * If extension is null and the content doesn't specify a language, * the language called "xul/html" is assumed. * @exception UiException if failed to parse */ public static final PageDefinition getPageDefinitionDirectly(WebApp wapp, Locator locator, Document doc, String extension) { try { return new Parser(wapp, locator).parse(doc, extension); } catch (Exception ex) { throw UiException.Aide.wrap(ex); } } /** Returns the page definition of the specified path, or null if not * found or failed to parse. * *

This is the lowest method that other getPageDefinition depends. * *

Dependency: Execution.createComponents -& Execution.getPageDefinition * -& UiFactory.getPageDefiition -& PageDefintions.getPageDefinition * * @param locator the locator used to locate taglib and other resources. * If null, wapp is assumed ({@link WebApp} is also assumed). */ public static final PageDefinition getPageDefinition(WebApp wapp, Locator locator, String path) { wapp.getConfiguration().invokeURIInterceptors(path); //give the security a chance to reject return ResourceCaches.get( getCache(wapp), wapp.getServletContext(), path, locator); } /** Returns the locator for the specified context. * * @param path the original path, or null if not available. * The original path is used to resolve a relative path. * If not specified, {@link org.zkoss.zk.ui.Desktop#getCurrentDirectory} * is used. */ public static final Locator getLocator(WebApp wapp, String path) { if (wapp == null) throw new IllegalArgumentException("null"); if (path != null && path.length() > 0 && path.charAt(0) == '/') { final int j = path.lastIndexOf('/'); path = j > 0 ? path.substring(0, j + 1): "/"; } else { final Execution exec = Executions.getCurrent(); if (exec != null) path = exec.getDesktop().getCurrentDirectory(); } return new ServletContextLocator(wapp.getServletContext(), path); } @SuppressWarnings("unchecked") private static final ResourceCache getCache(WebApp wapp) { ResourceCache cache = (ResourceCache)wapp.getAttribute(ATTR_PAGE_CACHE); if (cache == null) { synchronized (PageDefinitions.class) { cache = (ResourceCache)wapp.getAttribute(ATTR_PAGE_CACHE); if (cache == null) { ResourceLoader loader = null; final String clsnm = Library.getProperty("org.zkoss.zk.ui.metainfo.page.Loader.class"); if (clsnm != null) { try { final Object o = Classes.newInstanceByThread(clsnm, new Class[] {WebApp.class}, new Object[] {wapp}); if (o instanceof ResourceLoader) loader = (ResourceLoader)o; else log.warn(clsnm + " must implement " + ResourceLoader.class.getName()); } catch (Throwable ex) { log.warn("Unable to instantiate "+clsnm, ex); } } if (loader == null) loader = new MyLoader(wapp); cache = new ResourceCache(loader, 167); cache.setMaxSize(1024); cache.setLifetime(60*60000); //1hr wapp.setAttribute(ATTR_PAGE_CACHE, cache); } } } return cache; } private static class MyLoader extends ResourceLoader { private final WebApp _wapp; private MyLoader(WebApp wapp) { _wapp = wapp; } //-- super --// protected PageDefinition parse(String path, File file, Object extra) throws Exception { final Locator locator = extra != null ? (Locator)extra: getLocator(_wapp, path); return new Parser(_wapp, locator).parse(file, path); } protected PageDefinition parse(String path, URL url, Object extra) throws Exception { final Locator locator = extra != null ? (Locator)extra: getLocator(_wapp, path); return new Parser(_wapp, locator).parse(url, path); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy