View Javadoc

1   /**
2    * This file Copyright (c) 2013 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.i18nsystem.setup;
35  
36  import info.magnolia.jcr.util.NodeUtil;
37  import info.magnolia.module.InstallContext;
38  import info.magnolia.module.delta.AbstractRepositoryTask;
39  import info.magnolia.module.delta.TaskExecutionException;
40  
41  import java.util.Arrays;
42  import java.util.Iterator;
43  import java.util.List;
44  
45  import javax.jcr.Node;
46  import javax.jcr.RepositoryException;
47  import javax.jcr.Session;
48  
49  /**
50   * Removes some well-known deprecated i18n properties whose keys are now generated via the {@link info.magnolia.i18nsystem.I18nizer} mechanism.
51   * The properties are defined by {@link AbstractRemoveHardcodedI18nPropertiesTask#DEPRECATED_I18N_PROPERTIES}.
52   * <p>
53   * Subclasses will need to implement {@link #getAppRelativePaths()} to provide the paths relative to the module name under which one wants to remove such properties. All sub nodes under the provided paths will be searched recursively for the deprecated i18n properties.
54   */
55  public abstract class AbstractRemoveHardcodedI18nPropertiesTask extends AbstractRepositoryTask {
56  
57      public static final List<String> DEPRECATED_I18N_PROPERTIES = Arrays.asList(new String[] { "label", "confirmationMessage", "errorMessage", "i18nBasename", "description" });
58      private String appName;
59      private List<String> additionalDeprecatedProperties;
60  
61      public AbstractRemoveHardcodedI18nPropertiesTask(final String appName, final String description) {
62          this(appName, description, null);
63      }
64  
65      public AbstractRemoveHardcodedI18nPropertiesTask(final String appName, final String description, List<String> additionalDeprecatedProperties) {
66          super("Remove hardcoded i18n properties", description);
67          this.appName = appName;
68          this.additionalDeprecatedProperties = additionalDeprecatedProperties;
69      }
70  
71  
72  
73      @Override
74      public void doExecute(InstallContext installContext) throws RepositoryException, TaskExecutionException {
75          final Session session = installContext.getConfigJCRSession();
76          final Node module = session.getNode("/modules/" + appName);
77          removeProperty(module);
78          for (String path : getAppRelativePaths()) {
79              if (module.hasNode(path)){
80                  Node node = module.getNode(path);
81                  final Iterator<Node> iter = NodeUtil.collectAllChildren(node).iterator();
82                  while (iter.hasNext()) {
83                      removeProperty(iter.next());
84                  }
85              }
86          }
87  
88          session.save();
89      }
90  
91      abstract protected String[] getAppRelativePaths();
92  
93      private void removeProperty(final Node node) throws RepositoryException {
94          for (String propertyName : DEPRECATED_I18N_PROPERTIES) {
95              if (node.hasProperty(propertyName)) {
96                  node.getProperty(propertyName).remove();
97              }
98          }
99          if(additionalDeprecatedProperties!=null){
100             for (String propertyName : additionalDeprecatedProperties) {
101                 if (node.hasProperty(propertyName)) {
102                     node.getProperty(propertyName).remove();
103                 }
104             }
105         }
106     }
107 }