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);
+ }
+ });
}
-
}