Repository: deltaspike Updated Branches: refs/heads/master 8f394989d -> 36dee2b8e
DELTASPIKE-599 improvement for bean-discovery-mode annotated Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/36dee2b8 Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/36dee2b8 Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/36dee2b8 Branch: refs/heads/master Commit: 36dee2b8e372a3f19f46757d920e8a9ac6ebcefc Parents: 8f39498 Author: gpetracek <[email protected]> Authored: Sun Jul 6 20:21:13 2014 +0200 Committer: gpetracek <[email protected]> Committed: Sun Jul 6 20:26:08 2014 +0200 ---------------------------------------------------------------------- .../impl/config/view/ViewConfigExtension.java | 64 ++++- .../view/navigation/syntax/uc011/Pages.java | 56 ++++ .../navigation/syntax/uc011/ViewConfigTest.java | 264 +++++++++++++++++++ 3 files changed, 376 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/deltaspike/blob/36dee2b8/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/config/view/ViewConfigExtension.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/config/view/ViewConfigExtension.java b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/config/view/ViewConfigExtension.java index 1aa9500..53133ac 100644 --- a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/config/view/ViewConfigExtension.java +++ b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/config/view/ViewConfigExtension.java @@ -37,6 +37,7 @@ import org.apache.deltaspike.core.util.ExceptionUtils; import org.apache.deltaspike.jsf.api.config.view.Folder; import org.apache.deltaspike.jsf.impl.util.ViewConfigUtils; +import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Observes; import javax.enterprise.inject.spi.AfterDeploymentValidation; import javax.enterprise.inject.spi.BeforeBeanDiscovery; @@ -71,30 +72,42 @@ public class ViewConfigExtension implements Extension, Deactivatable } @SuppressWarnings("UnusedDeclaration") - protected void buildViewConfigMetaDataTree(@Observes ProcessAnnotatedType pat) + protected void buildViewConfigMetaDataTree(@Observes final ProcessAnnotatedType pat) { if (!isActivated) { return; } - Class beanClass = pat.getAnnotatedType().getJavaClass(); + buildViewConfigMetaDataTreeFor( + pat.getAnnotatedType().getJavaClass(), pat.getAnnotatedType().getAnnotations(), new VetoCallback() { + @Override + public void veto() + { + pat.veto(); + } + }); + } + + protected void buildViewConfigMetaDataTreeFor(Class beanClass, + Set<Annotation> annotations, + VetoCallback vetoCallback) + { if (ViewConfig.class.isAssignableFrom(beanClass)) { - addConfigClass(pat.getAnnotatedType().getJavaClass(), pat.getAnnotatedType().getAnnotations()); - pat.veto(); + addConfigClass(beanClass, annotations); + vetoCallback.veto(); } else { if (ViewConfigUtils.isFolderConfig(beanClass) && beanClass.isAnnotationPresent(Folder.class)) { - addConfigClass(pat.getAnnotatedType().getJavaClass(), pat.getAnnotatedType().getAnnotations()); - pat.veto(); + addConfigClass(beanClass, annotations); + vetoCallback.veto(); } else { - addIndirectlyInheritedMetaData( - pat.getAnnotatedType().getJavaClass(), pat.getAnnotatedType().getAnnotations()); + addIndirectlyInheritedMetaData(beanClass, annotations); } } } @@ -200,6 +213,27 @@ public class ViewConfigExtension implements Extension, Deactivatable } this.rootViewConfigNode.getMetaData().add(annotation); this.rootViewConfigNode = new FolderConfigNode(this.rootViewConfigNode, viewConfigClass); + + //needed for cdi 1.1+ with bean-discovery-mode 'annotated' + if (viewConfigClass.getAnnotation(ApplicationScoped.class) != null) + { + Set<Class> manuallyDiscoveredViewConfigs = new HashSet<Class>(); + findNestedClasses(viewConfigClass, manuallyDiscoveredViewConfigs); + + for (Class foundClass : manuallyDiscoveredViewConfigs) + { + buildViewConfigMetaDataTreeFor( + foundClass, + new HashSet<Annotation>(Arrays.asList(foundClass.getAnnotations())), + new VetoCallback() { + @Override + public void veto() + { + + } + }); + } + } break; } } @@ -229,6 +263,15 @@ public class ViewConfigExtension implements Extension, Deactivatable } } + private void findNestedClasses(Class viewConfigClass, Set<Class> nestedClasses) + { + for (Class nestedClass : viewConfigClass.getDeclaredClasses()) + { + nestedClasses.add(nestedClass); + findNestedClasses(nestedClass, nestedClasses); + } + } + private boolean isInternal(Class configClass) { return ViewConfig.class.equals(configClass) || @@ -454,4 +497,9 @@ public class ViewConfigExtension implements Extension, Deactivatable { return viewConfigResolver; } + + interface VetoCallback + { + void veto(); + } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/36dee2b8/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/config/view/navigation/syntax/uc011/Pages.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/config/view/navigation/syntax/uc011/Pages.java b/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/config/view/navigation/syntax/uc011/Pages.java new file mode 100644 index 0000000..6548887 --- /dev/null +++ b/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/config/view/navigation/syntax/uc011/Pages.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.deltaspike.test.jsf.impl.config.view.navigation.syntax.uc011; + +import org.apache.deltaspike.core.api.config.view.ViewConfig; +import org.apache.deltaspike.core.spi.config.view.ViewConfigRoot; +import org.apache.deltaspike.jsf.api.config.view.Folder; +import org.apache.deltaspike.jsf.api.config.view.View; + +import javax.enterprise.context.ApplicationScoped; + +@ApplicationScoped +@ViewConfigRoot +@Folder(name = "/") //there are multiple folders which should be grouped by the outermost interface +interface Pages extends ViewConfig +{ + //result: /index.xhtml + class Index implements Pages + { + } + + //result: /admin + interface Admin extends Pages + { + @View + class Index implements Admin + { + } + } + + //result: /public + @Folder + interface Public extends Pages + { + @View + class Index implements Public + { + } + } +} http://git-wip-us.apache.org/repos/asf/deltaspike/blob/36dee2b8/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/config/view/navigation/syntax/uc011/ViewConfigTest.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/config/view/navigation/syntax/uc011/ViewConfigTest.java b/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/config/view/navigation/syntax/uc011/ViewConfigTest.java new file mode 100644 index 0000000..73135cb --- /dev/null +++ b/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/config/view/navigation/syntax/uc011/ViewConfigTest.java @@ -0,0 +1,264 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.deltaspike.test.jsf.impl.config.view.navigation.syntax.uc011; + +import org.apache.deltaspike.core.api.config.view.metadata.ConfigDescriptor; +import org.apache.deltaspike.core.api.config.view.metadata.ViewConfigDescriptor; +import org.apache.deltaspike.core.api.config.view.metadata.ViewConfigResolver; +import org.apache.deltaspike.core.spi.config.view.ViewConfigNode; +import org.apache.deltaspike.jsf.api.config.view.Folder; +import org.apache.deltaspike.jsf.api.config.view.View; +import org.apache.deltaspike.jsf.impl.config.view.ViewConfigExtension; +import org.apache.deltaspike.jsf.impl.config.view.ViewConfigResolverProducer; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ViewConfigTest +{ + private ViewConfigExtension viewConfigExtension; + + private ViewConfigResolverProducer viewConfigResolverProducer; + + @Before + public void before() + { + this.viewConfigExtension = new ViewConfigExtension(); + this.viewConfigResolverProducer = new ViewConfigResolverProducer(this.viewConfigExtension); + } + + @After + public void after() + { + this.viewConfigExtension.freeViewConfigCache(null); + } + + @Test + public void testMetaDataInheritanceInTree() + { + this.viewConfigExtension.addPageDefinition(Pages.class); + + ViewConfigNode node = this.viewConfigExtension.findNode(Pages.class); + + Assert.assertNotNull(node); + Assert.assertNotNull(node.getParent()); //Root + Assert.assertNull(node.getParent().getParent()); + + Assert.assertNotNull(node.getChildren()); + Assert.assertEquals(3, node.getChildren().size()); + + Assert.assertNotNull(node.getMetaData()); + Assert.assertEquals(3, node.getMetaData().size()); + + Assert.assertNotNull(node.getInheritedMetaData()); + Assert.assertEquals(0, node.getInheritedMetaData().size()); + + + node = this.viewConfigExtension.findNode(Pages.Index.class); + + Assert.assertNotNull(node); + Assert.assertNotNull(node.getParent()); //Pages + Assert.assertNotNull(node.getParent().getParent()); //Root + Assert.assertNull(node.getParent().getParent().getParent()); + + Assert.assertNotNull(node.getChildren()); + Assert.assertEquals(0, node.getChildren().size()); + + Assert.assertNotNull(node.getMetaData()); + Assert.assertEquals(0, node.getMetaData().size()); + + Assert.assertNotNull(node.getInheritedMetaData()); + Assert.assertEquals(0, node.getInheritedMetaData().size()); + + + node = this.viewConfigExtension.findNode(Pages.Admin.class); + + Assert.assertNotNull(node); + Assert.assertNotNull(node.getParent()); //Admin + Assert.assertNotNull(node.getParent().getParent()); //Root + Assert.assertNull(node.getParent().getParent().getParent()); + + Assert.assertNotNull(node.getChildren()); + Assert.assertEquals(1, node.getChildren().size()); + + Assert.assertNotNull(node.getMetaData()); + Assert.assertEquals(0, node.getMetaData().size()); + + Assert.assertNotNull(node.getInheritedMetaData()); + Assert.assertEquals(0, node.getInheritedMetaData().size()); + + + node = this.viewConfigExtension.findNode(Pages.Admin.Index.class); + + Assert.assertNotNull(node); + Assert.assertNotNull(node.getParent()); //Admin + Assert.assertNotNull(node.getParent().getParent()); //Pages + Assert.assertNotNull(node.getParent().getParent().getParent()); //Root + Assert.assertNull(node.getParent().getParent().getParent().getParent()); + + Assert.assertNotNull(node.getChildren()); + Assert.assertEquals(0, node.getChildren().size()); + + Assert.assertNotNull(node.getMetaData()); + Assert.assertEquals(1, node.getMetaData().size()); + Assert.assertEquals(View.NavigationMode.DEFAULT, ((View) node.getMetaData().iterator().next()).navigation()); + Assert.assertEquals(View.ViewParameterMode.DEFAULT, ((View) node.getMetaData().iterator().next()).viewParams()); + Assert.assertEquals("", ((View) node.getMetaData().iterator().next()).name()); + Assert.assertEquals(View.Extension.DEFAULT, ((View) node.getMetaData().iterator().next()).extension()); + + Assert.assertNotNull(node.getInheritedMetaData()); + Assert.assertEquals(0, node.getInheritedMetaData().size()); + + + Assert.assertNotNull(node.getInheritedMetaData()); + Assert.assertEquals(0, node.getInheritedMetaData().size()); + + + node = this.viewConfigExtension.findNode(Pages.Public.class); + + Assert.assertNotNull(node); + Assert.assertNotNull(node.getParent()); //Public + Assert.assertNotNull(node.getParent().getParent()); //Root + Assert.assertNull(node.getParent().getParent().getParent()); + + Assert.assertNotNull(node.getChildren()); + Assert.assertEquals(1, node.getChildren().size()); + + Assert.assertNotNull(node.getMetaData()); + Assert.assertEquals(1, node.getMetaData().size()); + Assert.assertEquals(Folder.class, node.getMetaData().iterator().next().annotationType()); + + Assert.assertNotNull(node.getInheritedMetaData()); + Assert.assertEquals(0, node.getInheritedMetaData().size()); + + + node = this.viewConfigExtension.findNode(Pages.Public.Index.class); + + Assert.assertNotNull(node); + Assert.assertNotNull(node.getParent()); //Public + Assert.assertNotNull(node.getParent().getParent()); //Pages + Assert.assertNotNull(node.getParent().getParent().getParent()); //Root + Assert.assertNull(node.getParent().getParent().getParent().getParent()); + + Assert.assertNotNull(node.getChildren()); + Assert.assertEquals(0, node.getChildren().size()); + + Assert.assertNotNull(node.getMetaData()); + Assert.assertEquals(1, node.getMetaData().size()); + Assert.assertEquals(View.NavigationMode.DEFAULT, ((View) node.getMetaData().iterator().next()).navigation()); + Assert.assertEquals(View.ViewParameterMode.DEFAULT, ((View) node.getMetaData().iterator().next()).viewParams()); + Assert.assertEquals("", ((View) node.getMetaData().iterator().next()).name()); + Assert.assertEquals(View.Extension.DEFAULT, ((View) node.getMetaData().iterator().next()).extension()); + + Assert.assertNotNull(node.getInheritedMetaData()); + Assert.assertEquals(0, node.getInheritedMetaData().size()); + + + Assert.assertNotNull(node.getInheritedMetaData()); + Assert.assertEquals(0, node.getInheritedMetaData().size()); + } + + @Test + public void testMetaDataInheritanceInViewConfig() + { + this.viewConfigExtension.addPageDefinition(Pages.class); + + ViewConfigResolver viewConfigResolver = this.viewConfigResolverProducer.createViewConfigResolver(); + ConfigDescriptor<?> configDescriptor = viewConfigResolver.getConfigDescriptor(Pages.class); + + Assert.assertNotNull(configDescriptor); + Assert.assertNotNull(configDescriptor.getConfigClass()); + Assert.assertEquals(Pages.class, configDescriptor.getConfigClass()); + + Assert.assertNotNull(configDescriptor.getMetaData()); + Assert.assertEquals(1, configDescriptor.getMetaData().size()); + Assert.assertEquals(1, configDescriptor.getMetaData(Folder.class).size()); + Assert.assertEquals("/", configDescriptor.getMetaData(Folder.class).iterator().next().name()); + + + ViewConfigDescriptor viewConfigDescriptor = viewConfigResolver.getViewConfigDescriptor(Pages.Index.class); + + Assert.assertNotNull(viewConfigDescriptor); + Assert.assertEquals("/index.xhtml", viewConfigDescriptor.getViewId()); + Assert.assertEquals(Pages.Index.class, viewConfigDescriptor.getConfigClass()); + + Assert.assertNotNull(viewConfigDescriptor.getMetaData()); + Assert.assertEquals(1, viewConfigDescriptor.getMetaData().size()); + Assert.assertEquals(View.NavigationMode.FORWARD, viewConfigDescriptor.getMetaData(View.class).iterator().next().navigation()); + Assert.assertEquals(View.ViewParameterMode.EXCLUDE, viewConfigDescriptor.getMetaData(View.class).iterator().next().viewParams()); + Assert.assertEquals("index", viewConfigDescriptor.getMetaData(View.class).iterator().next().name()); + Assert.assertEquals("xhtml", viewConfigDescriptor.getMetaData(View.class).iterator().next().extension()); + Assert.assertEquals("/", viewConfigDescriptor.getMetaData(View.class).iterator().next().basePath()); + + + configDescriptor = viewConfigResolver.getConfigDescriptor(Pages.Admin.class); + + Assert.assertNotNull(configDescriptor); + Assert.assertNotNull(configDescriptor.getConfigClass()); + Assert.assertEquals(Pages.Admin.class, configDescriptor.getConfigClass()); + + Assert.assertNotNull(configDescriptor.getMetaData()); + Assert.assertEquals(1, configDescriptor.getMetaData().size()); + Assert.assertEquals(1, configDescriptor.getMetaData(Folder.class).size()); + Assert.assertEquals("/admin/", configDescriptor.getMetaData(Folder.class).iterator().next().name()); + + + viewConfigDescriptor = viewConfigResolver.getViewConfigDescriptor(Pages.Admin.Index.class); + + Assert.assertNotNull(viewConfigDescriptor); + Assert.assertEquals("/admin/index.xhtml", viewConfigDescriptor.getViewId()); + Assert.assertEquals(Pages.Admin.Index.class, viewConfigDescriptor.getConfigClass()); + + Assert.assertNotNull(viewConfigDescriptor.getMetaData()); + Assert.assertEquals(1, viewConfigDescriptor.getMetaData().size()); + Assert.assertEquals(View.NavigationMode.FORWARD, viewConfigDescriptor.getMetaData(View.class).iterator().next().navigation()); + Assert.assertEquals(View.ViewParameterMode.EXCLUDE, viewConfigDescriptor.getMetaData(View.class).iterator().next().viewParams()); + Assert.assertEquals("index", viewConfigDescriptor.getMetaData(View.class).iterator().next().name()); + Assert.assertEquals("xhtml", viewConfigDescriptor.getMetaData(View.class).iterator().next().extension()); + Assert.assertEquals("/admin/", viewConfigDescriptor.getMetaData(View.class).iterator().next().basePath()); + + + configDescriptor = viewConfigResolver.getConfigDescriptor(Pages.Public.class); + + Assert.assertNotNull(configDescriptor); + Assert.assertNotNull(configDescriptor.getConfigClass()); + Assert.assertEquals(Pages.Public.class, configDescriptor.getConfigClass()); + + Assert.assertNotNull(configDescriptor.getMetaData()); + Assert.assertEquals(1, configDescriptor.getMetaData().size()); + Assert.assertEquals(1, configDescriptor.getMetaData(Folder.class).size()); + Assert.assertEquals("/public/", configDescriptor.getMetaData(Folder.class).iterator().next().name()); + + + viewConfigDescriptor = viewConfigResolver.getViewConfigDescriptor(Pages.Public.Index.class); + + Assert.assertNotNull(viewConfigDescriptor); + Assert.assertEquals("/public/index.xhtml", viewConfigDescriptor.getViewId()); + Assert.assertEquals(Pages.Public.Index.class, viewConfigDescriptor.getConfigClass()); + + Assert.assertNotNull(viewConfigDescriptor.getMetaData()); + Assert.assertEquals(1, viewConfigDescriptor.getMetaData().size()); + Assert.assertEquals(View.NavigationMode.FORWARD, viewConfigDescriptor.getMetaData(View.class).iterator().next().navigation()); + Assert.assertEquals(View.ViewParameterMode.EXCLUDE, viewConfigDescriptor.getMetaData(View.class).iterator().next().viewParams()); + Assert.assertEquals("index", viewConfigDescriptor.getMetaData(View.class).iterator().next().name()); + Assert.assertEquals("xhtml", viewConfigDescriptor.getMetaData(View.class).iterator().next().extension()); + Assert.assertEquals("/public/", viewConfigDescriptor.getMetaData(View.class).iterator().next().basePath()); + } +}
