Adding JSF components programmatically

I've had to search a lot through internet in order to discover how to create JSF components programmaticaly. At the end, I didn't have to use it in the application I was creating, but I thought it worth to keep the research in some way.

 
import javax.faces.application.Application;
import javax.faces.component.html.*;
import javax.faces.context.FacesContext;
 
import com.rapidoaudit.model.AuditSkel;
 
 
public class SectionsCollection
{
	// rendered panel
	private HtmlPanelGrid grid = null; 
	//private List<UIComponent> sections;
	private int sectionsCounter; 
 
	public borrado_20110603_SectionsCollection()
	{
		sectionsCounter = 0; 
		//sections = new ArrayList<UIComponent>();
	}
 
	public void setComponent( HtmlPanelGrid newGrid )
	{
		grid = newGrid;
	}
 
	public HtmlPanelGrid getComponent()
	{
		Application app =  FacesContext.getCurrentInstance().getApplication();
 
		grid = (HtmlPanelGrid) app.createComponent(HtmlPanelGrid.COMPONENT_TYPE);
		grid.setColumns(1);
		grid.setId("sections");
 
		return grid;
	}
 
	public void addSection(AuditSkel skel)
	{
 
		Section s1;
 
		skel.addSection();
 
		s1 = new Section(skel, sectionsCounter);
 
		grid.getChildren().add( s1.getGrid() );
 
		sectionsCounter++; 
 
	} // addSection
 
}
package com.rapidoaudit.view;
 
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.component.UISelectItem;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlOutputLabel;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.component.html.HtmlPanelGroup;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.component.html.HtmlSelectBooleanCheckbox;
import javax.faces.context.FacesContext;
import javax.faces.convert.IntegerConverter;
 
import com.rapidoaudit.model.AuditSkel;
 
import java.util.Random; 
import org.primefaces.component.spinner.Spinner;
 
public class Section 
{
 
	int sectNumber; 
 
	// rendered panel
	private HtmlPanelGrid grid = null; 
 
	public Section( AuditSkel newSkel, int newSectNumber ) 
	{
		sectNumber = newSectNumber; 
	}
 
	public Section()
	{
		Random rnd = new Random(); 
 
		sectNumber = rnd.nextInt( 200000 ); 
	}
 
	public Section( int intSectNumber )
	{
		sectNumber = intSectNumber;
	}
 
 
	// for setting unique id's in the view
	private void compSetId( UIComponent comp, String id )
	{
		comp.setId( id + new Integer(sectNumber).toString() ); 
	}
 
	// for setting unique id's in the view
	@SuppressWarnings("unused")
	private void compSetId( UIComponent comp )
	{
		// create a random stream of numbers (just for the sake of keep faces happy)
		Random rnd = new Random();
 
		comp.setId( Integer.toString(rnd.nextInt(200000)));
	}
 
	/**
	 * To set a value from an Expression Language expression. 
	 * Example:
	 * 
	 * compSetValue( name_input, "#{auditSkel.name}" );
	 * 
	 * where "auditSkel" should be an existent bean
	 * 
	 * @param comp
	 * @param elExpression
	 */
	private void compSetValue( UIInput comp, String elExpression )
	{
		ELContext elContext = FacesContext.getCurrentInstance().getELContext();
 
		ValueExpression val1 = FacesContext.getCurrentInstance().
						    getApplication().
						    getExpressionFactory().
						    createValueExpression( elContext,
						    						elExpression,
						    						Object.class);
		comp.setValueExpression( "value", val1 );
 
	} // compSetValue
 
 
	public HtmlPanelGrid getGrid( )
	{
		if( grid == null )
		{
			Application app = FacesContext.getCurrentInstance().getApplication();
 
			grid = (HtmlPanelGrid) app.createComponent(HtmlPanelGrid.COMPONENT_TYPE);
 
			grid.setColumns(2);
			compSetId( grid, "Section" ); 
 
			// <h:outputLabel for="name" value="Name" styleClass="right"/>
			HtmlOutputLabel name_label = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);
			name_label.setStyleClass("right");
			name_label.setValue("Name");
			name_label.setFor("type");
			compSetId( name_label, "name_label" );
			grid.getChildren().add(name_label);
 
			// <h:inputText id="name" value="Put a name here"/>
			HtmlInputText name_input = (HtmlInputText) app.createComponent(HtmlInputText.COMPONENT_TYPE);
			compSetId( name_input, "name_input" );
			// aqui me quedo, no sé cómo se puede hacer esto
			//compSetValue( name_input, "#{auditSkel.getSection("+ sectNumber +").name}" );
			compSetValue( name_input, "#{testProp.testObject(1).name}" ); 
			grid.getChildren().add(name_input);
 
			//<h:outputLabel for="type" value="Type" styleClass="right"/>
			HtmlOutputLabel type_label = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE); 
			type_label.setStyleClass("right");
			type_label.setValue("Type");
			type_label.setFor("type");
			compSetId( type_label, "type_label" );
			grid.getChildren().add(type_label); 
 
