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

org.apache.myfaces.trinidadinternal.uinode.UIXComponentUINode Maven / Gradle / Ivy

The newest version!
/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 * 
 *  http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */
package org.apache.myfaces.trinidadinternal.uinode;

import java.io.IOException;

import java.util.Iterator;

import javax.faces.component.UIComponent;

import java.lang.reflect.UndeclaredThrowableException;

import org.apache.myfaces.trinidad.logging.TrinidadLogger;

import org.apache.myfaces.trinidadinternal.ui.AttributeKey;
import org.apache.myfaces.trinidadinternal.ui.NodeRole;
import org.apache.myfaces.trinidadinternal.ui.Renderer;
import org.apache.myfaces.trinidadinternal.ui.RendererFactory;
import org.apache.myfaces.trinidadinternal.ui.RendererManager;
import org.apache.myfaces.trinidadinternal.ui.UIXRenderingContext;
import org.apache.myfaces.trinidadinternal.ui.RoledRenderer;
import org.apache.myfaces.trinidadinternal.ui.UIConstants;
import org.apache.myfaces.trinidadinternal.ui.UINode;
import org.apache.myfaces.trinidadinternal.ui.collection.AttributeMap;
import org.apache.myfaces.trinidadinternal.ui.data.BoundValue;
import org.apache.myfaces.trinidadinternal.ui.laf.base.PreAndPostRenderer;

import org.apache.myfaces.trinidad.component.UIXComponent;

