/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package com.sun.faces.facelets.tag.composite;
import javax.el.ValueExpression;
import javax.faces.FacesException;
import javax.faces.component.ContextCallback;
import javax.faces.component.UIComponent;
import javax.faces.component.behavior.ClientBehavior;
import javax.faces.component.behavior.ClientBehaviorHolder;
import javax.faces.component.visit.VisitCallback;
import javax.faces.component.visit.VisitContext;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import javax.faces.event.*;
import javax.faces.render.Renderer;
import java.io.IOException;
import java.util.*;
/**
* <p class="changed_added_2_0"></p>
*/
public class BehaviorHolderWrapper extends UIComponent implements
ClientBehaviorHolder {
private final UIComponent parent;
private final String virtualEvent;
private final String event;
public BehaviorHolderWrapper(UIComponent parent, String virtualEvent, String event) {
this.parent = parent;
this.virtualEvent = virtualEvent;
this.event = event;
}
/**
* @see javax.faces.component.UIComponent#broadcast(javax.faces.event.FacesEvent)
*/
@Override
public void broadcast(FacesEvent event) throws AbortProcessingException {
parent.broadcast(event);
}
/**
* @see javax.faces.component.UIComponent#decode(javax.faces.context.FacesContext)
*/
@Override
public void decode(FacesContext context) {
parent.decode(context);
}
/**
* @see javax.faces.component.UIComponent#encodeBegin(javax.faces.context.FacesContext)
*/
@Override
public void encodeBegin(FacesContext context) throws IOException {
parent.encodeBegin(context);
}
/**
* @see javax.faces.component.UIComponent#encodeChildren(javax.faces.context.FacesContext)
*/
@Override
public void encodeChildren(FacesContext context) throws IOException {
parent.encodeChildren(context);
}
/**
* @see javax.faces.component.UIComponent#encodeEnd(javax.faces.context.FacesContext)
*/
@Override
public void encodeEnd(FacesContext context) throws IOException {
parent.encodeEnd(context);
}
/**
* @see javax.faces.component.UIComponent#findComponent(java.lang.String)
*/
@Override
public UIComponent findComponent(String expr) {
return parent.findComponent(expr);
}
/**
* @see javax.faces.component.UIComponent#getAttributes()
*/
@Override
public Map<String, Object> getAttributes() {
return parent.getAttributes();
}
@Override
public Map<String, Object> getPassThroughAttributes(boolean create) {
return parent.getPassThroughAttributes(create);
}
/**
* @see javax.faces.component.UIComponent#getChildCount()
*/
@Override
public int getChildCount() {
return parent.getChildCount();
}
/**
* @see javax.faces.component.UIComponent#getChildren()
*/
@Override
public List<UIComponent> getChildren() {
return parent.getChildren();
}
/**
* @see javax.faces.component.UIComponent#getClientId(javax.faces.context.FacesContext)
*/
@Override
public String getClientId(FacesContext context) {
return parent.getClientId(context);
}
/**
* @see javax.faces.component.UIComponent#getFacet(java.lang.String)
*/
@Override
public UIComponent getFacet(String name) {
return parent.getFacet(name);
}
/**
* @see javax.faces.component.UIComponent#getFacets()
*/
@Override
public Map<String, UIComponent> getFacets() {
return parent.getFacets();
}
/**
* @see javax.faces.component.UIComponent#getFacetsAndChildren()
*/
@Override
public Iterator<UIComponent> getFacetsAndChildren() {
return parent.getFacetsAndChildren();
}
/**
* @see javax.faces.component.UIComponent#getFamily()
*/
@Override
public String getFamily() {
return parent.getFamily();
}
/**
* @see javax.faces.component.UIComponent#getId()
*/
@Override
public String getId() {
return parent.getId();
}
/**
* @see javax.faces.component.UIComponent#getParent()
*/
@Override
public UIComponent getParent() {
return parent.getParent();
}
/**
* @see javax.faces.component.UIComponent#getRendererType()
*/
@Override
public String getRendererType() {
return parent.getRendererType();
}
/**
* @see javax.faces.component.UIComponent#getRendersChildren()
*/
@Override
public boolean getRendersChildren() {
return parent.getRendersChildren();
}
/**
* @see javax.faces.component.UIComponent#getValueBinding(java.lang.String)
* @deprecated
*/
@Override
public ValueBinding getValueBinding(String name) {
return parent.getValueBinding(name);
}
/**
* @see javax.faces.component.UIComponent#getValueExpression(java.lang.String)
*/
@Override
public ValueExpression getValueExpression(String name) {
return parent.getValueExpression(name);
}
/**
* @see javax.faces.component.UIComponent#invokeOnComponent(javax.faces.context.FacesContext, java.lang.String, javax.faces.component.ContextCallback)
*/
@Override
public boolean invokeOnComponent(FacesContext context,
String clientId,
ContextCallback callback)
throws FacesException {
return parent.invokeOnComponent(context, clientId, callback);
}
/**
* @see javax.faces.component.UIComponent#isInView()
*/
@Override
public boolean isInView() {
return parent.isInView();
}
/**
* @see javax.faces.component.UIComponent#isRendered()
*/
@Override
public boolean isRendered() {
return parent.isRendered();
}
/**
* @see javax.faces.component.StateHolder#isTransient()
*/
@Override
public boolean isTransient() {
return parent.isTransient();
}
/**
* @see javax.faces.component.UIComponent#processDecodes(javax.faces.context.FacesContext)
*/
@Override
public void processDecodes(FacesContext context) {
parent.processDecodes(context);
}
/**
* @see javax.faces.component.UIComponent#processEvent(javax.faces.event.ComponentSystemEvent)
*/
@Override
public void processEvent(ComponentSystemEvent event)
throws AbortProcessingException {
parent.processEvent(event);
}
/**
* @see javax.faces.component.UIComponent#processRestoreState(javax.faces.context.FacesContext, java.lang.Object)
*/
@Override
public void processRestoreState(FacesContext context, Object state) {
parent.processRestoreState(context, state);
}
/**
* @see javax.faces.component.UIComponent#processSaveState(javax.faces.context.FacesContext)
*/
@Override
public Object processSaveState(FacesContext context) {
return parent.processSaveState(context);
}
/**
* @see javax.faces.component.UIComponent#processUpdates(javax.faces.context.FacesContext)
*/
@Override
public void processUpdates(FacesContext context) {
parent.processUpdates(context);
}
/**
* @see javax.faces.component.UIComponent#processValidators(javax.faces.context.FacesContext)
*/
@Override
public void processValidators(FacesContext context) {
parent.processValidators(context);
}
/**
* @see javax.faces.component.UIComponent#queueEvent(javax.faces.event.FacesEvent)
*/
@Override
public void queueEvent(FacesEvent event) {
parent.queueEvent(event);
}
/**
* @see javax.faces.component.StateHolder#restoreState(javax.faces.context.FacesContext, java.lang.Object)
*/
@Override
public void restoreState(FacesContext context, Object state) {
if (context == null) {
throw new NullPointerException();
}
parent.restoreState(context, state);
}
/**
* @see javax.faces.component.StateHolder#saveState(javax.faces.context.FacesContext)
*/
@Override
public Object saveState(FacesContext context) {
if (context == null) {
throw new NullPointerException();
}
return parent.saveState(context);
}
/**
* @see javax.faces.component.UIComponent#setId(java.lang.String)
*/
@Override
public void setId(String id) {
parent.setId(id);
}
/**
* @see javax.faces.component.UIComponent#setParent(javax.faces.component.UIComponent)
*/
@Override
public void setParent(UIComponent parent) {
parent.setParent(parent);
}
/**
* @see javax.faces.component.UIComponent#setRendered(boolean)
*/
@Override
public void setRendered(boolean rendered) {
parent.setRendered(rendered);
}
/**
* @see javax.faces.component.UIComponent#setRendererType(java.lang.String)
*/
@Override
public void setRendererType(String rendererType) {
parent.setRendererType(rendererType);
}
/**
* @see javax.faces.component.StateHolder#setTransient(boolean)
*/
@Override
public void setTransient(boolean newTransientValue) {
parent.setTransient(newTransientValue);
}
/**
* @see javax.faces.component.UIComponent#setValueBinding(java.lang.String, javax.faces.el.ValueBinding)
* @deprecated
*/
@Override
public void setValueBinding(String name, ValueBinding binding) {
parent.setValueBinding(name, binding);
}
/**
* @see javax.faces.component.UIComponent#setValueExpression(java.lang.String, javax.el.ValueExpression)
*/
@Override
public void setValueExpression(String name, ValueExpression binding) {
parent.setValueExpression(name, binding);
}
/**
* @see javax.faces.component.UIComponent#subscribeToEvent(java.lang.Class, javax.faces.event.ComponentSystemEventListener)
*/
@Override
public void subscribeToEvent(Class<? extends SystemEvent> eventClass,
ComponentSystemEventListener componentListener) {
parent.subscribeToEvent(eventClass, componentListener);
}
/**
* @see javax.faces.component.UIComponent#unsubscribeFromEvent(java.lang.Class, javax.faces.event.ComponentSystemEventListener)
*/
@Override
public void unsubscribeFromEvent(Class<? extends SystemEvent> eventClass,
ComponentSystemEventListener componentListener) {
parent.unsubscribeFromEvent(eventClass, componentListener);
}
/**
* @see javax.faces.component.UIComponent#visitTree(javax.faces.component.visit.VisitContext, javax.faces.component.visit.VisitCallback)
*/
@Override
public boolean visitTree(VisitContext context, VisitCallback callback) {
return parent.visitTree(context, callback);
}
@Override
protected void addFacesListener(FacesListener listener) {
// no-op
}
@Override
protected FacesContext getFacesContext() {
return FacesContext.getCurrentInstance();
}
@Override
protected FacesListener[] getFacesListeners(Class clazz) {
return new FacesListener[0];
}
@Override
protected Renderer getRenderer(FacesContext context) {
return null;
}
@Override
protected void removeFacesListener(FacesListener listener) {
// no-op
}
@Override
public void addClientBehavior(String eventName, ClientBehavior behavior) {
if (parent instanceof ClientBehaviorHolder) {
ClientBehaviorHolder parentHolder = (ClientBehaviorHolder) parent;
if (virtualEvent.equals(eventName)) {
parentHolder.addClientBehavior(event, behavior);
}
} else {
throw new FacesException(
"Unable to attach behavior to non-ClientBehaviorHolder parent:"
+ parent);
}
}
@Override
public Map<String, List<ClientBehavior>> getClientBehaviors() {
if (parent instanceof ClientBehaviorHolder) {
ClientBehaviorHolder parentHolder = (ClientBehaviorHolder) parent;
Map<String, List<ClientBehavior>> behaviors = new HashMap<>(
1);
behaviors.put(virtualEvent, parentHolder.getClientBehaviors().get(event));
return Collections.unmodifiableMap(behaviors);
} else {
throw new FacesException(
"Unable to get behaviors from non-ClientBehaviorHolder parent:"
+ parent);
}
}
@Override
public String getDefaultEventName() {
return virtualEvent;
}
@Override
public Collection<String> getEventNames() {
return Collections.singleton(virtualEvent);
}
}