Skip to content

Latest commit

 

History

History
121 lines (115 loc) · 4.15 KB

Readme.md

File metadata and controls

121 lines (115 loc) · 4.15 KB

The HTmlFlow is a simple Java library for writing HTML documents in a fluent style into a java.io.PrintStream. For instance, considering a Java class Taskwith three properties: Title, Description and a Priority, then we can produce an HTML document for a Task object in the following way:

	//
	// Creates a new Task object
	//
	Task t1 = new Task("ISEL MPD project", "A Java library for serializing objects in HTML.", Priority.High);
	//
	// Creates and setup an HtmlView object for task details
	//
	HtmlView<Task> taskView = new HtmlView<Task>();
	taskView.head().title("Task Details");
	taskView
	.body()
	.heading(1, "Task Details")
	.hr()
	.div()
	.text("Title: ").text(t1.getTitle())
	.br()
	.text("Description: ").text(t1.getDescription());
	.br()
	.text("Priority: ").text(t1.getPriority().toString());
	//
	// Produces an HTML file document
	//
	try{
		PrintStream out = new PrintStream(new FileOutputStream("Task.html"));
		taskView.setPrintStream(out).write(1, t1);
		Runtime.getRuntime().exec("explorer Task.html");
	}finally{
		out.close();
	}

The HtmlFlow also supports binders that enable the same HTML view to be used (or bind) with different object models.

	public static void main(String[] args) throws IOException {
		HtmlView<Task> taskView = taskDetailsView();
		try{
			Task t1 = new Task("ISEL MPD project", "A Java library for serializing objects in HTML.", Priority.High);
			PrintStream out = new PrintStream(new FileOutputStream("Task1.html"));
			taskView.setPrintStream(out).write(1, t1);
			Runtime.getRuntime().exec("explorer Task1.html");
		}finally{
			out.close();
		}
		try{
			Task t2 = new Task("Special dinner", "Have dinner with someone!", Priority.Normal);
			PrintStream out = new PrintStream(new FileOutputStream("Task2.html"));
			taskView.setPrintStream(out).write(1, t2); // Now we can use the same HtmlView with a different task
			Runtime.getRuntime().exec("explorer Task2.html");
		}finally{
			out.close();
		}
	}	
	private static HtmlView<Task> taskDetailsView(){
		HtmlView<Task> taskView = new HtmlView<Task>();
		taskView.head().title("Task Details");
		taskView
		.body()
		.heading(1, "Task Details")
		.hr()
		.div()
		.text("Title: ").text(binderGetTitle())
		.br()
		.text("Description: ").text(binderGetDescription())
		.br()
		.text("Priority: ").text(binderGetPriority());
		return taskView;
	}
	private static ModelBinder<Task> binderGetTitle(){
		return new ModelBinder<Task>() {public void bind(PrintStream out, Task model) {
			out.print(model.getTitle());
		}};
	}
	private static ModelBinder<Task> binderGetDescription(){
		return new ModelBinder<Task>() {public void bind(PrintStream out, Task model) {
			out.print(model.getDescription());
		}};
	}
	private static ModelBinder<Task> binderGetPriority(){
		return new ModelBinder<Task>() {public void bind(PrintStream out, Task model) {
			out.print(model.getPriority());
		}};
	}

Finally, an example of producing an HTML table bind to a list of tasks:

	public static void main(String[] args) throws IOException {
		HtmlView<Task> taskView = taskDetailsView();
		try{
			Task t1 = new Task("ISEL MPD project", "A Java library for serializing objects in HTML.", Priority.High);
			Task t2 = new Task("Special dinner", "Have dinner with someone!", Priority.Normal);
			Task t3 = new Task("Manchester City - Sporting", "1/8 Final UEFA Europa League. VS. Manchester City - Sporting!", Priority.High);
			PrintStream out = new PrintStream(new FileOutputStream("TaskList.html"));
			taskListView().setPrintStream(out).write(1, Arrays.asList(t1, t2, t3));
			Runtime.getRuntime().exec("explorer TaskList.html");
		}finally{
			out.close();
		}
	}
	private static HtmlView<Iterable<Task>> taskListView(){
		HtmlView<Iterable<Task>> taskView = new HtmlView<Iterable<Task>>();
		taskView.head().title("Task List");

		HtmlTable<Iterable<Task>> t = taskView.body()
		.heading(1, "Task Details")
		.hr()
		.div()
		.table();
		HtmlTr<Iterable<Task>> headerRow = t.tr();
		headerRow.th().text("Title");
		headerRow.th().text("Description");
		headerRow.th().text("Priority");
		t.trFromIterable(binderGetTitle(), binderGetDescription(), binderGetPriority());
		return taskView;
	}