/sitebricks/src/main/java/com/google/sitebricks/rendering/control/EmbedWidget.java

http://github.com/dhanji/sitebricks · Java · 84 lines · 58 code · 18 blank · 8 comment · 1 complexity · 30f0c7a49fc56ed5871f3faa403968ab MD5 · raw file

  1. package com.google.sitebricks.rendering.control;
  2. import com.google.inject.Inject;
  3. import com.google.inject.Provider;
  4. import com.google.sitebricks.Evaluator;
  5. import com.google.sitebricks.Renderable;
  6. import com.google.sitebricks.Respond;
  7. import com.google.sitebricks.compiler.Parsing;
  8. import com.google.sitebricks.headless.Request;
  9. import com.google.sitebricks.routing.PageBook;
  10. import net.jcip.annotations.Immutable;
  11. import java.io.IOException;
  12. import java.util.Collections;
  13. import java.util.Map;
  14. import java.util.Set;
  15. /**
  16. * @author Dhanji R. Prasanna (dhanji@gmail.com)
  17. */
  18. @Immutable
  19. class EmbedWidget implements Renderable {
  20. private final Map<String, String> bindExpressions;
  21. private final Map<String, ArgumentWidget> arguments;
  22. private final Evaluator evaluator;
  23. private final PageBook pageBook;
  24. private final String targetPage;
  25. private EmbeddedRespondFactory factory;
  26. private Provider<Request> request;
  27. public EmbedWidget(Map<String, ArgumentWidget> arguments, String expression,
  28. Evaluator evaluator, PageBook pageBook, String targetPage) {
  29. this.arguments = arguments;
  30. this.evaluator = evaluator;
  31. this.pageBook = pageBook;
  32. this.targetPage = targetPage.toLowerCase();
  33. //parse expression list
  34. this.bindExpressions = Parsing.toBindMap(expression);
  35. }
  36. public void render(Object bound, Respond respond) {
  37. PageBook.Page page = pageBook.forName(targetPage);
  38. //create an instance of the embedded page
  39. Object pageObject = page.instantiate();
  40. //bind parameters to it as necessary
  41. for (Map.Entry<String, String> entry : bindExpressions.entrySet()) {
  42. evaluator.write(entry.getKey(), pageObject, evaluator.evaluate(entry.getValue(), bound));
  43. }
  44. //chain to embedded page (widget), with arguments
  45. EmbeddedRespond embed = factory.get(arguments);
  46. Request req = request.get();
  47. try {
  48. page.doMethod(req.method(), pageObject, "", req);
  49. } catch (IOException e) {
  50. throw new RuntimeException(e);
  51. }
  52. page.widget().render(pageObject, embed);
  53. //extract and write embedded response to enclosing page's respond
  54. respond.writeToHead(embed.toHeadString()); //TODO only write @Require tags
  55. respond.write(embed.toString());
  56. embed.clear();
  57. }
  58. public <T extends Renderable> Set<T> collect(Class<T> clazz) {
  59. return Collections.emptySet();
  60. }
  61. @Inject
  62. public void init(EmbeddedRespondFactory factory, Provider<Request> request) {
  63. this.factory = factory;
  64. this.request = request;
  65. }
  66. }