View Javadoc
1   /**
2    * This file Copyright (c) 2015-2018 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.field.nodetype;
35  
36  import info.magnolia.context.Context;
37  import info.magnolia.objectfactory.Components;
38  import info.magnolia.repository.RepositoryConstants;
39  import info.magnolia.ui.api.context.UiContext;
40  import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
41  import info.magnolia.ui.form.field.definition.SelectFieldOptionDefinition;
42  import info.magnolia.ui.form.field.factory.SelectFieldFactory;
43  
44  import java.util.Collections;
45  import java.util.List;
46  
47  import javax.inject.Inject;
48  import javax.jcr.RepositoryException;
49  import javax.jcr.nodetype.NodeType;
50  import javax.jcr.nodetype.NodeTypeIterator;
51  import javax.jcr.nodetype.NodeTypeManager;
52  
53  import org.slf4j.Logger;
54  import org.slf4j.LoggerFactory;
55  
56  import com.google.common.collect.Lists;
57  import com.vaadin.v7.data.Item;
58  import com.vaadin.v7.data.Property;
59  
60  /**
61   * {@linkplain NodeTypeSelectFieldFactory} produces a drop-down select field with all the available primary node types available
62   * via {@link NodeTypeManager}.
63   *
64   * @see NodeTypeSelectFieldDefinition
65   */
66  public class NodeTypeSelectFieldFactory extends SelectFieldFactory<NodeTypeSelectFieldDefinition> {
67  
68      private static final Logger log = LoggerFactory.getLogger(NodeTypeSelectFieldFactory.class);
69  
70      private final Context context;
71  
72      @Inject
73      public NodeTypeSelectFieldFactory(NodeTypeSelectFieldDefinition definition, Item relatedFieldItem, UiContext uiContext, I18NAuthoringSupport i18nAuthoringSupport, Context context) {
74          super(definition, relatedFieldItem, uiContext, i18nAuthoringSupport);
75          this.context = context;
76      }
77  
78      /**
79       * @deprecated since 5.4.7 - use {@link #NodeTypeSelectFieldFactory(NodeTypeSelectFieldDefinition, Item, UiContext, I18NAuthoringSupport, Context)} instead.
80       */
81      @Deprecated
82      public NodeTypeSelectFieldFactory(NodeTypeSelectFieldDefinition definition, Item relatedFieldItem, Context context) {
83          this(definition, relatedFieldItem, null, Components.getComponent(I18NAuthoringSupport.class), context);
84      }
85  
86      @Override
87      public List<SelectFieldOptionDefinition> getOptions() {
88          try {
89              final NodeTypeManager nodeTypeManager = context.getJCRSession(RepositoryConstants.CONFIG).getWorkspace().getNodeTypeManager();
90              final NodeTypeIterator nodeTypes = nodeTypeManager.getPrimaryNodeTypes();
91              final List<SelectFieldOptionDefinition> options = Lists.newArrayListWithCapacity(Long.valueOf(nodeTypes.getSize()).intValue());
92  
93              while (nodeTypes.hasNext()) {
94                  final NodeType nodeType = nodeTypes.nextNodeType();
95                  SelectFieldOptionDefinition option = new SelectFieldOptionDefinition();
96  
97                  final String nodeTypeName = nodeType.getName();
98  
99                  option.setName(nodeTypeName);
100                 option.setLabel(nodeTypeName);
101                 option.setValue(nodeTypeName);
102                 option.setSelected(nodeTypeName.equals(definition.getDefaultValue()));
103 
104                 options.add(option);
105             }
106 
107             return options;
108         } catch (RepositoryException e) {
109             log.warn(String.format("Failed to populate a list of available node types due to: [%s], returning empty collection.", e.getMessage()));
110             return Collections.emptyList();
111         }
112     }
113 
114     @Override
115     protected String createDefaultValue(Property dataSource) {
116         return definition.getDefaultValue();
117     }
118 }