The code is pretty simplistic for the component:
@FaceletComponent(namespace = "http://christws.com/components",
tagName = "helpIcon",
type = UIHelpIcon.COMPONENT_TYPE,
rendererType = HelpIconRenderer.RENDERER_TYPE)
public class UIHelpIcon
extends CoreCommandLink
{
public final static String COMPONENT_FAMILY = "com.christws.HelpIcon";
public final static String COMPONENT_TYPE = "com.christws.HelpIcon";
public final static FacesBean.Type TYPE = new FacesBean.Type(
CoreCommandLink.TYPE);
public final static PropertyKey MESSAGE_ID_KEY =
TYPE.registerKey("messageId", String.class);
public final static PropertyKey FOR_KEY =
TYPE.registerKey("for", String.class);
static
{
TYPE.lockAndRegister(COMPONENT_FAMILY, COMPONENT_TYPE);
};
public UIHelpIcon()
{
super(HelpIconRenderer.RENDERER_TYPE);
}
/**
* @see
org.apache.myfaces.trinidad.component.UIXComponentBase#getClientId(javax.faces.context.FacesContext)
*/
@Override
public String getClientId(FacesContext context)
{
// TODO Auto-generated method stub
String id = super.getClientId(context);
return id;
}
/**
* @see javax.faces.component.UIComponent#getFamily()
*/
@Override
public String getFamily()
{
return COMPONENT_FAMILY;
}
public String getMessageId()
{
return ComponentUtils.resolveString(getProperty(MESSAGE_ID_KEY));
}
public void setMessageId(String messageId)
{
setProperty(MESSAGE_ID_KEY, messageId);
}
public String getFor()
{
return ComponentUtils.resolveString(getProperty(FOR_KEY));
}
public void setFor(String value)
{
setProperty(FOR_KEY, value);
}
/**
* @see org.apache.myfaces.trinidad.component.UIXComponentBase#getBeanType()
*/
@Override
protected Type getBeanType()
{
return TYPE;
}
/**
* @see
org.apache.myfaces.trinidad.component.UIXCommand#broadcast(javax.faces.event.FacesEvent)
*/
@Override
public void broadcast(FacesEvent event) throws AbortProcessingException
{
if (event instanceof ActionEvent)
{
HelpBean bean = FacesUtils.getBean(HelpBean.class, true);
bean.setCurrentHelpTopicKey(getMessageId());
}
super.broadcast(event);
}
}
As you can see, I haven't done anything to the state saving at all. I
haven't setup the maven component generation in my project yet so the
above component was hand-written, but I don't think I made any
mistakes, but not positive.
On 9/5/07, Adam Winer <[EMAIL PROTECTED]> wrote:
> I don't see how or why this is wrong... _genId should get state
> saved, so I don't understand why you're having problems unless
> your custom component has overridden state saving incorrectly.
> I've never seen a problem like this with any of our Trinidad components.
>
> -- Adam
>
>
> On 9/5/07, Andrew Robinson <[EMAIL PROTECTED]> wrote:
> > I am wondering if this is a bug or planned with UIXComponentBase:
> >
> > I was noticing that my custom component that extended CoreCommandLink
> > stopped working after a partial update. When trying to figure out why,
> > I noticed that the ID of the link changed between rendering and
> > therefore the decode no longer worked.
> >
> > On first page rendering, the link ID was _id44. During decode, it was
> > still _id44. During encode, it was _id108. It failed partial update
> > because the ID changed, and therefore all further decodes failed since
> > the client was now out of sync from the server.
> >
> > In UIComponentBase.getClientId, if the getId() returns null, a new ID
> > is created and then setId is called. UIXComponentBase never calls
> > setId, but instead caches it in a "_genId" property using the
> > FacesBean.
> >
> > Therefore, anything extending UIComponentBase and has a generated ID
> > will never have its ID change between requests on the same view.
> > However, it seems that UIXComponentBase does not guarantee that a
> > component with a generated ID will have a consistent ID.
> >
> > Here is my code:
> >
> > <tr:panelLabelAndMessage
> > label="Test help">
> > <tr:inputText id="testHelp" value="#{testHelpText}"
> > simple="true" />
> > <f:facet name="end">
> > <cw:helpIcon for="testHelp"
> > messageId="test_help" />
> > </f:facet>
> > </tr:panelLabelAndMessage>
> >
> > The cw:helpIcon extends CoreCommandLink
> >
> > If I give the helpIcon a hard coded ID, it works fine.
> >
> > Is this a bug, a shortcoming, or just not supported with UIXComponentBase?
> >
> > I seems like it could be a very big source of problems if IDs change
> > between requests, as decodes will have a lot of problems. Should
> > UIXComponentBase be calling setId after generating an ID in the
> > getClientId function?
> >
> > This was found on 1.0.3-SNAPSHOT
> >
> > Any ideas?
> >
> > Thanks,
> > Andrew
> >
>
>