/**
 * Subclass for UIX components.
 * 

* @version $Name: $ ($Revision: adfrt/faces/adf-faces-impl/src/main/java/oracle/adfinternal/view/faces/uinode/UIXComponentUINode.java#0 $) $Date: 10-nov-2005.18:49:20 $ * @deprecated This class comes from the old Java 1.2 UIX codebase and should not be used anymore. */ @Deprecated public class UIXComponentUINode extends UIComponentUINode { public UIXComponentUINode( UIXComponent component, String namespace, AttributeMap attributes) { super(component, namespace); _attributes = attributes; } /** * Returns the role that this node occupies. */ @Override public NodeRole getNodeRole(UIXRenderingContext context) { if (context != null) { Renderer renderer = getRenderer(context, this); if (renderer instanceof RoledRenderer) { return ((RoledRenderer) renderer).getNodeRole(context, this); } // Null Renderer - for our components - means components // like switcher. else if (renderer == null) { return UIConstants.STATE_ROLE; } } return UIConstants.UNKNOWN_ROLE; } @Override public Iterator getAttributeNames(UIXRenderingContext context) { AttributeMap attributes = getAttributeMap(false); if (attributes != null) { return attributes.attributeKeys(context); } else { return null; } } @Override public void setAttributeValue( AttributeKey attrKey, Object value ) { AttributeMap attrDict = getAttributeMap((value != null)); if (attrDict != null) { attrDict.setAttribute(attrKey, value); } } /** * Returns the value of the attribute with the specified name in the * RenderingContext. If no attribute with the specified name exists * in this UINode, or a checked Exception occurs in retrieving the value of * the attribute, null will be returned. *

* Note that as with indexed children and named children, the presence of * of an attribute is no guarantee that the Renderer used to render this * UINode will actually use the attribute. The presence of attributes * should only be considered as hints to the Renderer. *

* If the UINode is mutable and may be modified and read in different * threads, it is the programmer's responsibility to ensure proper * synchronization. * *

* @see #getAttributeNames */ @Override public Object getAttributeValue(UIXRenderingContext context, AttributeKey attrKey) { return getAttributeValueImpl(context, attrKey, true); } /** * Returns the value of the attribute with a specified name, without * attempting to further resolve that value - as if , for instance, * it might be a BoundValue. *

* @see org.apache.myfaces.trinidadinternal.ui.data.BoundValue */ @Override public Object getRawAttributeValue(UIXRenderingContext context, AttributeKey attrKey) { return getAttributeValueImpl(context, attrKey, false); } public void renderInternal(UIXRenderingContext context, UINode dataNode) throws IOException { Renderer renderer = null; try { renderer = getRenderer(context, dataNode); } catch( UndeclaredThrowableException e ) { if (_LOG.isWarning()) _LOG.warning(e.getMessage()); return; } if (renderer != null) { // See if we need to push/pop ourselves. This should only // happen in two cases: // - We're the root of the tree. // - We're a private bean, and a Renderer called render() directly // instead of using composite widgets. boolean pushAndPop = (context.getRenderedAncestorNode(0) != dataNode); if (pushAndPop) { context.pushChild(dataNode, null, -1); context.pushRenderedChild(context, dataNode); } try { renderer.render(context, dataNode); } // Annotate all exceptions thrown by UIX to indicate // which component is the guilty one catch (RuntimeException re) { _handleRenderException(re); } finally { if (pushAndPop) { context.popRenderedChild(context); context.popChild(); } } } else { _logNoRenderer(context); } } public void prerenderInternal(UIXRenderingContext context, UINode dataNode) throws IOException { Renderer renderer = null; try { renderer = getRenderer(context, dataNode); } catch( UndeclaredThrowableException e ) { if (_LOG.isWarning()) _LOG.warning(e.getMessage()); return; } assert(renderer instanceof PreAndPostRenderer); // =-=AEW PUSH-POP-CATCH??? if (renderer != null) { // See if we need to push/pop ourselves. This should only // happen in two cases: // - We're the root of the tree. // - We're a private bean, and a Renderer called render() directly // instead of using composite widgets. boolean pushAndPop = (context.getRenderedAncestorNode(0) != dataNode); if (pushAndPop) { context.pushChild(dataNode, null, -1); context.pushRenderedChild(context, dataNode); } try { ((PreAndPostRenderer) renderer).prerender(context, dataNode); } // Annotate all exceptions thrown by UIX to indicate // which component is the guilty one catch (RuntimeException re) { _handleRenderException(re); } finally { if (pushAndPop) { context.popRenderedChild(context); context.popChild(); } } } else { _logNoRenderer(context); } } public void postrenderInternal(UIXRenderingContext context, UINode dataNode) throws IOException { Renderer renderer = null; try { renderer = getRenderer(context, dataNode); } catch( UndeclaredThrowableException e ) { if (_LOG.isWarning()) _LOG.warning(e.getMessage()); return; } assert(renderer instanceof PreAndPostRenderer); // =-=AEW PUSH-POP-CATCH??? if (renderer != null) { // See if we need to push/pop ourselves. This should only // happen in two cases: // - We're the root of the tree. // - We're a private bean, and a Renderer called render() directly // instead of using composite widgets. boolean pushAndPop = (context.getRenderedAncestorNode(0) != dataNode); if (pushAndPop) { context.pushChild(dataNode, null, -1); context.pushRenderedChild(context, dataNode); } try { ((PreAndPostRenderer) renderer).postrender(context, dataNode); } // Annotate all exceptions thrown by UIX to indicate // which component is the guilty one catch (RuntimeException re) { _handleRenderException(re); } finally { if (pushAndPop) { context.popRenderedChild(context); context.popChild(); } } } else { _logNoRenderer(context); } } private void _handleRenderException( RuntimeException re) throws IOException { if (re instanceof UndeclaredThrowableException) { // Our UnsynchronizedPrintWriter catches IOExceptions and // rethrows these wrapped in UndeclaredThrowableExceptions. If we // catch any UndeclaredThrowableExceptions which have an IOExceptions // as the root cause, let's just rethrow the original // IOException so that the original stack trace will be // preserved. Throwable rootCause = ((UndeclaredThrowableException)re).getCause(); if (rootCause instanceof IOException) throw ((IOException)rootCause); } throw re; } private void _logNoRenderer(UIXRenderingContext context) { if (_LOG.isWarning()) { RendererManager manager = context.getRendererManager(); RendererFactory factory = manager.getFactory(getNamespaceURI()); if (factory == null) { _LOG.warning("NO_RENDERERFACTORY_REGISTERED_COMPONENT", getNamespaceURI()); } else { _LOG.warning("NO_RENDERER_REGISTERED", this); } } } protected Renderer getRenderer( UIXRenderingContext context, UINode dataNode ) { // get the renderer for ourselves RendererManager manager = context.getRendererManager(); String localName = getLocalName(); if (localName == null) return null; return manager.getRenderer(getNamespaceURI(), localName); } /** * Bottleneck method for all attribute getting. */ protected Object getAttributeValueImpl( UIXRenderingContext context, AttributeKey attrKey, boolean returnBoundValue ) { AttributeMap attributes = getAttributeMap(false); if (attributes != null) { Object value = attributes.getAttribute(context, attrKey); if (returnBoundValue && (value instanceof BoundValue)) { value = ((BoundValue)value).getValue(context); } return value; } else { return null; } } /** * Returns the AttributeMap used to store attributes. *

* @param createIfNull if true, creates * an AttributeMap object if one has not yet been created. */ protected final AttributeMap getAttributeMap( boolean createIfNull ) { if (createIfNull && (_attributes == null)) { // This should not happen; we set the attributes in the // construtor throw new IllegalStateException(); } return _attributes; } static UIXComponentUINode __getAdapter(UIComponent component) { // =-=AEW How to assert this is only called when allowable? return (UIXComponentUINode) __getUINode(component); } private AttributeMap _attributes; private static final TrinidadLogger _LOG = TrinidadLogger.createTrinidadLogger(UIXComponentUINode.class); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy