1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
55
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
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
100 doBootstrap(ctx);
101
102
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 }