			//<h:selectOneMenu id="type" value="text_many">
			//	<f:selectItem itemLabel="Text" itemValue="text_many"/>
			//	<f:selectItem itemLabel="Date" itemValue="date"/>
			//	<f:selectItem itemLabel="Text (one line)" itemValue="text_one"/>
			//	<f:selectItem itemLabel="Document" itemValue="file"/>
			//	<f:selectItem itemLabel="Image" itemvalue="image"/>
			//</h:selectOneMenu>
			HtmlSelectOneMenu type_menu = (HtmlSelectOneMenu) app.createComponent(HtmlSelectOneMenu.COMPONENT_TYPE);
			compSetId( type_menu, "type_menu" ); 
			type_menu.setValue("text_many");
 
			UISelectItem type_item_1 = (UISelectItem) app.createComponent(UISelectItem.COMPONENT_TYPE);
			type_item_1.setItemLabel("Text (many lines)");
			type_item_1.setItemValue("text_many");
			compSetId( type_item_1, "type_item_1" );
			type_menu.getChildren().add(type_item_1);
 
			UISelectItem type_item_2 = (UISelectItem) app.createComponent(UISelectItem.COMPONENT_TYPE); 
			type_item_2.setItemLabel("Date");
			type_item_2.setItemValue("date");
			type_item_2.setId("type_item_2"); 
			compSetId( type_item_2, "type_item_2" );
			type_menu.getChildren().add(type_item_2);
 
			UISelectItem type_item_3 = (UISelectItem) app.createComponent(UISelectItem.COMPONENT_TYPE); 
			type_item_3.setItemLabel("Text (one line)");
			type_item_3.setItemValue("text_one");
			compSetId( type_item_3, "type_item_3"); 
			type_menu.getChildren().add(type_item_3);
 
			UISelectItem type_item_4 = (UISelectItem) app.createComponent(UISelectItem.COMPONENT_TYPE); 
			type_item_4.setItemLabel("Document");
			type_item_4.setItemValue("file");
			compSetId( type_item_4, "type_item_4"); 
			type_menu.getChildren().add(type_item_4);
 
			UISelectItem type_item_5 = (UISelectItem) app.createComponent(UISelectItem.COMPONENT_TYPE); 
			type_item_5.setItemLabel("Image");
			type_item_5.setItemValue("image");
			compSetId( type_item_5, "type_item_5"); 
			type_menu.getChildren().add(type_item_5);
 
			grid.getChildren().add(type_menu);
 
