Repository: tapestry-5 Updated Branches: refs/heads/master c4d8d6c30 -> aca075cb7
TAP5-2192 : adds tags to ComponentLibraryInfo and adds @Description to tapestry5-annotations Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/aca075cb Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/aca075cb Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/aca075cb Branch: refs/heads/master Commit: aca075cb714b5281457ae62146f8de5b6feebfae Parents: c4d8d6c Author: Thiago H. de Paula Figueiredo <thiag...@apache.org> Authored: Sat Jul 5 16:04:32 2014 -0300 Committer: Thiago H. de Paula Figueiredo <thiag...@apache.org> Committed: Sat Jul 5 16:04:32 2014 -0300 ---------------------------------------------------------------------- .../corelib/pages/ComponentLibraries.java | 23 +++++++++- .../tapestry5/modules/TapestryModule.java | 1 + .../services/ComponentLibraryInfo.java | 20 ++++++++- .../corelib/pages/ComponentLibraries.tml | 30 +++++++++++-- .../ComponentLibrariesCatalogPageTests.groovy | 12 ++++- .../locallib/alpha/pages/Logo.groovy | 1 + .../locallib/alpha/pages/AlphaRoot.java | 3 ++ .../tapestry5/ioc/annotations/Description.java | 46 ++++++++++++++++++++ 8 files changed, 129 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/aca075cb/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/ComponentLibraries.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/ComponentLibraries.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/ComponentLibraries.java index 362d5f7..675063c 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/ComponentLibraries.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/ComponentLibraries.java @@ -23,12 +23,14 @@ import org.apache.tapestry5.annotations.OnEvent; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.annotations.UnknownActivationContextCheck; import org.apache.tapestry5.annotations.WhitelistAccessOnly; +import org.apache.tapestry5.ioc.annotations.Description; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.json.JSONArray; import org.apache.tapestry5.json.JSONObject; import org.apache.tapestry5.services.ComponentClassResolver; import org.apache.tapestry5.services.ComponentLibraryInfo; import org.apache.tapestry5.util.TextStreamResponse; +import org.eclipse.jetty.io.NetworkTrafficListener.Empty; /** * Page used to describe the component libraries being used in the application. @@ -39,7 +41,9 @@ import org.apache.tapestry5.util.TextStreamResponse; @WhitelistAccessOnly public class ComponentLibraries { - + + final private static String[] EMTPY_STRING_ARRAY = {}; + private static enum Type { PAGE, COMPONENT, MIXIN } @Inject @@ -158,6 +162,23 @@ public class ComponentLibraries return logicalName.replace("core/", ""); } + @Cached(watch = "logicalName") + public String[] getTags() throws ClassNotFoundException { + Description description = getDescription(); + return description != null ? description.tags() : EMTPY_STRING_ARRAY; + } + + @Cached(watch = "logicalName") + public Description getDescription() throws ClassNotFoundException + { + return Class.forName(getClassName()).getAnnotation(Description.class); + } + + public boolean isClassHasTags() throws ClassNotFoundException + { + return getTags().length > 0; + } + @OnEvent("json") Object generateJSONDescription(String libraryName) { http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/aca075cb/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java index 8e3e070..318feec 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java @@ -457,6 +457,7 @@ public final class TapestryModule info.setArtifactId("tapestry-core"); info.setVersion("5.4.0"); info.setSourceUrlResolver(new ComponentLibraryInfo.GitWebMavenSourceUrlResolver()); + info.setTags(Arrays.asList("core", "out-of-the-box")); configuration.add(new LibraryMapping(InternalConstants.CORE_LIBRARY, "org.apache.tapestry5.corelib", info)); configuration.add(new LibraryMapping("", appRootPackage)); http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/aca075cb/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentLibraryInfo.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentLibraryInfo.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentLibraryInfo.java index 71c2743..92323af 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentLibraryInfo.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentLibraryInfo.java @@ -14,6 +14,7 @@ package org.apache.tapestry5.services; import java.io.Serializable; +import java.util.List; /** * Class that encapsulates information about a component library, going beyond what a library mapping @@ -34,6 +35,8 @@ public final class ComponentLibraryInfo implements Serializable private String name, description, homepageUrl, documentationUrl, sourceBrowseUrl, issueTrackerUrl, sourceRootUrl, javadocUrl, groupId, artifactId, version; + private List<String> tags; + /** * Returns the actual name of the component library (not the identifier). * For example, "Tapestry 5 Core Library". @@ -137,7 +140,16 @@ public final class ComponentLibraryInfo implements Serializable { return version; } - + + /** + * Returns the tags associated which describe this component library. + * Use just lowercase letters, numbers and dashes. + */ + public List<String> getTags() + { + return tags; + } + /** * Returns an URL decribing the dependency management information for this component library. */ @@ -219,6 +231,12 @@ public final class ComponentLibraryInfo implements Serializable this.issueTrackerUrl = issueTrackingUrl; } + public void setTags(List<String> tags) + { + if (this.tags != null) throwExceptionIfAlreadySet("tags", tags); + this.tags = tags; + } + public void setLibraryMapping(LibraryMapping libraryMapping) { if (this.libraryMapping != null) throwExceptionIfAlreadySet("libraryMapping", libraryMapping); http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/aca075cb/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ComponentLibraries.tml ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ComponentLibraries.tml b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ComponentLibraries.tml index bfd5a39..acf3f31 100644 --- a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ComponentLibraries.tml +++ b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/ComponentLibraries.tml @@ -11,6 +11,13 @@ <p t:type="If" t:test="info?.description"> ${info.description} </p> + <p class="tags" t:type="If" t:test="!info?.tags.empty"> + Tags: + <span t:type="Loop" t:source="info.tags" t:value="var:tag" class="badge" + style="margin-right: 0.3em; font-size: 0.75em"> + ${var:tag} + </span> + </p> </li> </ul> @@ -106,6 +113,8 @@ <thead> <tr> <td>Name</td> + <td>Description</td> + <td>Tags</td> <td>JavaDoc URL</td> <td>Source URL</td> </tr> @@ -113,11 +122,24 @@ <tbody> <tr t:type="Loop" t:source="logicalNames" t:value="logicalName"> <td><code>${simpleLogicalName}</code></td> - <td><t:if test="javadocUrl" else="message:not-informed" target="_blank"> - <a href="${javadocUrl}">JavaDoc</a></t:if> + <td>${description?.text()}</td> + <td> + <ul t:type="If" t:test="classHasTags" style="padding: 0; margin: 0;"> + <li t:type="Loop" t:source="tags" t:value="var:tag" + style="display: inline; list-style-type: none; margin: 0; margin-right: 0.3em"> + <span class="badge">${var:tag}</span> + </li> + </ul> </td> - <td><t:if test="sourceUrl" else="message:not-informed" target="_blank"> - <a href="${sourceUrl}">Source</a></t:if> + <td> + <t:if test="javadocUrl" else="message:not-informed" target="_blank"> + <a href="${javadocUrl}">JavaDoc</a> + </t:if> + </td> + <td> + <t:if test="sourceUrl" else="message:not-informed" target="_blank"> + <a href="${sourceUrl}">Source</a> + </t:if> </td> </tr> </tbody> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/aca075cb/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/ComponentLibrariesCatalogPageTests.groovy ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/ComponentLibrariesCatalogPageTests.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/ComponentLibrariesCatalogPageTests.groovy index ea68c7b..1a00cc7 100644 --- a/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/ComponentLibrariesCatalogPageTests.groovy +++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/ComponentLibrariesCatalogPageTests.groovy @@ -21,6 +21,8 @@ class ComponentLibrariesCatalogPageTests extends TapestryCoreTestCase assertEquals getText("//ul[@id='libraryList']/li[1]/p"), "The set of components, pages and mixins provided by Tapestry out-of-the-box." assertEquals getText("//ul[@id='libraryList']/li[2]/a"), "lib/alpha" assertFalse isElementPresent("//ul[@id='libraryList']/li[2]/p") + assertEquals getText("//ul[@id='libraryList']/li[1]/p[@class='tags']"), "Tags: core out-of-the-box" + assertFalse isElementPresent("//ul[@id='libraryList']/li[2]/p[@class='tags']") // component library information @@ -40,7 +42,15 @@ class ComponentLibrariesCatalogPageTests extends TapestryCoreTestCase // without ComponentLibraryInfo assertEquals "lib/alpha", getText("css=#lib-alpha h2") - assertEquals getText("css=#lib-alpha p.noInformation"), "No additional information provided for lib/alpha." + assertEquals getText("css=#lib-alpha p.noInformation"), "No additional information provided for lib/alpha." + + // table row + assertEquals getText("//div[@id='lib-alpha']//table/tbody/tr[2]/td[1]"), "lib/alpha/Root" + assertEquals getText("//div[@id='lib-alpha']//table/tbody/tr[2]/td[2]"), "Alpha root page" + assertEquals getText("//div[@id='lib-alpha']//table/tbody/tr[2]/td[3]"), "alpha root page" + assertEquals getText("//div[@id='lib-alpha']//table/tbody/tr[2]/td[4]"), "Not informed" + assertEquals getText("//div[@id='lib-alpha']//table/tbody/tr[2]/td[5]"), "Not informed" + } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/aca075cb/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/locallib/alpha/pages/Logo.groovy ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/locallib/alpha/pages/Logo.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/locallib/alpha/pages/Logo.groovy index 9f4e9ba..c34a46d 100644 --- a/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/locallib/alpha/pages/Logo.groovy +++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/locallib/alpha/pages/Logo.groovy @@ -3,6 +3,7 @@ package org.apache.tapestry5.integration.locallib.alpha.pages import org.apache.tapestry5.Asset import org.apache.tapestry5.annotations.Import import org.apache.tapestry5.annotations.Path +import org.apache.tapestry5.ioc.annotations.Description; import org.apache.tapestry5.ioc.annotations.Inject @Import(library="show-logo.js") http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/aca075cb/tapestry-core/src/test/java/org/apache/tapestry5/integration/locallib/alpha/pages/AlphaRoot.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/locallib/alpha/pages/AlphaRoot.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/locallib/alpha/pages/AlphaRoot.java index dd378da..ea64aea 100644 --- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/locallib/alpha/pages/AlphaRoot.java +++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/locallib/alpha/pages/AlphaRoot.java @@ -1,8 +1,11 @@ package org.apache.tapestry5.integration.locallib.alpha.pages; +import org.apache.tapestry5.ioc.annotations.Description; + /** * */ +@Description(text="Alpha root page", tags = {"alpha", "root", "page"}) public class AlphaRoot { } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/aca075cb/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/Description.java ---------------------------------------------------------------------- diff --git a/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/Description.java b/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/Description.java new file mode 100644 index 0000000..b951eda --- /dev/null +++ b/tapestry5-annotations/src/main/java/org/apache/tapestry5/ioc/annotations/Description.java @@ -0,0 +1,46 @@ +// Copyright 2014 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.ioc.annotations; + +import java.lang.annotation.Documented; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.ElementType.PACKAGE; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +import static org.apache.tapestry5.ioc.annotations.AnnotationUseContext.*; + +/** + * Annotation used by Tapestry to describe the annotated class or package in runtime, + * specially in the T5Dashboard page. + */ +@Target({TYPE, PACKAGE}) +@Retention(RUNTIME) +@Documented +@UseWith({COMPONENT,MIXIN,PAGE,SERVICE}) +public @interface Description +{ + /** + * A textual description of this class. + */ + String text(); + + /** + * Tags used to describe this class. Use just lowercase letters, numbers and dashes. + */ + String[] tags() default {}; + +}