tapestry-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From hls...@apache.org
Subject git commit: Refactor the t5internal library into its own separate (internal) library
Date Fri, 19 Apr 2013 20:05:16 GMT
Updated Branches:
  refs/heads/master cc0c541ab -> 9f854af5f


Refactor the t5internal library into its own separate (internal) library


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/9f854af5
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/9f854af5
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/9f854af5

Branch: refs/heads/master
Commit: 9f854af5f0acebd71d6f4aca55c90e37884deb7e
Parents: cc0c541
Author: Howard M. Lewis Ship <hlship@apache.org>
Authored: Fri Apr 19 21:05:04 2013 +0100
Committer: Howard M. Lewis Ship <hlship@apache.org>
Committed: Fri Apr 19 21:05:04 2013 +0100

----------------------------------------------------------------------
 settings.gradle                                    |    2 +-
 .../tapestry5/corelib/pages/PageCatalog.java       |  321 +++++++++++++++
 .../tapestry5/corelib/pages/ServiceStatus.java     |   82 ++++
 .../tapestry5/internal/PageCatalogTotals.java      |    2 +-
 .../tapestry5/internal/services/PageSource.java    |    2 +-
 .../t5internal/components/InternalLayout.java      |   33 --
 .../internal/t5internal/pages/PageCatalog.java     |  318 --------------
 .../internal/t5internal/pages/ServiceStatus.java   |   82 ----
 .../apache/tapestry5/services/TapestryModule.java  |    3 +-
 .../services/dashboard/DashboardModule.java        |    4 +-
 .../META-INF/assets/core/service-status.css        |   12 +
 .../META-INF/assets/t5internal/service-status.css  |   12 -
 .../tapestry5/corelib/pages/PageCatalog.properties |    3 +
 .../apache/tapestry5/corelib/pages/PageCatalog.tml |   78 ++++
 .../corelib/pages/ServiceStatus.properties         |   15 +
 .../tapestry5/corelib/pages/ServiceStatus.tml      |   59 +++
 .../t5internal/components/InternalLayout.tml       |   34 --
 .../t5internal/pages/PageCatalog.properties        |    3 -
 .../internal/t5internal/pages/PageCatalog.tml      |   78 ----
 .../t5internal/pages/ServiceStatus.properties      |   15 -
 .../internal/t5internal/pages/ServiceStatus.tml    |   59 ---
 tapestry-internal-test/build.gradle                |    5 +
 .../t5internal/components/InternalLayout.java      |   35 ++
 .../t5internal/modules/InternalTestModule.java     |   23 +
 .../t5internal/components/InternalLayout.tml       |   34 ++
 tapestry-yuicompressor/build.gradle                |    1 +
 .../yuicompressor/testapp/services/AppModule.java  |    3 +-
 27 files changed, 676 insertions(+), 642 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/settings.gradle
----------------------------------------------------------------------
diff --git a/settings.gradle b/settings.gradle
index 1e9636b..de2c892 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -2,5 +2,5 @@ include "plastic", "tapestry5-annotations", "tapestry-test", "tapestry-func", "t
 include "tapestry-hibernate-core", "tapestry-hibernate", "tapestry-jmx", "tapestry-upload", "tapestry-spring"
 include "tapestry-beanvalidator", "tapestry-yuicompressor", "tapestry-jpa", "tapestry-kaptcha"
 include "tapestry-javadoc", "quickstart", "tapestry-clojure", "tapestry-mongodb"
