You can find the full source code for this website in the Seam package in the directory /examples/wiki. It is licensed under the LGPL.
See Creating Custom EL Functions and Creating Custom UI Compositions as a starting point
Given you already have the elfunctions.taglib.xml from the custom EL functions, no need to add any more xml or configuration.
Open and edit FnLibrary.java
import org.el.func.IsTextHandler;
import com.sun.facelets.tag.AbstractTagLibrary;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class FnLibrary extends AbstractTagLibrary {
public final static String Namespace = "http://org.el.func/SeamFunc";
public static final FnLibrary INSTANCE = new FnLibrary();
public FnLibrary() {
super(Namespace);
try {
this.addTagHandler("doesFieldTypeClassHaveAnnotation", DoesFieldTypeClassHaveAnnotation.class);
Method[] methods = SeamFunc.class.getMethods();
for (int i = 0; i < methods.length; i++) {
if (Modifier.isStatic(methods[i].getModifiers())) {
this.addFunction(methods[i].getName(), methods[i]);
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Create DoesFieldTypeClassHaveAnnotation.class
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import com.sun.facelets.FaceletContext;
import com.sun.facelets.tag.TagAttribute;
import com.sun.facelets.tag.TagConfig;
import com.sun.facelets.tag.TagHandler;
public class DoesFieldTypeClassHaveAnnotation extends TagHandler {
private final TagAttribute annotation;
private final TagAttribute field;
public DoesFieldTypeClassHaveAnnotation(final TagConfig config) {
super(config);
annotation = this.getRequiredAttribute("annotation");
field = this.getRequiredAttribute("field");
}
public void apply(final FaceletContext faceletsContext, final UIComponent aParent) throws IOException {
boolean apply = false;
ValueExpression valueExpression = this.field.getValueExpression(faceletsContext, Object.class);
Field f = (Field)valueExpression.getValue(faceletsContext.getFacesContext().getELContext());
try {
Annotation[] asOnField = f.getType().getAnnotations();
for(Annotation t : asOnField) {
if (annotation.getValue().equals(t.annotationType().getName())) {
apply = true;
break;
}
}
} catch (SecurityException ex) {
System.err.println(ex.getMessage());
}
if (apply) {
this.nextHandler.apply(faceletsContext, aParent);
}
}
}
In your test.xhtml
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich"
xmlns:a="http://richfaces.org/a4j"
xmlns:e="http://org.el.func/SeamFunc"
xmlns:custom="http://enhancements.seam/jsf"
template="/layout/template.xhtml">
<ui:define name="body">
<custom:print message="World" />
<br />
<e:doesFieldTypeClassHaveAnnotation field="#{person.dog}" annotation="javax.persistence.Entity">
The dog field in the Person Entity is also an Entity
</e:doesFieldTypeClassHaveAnnotation>
</ui:define>
</ui:composition>
This would be the case where there is a @Entity public class Dog and
@Entity
public class Person {
...
private Dog dog;
...
}