			//<h:outputLabel for="goesReport" value="Does this section appear on the report?" styleClass="right"/>
			HtmlOutputLabel goesReportLabel = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE); 
			goesReportLabel.setStyleClass("right");
			goesReportLabel.setValue("Does this section appear on the report?");
			goesReportLabel.setFor("type");
			compSetId( goesReportLabel, "goesReportLabel" );
			grid.getChildren().add(goesReportLabel); 
 
			//<h:selectBooleanCheckbox id="goesReport"/>
			HtmlSelectBooleanCheckbox goesReport = (HtmlSelectBooleanCheckbox) app.createComponent(HtmlSelectBooleanCheckbox.COMPONENT_TYPE);
			compSetId( goesReport, "goesReport" );
			grid.getChildren().add(goesReport); 
 
			//<h:outputLabel for="isFinding" value="Is this section part of a finding?" styleClass="right"/>
			HtmlOutputLabel isFindingLabel = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE); 
			isFindingLabel.setStyleClass("right");
			isFindingLabel.setValue("Is this section part of a finding?"); 
			isFindingLabel.setFor("isFinding" );
			compSetId( isFindingLabel, "isFindingLabel" ); 
			grid.getChildren().add(isFindingLabel); 
 
			//<h:selectBooleanCheckbox id="isFinding"/>
			HtmlSelectBooleanCheckbox isFinding = (HtmlSelectBooleanCheckbox) app.createComponent(HtmlSelectBooleanCheckbox.COMPONENT_TYPE);
			compSetId( isFinding, "isFinding" );
			grid.getChildren().add(isFinding); 
 
			//<h:outputText value="In each audit work this will appear..."/>
			HtmlOutputText minimumMaximum = (HtmlOutputText) app.createComponent( HtmlOutputText.COMPONENT_TYPE );
			compSetId( minimumMaximum, "minimumMaximum" );
			minimumMaximum.setValue("In each audit work this will appear...");
			minimumMaximum.setStyleClass("right");
			grid.getChildren().add(minimumMaximum);
 
			HtmlOutputLabel empty1 = (HtmlOutputLabel) app.createComponent( HtmlOutputLabel.COMPONENT_TYPE );
			compSetId( empty1, "empty1" );
			empty1.setValue("");
			grid.getChildren().add(empty1);
 
			//<h:panelGrid/>
 
			//<h:outputLabel for="minima" value="...a minimum of" styleClass="right"/>
			HtmlOutputLabel aMinimumOf = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);
			compSetId(aMinimumOf, "aMinimumOf"); 
			aMinimumOf.setValue("A minimum of" ); 
			aMinimumOf.setStyleClass("right"); 
			aMinimumOf.setFor("panelMin");
			grid.getChildren().add(aMinimumOf);
 
			//<h:panelGroup>
			HtmlPanelGroup panelMin = (HtmlPanelGroup) app.createComponent(HtmlPanelGroup.COMPONENT_TYPE);
			compSetId(panelMin, "panelMin");
 
			//	<p:spinner id="minima" value="1" min="0" max="1000"/>
			Spinner spMin = (Spinner) app.createComponent( Spinner.COMPONENT_TYPE ); 
			compSetId( spMin, "spMin" ); 
			spMin.setValue(1); 
			spMin.setMin(0); 
			spMin.setSize(5);
			spMin.setMax(1000);
			spMin.setConverter(new IntegerConverter());
			panelMin.getChildren().add(spMin);
 
			//	<h:outputText value="times"/>
			HtmlOutputText times = (HtmlOutputText) app.createComponent(HtmlOutputText.COMPONENT_TYPE);
			compSetId( times, "times" ); 
			times.setValue("times");
			panelMin.getChildren().add(times); 
 
			//</h:panelGroup>
			grid.getChildren().add(panelMin); 
 
 
			//<h:outputLabel for="maximum" value="...a maximum of" styleClass="right"/>
			HtmlOutputLabel aMaximumOf = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);
			compSetId(aMaximumOf, "aMaximumOf"); 
			aMaximumOf.setValue("A maximum of" ); 
			aMaximumOf.setStyleClass("right"); 
			aMaximumOf.setFor("panelMin");
			grid.getChildren().add(aMaximumOf);
 
			//<h:panelGroup>
			HtmlPanelGroup panelMax = (HtmlPanelGroup) app.createComponent(HtmlPanelGroup.COMPONENT_TYPE);
			compSetId(panelMax, "panelMax");
 
			//	<p:spinner id="maximum" value="1"/>
			Spinner spMax = (Spinner) app.createComponent( Spinner.COMPONENT_TYPE ); 
			compSetId( spMax, "spMax" ); 
			spMax.setValue(1); 
			spMax.setMin(0); 
			spMax.setSize(5);
			spMax.setMax(1000);
			spMax.setValue(0);
			spMax.setConverter(new IntegerConverter());
			panelMax.getChildren().add(spMax);
 
			//	<h:outputText value="times"/>
			HtmlOutputText times2 = (HtmlOutputText) app.createComponent(HtmlOutputText.COMPONENT_TYPE);
			compSetId( times2, "times2" ); 
			times2.setValue("times");
			panelMax.getChildren().add(times2); 
 
			//	</h:panelGroup>
			grid.getChildren().add(panelMax); 
 
			//</h:panelGrid>			
 
		}
 
		return grid;
	}
 
}

~~DISQUS~~