Skip to content

Commit

Permalink
Fix #188 with clustered peers not remotely compiling properly
Browse files Browse the repository at this point in the history
  • Loading branch information
Nicholas Hagen committed Sep 8, 2012
1 parent 9fd9285 commit 3bb22e2
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 11 deletions.
1 change: 1 addition & 0 deletions tea/readme.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Change History

4.1.2 to 4.2.0
=============================
- Fix #188 fixing cluster/peers and compilation exceptions
- Adding BeanInfo plugin to generate bean info properties
- Fix #157 adding back UtilityContext for backwards compatibility
- Fix #154 fixng ambiguous edge cases when using varargs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
* @author Brian S O'Neill
*/
public class CompilationUnit implements CompileListener {

private String mName;
private Compiler mCompiler;
private Template mTree;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
Expand All @@ -27,7 +28,9 @@
import org.teatrove.tea.compiler.CompilationUnit;

/**
*
* This contains the results of compiling templates including the templates that
* were compiled and any errors/warnings for those that failed compilation.
*
* @author Jonathan Colwell
*/
public class TemplateCompilationResults implements java.io.Serializable {
Expand All @@ -38,44 +41,90 @@ public class TemplateCompilationResults implements java.io.Serializable {
boolean mReloadInProgress;

/** The set of successfully reloaded template names */
Map<String, CompilationUnit> mReloaded;
Set<String> mReloaded;

/**
* The set of reloaded template units.
* Note that this is transient so we do not transfer across the wire to
* remote peers in the cluster.
*/
transient Map<String, CompilationUnit> mReloadedUnits;

/** Error map, where the key is the failed template name, and the
value is a list of TemplateIssue objects for that template */
Map<String, List<TemplateIssue>> mIssues;

public TemplateCompilationResults(Map<String, CompilationUnit> reloaded,
public TemplateCompilationResults(Set<String> reloaded,
Map<String, List<TemplateIssue>> issues) {
mIssues = issues;
mReloaded = reloaded;
}

public TemplateCompilationResults(Map<String, CompilationUnit> reloaded,
Map<String, List<TemplateIssue>> issues) {
mIssues = issues;
mReloadedUnits = reloaded;
mReloaded = new HashSet<String>(reloaded.keySet());
}

public TemplateCompilationResults() {
mReloadInProgress = true;
}

public boolean appendTemplate(String name) {
if (name == null) {
return false;
}

mReloaded.add(name);
return true;
}

public boolean appendTemplate(String name, CompilationUnit unit) {
if (name == null) {
return false;
}
mReloaded.put(name, unit);

mReloaded.add(name);

if (mReloadedUnits != null) {
mReloadedUnits.put(name, unit);
}

return true;
}

public boolean appendTemplates(Set<String> names) {
if (names == null) {
return false;
}

mReloaded.addAll(names);
return true;
}

public boolean appendTemplates(Map<String, CompilationUnit> names) {
if (names == null) {
return false;
}
mReloaded.putAll(names);

mReloaded.addAll(names.keySet());

if (mReloadedUnits != null) {
mReloadedUnits.putAll(names);
}

return true;
}

public boolean appendIssues(Map<String, List<TemplateIssue>> issues) {
if (issues == null || issues.isEmpty())
if (issues == null || issues.isEmpty()) {
return false;
}

if (mIssues == null)
if (mIssues == null) {
mIssues = new Hashtable<String, List<TemplateIssue>>();
}

Iterator<String> keyIterator = issues.keySet().iterator();
while (keyIterator.hasNext()) {
Expand Down Expand Up @@ -112,8 +161,9 @@ public boolean appendIssue(String templateName, TemplateIssue issue) {

public boolean appendIssues(String templateName,
List<TemplateIssue> issues) {
if (templateName == null || issues == null || issues.isEmpty())
if (templateName == null || issues == null || issues.isEmpty()) {
return false;
}

List<TemplateIssue> templateIssues = mIssues.get(templateName);
if (templateIssues == null) {
Expand All @@ -125,15 +175,19 @@ public boolean appendIssues(String templateName,
}

public Set<String> getReloadedTemplateNames() {
return mReloaded.keySet();
return mReloaded;
}

public Map<String, CompilationUnit> getReloadedTemplates() {
return mReloaded;
return mReloadedUnits;
}

public CompilationUnit getReloadedTemplate(String templateName) {
return mReloaded.get(templateName);
if (mReloadedUnits == null) {
return null;
}

return mReloadedUnits.get(templateName);
}

public Map<String, List<TemplateIssue>> getTemplateIssues() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.teatrove.tea.engine;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.junit.Test;
import org.teatrove.tea.compiler.CompilationUnit;

public class TemplateCompilationResultsTest {

@Test
public void testSerialization()
throws Exception {

// setup data
Map<String, CompilationUnit> templates =
new HashMap<String, CompilationUnit>();
templates.put("test1", null);
templates.put("test2", null);
templates.put("test3", null);

// setup results
TemplateCompilationResults results =
new TemplateCompilationResults(templates, null);

// validate data
Set<String> names = results.getReloadedTemplateNames();
assertTrue(names.contains("test1"));
assertTrue(names.contains("test2"));
assertTrue(names.contains("test3"));
assertEquals(3, results.getReloadedTemplates().size());

// serialize and validate valid
results = serialize(results);
names = results.getReloadedTemplateNames();
assertTrue(names.contains("test1"));
assertTrue(names.contains("test2"));
assertTrue(names.contains("test3"));
assertNull(results.getReloadedTemplates());
}

@SuppressWarnings("unchecked")
protected <T> T serialize(T object)
throws Exception {

ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
ObjectOutputStream output = new ObjectOutputStream(baos);
output.writeObject(object);
output.close();

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream input = new ObjectInputStream(bais);
Object result = input.readObject();
input.close();

return (T) result;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -1212,6 +1212,7 @@ public void run() {
"template reload already in progress");
}
else {
mResults.appendTemplates(res.getReloadedTemplateNames());
mResults.appendTemplates(res.getReloadedTemplates());
mResults.appendIssues(res.getTemplateIssues());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ private TemplateCompilationResults compileTemplates(
else {
TemplateCompilationResults transients =
results.getTransientResults();
transients.appendTemplates(delegateResults.getReloadedTemplateNames());
transients.appendTemplates(delegateResults.getReloadedTemplates());
transients.appendIssues(delegateResults.getTemplateErrors());
}
Expand Down

0 comments on commit 3bb22e2

Please sign in to comment.