You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2010/05/25 19:41:20 UTC
svn commit: r948129 - in
/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal:
pageload/ComponentAssemblerImpl.java pageload/PageLoaderImpl.java
services/TemplateParserImpl.java
Author: hlship
Date: Tue May 25 17:41:20 2010
New Revision: 948129
URL: http://svn.apache.org/viewvc?rev=948129&view=rev
Log:
TAP5-1165: Add operation tracking about page loading, assembling and template parsing
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/ComponentAssemblerImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/TemplateParserImpl.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/ComponentAssemblerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/ComponentAssemblerImpl.java?rev=948129&r1=948128&r2=948129&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/ComponentAssemblerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/ComponentAssemblerImpl.java Tue May 25 17:41:20 2010
@@ -4,7 +4,7 @@
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -18,7 +18,9 @@ import org.apache.tapestry5.Binding;
import org.apache.tapestry5.internal.services.ComponentInstantiatorSource;
import org.apache.tapestry5.internal.services.Instantiator;
import org.apache.tapestry5.internal.structure.*;
+import org.apache.tapestry5.ioc.Invokable;
import org.apache.tapestry5.ioc.Location;
+import org.apache.tapestry5.ioc.OperationTracker;
import org.apache.tapestry5.ioc.Resource;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.internal.util.IdAllocator;
@@ -51,15 +53,15 @@ class ComponentAssemblerImpl implements
private final IdAllocator allocator = new IdAllocator();
+ private final OperationTracker tracker;
+
private Map<String, String> publishedParameterToEmbeddedId;
private Map<String, EmbeddedComponentAssembler> embeddedIdToAssembler;
public ComponentAssemblerImpl(ComponentAssemblerSource assemblerSource,
- ComponentInstantiatorSource instantiatorSource,
- ComponentClassResolver componentClassResolver,
- Instantiator instantiator,
- ComponentPageElementResources resources, Locale locale)
+ ComponentInstantiatorSource instantiatorSource, ComponentClassResolver componentClassResolver,
+ Instantiator instantiator, ComponentPageElementResources resources, Locale locale, OperationTracker tracker)
{
this.assemblerSource = assemblerSource;
this.instantiatorSource = instantiatorSource;
@@ -67,9 +69,22 @@ class ComponentAssemblerImpl implements
this.instantiator = instantiator;
this.resources = resources;
this.locale = locale;
+ this.tracker = tracker;
}
- public ComponentPageElement assembleRootComponent(Page page)
+ public ComponentPageElement assembleRootComponent(final Page page)
+ {
+ return tracker.invoke("Assembling root component for page " + page.getName(),
+ new Invokable<ComponentPageElement>()
+ {
+ public ComponentPageElement invoke()
+ {
+ return performAssembleRootComponent(page);
+ }
+ });
+ }
+
+ private ComponentPageElement performAssembleRootComponent(Page page)
{
PageAssembly pageAssembly = new PageAssembly(page);
@@ -102,16 +117,12 @@ class ComponentAssemblerImpl implements
action.execute(pageAssembly);
}
-
return pageAssembly.createdElement.peek();
}
catch (RuntimeException ex)
{
- throw new RuntimeException(
- PageloadMessages.exceptionAssemblingRootComponent(
- pageAssembly.page.getName(),
- InternalUtils.toMessage(ex)),
- ex);
+ throw new RuntimeException(PageloadMessages.exceptionAssemblingRootComponent(pageAssembly.page.getName(),
+ InternalUtils.toMessage(ex)), ex);
}
}
@@ -122,56 +133,55 @@ class ComponentAssemblerImpl implements
Instantiator mixinInstantiator = instantiatorSource.getInstantiator(className);
ComponentModel model = instantiator.getModel();
- element.addMixin(InternalUtils.lastTerm(className),
- mixinInstantiator,model.getOrderForMixin(className));
+ element.addMixin(InternalUtils.lastTerm(className), mixinInstantiator, model.getOrderForMixin(className));
}
}
- public void assembleEmbeddedComponent(PageAssembly pageAssembly, EmbeddedComponentAssembler embeddedAssembler,
- String embeddedId, String elementName,
- Location location)
+ public void assembleEmbeddedComponent(final PageAssembly pageAssembly,
+ final EmbeddedComponentAssembler embeddedAssembler, final String embeddedId, final String elementName,
+ final Location location)
{
- ComponentPageElement container = pageAssembly.activeElement.peek();
+ ComponentName containerName = pageAssembly.componentName.peek();
- try
+ final ComponentName embeddedName = containerName.child(embeddedId.toLowerCase());
+
+ final String componentClassName = instantiator.getModel().getComponentClassName();
+
+ String description = String.format("Assembling component %s (%s)", embeddedName.completeId, componentClassName);
+
+ tracker.run(description, new Runnable()
{
- ComponentName containerName = pageAssembly.componentName.peek();
+ public void run()
+ {
+ ComponentPageElement container = pageAssembly.activeElement.peek();
- ComponentName embeddedName = containerName.child(embeddedId.toLowerCase());
+ try
+ {
- pageAssembly.componentName.push(embeddedName);
+ pageAssembly.componentName.push(embeddedName);
- ComponentPageElement newElement = container.newChild(embeddedId,
- embeddedName.nestedId,
- embeddedName.completeId,
- elementName,
- instantiator,
- location);
+ ComponentPageElement newElement = container.newChild(embeddedId, embeddedName.nestedId,
+ embeddedName.completeId, elementName, instantiator, location);
- pageAssembly.page.addLifecycleListener(newElement);
+ pageAssembly.page.addLifecycleListener(newElement);
- pushNewElement(pageAssembly, newElement);
+ pushNewElement(pageAssembly, newElement);
- embeddedAssembler.addMixinsToElement(newElement);
+ embeddedAssembler.addMixinsToElement(newElement);
- runActions(pageAssembly);
+ runActions(pageAssembly);
- popNewElement(pageAssembly);
+ popNewElement(pageAssembly);
- pageAssembly.componentName.pop();
- }
- catch (RuntimeException ex)
- {
- throw new TapestryException(
- PageloadMessages.exceptionAssemblingEmbeddedComponent(
- embeddedId,
- instantiator.getModel().getComponentClassName(),
- container.getCompleteId(),
- InternalUtils.toMessage(ex)
- ),
- location,
- ex);
- }
+ pageAssembly.componentName.pop();
+ }
+ catch (RuntimeException ex)
+ {
+ throw new TapestryException(PageloadMessages.exceptionAssemblingEmbeddedComponent(embeddedId,
+ componentClassName, container.getCompleteId(), InternalUtils.toMessage(ex)), location, ex);
+ }
+ }
+ });
}
private void pushNewElement(PageAssembly pageAssembly, final ComponentPageElement componentElement)
@@ -217,7 +227,6 @@ class ComponentAssemblerImpl implements
actions.add(action);
}
-
public void validateEmbeddedIds(Map<String, Location> componentIds, Resource templateResource)
{
Map<String, Boolean> embeddedIds = CollectionFactory.newCaseInsensitiveMap();
@@ -236,12 +245,8 @@ class ComponentAssemblerImpl implements
String className = getModel().getComponentClassName();
- throw new RuntimeException(
- PageloadMessages.embeddedComponentsNotInTemplate(
- InternalUtils.joinSorted(embeddedIds.keySet()),
- className,
- InternalUtils.lastTerm(className),
- templateResource));
+ throw new RuntimeException(PageloadMessages.embeddedComponentsNotInTemplate(InternalUtils
+ .joinSorted(embeddedIds.keySet()), className, InternalUtils.lastTerm(className), templateResource));
}
}
@@ -261,24 +266,16 @@ class ComponentAssemblerImpl implements
}
public EmbeddedComponentAssembler createEmbeddedAssembler(String embeddedId, String componentClassName,
- EmbeddedComponentModel embeddedModel, String mixins,
- Location location)
+ EmbeddedComponentModel embeddedModel, String mixins, Location location)
{
try
{
- if (InternalUtils.isBlank(componentClassName))
- {
- throw new TapestryException(PageloadMessages.missingComponentType(),location,null);
- }
+ if (InternalUtils.isBlank(componentClassName)) { throw new TapestryException(PageloadMessages
+ .missingComponentType(), location, null); }
EmbeddedComponentAssemblerImpl embedded = new EmbeddedComponentAssemblerImpl(assemblerSource,
- instantiatorSource,
- componentClassResolver,
- componentClassName,
- locale, embeddedModel,
- mixins,
- location);
-
+ instantiatorSource, componentClassResolver, componentClassName, locale, embeddedModel, mixins,
+ location);
if (embeddedIdToAssembler == null)
embeddedIdToAssembler = CollectionFactory.newMap();
@@ -294,15 +291,9 @@ class ComponentAssemblerImpl implements
String existingEmbeddedId = publishedParameterToEmbeddedId.get(publishedParameterName);
- if (existingEmbeddedId != null)
- {
- throw new TapestryException(
- PageloadMessages.parameterAlreadyPublished(
- publishedParameterName,
- embeddedId,
- instantiator.getModel().getComponentClassName(),
- existingEmbeddedId) , location, null);
- }
+ if (existingEmbeddedId != null) { throw new TapestryException(PageloadMessages
+ .parameterAlreadyPublished(publishedParameterName, embeddedId, instantiator.getModel()
+ .getComponentClassName(), existingEmbeddedId), location, null); }
publishedParameterToEmbeddedId.put(publishedParameterName, embeddedId);
}
@@ -313,14 +304,8 @@ class ComponentAssemblerImpl implements
}
catch (Exception ex)
{
- throw new TapestryException(
- PageloadMessages.failureCreatingEmbeddedComponent(
- embeddedId,
- instantiator.getModel().getComponentClassName(),
- InternalUtils.toMessage(ex)
- ),
- location,
- ex);
+ throw new TapestryException(PageloadMessages.failureCreatingEmbeddedComponent(embeddedId, instantiator
+ .getModel().getComponentClassName(), InternalUtils.toMessage(ex)), location, ex);
}
}
@@ -328,7 +313,8 @@ class ComponentAssemblerImpl implements
{
final String embeddedId = InternalUtils.get(publishedParameterToEmbeddedId, parameterName);
- if (embeddedId == null) return null;
+ if (embeddedId == null)
+ return null;
final EmbeddedComponentAssembler embededdedComponentAssembler = embeddedIdToAssembler.get(embeddedId);
@@ -336,36 +322,30 @@ class ComponentAssemblerImpl implements
final ParameterBinder embeddedBinder = embeddedAssembler.getBinder(parameterName);
- // The complex case: a re-publish! Yes you can go deep here if you don't
+ // The complex case: a re-publish! Yes you can go deep here if you don't
// value your sanity!
- if (embeddedBinder != null)
+ if (embeddedBinder != null) { return new ParameterBinder()
{
- return new ParameterBinder()
+ public void bind(ComponentPageElement element, Binding binding)
{
- public void bind(ComponentPageElement element, Binding binding)
- {
- ComponentPageElement subelement = element.getEmbeddedElement(embeddedId);
-
- embeddedBinder.bind(subelement, binding);
- }
+ ComponentPageElement subelement = element.getEmbeddedElement(embeddedId);
- public String getDefaultBindingPrefix(String metaDefault)
- {
- return embeddedBinder.getDefaultBindingPrefix(metaDefault);
- }
- };
- }
+ embeddedBinder.bind(subelement, binding);
+ }
+ public String getDefaultBindingPrefix(String metaDefault)
+ {
+ return embeddedBinder.getDefaultBindingPrefix(metaDefault);
+ }
+ }; }
final ParameterBinder innerBinder = embededdedComponentAssembler.createParameterBinder(parameterName);
if (innerBinder == null)
{
- String message = PageloadMessages.publishedParameterNonexistant(
- parameterName,
- instantiator.getModel().getComponentClassName(),
- embeddedId);
+ String message = PageloadMessages.publishedParameterNonexistant(parameterName, instantiator.getModel()
+ .getComponentClassName(), embeddedId);
throw new TapestryException(message, embededdedComponentAssembler.getLocation(), null);
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java?rev=948129&r1=948128&r2=948129&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java Tue May 25 17:41:20 2010
@@ -216,7 +216,7 @@ public class PageLoaderImpl implements P
ComponentPageElementResources resources = resourcesSource.get(locale);
ComponentAssembler assembler = new ComponentAssemblerImpl(PageLoaderImpl.this, instantiatorSource,
- componentClassResolver, instantiator, resources, locale);
+ componentClassResolver, instantiator, resources, locale, tracker);
// "Program" the assembler by adding actions to it. The actions interact with a
// PageAssembly object (a fresh one for each new page being created).
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/TemplateParserImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/TemplateParserImpl.java?rev=948129&r1=948128&r2=948129&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/TemplateParserImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/TemplateParserImpl.java Tue May 25 17:41:20 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2007, 2008, 2009 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009, 2010 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -19,9 +19,10 @@ import java.util.Map;
import org.apache.tapestry5.SymbolConstants;
import org.apache.tapestry5.internal.parser.ComponentTemplate;
+import org.apache.tapestry5.ioc.Invokable;
+import org.apache.tapestry5.ioc.OperationTracker;
import org.apache.tapestry5.ioc.Resource;
import org.apache.tapestry5.ioc.annotations.Symbol;
-import org.apache.tapestry5.ioc.internal.util.InternalUtils;
/**
* Parses Tapestry XML template files into {@link ComponentTemplate} instances.
@@ -36,22 +37,29 @@ public class TemplateParserImpl implemen
private final boolean defaultCompressWhitespace;
+ private final OperationTracker tracker;
+
public TemplateParserImpl(Map<String, URL> configuration,
@Symbol(SymbolConstants.COMPRESS_WHITESPACE)
- boolean defaultCompressWhitespace)
+ boolean defaultCompressWhitespace, OperationTracker tracker)
{
this.configuration = configuration;
this.defaultCompressWhitespace = defaultCompressWhitespace;
+ this.tracker = tracker;
}
- public ComponentTemplate parseTemplate(Resource templateResource)
+ public ComponentTemplate parseTemplate(final Resource templateResource)
{
if (!templateResource.exists())
throw new RuntimeException(ServicesMessages.missingTemplateResource(templateResource));
- return new SaxTemplateParser(templateResource, configuration)
- .parse(defaultCompressWhitespace);
+ return tracker.invoke("Parsing component template " + templateResource, new Invokable<ComponentTemplate>()
+ {
+ public ComponentTemplate invoke()
+ {
+ return new SaxTemplateParser(templateResource, configuration).parse(defaultCompressWhitespace);
+ }
+ });
}
-
}