-include "tapestry-test-data"
+include "tapestry-test-data", 'tapestry-internal-test'
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageCatalog.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageCatalog.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageCatalog.java
new file mode 100644
index 0000000..ff9f66b
--- /dev/null
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageCatalog.java
@@ -0,0 +1,321 @@
+// Copyright 2011-2013 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
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.corelib.pages;
+
+import org.apache.tapestry5.SymbolConstants;
+import org.apache.tapestry5.alerts.AlertManager;
+import org.apache.tapestry5.annotations.InjectComponent;
+import org.apache.tapestry5.annotations.Persist;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.annotations.WhitelistAccessOnly;
+import org.apache.tapestry5.beaneditor.BeanModel;
+import org.apache.tapestry5.beaneditor.Validate;
+import org.apache.tapestry5.corelib.components.Zone;
+import org.apache.tapestry5.func.*;
+import org.apache.tapestry5.internal.PageCatalogTotals;
+import org.apache.tapestry5.internal.services.ComponentInstantiatorSource;
+import org.apache.tapestry5.internal.services.PageSource;
+import org.apache.tapestry5.internal.structure.Page;
+import org.apache.tapestry5.ioc.Messages;
+import org.apache.tapestry5.ioc.OperationTracker;
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.ioc.annotations.Symbol;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.services.BeanModelSource;
+import org.apache.tapestry5.services.ComponentClassResolver;
+import org.apache.tapestry5.services.pageload.ComponentResourceSelector;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Lists out the currently loaded pages, using a {@link org.apache.tapestry5.corelib.components.Grid}.
+ * Provides an option to force all pages to be loaded. In development mode, includes an option to clear the page cache.
+ */
+@WhitelistAccessOnly
+public class PageCatalog
+{
+
+    @Property
+    private PageCatalogTotals totals;
+
+    @Property
+    @Inject
+    @Symbol(SymbolConstants.PRODUCTION_MODE)
+    private boolean productionMode;
+
+    @Inject
+    private PageSource pageSource;
+
+    @Inject
+    private ComponentResourceSelector selector;
+
+    @Inject
+    private ComponentClassResolver resolver;
+
+    @Inject
+    private AlertManager alertManager;
+
+    @Property
+    private Page page;
+
+    @InjectComponent
+    private Zone pagesZone;
+
+    @Persist
+    private Set<String> failures;
+
+    @Property
+    @Validate("required")
+    @Persist
+    private String pageName;
+
+    @Inject
+    private OperationTracker operationTracker;
+
+    @Inject
+    private ComponentInstantiatorSource componentInstantiatorSource;
+
+    @Inject
+    private BeanModelSource beanModelSource;
+
+    @Inject
+    private Messages messages;
+
+    @Property
+    public static BeanModel<Page> model;
+
+    void pageLoaded()
+    {
+        model = beanModelSource.createDisplayModel(Page.class, messages);
+
+        model.addExpression("selector", "selector.toString()");
+        model.addExpression("assemblyTime", "stats.assemblyTime");
+        model.addExpression("componentCount", "stats.componentCount");
+        model.addExpression("weight", "stats.weight");
+
+        model.reorder("name", "selector", "assemblyTime", "componentCount", "weight");
+    }
+
+    public void onRecomputeTotals()
+    {
+        totals = new PageCatalogTotals();
+
+        Flow<Page> pages = F.flow(getPages());
+
+        totals.loadedPages = pages.count();
+        totals.definedPages = getPageNames().size();
+        totals.uniquePageNames = pages.map(new Mapper<Page, String>()
+        {
+            public String map(Page element)
+            {
+                return element.getName();
+            }
+        }).toSet().size();
+
+        totals.components = pages.reduce(new Reducer<Integer, Page>()
+        {
+            public Integer reduce(Integer accumulator, Page element)
+            {
+                return accumulator + element.getStats().componentCount;
+            }
+        }, 0);
+
+        Set<String> selectorIds = pages.map(new Mapper<Page, String>()
+        {
+            public String map(Page element)
+            {
+                return element.getSelector().toShortString();
+            }
+        }).toSet();
+
+        totals.selectors = InternalUtils.joinSorted(selectorIds);
+    }
+
+    public List<String> getPageNames()
+    {
+        return resolver.getPageNames();
+    }
+
+    public Collection<Page> getPages()
+    {
+        return pageSource.getAllPages();
+    }
+
+    Object onActionFromReloadClasses()
+    {
+        if (productionMode)
+        {
+            alertManager.error("Forcing a class reload is only allowed when executing in development mode.");
+            return null;
+        }
+
+        pageName = null;
+
+        componentInstantiatorSource.forceComponentInvalidation();
+
+        alertManager.info("Forced a component class reload.");
+
+        return pagesZone.getBody();
+    }
+
+    Object onSuccessFromSinglePageLoad()
+    {
+        boolean found = !F.flow(getPages()).filter(new Predicate<Page>()
+        {
+            public boolean accept(Page element)
+            {
+                return element.getName().equals(pageName) && element.getSelector().equals(selector);
+            }
+        }).isEmpty();
+
+        if (found)
+        {
+            alertManager.warn(String.format("Page %s has already been loaded for '%s'.",
+                    pageName, selector.toShortString()));
+            return null;
+        }
+
+        long startTime = System.currentTimeMillis();
+
+
+        // Load the page now (may cause an exception).
+
+        pageSource.getPage(pageName);
+
+
+        alertManager.info(String.format("Loaded page %s for selector '%s' (in %,d ms).", pageName,
+                selector.toShortString(), System.currentTimeMillis() - startTime));
+
+        return pagesZone.getBody();
+    }
+
+    private class PageLoadData
+    {
+        int loadedCount;
+        RuntimeException fail;
+        boolean someFail;
+    }
+
+    Object onActionFromForceLoad()
+    {
+        if (failures == null)
+        {
+            failures = CollectionFactory.newSet();
+        }
+
+        long startTime = System.currentTimeMillis();
+
+        final Collection<Page> initialPages = getPages();
+
+        final PageLoadData data = new PageLoadData();
+
+        for (final String name : resolver.getPageNames())
+        {
+            if (failures.contains(name))
+            {
+                alertManager.warn(String.format("Skipping page %s due to prior load failure.", name));
+                data.someFail = true;
+                continue;
+            }
+
+            operationTracker.run("Loading page " + name, new Runnable()
+            {
+                public void run()
+                {
+                    try
+                    {
+                        Page newPage = pageSource.getPage(name);
+
+                        if (!initialPages.contains(newPage))
+                        {
+                            data.loadedCount++;
+                        }
+                    } catch (RuntimeException ex)
+                    {
+                        alertManager.error(String.format("Page %s failed to load.", name));
+                        failures.add(name);
+
+                        if (data.fail == null)
+                        {
+                            pageName = name;
+                            data.fail = ex;
+                        }
+                    }
+                }
+            });
+
+            if (data.fail != null)
+            {
+                break;
+            }
+        }
+
+        alertManager.info(String.format("Loaded %,d new pages for selector '%s' (in %,d ms).", data.loadedCount,
+                selector.toShortString(), System.currentTimeMillis() - startTime));
+
+        if (data.someFail)
+        {
+            alertManager.warn("Clear the cache to reset the list of failed pages.");
+        }
+
+        if (data.fail != null)
+        {
+            throw data.fail;
+        }
+
+        return pagesZone.getBody();
+    }
+
+    Object onActionFromClearCache()
+    {
+        if (productionMode)
+        {
+            alertManager.error("Clearing the cache is only allowed in development mode.");
+            return null;
+        }
+
+        pageSource.clearCache();
+
+        failures = null;
+
+        alertManager.info("Page cache cleared.");
+
+        return pagesZone.getBody();
+    }
+
+    Object onActionFromRunGC()
+    {
+        Runtime runtime = Runtime.getRuntime();
+
+        long initialFreeMemory = runtime.freeMemory();
+
+        runtime.gc();
+
+        long delta = runtime.freeMemory() - initialFreeMemory;
+
+        alertManager.info(String.format("Garbage collection freed %,.2f Kb of memory.",
+                ((double) delta) / 1024.0d));
+
+        return pagesZone.getBody();
+    }
+
+    public String formatElapsed(double millis)
+    {
+        return String.format("%,.3f ms", millis);
+    }
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/ServiceStatus.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/ServiceStatus.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/ServiceStatus.java
new file mode 100644
index 0000000..b53c9c3
--- /dev/null
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/ServiceStatus.java
@@ -0,0 +1,82 @@
+// Copyright 2007, 2008, 2013 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
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.corelib.pages;
+
+import org.apache.tapestry5.SymbolConstants;
+import org.apache.tapestry5.annotations.Cached;
+import org.apache.tapestry5.annotations.Import;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.annotations.WhitelistAccessOnly;
+import org.apache.tapestry5.beaneditor.BeanModel;
+import org.apache.tapestry5.ioc.Messages;
+import org.apache.tapestry5.ioc.Registry;
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.ioc.annotations.Symbol;
+import org.apache.tapestry5.ioc.services.ServiceActivity;
+import org.apache.tapestry5.ioc.services.ServiceActivityScoreboard;
+import org.apache.tapestry5.services.BeanModelSource;
+
+import java.util.List;
+
+/**
+ * Page used to see the status of all services defined by the {@link Registry}.
+ * <p/>
+ * TODO: Add filters to control which services are displayed
+ */
+@WhitelistAccessOnly
+public class ServiceStatus
+{
+    @Inject
+    private ServiceActivityScoreboard scoreboard;
+
+    @Property
+    private ServiceActivity row;
+
+    @Inject
+    private BeanModelSource source;
+
+    @Property
+    private final BeanModel model;
+
+    @Inject
+    private Messages messages;
+
+    @Property
+    @Inject
+    @Symbol(SymbolConstants.PRODUCTION_MODE)
+    private boolean productionMode;
+
+    {
+        model = source.createDisplayModel(ServiceActivity.class, messages);
+
+        model.addEmpty("serviceInterface");
+
+        // There's no line number information for interfaces, so we'll reorder the
+        // proprieties manually.
+
+        model.reorder("serviceId", "serviceInterface", "scope", "status");
+    }
+
+    @Cached
+    public List<ServiceActivity> getActivity()
+    {
+        return scoreboard.getServiceActivity();
+    }
+
+    @Import(stylesheet = "service-status.css")
+    void onAfterRenderFromServices()
+    {
+    }
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/java/org/apache/tapestry5/internal/PageCatalogTotals.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/PageCatalogTotals.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/PageCatalogTotals.java
index 0a6e2c1..3fff478 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/PageCatalogTotals.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/PageCatalogTotals.java
@@ -17,7 +17,7 @@ package org.apache.tapestry5.internal;
 import org.apache.tapestry5.beaneditor.ReorderProperties;
 
 /**
- * @see org.apache.tapestry5.internal.t5internal.pages.PageCatalog
+ * @see org.apache.tapestry5.corelib.pages.PageCatalog
  */
 @ReorderProperties("definedPages,loadedPages,uniquePageNames,selectors,components")
 public class PageCatalogTotals

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageSource.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageSource.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageSource.java
index 0bdc042..7c1a4e1 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageSource.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageSource.java
@@ -53,7 +53,7 @@ public interface PageSource
      * garbage collector, and may include the same page loaded for different {@link ComponentResourceSelector}s. This is needed
      * for reporting purposes only.
      *
-     * @see org.apache.tapestry5.internal.t5internal.pages.PageCatalog
+     * @see org.apache.tapestry5.corelib.pages.PageCatalog
      * @since 5.3
      */
     Set<Page> getAllPages();

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/components/InternalLayout.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/components/InternalLayout.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/components/InternalLayout.java
deleted file mode 100644
index 8862655..0000000
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/components/InternalLayout.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.apache.tapestry5.internal.t5internal.components;
-
-import org.apache.tapestry5.BindingConstants;
-import org.apache.tapestry5.Block;
-import org.apache.tapestry5.SymbolConstants;
-import org.apache.tapestry5.annotations.Parameter;
-import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.ioc.annotations.Symbol;
-
-/**
- * A default layout for a number of internal pages in Tapestry, such as {@link org.apache.tapestry5.internal.t5internal.pages.ServiceStatus} and {@link org.apache.tapestry5.internal.t5internal.pages.PageCatalog}.
- * <strong>This component is not intended for use in user applications, and may change at any time.</strong>
- *
- * @tapestrydoc
- * @since 5.3
- */
-public class InternalLayout
-{
-    @Property
-    @Parameter
-    private Block leftNav;
-
-    @Property
-    @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)
-    private String title;
-
-    @Inject
-    @Symbol(SymbolConstants.TAPESTRY_VERSION)
-    @Property
-    private String frameworkVersion;
-
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.java
deleted file mode 100644
index 3f4b31c..0000000
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.java
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 2011-2013 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
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.internal.t5internal.pages;
-
-import org.apache.tapestry5.SymbolConstants;
-import org.apache.tapestry5.alerts.AlertManager;
-import org.apache.tapestry5.annotations.*;
-import org.apache.tapestry5.beaneditor.BeanModel;
-import org.apache.tapestry5.beaneditor.Validate;
-import org.apache.tapestry5.corelib.components.Zone;
-import org.apache.tapestry5.func.*;
-import org.apache.tapestry5.internal.PageCatalogTotals;
-import org.apache.tapestry5.internal.services.ComponentInstantiatorSource;
-import org.apache.tapestry5.internal.services.PageSource;
-import org.apache.tapestry5.internal.structure.Page;
-import org.apache.tapestry5.ioc.Messages;
-import org.apache.tapestry5.ioc.OperationTracker;
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.ioc.annotations.Symbol;
-import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
-import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.services.BeanModelSource;
-import org.apache.tapestry5.services.ComponentClassResolver;
-import org.apache.tapestry5.services.pageload.ComponentResourceSelector;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Lists out the currently loaded pages, using a {@link org.apache.tapestry5.corelib.components.Grid}.
- * Provides an option to force all pages to be loaded. In development mode, includes an option to clear the page cache.
- */
-@WhitelistAccessOnly
-public class PageCatalog
-{
-
-    @Property
-    private PageCatalogTotals totals;
-
-    @Property
-    @Inject
-    @Symbol(SymbolConstants.PRODUCTION_MODE)
-    private boolean productionMode;
-
-    @Inject
-    private PageSource pageSource;
-
-    @Inject
-    private ComponentResourceSelector selector;
-
-    @Inject
-    private ComponentClassResolver resolver;
-
-    @Inject
-    private AlertManager alertManager;
-
-    @Property
-    private Page page;
-
-    @InjectComponent
-    private Zone pagesZone;
-
-    @Persist
-    private Set<String> failures;
-
-    @Property
-    @Validate("required")
-    @Persist
-    private String pageName;
-
-    @Inject
-    private OperationTracker operationTracker;
-
-    @Inject
-    private ComponentInstantiatorSource componentInstantiatorSource;
-
-    @Inject
-    private BeanModelSource beanModelSource;
-
-    @Inject
-    private Messages messages;
-
-    @Property
-    public static BeanModel<Page> model;
-
-    void pageLoaded()
-    {
-        model = beanModelSource.createDisplayModel(Page.class, messages);
-
-        model.addExpression("selector", "selector.toString()");
-        model.addExpression("assemblyTime", "stats.assemblyTime");
-        model.addExpression("componentCount", "stats.componentCount");
-        model.addExpression("weight", "stats.weight");
-
-        model.reorder("name", "selector", "assemblyTime", "componentCount", "weight");
-    }
-
-    public void onRecomputeTotals()
-    {
-        totals = new PageCatalogTotals();
-
-        Flow<Page> pages = F.flow(getPages());
-
-        totals.loadedPages = pages.count();
-        totals.definedPages = getPageNames().size();
-        totals.uniquePageNames = pages.map(new Mapper<Page, String>()
-        {
-            public String map(Page element)
-            {
-                return element.getName();
-            }
-        }).toSet().size();
-
-        totals.components = pages.reduce(new Reducer<Integer, Page>()
-        {
-            public Integer reduce(Integer accumulator, Page element)
-            {
-                return accumulator + element.getStats().componentCount;
-            }
-        }, 0);
-
-        Set<String> selectorIds = pages.map(new Mapper<Page, String>()
-        {
-            public String map(Page element)
-            {
-                return element.getSelector().toShortString();
-            }
-        }).toSet();
-
-        totals.selectors = InternalUtils.joinSorted(selectorIds);
-    }
-
-    public List<String> getPageNames()
-    {
-        return resolver.getPageNames();
-    }
-
-    public Collection<Page> getPages()
-    {
-        return pageSource.getAllPages();
-    }
-
-    Object onActionFromReloadClasses()
-    {
-        if (productionMode)
-        {
-            alertManager.error("Forcing a class reload is only allowed when executing in development mode.");
-            return null;
-        }
-
-        pageName = null;
-
-        componentInstantiatorSource.forceComponentInvalidation();
-
-        alertManager.info("Forced a component class reload.");
-
-        return pagesZone.getBody();
-    }
-
-    Object onSuccessFromSinglePageLoad()
-    {
-        boolean found = !F.flow(getPages()).filter(new Predicate<Page>()
-        {
-            public boolean accept(Page element)
-            {
-                return element.getName().equals(pageName) && element.getSelector().equals(selector);
-            }
-        }).isEmpty();
-
-        if (found)
-        {
-            alertManager.warn(String.format("Page %s has already been loaded for '%s'.",
-                    pageName, selector.toShortString()));
-            return null;
-        }
-
-        long startTime = System.currentTimeMillis();
-
-
-        // Load the page now (may cause an exception).
-
-        pageSource.getPage(pageName);
-
-
-        alertManager.info(String.format("Loaded page %s for selector '%s' (in %,d ms).", pageName,
-                selector.toShortString(), System.currentTimeMillis() - startTime));
-
-        return pagesZone.getBody();
-    }
-
-    private class PageLoadData
-    {
-        int loadedCount;
-        RuntimeException fail;
-        boolean someFail;
-    }
-
-    Object onActionFromForceLoad()
-    {
-        if (failures == null)
-        {
-            failures = CollectionFactory.newSet();
-        }
-
-        long startTime = System.currentTimeMillis();
-
-        final Collection<Page> initialPages = getPages();
-
-        final PageLoadData data = new PageLoadData();
-
-        for (final String name : resolver.getPageNames())
-        {
-            if (failures.contains(name))
-            {
-                alertManager.warn(String.format("Skipping page %s due to prior load failure.", name));
-                data.someFail = true;
-                continue;
-            }
-
-            operationTracker.run("Loading page " + name, new Runnable()
-            {
-                public void run()
-                {
-                    try
-                    {
-                        Page newPage = pageSource.getPage(name);
-
-                        if (!initialPages.contains(newPage))
-                        {
-                            data.loadedCount++;
-                        }
-                    } catch (RuntimeException ex)
-                    {
-                        alertManager.error(String.format("Page %s failed to load.", name));
-                        failures.add(name);
-
-                        if (data.fail == null)
-                        {
-                            pageName = name;
-                            data.fail = ex;
-                        }
-                    }
-                }
-            });
-
-            if (data.fail != null)
-            {
-                break;
-            }
-        }
-
-        alertManager.info(String.format("Loaded %,d new pages for selector '%s' (in %,d ms).", data.loadedCount,
-                selector.toShortString(), System.currentTimeMillis() - startTime));
-
-        if (data.someFail)
-        {
-            alertManager.warn("Clear the cache to reset the list of failed pages.");
-        }
-
-        if (data.fail != null)
-        {
-            throw data.fail;
-        }
-
-        return pagesZone.getBody();
-    }
-
-    Object onActionFromClearCache()
-    {
-        if (productionMode)
-        {
-            alertManager.error("Clearing the cache is only allowed in development mode.");
-            return null;
-        }
-
-        pageSource.clearCache();
-
-        failures = null;
-
-        alertManager.info("Page cache cleared.");
-
-        return pagesZone.getBody();
-    }
-
-    Object onActionFromRunGC()
-    {
-        Runtime runtime = Runtime.getRuntime();
-
-        long initialFreeMemory = runtime.freeMemory();
-
-        runtime.gc();
-
-        long delta = runtime.freeMemory() - initialFreeMemory;
-
-        alertManager.info(String.format("Garbage collection freed %,.2f Kb of memory.",
-                ((double) delta) / 1024.0d));
-
-        return pagesZone.getBody();
-    }
-
-    public String formatElapsed(double millis)
-    {
-        return String.format("%,.3f ms", millis);
-    }
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.java
deleted file mode 100644
index 0434ea8..0000000
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2007, 2008, 2013 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
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.internal.t5internal.pages;
-
-import org.apache.tapestry5.SymbolConstants;
-import org.apache.tapestry5.annotations.Cached;
-import org.apache.tapestry5.annotations.Import;
-import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.annotations.WhitelistAccessOnly;
-import org.apache.tapestry5.beaneditor.BeanModel;
-import org.apache.tapestry5.ioc.Messages;
-import org.apache.tapestry5.ioc.Registry;
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.ioc.annotations.Symbol;
-import org.apache.tapestry5.ioc.services.ServiceActivity;
-import org.apache.tapestry5.ioc.services.ServiceActivityScoreboard;
-import org.apache.tapestry5.services.BeanModelSource;
-
-import java.util.List;
-
-/**
- * Page used to see the status of all services defined by the {@link Registry}.
- * <p/>
- * TODO: Add filters to control which services are displayed
- */
-@WhitelistAccessOnly
-public class ServiceStatus
-{
-    @Inject
-    private ServiceActivityScoreboard scoreboard;
-
-    @Property
-    private ServiceActivity row;
-
-    @Inject
-    private BeanModelSource source;
-
-    @Property
-    private final BeanModel model;
-
-    @Inject
-    private Messages messages;
-
-    @Property
-    @Inject
-    @Symbol(SymbolConstants.PRODUCTION_MODE)
-    private boolean productionMode;
-
-    {
-        model = source.createDisplayModel(ServiceActivity.class, messages);
-
-        model.addEmpty("serviceInterface");
-
-        // There's no line number information for interfaces, so we'll reorder the
-        // proprieties manually.
-
-        model.reorder("serviceId", "serviceInterface", "scope", "status");
-    }
-
-    @Cached
-    public List<ServiceActivity> getActivity()
-    {
-        return scoreboard.getServiceActivity();
-    }
-
-    @Import(stylesheet = "service-status.css")
-    void onAfterRenderFromServices()
-    {
-    }
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
index 86127a9..da649fa 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
@@ -431,12 +431,11 @@ public final class TapestryModule
 
 
     @Contribute(ComponentClassResolver.class)
-    public static void setupCoreAndAppLibraries(Configuration<LibraryMapping> configuration,
+    public static void provideCoreAndAppLibraries(Configuration<LibraryMapping> configuration,
                                                 @Symbol(InternalConstants.TAPESTRY_APP_PACKAGE_PARAM)
                                                 String appRootPackage)
     {
         configuration.add(new LibraryMapping(InternalConstants.CORE_LIBRARY, "org.apache.tapestry5.corelib"));
-        configuration.add(new LibraryMapping("t5internal", "org.apache.tapestry5.internal.t5internal"));
         configuration.add(new LibraryMapping("", appRootPackage));
     }
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/java/org/apache/tapestry5/services/dashboard/DashboardModule.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/dashboard/DashboardModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/dashboard/DashboardModule.java
index 60e5129..98c9529 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/services/dashboard/DashboardModule.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/dashboard/DashboardModule.java
@@ -29,7 +29,7 @@ public class DashboardModule
     @Contribute(DashboardManager.class)
     public static void defaultTabs(OrderedConfiguration<DashboardTab> configuration)
     {
-        configuration.add("Pages", new DashboardTab("Pages", "t5internal/PageCatalog"));
-        configuration.add("Services", new DashboardTab("Services", "t5internal/ServiceStatus"));
+        configuration.add("Pages", new DashboardTab("Pages", "core/PageCatalog"));
+        configuration.add("Services", new DashboardTab("Services", "core/ServiceStatus"));
     }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/META-INF/assets/core/service-status.css
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/META-INF/assets/core/service-status.css b/tapestry-core/src/main/resources/META-INF/assets/core/service-status.css
new file mode 100644
index 0000000..15a1db7
--- /dev/null
+++ b/tapestry-core/src/main/resources/META-INF/assets/core/service-status.css
@@ -0,0 +1,12 @@
+TR.DEFINED {
+    color: #666666;
+    font-style: italic;
+}
+
+TR.VIRTUAL {
+    color: blue;
+}
+
+TR.REAL {
+    color: green;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/META-INF/assets/t5internal/service-status.css
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/META-INF/assets/t5internal/service-status.css b/tapestry-core/src/main/resources/META-INF/assets/t5internal/service-status.css
deleted file mode 100644
index 15a1db7..0000000
--- a/tapestry-core/src/main/resources/META-INF/assets/t5internal/service-status.css
+++ /dev/null
@@ -1,12 +0,0 @@
-TR.DEFINED {
-    color: #666666;
-    font-style: italic;
-}
-
-TR.VIRTUAL {
-    color: blue;
-}
-
-TR.REAL {
-    color: green;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/PageCatalog.properties
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/PageCatalog.properties b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/PageCatalog.properties
new file mode 100644
index 0000000..d1b1307
--- /dev/null
+++ b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/PageCatalog.properties
@@ -0,0 +1,3 @@
+loadedpages-label=Pages in Cache
+components-label=Total # of Components
+selectors-label=Active Selectors

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/PageCatalog.tml
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/PageCatalog.tml b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/PageCatalog.tml
new file mode 100644
index 0000000..3dc308f
--- /dev/null
+++ b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/PageCatalog.tml
@@ -0,0 +1,78 @@
+<t:block id="content" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
+         xmlns:p="tapestry:parameter">
+
+    <t:zone t:id="pagesZone" id="pages">
+
+        <p>
+            This page provides a list of pages currently loaded in the application.
+        </p>
+
+        <t:trigger event="recomputeTotals"/>
+
+        <t:beandisplay t:id="totals"/>
+
+        <t:grid source="pages" row="page" model="model">
+            <p:assemblyTimeCell>
+                ${formatElapsed(page.stats.assemblyTime)}
+            </p:assemblyTimeCell>
+            <p:selectorCell>
+                ${page.selector.toShortString()}
+            </p:selectorCell>
+            <p:empty>
+                <p><em>There are no pages in the page cache. This can only occur immediately after reloading all
+                    component classes or clearing the cache.</em></p>
+            </p:empty>
+        </t:grid>
+
+    </t:zone>
+
+
+    <div class="btn-group">
+        <t:actionlink t:id="forceLoad" zone="pages" class="btn">Load all pages</t:actionlink>
+        <t:if test="! productionMode">
+            <t:actionlink t:id="clearCache" zone="pages" class="btn">Clear the cache</t:actionlink>
+            <t:actionlink t:id="reloadClasses" zone="pages" class="btn">Reload component classes</t:actionlink>
+        </t:if>
+        <t:actionlink t:id="runGC" zone="pages" class="btn">Run the GC</t:actionlink>
+    </div>
+
+
+    <ul class="nav nav-pills nav-stacked">
+        <li>
+        </li>
+    </ul>
+
+    <t:form t:id="singlePageLoad" zone="pages" class="form-inline">
+
+        <t:label for="pageName">Load single page:</t:label>
+        <t:select t:id="pageName" model="pageNames"/>
+
+        <input type="submit" value="Load Page" class="btn btn-primary"/>
+
+    </t:form>
+
+    <dl class="dl-horizontal">
+        <dt>Defined Pages</dt>
+        <dd>Number of page classes.</dd>
+        <dt>Pages in Cache</dt>
+        <dd>Number of page instances currently loaded. This may include the same page class for different selectors.
+        </dd>
+        <dt>Unique Page Names</dt>
+        <dd>Number of pages loaded, ignoring selectors.</dd>
+        <dt>Selector</dt>
+        <dd>The locale (plus application-specific other information) for which the page was assembled. A new instance of
+            a Page will be created for each new selector,
+            as needed.
+        </dd>
+        <dt>Assembly Time</dt>
+        <dd>Time to assemble a complete instance of a page, including all sub-components, and all bindings and other
+            connections
+            between them.
+        </dd>
+        <dt>Component Count</dt>
+        <dd>Number of components on the page, including the root component.</dd>
+        <dt>Weight</dt>
+        <dd>Arbitrary number that includes number of components and mixins, template tokens, and other factors.</dd>
+    </dl>
+
+</t:block>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ServiceStatus.properties
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ServiceStatus.properties b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ServiceStatus.properties
new file mode 100644
index 0000000..c6d4035
--- /dev/null
+++ b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ServiceStatus.properties
@@ -0,0 +1,15 @@
+# Copyright 2008, 2013 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
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+service-status-hidden=Detailed service status is only available in development mode.

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ServiceStatus.tml
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ServiceStatus.tml b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ServiceStatus.tml
new file mode 100644
index 0000000..f68eb35
--- /dev/null
+++ b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ServiceStatus.tml
@@ -0,0 +1,59 @@
+<t:block id="content"
+         xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd" xmlns:p="tapestry:parameter">
+
+    <p><strong>${activity.size()}</strong> services defined in the IoC Registry.</p>
+
+    <t:if test="! productionMode">
+
+        <t:grid t:id="services" inplace="true" rowsperpage="100" model="model" rowClass="row.status" source="activity"
+                row="row" t:mixins="renderNotification">
+
+            <p:serviceInterfaceCell>
+                <t:if test="! row.serviceInterface.interface">
+                    <em>Class</em>
+                </t:if>
+                ${row.serviceInterface.name}
+            </p:serviceInterfaceCell>
+
+        </t:grid>
+
+
+        <p:else>
+            <p>
+                <em>${message:service-status-hidden}</em>
+            </p>
+        </p:else>
+    </t:if>
+
+
+    <dl class="dl-horizontal">
+        <dt>Builtin</dt>
+        <dd>
+            A fundamental service that exists even before the Registry is
+            created.
+        </dd>
+
+        <dt>Defined</dt>
+        <dd>
+            The service is defined, but has not yet been referenced.
+        </dd>
+
+        <dt>Virtual</dt>
+        <dd>
+            The service has been referenced (usually for injection into
+            another service) but has not yet been
+            <em>realized</em>
+            into an instantiated service. Realization occurs with the
+            first method invocation on the proxy.
+        </dd>
+
+        <dt>Real</dt>
+        <dd>
+            The service has been realized: instantiated, dependencies
+            injected, decorated with interceptors and is fully in
+            operation.
+        </dd>
+
+    </dl>
+
+</t:block>

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/components/InternalLayout.tml
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/components/InternalLayout.tml b/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/components/InternalLayout.tml
deleted file mode 100644
index 99e4b99..0000000
--- a/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/components/InternalLayout.tml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
-<head><title>Tapestry 5: ${title}</title></head>
-<body>
-
-<div class="navbar">
-    <div class="navbar-inner">
-        <div class="container-fluid">
-            <a href="http://tapestry.apache.org/" class="brand">Apache Tapestry 5</a>
-            <ul class="nav">
-                <li class="navbar-text">Version: ${frameworkVersion}</li>
-                <li class="divider-vertical"/>
-                <li class="navbar-text">${title}</li>
-            </ul>
-        </div>
-    </div>
-</div>
-
-<div class="container-fluid">
-    <div class="row-fluid">
-        <div class="span2">
-            <t:delegate to="leftNav"/>
-        </div>
-        <div class="span10">
-            <t:alerts/>
-
-            <t:body/>
-        </div>
-
-    </div>
-</div>
-
-</body>
-</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.properties
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.properties b/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.properties
deleted file mode 100644
index d1b1307..0000000
--- a/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-loadedpages-label=Pages in Cache
-components-label=Total # of Components
-selectors-label=Active Selectors

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.tml
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.tml b/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.tml
deleted file mode 100644
index 771f4a9..0000000
--- a/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/PageCatalog.tml
+++ /dev/null
@@ -1,78 +0,0 @@
-<t:block id="content" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
-         xmlns:p="tapestry:parameter">
-
-    <t:zone t:id="pagesZone" id="pages">
-
-        <p xml:space="preserve">
-            This page provides a list of pages currently loaded in the application.
-        </p>
-
-        <t:trigger event="recomputeTotals"/>
-
-        <t:beandisplay t:id="totals"/>
-
-        <t:grid source="pages" row="page" model="model">
-            <p:assemblyTimeCell>
-                ${formatElapsed(page.stats.assemblyTime)}
-            </p:assemblyTimeCell>
-            <p:selectorCell>
-                ${page.selector.toShortString()}
-            </p:selectorCell>
-            <p:empty>
-                <p><em>There are no pages in the page cache. This can only occur immediately after reloading all
-                    component classes or clearing the cache.</em></p>
-            </p:empty>
-        </t:grid>
-
-    </t:zone>
-
-
-    <div class="btn-group">
-        <t:actionlink t:id="forceLoad" zone="pages" class="btn">Load all pages</t:actionlink>
-        <t:if test="! productionMode">
-            <t:actionlink t:id="clearCache" zone="pages" class="btn">Clear the cache</t:actionlink>
-            <t:actionlink t:id="reloadClasses" zone="pages" class="btn">Reload component classes</t:actionlink>
-        </t:if>
-        <t:actionlink t:id="runGC" zone="pages" class="btn">Run the GC</t:actionlink>
-    </div>
-
-
-    <ul class="nav nav-pills nav-stacked">
-        <li>
-        </li>
-    </ul>
-
-    <t:form t:id="singlePageLoad" zone="pages" class="form-inline">
-
-        <t:label for="pageName">Load single page:</t:label>
-        <t:select t:id="pageName" model="pageNames"/>
-
-        <input type="submit" value="Load Page" class="btn btn-primary"/>
-
-    </t:form>
-
-    <dl>
-        <dt>Defined Pages</dt>
-        <dd>Number of page classes.</dd>
-        <dt>Pages in Cache</dt>
-        <dd>Number of page instances currently loaded. This may include the same page class for different selectors.
-        </dd>
-        <dt>Unique Page Names</dt>
-        <dd>Number of pages loaded, ignoring selectors.</dd>
-        <dt>Selector</dt>
-        <dd>The locale (plus application-specific other information) for which the page was assembled. A new instance of
-            a Page will be created for each new selector,
-            as needed.
-        </dd>
-        <dt>Assembly Time</dt>
-        <dd>Time to assemble a complete instance of a page, including all sub-components, and all bindings and other
-            connections
-            between them.
-        </dd>
-        <dt>Component Count</dt>
-        <dd>Number of components on the page, including the root component.</dd>
-        <dt>Weight</dt>
-        <dd>Arbitrary number that includes number of components and mixins, template tokens, and other factors.</dd>
-    </dl>
-
-</t:block>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.properties
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.properties b/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.properties
deleted file mode 100644
index c6d4035..0000000
--- a/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright 2008, 2013 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
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-service-status-hidden=Detailed service status is only available in development mode.

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.tml
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.tml b/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.tml
deleted file mode 100644
index ed782c1..0000000
--- a/tapestry-core/src/main/resources/org/apache/tapestry5/internal/t5internal/pages/ServiceStatus.tml
+++ /dev/null
@@ -1,59 +0,0 @@
-<t:block id="content"
-         xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd" xmlns:p="tapestry:parameter">
-
-    <p><strong>${activity.size()}</strong> services defined in the IoC Registry.</p>
-
-    <t:if test="! productionMode">
-
-        <t:grid t:id="services" inplace="true" rowsperpage="100" model="model" rowClass="row.status" source="activity"
-                row="row" t:mixins="renderNotification">
-
-            <p:serviceInterfaceCell>
-                <t:if test="! row.serviceInterface.interface">
-                    <em>Class</em>
-                </t:if>
-                ${row.serviceInterface.name}
-            </p:serviceInterfaceCell>
-
-        </t:grid>
-
-
-        <p:else>
-            <p>
-                <em>${message:service-status-hidden}</em>
-            </p>
-        </p:else>
-    </t:if>
-
-
-    <dl>
-        <dt>Builtin</dt>
-        <dd>
-            A fundamental service that exists even before the Registry is
-            created.
-        </dd>
-
-        <dt>Defined</dt>
-        <dd>
-            The service is defined, but has not yet been referenced.
-        </dd>
-
-        <dt>Virtual</dt>
-        <dd>
-            The service has been referenced (usually for injection into
-            another service) but has not yet been
-            <em>realized</em>
-            into an instantiated service. Realization occurs with the
-            first method invocation on the proxy.
-        </dd>
-
-        <dt>Real</dt>
-        <dd>
-            The service has been realized: instantiated, dependencies
-            injected, decorated with interceptors and is fully in
-            operation.
-        </dd>
-
-    </dl>
-
-</t:block>

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-internal-test/build.gradle
----------------------------------------------------------------------
diff --git a/tapestry-internal-test/build.gradle b/tapestry-internal-test/build.gradle
new file mode 100644
index 0000000..7ca24b6
--- /dev/null
+++ b/tapestry-internal-test/build.gradle
@@ -0,0 +1,5 @@
+description = "Internal utilties used to assist with testing; not intended for outside use"
+
+dependencies {
+    compile project(":tapestry-core")
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-internal-test/src/main/java/org/apache/tapestry5/internal/t5internal/components/InternalLayout.java
----------------------------------------------------------------------
diff --git a/tapestry-internal-test/src/main/java/org/apache/tapestry5/internal/t5internal/components/InternalLayout.java b/tapestry-internal-test/src/main/java/org/apache/tapestry5/internal/t5internal/components/InternalLayout.java
new file mode 100644
index 0000000..31631e1
--- /dev/null
+++ b/tapestry-internal-test/src/main/java/org/apache/tapestry5/internal/t5internal/components/InternalLayout.java
@@ -0,0 +1,35 @@
+package org.apache.tapestry5.internal.t5internal.components;
+
+import org.apache.tapestry5.BindingConstants;
+import org.apache.tapestry5.Block;
+import org.apache.tapestry5.SymbolConstants;
+import org.apache.tapestry5.annotations.Import;
+import org.apache.tapestry5.annotations.Parameter;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.ioc.annotations.Symbol;
+
+/**
+ * A default layout for a number of internal pages in Tapestry, such as {@link org.apache.tapestry5.corelib.pages.ServiceStatus} and {@link org.apache.tapestry5.corelib.pages.PageCatalog}.
+ * <strong>This component is not intended for use in user applications, and may change at any time.</strong>
+ *
+ * @tapestrydoc
+ * @since 5.3
+ */
+@Import(stack="core")
+public class InternalLayout
+{
+    @Property
+    @Parameter
+    private Block leftNav;
+
+    @Property
+    @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)
+    private String title;
+
+    @Inject
+    @Symbol(SymbolConstants.TAPESTRY_VERSION)
+    @Property
+    private String frameworkVersion;
+
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-internal-test/src/main/java/org/apache/tapestry5/internal/t5internal/modules/InternalTestModule.java
----------------------------------------------------------------------
diff --git a/tapestry-internal-test/src/main/java/org/apache/tapestry5/internal/t5internal/modules/InternalTestModule.java b/tapestry-internal-test/src/main/java/org/apache/tapestry5/internal/t5internal/modules/InternalTestModule.java
new file mode 100644
index 0000000..3f07ef3
--- /dev/null
+++ b/tapestry-internal-test/src/main/java/org/apache/tapestry5/internal/t5internal/modules/InternalTestModule.java
@@ -0,0 +1,23 @@
+package org.apache.tapestry5.internal.t5internal.modules;
+
+import org.apache.tapestry5.ioc.Configuration;
+import org.apache.tapestry5.ioc.annotations.Contribute;
+import org.apache.tapestry5.services.ComponentClassResolver;
+import org.apache.tapestry5.services.LibraryMapping;
+
+/**
+ * Provides the "t5internal" library, that provides common text utilities needed by some of the other
+ * projects' integration tests. To normalize in-IDE development with command-line development, this module
+ * is not set up to auto load via a manifest attribute, instead it is referenced via {@link org.apache.tapestry5.ioc.annotations.SubModule}.
+ *
+ * @since 5.4
+ */
+public class InternalTestModule
+{
+    @Contribute(ComponentClassResolver.class)
+    public static void provideT5InternalLibrary(Configuration<LibraryMapping> configuration)
+    {
+        configuration.add(new LibraryMapping("t5internal", "org.apache.tapestry5.internal.t5internal"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-internal-test/src/main/resources/org/apache/tapestry5/internal/t5internal/components/InternalLayout.tml
----------------------------------------------------------------------
diff --git a/tapestry-internal-test/src/main/resources/org/apache/tapestry5/internal/t5internal/components/InternalLayout.tml b/tapestry-internal-test/src/main/resources/org/apache/tapestry5/internal/t5internal/components/InternalLayout.tml
new file mode 100644
index 0000000..99e4b99
--- /dev/null
+++ b/tapestry-internal-test/src/main/resources/org/apache/tapestry5/internal/t5internal/components/InternalLayout.tml
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
+<head><title>Tapestry 5: ${title}</title></head>
+<body>
+
+<div class="navbar">
+    <div class="navbar-inner">
+        <div class="container-fluid">
+            <a href="http://tapestry.apache.org/" class="brand">Apache Tapestry 5</a>
+            <ul class="nav">
+                <li class="navbar-text">Version: ${frameworkVersion}</li>
+                <li class="divider-vertical"/>
+                <li class="navbar-text">${title}</li>
+            </ul>
+        </div>
+    </div>
+</div>
+
+<div class="container-fluid">
+    <div class="row-fluid">
+        <div class="span2">
+            <t:delegate to="leftNav"/>
+        </div>
+        <div class="span10">
+            <t:alerts/>
+
+            <t:body/>
+        </div>
+
+    </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-yuicompressor/build.gradle
----------------------------------------------------------------------
diff --git a/tapestry-yuicompressor/build.gradle b/tapestry-yuicompressor/build.gradle
index c744cb9..6aef587 100644
--- a/tapestry-yuicompressor/build.gradle
+++ b/tapestry-yuicompressor/build.gradle
@@ -5,6 +5,7 @@ dependencies {
   compile "com.yahoo.platform.yui:yuicompressor:2.4.6"
     
   testCompile project(':tapestry-test')
+  testCompile project(":tapestry-internal-test")
 }
 
 jar {

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9f854af5/tapestry-yuicompressor/src/test/java/yuicompressor/testapp/services/AppModule.java
----------------------------------------------------------------------
diff --git a/tapestry-yuicompressor/src/test/java/yuicompressor/testapp/services/AppModule.java b/tapestry-yuicompressor/src/test/java/yuicompressor/testapp/services/AppModule.java
index 8c4d237..be65259 100644
--- a/tapestry-yuicompressor/src/test/java/yuicompressor/testapp/services/AppModule.java
+++ b/tapestry-yuicompressor/src/test/java/yuicompressor/testapp/services/AppModule.java
@@ -1,6 +1,7 @@
 package yuicompressor.testapp.services;
 
 import org.apache.tapestry5.SymbolConstants;
+import org.apache.tapestry5.internal.t5internal.modules.InternalTestModule;
 import org.apache.tapestry5.ioc.MappedConfiguration;
 import org.apache.tapestry5.ioc.annotations.Contribute;
 import org.apache.tapestry5.ioc.annotations.SubModule;
@@ -8,7 +9,7 @@ import org.apache.tapestry5.ioc.services.ApplicationDefaults;
 import org.apache.tapestry5.ioc.services.SymbolProvider;
 import org.apache.tapestry5.yuicompressor.services.YuiCompressorModule;
 
-@SubModule(YuiCompressorModule.class)
+@SubModule({YuiCompressorModule.class, InternalTestModule.class})
 public class AppModule
 {
     @Contribute(SymbolProvider.class)


Mime
View raw message