View Javadoc
1   /**
2    * This file Copyright (c) 2013-2015 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.ui.framework;
35  
36  import info.magnolia.config.source.ConfigurationSourceFactory;
37  import info.magnolia.jcr.predicate.AbstractPredicate;
38  import info.magnolia.jcr.wrapper.ExtendingNodeWrapper;
39  import info.magnolia.module.ModuleLifecycle;
40  import info.magnolia.module.ModuleLifecycleContext;
41  import info.magnolia.ui.api.app.registry.AppDescriptorRegistry;
42  import info.magnolia.ui.dialog.definition.ConfiguredFormDialogDefinition;
43  import info.magnolia.ui.dialog.registry.DialogDefinitionRegistry;
44  import info.magnolia.ui.form.fieldtype.registry.FieldTypeDefinitionRegistry;
45  
46  import javax.inject.Inject;
47  import javax.jcr.Node;
48  import javax.jcr.RepositoryException;
49  
50  /**
51   * Module class for UI framework.
52   */
53  public class UiFrameworkModule implements ModuleLifecycle {
54  
55      private final ConfigurationSourceFactory configSourceFactory;
56      private final DialogDefinitionRegistry dialogRegistry;
57      private FieldTypeDefinitionRegistry fieldTypeDefinitionRegistry;
58      private AppDescriptorRegistry appDescriptorRegistry;
59  
60      @Inject
61      public UiFrameworkModule(ConfigurationSourceFactory configSourceFactory,
62                               DialogDefinitionRegistry dialogRegistry, FieldTypeDefinitionRegistry fieldTypeDefinitionRegistry,
63                               AppDescriptorRegistry appDescriptorRegistry) {
64  
65          this.configSourceFactory = configSourceFactory;
66          this.dialogRegistry = dialogRegistry;
67          this.fieldTypeDefinitionRegistry = fieldTypeDefinitionRegistry;
68          this.appDescriptorRegistry = appDescriptorRegistry;
69      }
70  
71      @Override
72      public void start(ModuleLifecycleContext context) {
73          if (context.getPhase() == ModuleLifecycleContext.PHASE_SYSTEM_STARTUP) {
74  
75              configSourceFactory.jcr().withFilter(new IsAppDescriptor()).bindWithDefaults(appDescriptorRegistry);
76              configSourceFactory.jcr().withFilter(new IsDialogNode()).bindWithDefaults(dialogRegistry);
77              configSourceFactory.jcr().withFilter(new IsFieldType()).bindWithDefaults(fieldTypeDefinitionRegistry);
78  
79              configSourceFactory.yaml().bindWithDefaults(dialogRegistry);
80              configSourceFactory.yaml().bindWithDefaults(appDescriptorRegistry);
81              configSourceFactory.yaml().bindWithDefaults(fieldTypeDefinitionRegistry);
82          }
83      }
84  
85      @Override
86      public void stop(ModuleLifecycleContext context) {
87      }
88  
89  
90      /**
91       * Check if this node can be handled as a ConfiguredDialogDefinition.
92       * Prior to 5.4, this was in {@link info.magnolia.ui.dialog.registry.ConfiguredDialogDefinitionManager}.
93       */
94      private static class IsDialogNode extends AbstractPredicate<Node> {
95          @Override
96          public boolean evaluateTyped(Node node) {
97              try {
98                  if (node.hasProperty(ConfiguredFormDialogDefinition.EXTEND_PROPERTY_NAME)) {
99                      node = new ExtendingNodeWrapper(node);
100                 }
101                 return node.hasNode(ConfiguredFormDialogDefinition.FORM_NODE_NAME) || node.hasNode(ConfiguredFormDialogDefinition.ACTIONS_NODE_NAME);
102             } catch (RepositoryException e) {
103                 throw new RuntimeException(e);
104             }
105         }
106     }
107 
108     /**
109      * Check if this node can be handled as an {@link info.magnolia.ui.api.app.AppDescriptor}.
110      * Prior to 5.4, this was in {@link info.magnolia.ui.api.app.registry.ConfiguredAppDescriptorManager}.
111      */
112     private static class IsAppDescriptor extends AbstractPredicate<Node> {
113         @Override
114         public boolean evaluateTyped(Node node) {
115             try {
116                 if (node.hasProperty(ConfiguredFormDialogDefinition.EXTEND_PROPERTY_NAME)) {
117                     node = new ExtendingNodeWrapper(node);
118                 }
119                 return "apps".equalsIgnoreCase(node.getParent().getName());
120             } catch (RepositoryException e) {
121                 throw new RuntimeException(e);
122             }
123         }
124     }
125 
126     /**
127      * Check if this node can be handled as an {@link info.magnolia.ui.form.fieldtype.definition.FieldTypeDefinition}.
128      * Prior to 5.4, this was in {@link info.magnolia.ui.form.fieldtype.registry.ConfiguredFieldTypeDefinitionManager}.
129      */
130     private static class IsFieldType extends AbstractPredicate<Node> {
131 
132         public static final String DEFINITION_CLASS = "definitionClass";
133 
134         public static final String FACTORY_CLASS = "factoryClass";
135 
136         @Override
137         public boolean evaluateTyped(Node node) {
138             try {
139                 if (node.hasProperty(ConfiguredFormDialogDefinition.EXTEND_PROPERTY_NAME)) {
140                     node = new ExtendingNodeWrapper(node);
141                 }
142                 return node.hasProperty(DEFINITION_CLASS) && node.hasProperty(FACTORY_CLASS);
143             } catch (RepositoryException e) {
144                 throw new RuntimeException(e);
145             }
146         }
147     }
148 }