View Javadoc

1   /**
2    * This file Copyright (c) 2003-2010 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.setup.for3_5;
35  
36  import info.magnolia.cms.core.Content;
37  import info.magnolia.cms.core.HierarchyManager;
38  import info.magnolia.cms.core.NodeData;
39  import info.magnolia.cms.util.NodeDataUtil;
40  import info.magnolia.content2bean.Content2BeanException;
41  import info.magnolia.content2bean.Content2BeanUtil;
42  import info.magnolia.module.InstallContext;
43  import info.magnolia.module.delta.AbstractRepositoryTask;
44  import info.magnolia.module.delta.BootstrapResourcesTask;
45  import info.magnolia.module.delta.NodeExistsDelegateTask;
46  import info.magnolia.module.delta.TaskExecutionException;
47  
48  import javax.jcr.RepositoryException;
49  import java.util.Collection;
50  import java.util.Iterator;
51  
52  /**
53   *
54   * @author gjoseph
55   * @version $Revision: $ ($Author: $)
56   */
57  public class UpdateI18nConfiguration extends NodeExistsDelegateTask {
58      private static final String I18N_NODEPATH = "/server/i18n";
59      private static final String I18N_SYSTEM_NODEPATH = I18N_NODEPATH + "/system";
60  
61      public UpdateI18nConfiguration() {
62          super("I18N configuration", "The I18N configuration has changed considerably in Magnolia 3.5. Will update the existing configuration or bootstrap a new one.",
63                  "config", I18N_NODEPATH, new UpdateFrom30(), new BootstrapI18nConfig());
64      }
65  
66      final static class BootstrapI18nConfig extends BootstrapResourcesTask {
67          BootstrapI18nConfig() {
68              super(null, null);
69          }
70  
71          protected String[] getResourcesToBootstrap(final InstallContext installContext) {
72              return new String[]{
73                      "/mgnl-bootstrap/core/config.server.i18n.content.xml",
74                      "/mgnl-bootstrap/core/config.server.i18n.system.xml"
75              };
76          }
77      }
78  
79      static class UpdateFrom30 extends AbstractRepositoryTask {
80          UpdateFrom30() {
81              super(null, null);
82          }
83  
84          protected void doExecute(InstallContext ctx) throws RepositoryException, TaskExecutionException {
85              final HierarchyManager configHM = ctx.getConfigHierarchyManager();
86  
87              // get existing values and remove node
88              final Content i18nNode = configHM.getContent(I18N_NODEPATH);
89              final String defaultLangIn30 = i18nNode.getNodeData("language").getString();
90              final Content availLangsNode = i18nNode.getContent("availableLanguages");
91              final Collection availLangsIn30;
92              try {
93                  availLangsIn30 = Content2BeanUtil.toMap(availLangsNode, false).values();
94              } catch (Content2BeanException e) {
95                  throw new TaskExecutionException("Couldn't read availableLanguages", e);
96              }
97              i18nNode.delete();
98  
99              // bootstrap new defaults
100             doBootstrap(ctx);
101 
102             // adapt with previously existing values
103             final Content newI18nSystemNode = configHM.getContent(I18N_SYSTEM_NODEPATH);
104             final NodeData sysFallbackLang = newI18nSystemNode.getNodeData("fallbackLanguage");
105             sysFallbackLang.setValue(defaultLangIn30);
106 
107             final Collection languages = newI18nSystemNode.getContent("languages").getChildren();
108             final Iterator it = languages.iterator();
109             while (it.hasNext()) {
110                 final Content langNode = (Content) it.next();
111                 if (!availLangsIn30.contains(langNode.getName())) {
112                     final NodeData enabledProperty = NodeDataUtil.getOrCreate(langNode, "enabled");
113                     enabledProperty.setValue(false);
114                 }
115             }
116         }
117 
118         protected void doBootstrap(InstallContext ctx) throws TaskExecutionException {
119             new BootstrapI18nConfig().execute(ctx);
120         }
121     }
122 }