Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
 package com.google.sitebricks.rendering.control;
 

Author(s):
John Patterson (jdpatterson@gmail.com)
public class DecorateWidget implements Renderable {
  private PageBook book;
  private ThreadLocal<Class<?>> templateClassLocal = new ThreadLocal<Class<?>>();
  public static String embedNameFor(Class<?> pageClass) {
    return pageClass.getName().toLowerCase() + "-extend";
  }
  public DecorateWidget(WidgetChain chainString expressionEvaluator evaluator) {
    // do not need any of the compulsory constructor args
  }
  public void render(Object boundRespond respond) {
    Class<?> templateClass;
    Class<?> previousTemplateClass = .get();
    try {
      if (previousTemplateClass == null) {
        templateClass = nextDecoratedClassInHierarchy(nullbound.getClass());
      } else {
        // get the extension subclass above the last
        templateClass = nextDecoratedClassInHierarchy(previousTemplateClassbound.getClass());
        if (templateClass == null) {
          throw new IllegalStateException(
              "Could not find subclass of " + previousTemplateClass.getName() +
                  " with @Decorated annotation.");
        }
      }
      .set(templateClass);
      // get the extension page by name
      PageBook.Page page = .forName(DecorateWidget.embedNameFor(templateClass));
      // create a dummy respond to collect the output of the embedded page
      StringBuilderRespond sbrespond = new StringBuilderRespond(bound);
      EmbeddedRespond embedded = new EmbeddedRespond(nullsbrespond);
      page.widget().render(boundembedded);
      // write the head and content to the real respond
      respond.writeToHead(embedded.toHeadString());
      respond.write(embedded.toString());
      // free some memory
      embedded.clear();
    } finally {
      // we are finished with this extension
      if (previousTemplateClass == null) {
        .set(null);
      }
    }
  }
  // recursively find the next superclass with an @Decorated annotation
  private Class<?> nextDecoratedClassInHierarchy(Class<?> previousTemplateClass,
                                                 Class<?> candidate) {
    if (candidate == previousTemplateClass) {
      // terminate the recursion
      return null;
    } else if (candidate == Object.class) {
      // this should never happen - we should terminate recursion first
      throw new IllegalStateException("Did not find previous extension");
    } else {
      boolean isDecorated = candidate.isAnnotationPresent(Decorated.class);
      if (isDecorated)
        return candidate;
      else
        return nextDecoratedClassInHierarchy(previousTemplateClasscandidate.getSuperclass());
    }
  }
  public <T extends RenderableSet<T> collect(Class<T> clazz) {
    return Collections.emptySet();
  }
New to GrepCode? Check out our FAQ X