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

org.zkoss.zk.ui.sys.UiFactory Maven / Gradle / Ivy

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

	Purpose:
		
	Description:
		
	History:
		Wed Apr 19 10:50:48     2006, Created by tomyeh

Copyright (C) 2006 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.sys;

import java.io.IOException;
import java.io.Reader;

import org.zkoss.idom.Document;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Desktop;
import org.zkoss.zk.ui.Page;
import org.zkoss.zk.ui.Richlet;
import org.zkoss.zk.ui.Session;
import org.zkoss.zk.ui.UiException;
import org.zkoss.zk.ui.WebApp;
import org.zkoss.zk.ui.metainfo.ComponentDefinition;
import org.zkoss.zk.ui.metainfo.ComponentInfo;
import org.zkoss.zk.ui.metainfo.PageDefinition;
import org.zkoss.zk.ui.metainfo.ShadowInfo;
import org.zkoss.zk.ui.util.Composer;

/**
 * Used to create {@link Session}, {@link Desktop}, {@link Page},
 * {@link Component}, {@link Composer}, and {@link ServerPush}.
 * It is also used to load path/URL into {@link PageDefinition}.
 *
 * 

To customize the implementation of {@link WebApp}, please * specify web-app-class * or web-app-factory-class * instead (of implementing this interface). * *

Rather than implementing this interface from scratch, you could * extend from {@link org.zkoss.zk.ui.http.SimpleUiFactory} * (for non-clustering environment) * or {@link org.zkoss.zk.ui.http.SerializableUiFactory} * (for clustering environment). * * @author tomyeh * @see WebAppFactory */ public interface UiFactory { /** Starts this factory. */ public void start(WebApp wapp); /** Stops this factory. */ public void stop(WebApp wapp); /** Creates an instance of {@link Session}. * * @param wapp the web application * @param nativeSess the native session depending on the Web server. * If HTTP is used, it is javax.servlet.http.HttpSession. * @param request the original request. If HTTP, it is * javax.servlet.http.HttlServletRequest. * @since 3.0.1 */ public Session newSession(WebApp wapp, Object nativeSess, Object request); /** Tests whether the specified request is a richlet. * *

If this method returns true, {@link #getRichlet} is called to create * the richlet. Otherwise, {@link #getPageDefinition} is called to retrieve * the page definition from a ZUML page. * * @param bRichlet the default value that this method shall return. * It is a suggestion. If you don't know what to do, just return bRichlet. * @return true if it is a richlet, or false if it is a ZUML page. */ public boolean isRichlet(RequestInfo ri, boolean bRichlet); /** Returns a richlet for specified request, or null if the richlet is not found.. */ public Richlet getRichlet(RequestInfo ri, String path); /** Creates an instance of {@link Desktop}. * *

Note: the returned instance must also implement {@link DesktopCtrl}. * * @param ri the additional request information. * @param updateURI the URI that is used as the base to generate * URI for asynchronous updates. In other words, it is used to * implement {@link Desktop#getUpdateURI} * @param path the path to request this desktop, such as "/test/test.zul", * or null if it is caused by a filter. */ public Desktop newDesktop(RequestInfo ri, String updateURI, String path); /** Creates an instance of {@link Desktop}. * *

Note: the returned instance must also implement {@link DesktopCtrl}. * * @param ri the additional request information. * @param updateURI the URI that is used as the base to generate * URI for asynchronous updates. In other words, it is used to * implement {@link Desktop#getUpdateURI} * @param resourceURI the URI that is used to get ZK resource * @param path the path to request this desktop, such as "/test/test.zul", * or null if it is caused by a filter. * @since 9.5.0 */ public default Desktop newDesktop(RequestInfo ri, String updateURI, String resourceURI, String path) { return newDesktop(ri, updateURI, path); } /** Creates an instance of {@link Page} for the specified page definition. * *

Note: the returned instance must also implement {@link PageCtrl}. * * @param ri the additional request information. * @param pagedef the page definition. If null, it means the page is served * by a {@link Richlet} instance. * @param path the path to request this page, or null if it is caused * by a filter. */ public Page newPage(RequestInfo ri, PageDefinition pagedef, String path); /** Creates an instance of {@link Page} for the specified richlet. * *

Note: the returned instance must also implement {@link PageCtrl}. */ public Page newPage(RequestInfo ri, Richlet richlet, String path); /** Creates and initializes a component based on the specified * {@link ComponentInfo}. * *

After called, the new component is added to the page, and becomes a * child of the specified parent, if any. In addition, the properties * and custom attributes defined in {@link ComponentDefinition} * and {@link ComponentInfo} are all * applied to the new component. * * @param page the page that the new component belongs to (never null). * @param parent the parent component, or null if the new component is root. * @param compInfo the component information * @since 6.0.0 */ public Component newComponent(Page page, Component parent, ComponentInfo compInfo, Component insertBefore); /** Creates and initializes a shadow based on the specified * {@link ShadowInfo}. * *

After called, the new shadow element is added to the host component, if any. * In addition, the properties are all applied to the new shadow element. * * @param page the page that the host component belongs to (never null). * @param parent the parent shadow, or null if the new shadow is root. * @param compInfo the shadow information * @since 8.0.0 */ public Component newComponent(Page page, Component parent, ShadowInfo compInfo, Component insertBefore); /** Creates and initializes a component based on the specified * {@link ComponentDefinition}. * *

After called, the new component is added to the page, and becomes a * child of the specified parent, if any. In addition, the properties * and custom attributes defined in {@link ComponentDefinition} are all * applied to the new component. * * @param page the page that the new component belongs to (never null). * @param parent the parent component, or null if the new component is root. * @param clsnm the implementation class of the component. * If null, {@link ComponentDefinition#getImplementationClass} will * be used. */ public Component newComponent(Page page, Component parent, ComponentDefinition compdef, String clsnm); /** Creates and initializes a composer of the given class and page. * @param page the page that the composer will be created for. * @exception UiException if failed to instantiate * @since 6.0.0 */ public Composer newComposer(Page page, Class klass); /** Creates and initializes a composer of the given class name and page. * In most cases, the implementation could use {@link Page#resolveClass} * to resolve the class, if page is not null. * @param page the page that the composer will be created for. * @exception UiException if failed to instantiate * @since 6.0.0 */ public Composer newComposer(Page page, String className) throws ClassNotFoundException; /** Creates and initializes the server push of the given class and desktop. * @param desktop the desktop that the server push will be created for. * @exception UiException if failed to instantiate * @since 6.0.0 */ public ServerPush newServerPush(Desktop desktop, Class klass); /** Returns the page definition of the specified path, or null if * not found. * *

Note: unlike {@link #newDesktop} and {@link #newPage}, * it won't be called if it is created thru filter. If filter, * {@link #getPageDefinitionDirectly} is called. * *

Typical use: retrieve the content from a database based on * the specified path, and then invoke {@link #getPageDefinitionDirectly} * to 'convert' the content into a page definition ({@link PageDefinition}). * *

Notice that a page definition usually contains taglib or zscript * files. These files are located by {@link RequestInfo#getLocator}. * If you want them * to be loaded from the database too, you must invoke * {@link RequestInfo#setLocator} to change the default locator. * *

Implementation NOTE: DO NOT invoke * {@link org.zkoss.zk.ui.Execution#getPageDefinition(String)}. * Otherwise, an endless loop occurs. * * @param ri the additional request information. * @param path the path to request this page. * @see #getPageDefinitionDirectly */ public PageDefinition getPageDefinition(RequestInfo ri, String path); /** Returns the page definition of the specified content; never null. * *

It is called when a filter or {@link org.zkoss.zk.ui.Execution#getPageDefinitionDirectly(String, String)} * is going to generate a page definition for the content it intercepts. * *

Implementation NOTE: DO NOT invoke * {@link org.zkoss.zk.ui.Execution#getPageDefinitionDirectly(String, String)}. * Otherwise, an endless loop occurs. * * @param content the raw content of the page. It must be in ZUML. * @param extension the default extension if doc doesn't specify * an language. Ignored if null. * If extension is null and the content doesn't specify a language, * the language called "xul/html" is assumed. * @see #getPageDefinition */ public PageDefinition getPageDefinitionDirectly(RequestInfo ri, String content, String extension); /** Returns the page definition of the specified content; never null. * *

It is called when {@link org.zkoss.zk.ui.Execution#getPageDefinitionDirectly(Document, String)} * is going to generate a page definition for the content it intercepts. * *

Implementation NOTE: DO NOT invoke * {@link org.zkoss.zk.ui.Execution#getPageDefinitionDirectly(Document, String)}. * Otherwise, an endless loop occurs. * * @param content the raw content of the page in DOM. * @param extension the default extension if doc doesn't specify * an language. Ignored if null. * If extension is null and the content doesn't specify a language, * the language called "xul/html" is assumed. * @see #getPageDefinition */ public PageDefinition getPageDefinitionDirectly(RequestInfo ri, Document content, String extension); /** Returns the page definition of the specified reader; never null. * *

It is called when {@link org.zkoss.zk.ui.Execution#getPageDefinitionDirectly(Reader, String)} * is going to generate a page definition for the content it intercepts. * *

Implementation NOTE: DO NOT invoke * {@link org.zkoss.zk.ui.Execution#getPageDefinitionDirectly(Reader, String)}. * Otherwise, an endless loop occurs. * * @param reader the reader to retrieve the raw content in ZUML. * @param extension the default extension if doc doesn't specify * an language. Ignored if null. * If extension is null and the content doesn't specify a language, * the language called "xul/html" is assumed. * @see #getPageDefinition */ public PageDefinition getPageDefinitionDirectly(RequestInfo ri, Reader reader, String extension) throws IOException; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy