use of org.apache.myfaces.view.facelets.AbstractFacelet in project myfaces by apache.
the class CreateDynamicCompositeComponentListener method processEvent.
@Override
public void processEvent(ComponentSystemEvent event) {
FacesContext facesContext = FacesContext.getCurrentInstance();
FaceletViewDeclarationLanguage vdl = (FaceletViewDeclarationLanguage) facesContext.getApplication().getViewHandler().getViewDeclarationLanguage(facesContext, facesContext.getViewRoot().getViewId());
Facelet componentFacelet;
FaceletFactory faceletFactory = vdl.getFaceletFactory();
FaceletFactory.setInstance(faceletFactory);
try {
componentFacelet = faceletFactory.compileComponentFacelet(taglibURI, tagName, attributes);
} finally {
FaceletFactory.setInstance(null);
}
UIComponent component = event.getComponent();
// The execution of this listener activated another call to PostAddToViewEvent, because
// ComponentTagHandlerDelegate removes and add the component again. This is necessary because
// the inner components also require the propagation of PostAddToViewEvent to refresh themselves.
// but this check avoids the duplicate call to the facelet, even if the duplicate call does not
// have any side effect (counts as a refresh).
Integer step = (Integer) component.getAttributes().get(CompositeComponentResourceTagHandler.CREATE_CC_ON_POST_ADD_TO_VIEW);
if (step != null && step == 0) {
component.getAttributes().put(CompositeComponentResourceTagHandler.CREATE_CC_ON_POST_ADD_TO_VIEW, 1);
} else {
return;
}
try {
facesContext.getAttributes().put(FaceletViewDeclarationLanguage.REFRESHING_TRANSIENT_BUILD, Boolean.TRUE);
// Detect the relationship between parent and child, to ensure the component is properly created
// and refreshed. In facelets this is usually done by core.FacetHandler, but since it is a
// dynamic component, we need to do it here before apply the handler
UIComponent parent = component.getParent();
String facetName = null;
if (parent.getFacetCount() > 0 && !parent.getChildren().contains(component)) {
facetName = ComponentSupport.findFacetNameByComponentInstance(parent, component);
}
try {
if (facetName != null) {
parent.getAttributes().put(org.apache.myfaces.view.facelets.tag.faces.core.FacetHandler.KEY, facetName);
}
// The trick here is restore MARK_CREATED, just to allow ComponentTagHandlerDelegate to
// find the component. Then we reset it to exclude it from facelets refresh algorithm.
String markId = (String) component.getAttributes().get(FaceletViewDeclarationLanguage.GEN_MARK_ID);
if (markId == null) {
((AbstractFacelet) componentFacelet).applyDynamicComponentHandler(facesContext, component, baseKey);
} else {
try {
component.getAttributes().put(ComponentSupport.MARK_CREATED, markId);
((AbstractFacelet) componentFacelet).applyDynamicComponentHandler(facesContext, component.getParent(), baseKey);
} finally {
component.getAttributes().put(ComponentSupport.MARK_CREATED, null);
}
}
if (FaceletViewDeclarationLanguageBase.isDynamicComponentNeedsRefresh(facesContext)) {
FaceletCompositionContext fcc = FaceletCompositionContext.getCurrentInstance(facesContext);
if (fcc == null) {
FaceletViewDeclarationLanguageBase.activateDynamicComponentRefreshTransientBuild(facesContext);
FaceletViewDeclarationLanguageBase.resetDynamicComponentNeedsRefreshFlag(facesContext);
component.subscribeToEvent(DynamicComponentRefreshTransientBuildEvent.class, new RefreshDynamicComponentListener(taglibURI, tagName, attributes, baseKey));
component.getAttributes().put(DynamicComponentRefreshTransientBuildEvent.DYN_COMP_REFRESH_FLAG, Boolean.TRUE);
} else {
component.subscribeToEvent(FaceletDynamicComponentRefreshTransientBuildEvent.class, new RefreshDynamicComponentListener(taglibURI, tagName, attributes, baseKey));
}
}
} finally {
if (facetName != null) {
parent.getAttributes().remove(org.apache.myfaces.view.facelets.tag.faces.core.FacetHandler.KEY);
}
}
} catch (IOException e) {
throw new LocationAwareFacesException(e, component);
} finally {
facesContext.getAttributes().remove(FaceletViewDeclarationLanguage.REFRESHING_TRANSIENT_BUILD);
}
}
use of org.apache.myfaces.view.facelets.AbstractFacelet in project myfaces by apache.
the class DoctypeTestCase method testCompilerXhtml.
@Test
public void testCompilerXhtml() throws Exception {
FaceletFactory ff = vdl.getFaceletFactory();
Facelet f = ff.getFacelet(this.getClass().getResource("/org/apache/myfaces/view/facelets/compiler/doctype/xhtml.xhtml"));
Assert.assertNotNull(((AbstractFacelet) f).getDoctype());
Assert.assertEquals("html", ((AbstractFacelet) f).getDoctype().getRootElement());
Assert.assertEquals("-//W3C//DTD XHTML 1.0 Transitional//EN", ((AbstractFacelet) f).getDoctype().getPublic());
Assert.assertEquals("http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", ((AbstractFacelet) f).getDoctype().getSystem());
}
use of org.apache.myfaces.view.facelets.AbstractFacelet in project myfaces by apache.
the class DoctypeTestCase method testCompilerHtml5.
@Test
public void testCompilerHtml5() throws Exception {
FaceletFactory ff = vdl.getFaceletFactory();
Facelet f = ff.getFacelet(this.getClass().getResource("/org/apache/myfaces/view/facelets/compiler/doctype/html5.xhtml"));
Assert.assertNotNull(((AbstractFacelet) f).getDoctype());
Assert.assertEquals("html", ((AbstractFacelet) f).getDoctype().getRootElement());
Assert.assertEquals(null, ((AbstractFacelet) f).getDoctype().getPublic());
Assert.assertEquals(null, ((AbstractFacelet) f).getDoctype().getSystem());
}
use of org.apache.myfaces.view.facelets.AbstractFacelet in project myfaces by apache.
the class DefaultFaceletContext method initPrefix.
private void initPrefix() {
if (_prefix == null) {
_uniqueIdBuilder = new StringBuilder(_faceletHierarchy.size() * 30);
for (int i = 0; i < _faceletHierarchy.size(); i++) {
AbstractFacelet facelet = _faceletHierarchy.get(i);
_uniqueIdBuilder.append(facelet.getFaceletId());
}
// Integer prefixInt = new Integer(builder.toString().hashCode());
// -= Leonardo Uribe =- if the previous formula is used, it is possible that
// negative values are introduced. The presence of '-' char causes problems
// with htmlunit 2.4 or lower, so in order to prevent it it is better to use
// only positive values instead.
// Take into account CompilationManager.nextTagId() uses Math.abs too.
_prefix = Integer.toString(Math.abs(_uniqueIdBuilder.toString().hashCode()));
}
}
use of org.apache.myfaces.view.facelets.AbstractFacelet in project myfaces by apache.
the class RefreshDynamicComponentListener method processEvent.
@Override
public void processEvent(ComponentSystemEvent event) {
FacesContext facesContext = FacesContext.getCurrentInstance();
FaceletViewDeclarationLanguage vdl = (FaceletViewDeclarationLanguage) facesContext.getApplication().getViewHandler().getViewDeclarationLanguage(facesContext, facesContext.getViewRoot().getViewId());
Facelet componentFacelet;
FaceletFactory faceletFactory = vdl.getFaceletFactory();
FaceletFactory.setInstance(faceletFactory);
try {
componentFacelet = faceletFactory.compileComponentFacelet(taglibURI, tagName, attributes);
} finally {
FaceletFactory.setInstance(null);
}
try {
UIComponent component = event.getComponent();
facesContext.getAttributes().put(FaceletViewDeclarationLanguage.REFRESHING_TRANSIENT_BUILD, Boolean.TRUE);
// Detect the relationship between parent and child, to ensure the component is properly created
// and refreshed. In facelets this is usually done by core.FacetHandler, but since it is a
// dynamic component, we need to do it here before apply the handler
UIComponent parent = component.getParent();
String facetName = null;
if (parent.getFacetCount() > 0 && !parent.getChildren().contains(component)) {
facetName = ComponentSupport.findFacetNameByComponentInstance(parent, component);
}
try {
if (facetName != null) {
parent.getAttributes().put(org.apache.myfaces.view.facelets.tag.faces.core.FacetHandler.KEY, facetName);
}
// The trick here is restore MARK_CREATED, just to allow ComponentTagHandlerDelegate to
// find the component. Then we reset it to exclude it from facelets refresh algorithm.
// Note oam.vf.GEN_MARK_ID helps to identify when there is a wrapper component or not,
// and in that way identify which component is the parent.
String markId = (String) component.getAttributes().get(FaceletViewDeclarationLanguage.GEN_MARK_ID);
if (markId == null) {
((AbstractFacelet) componentFacelet).applyDynamicComponentHandler(facesContext, component, baseKey);
} else {
try {
component.getAttributes().put(ComponentSupport.MARK_CREATED, markId);
((AbstractFacelet) componentFacelet).applyDynamicComponentHandler(facesContext, component.getParent(), baseKey);
} finally {
component.getAttributes().put(ComponentSupport.MARK_CREATED, null);
}
}
} finally {
if (facetName != null) {
parent.getAttributes().remove(org.apache.myfaces.view.facelets.tag.faces.core.FacetHandler.KEY);
}
}
} catch (IOException e) {
throw new FacesException(e);
} finally {
facesContext.getAttributes().remove(FaceletViewDeclarationLanguage.REFRESHING_TRANSIENT_BUILD);
}
}
Aggregations