Skip to content

Commit d120b9a

Browse files
author
Yoshito Umaoka
committed
Changed type of resource strings held by Bundle object from List to Collection
Previously, resource filter interface pass/receive Collection<ResourceString>. John created a container object for resource bundle contents - Bundle. The type of resource strings was once changed to List. Because the order resource strings is not guaranteed depending on resource type/implementation, change the type back to Collection. Also added some Bundle class API, make the class to store a defensive copy of List, and added copyright comment.
1 parent 169977e commit d120b9a

16 files changed

Lines changed: 251 additions & 97 deletions

File tree

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
eclipse.preferences.version=1
22
encoding//src/main/java=UTF-8
33
encoding//src/test/java=UTF-8
4-
encoding/<project>=UTF-8
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
eclipse.preferences.version=1
22
encoding//src/main/java=UTF-8
33
encoding//src/test/java=UTF-8
4-
encoding/<project>=UTF-8

gp-maven-plugin/pom.xml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,43 @@
4848
</executions>
4949
</plugin>
5050
</plugins>
51+
52+
<pluginManagement>
53+
<plugins>
54+
<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
55+
<plugin>
56+
<groupId>org.eclipse.m2e</groupId>
57+
<artifactId>lifecycle-mapping</artifactId>
58+
<version>1.0.0</version>
59+
<configuration>
60+
<lifecycleMappingMetadata>
61+
<pluginExecutions>
62+
<pluginExecution>
63+
<pluginExecutionFilter>
64+
<groupId>
65+
org.apache.maven.plugins
66+
</groupId>
67+
<artifactId>
68+
maven-plugin-plugin
69+
</artifactId>
70+
<versionRange>
71+
[3.5,)
72+
</versionRange>
73+
<goals>
74+
<goal>descriptor</goal>
75+
<goal>helpmojo</goal>
76+
</goals>
77+
</pluginExecutionFilter>
78+
<action>
79+
<ignore></ignore>
80+
</action>
81+
</pluginExecution>
82+
</pluginExecutions>
83+
</lifecycleMappingMetadata>
84+
</configuration>
85+
</plugin>
86+
</plugins>
87+
</pluginManagement>
5188
</build>
5289

5390
<profiles>

gp-maven-plugin/src/main/java/com/ibm/g11n/pipeline/maven/GPDownloadMojo.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.ibm.g11n.pipeline.client.ResourceEntryData;
3939
import com.ibm.g11n.pipeline.client.ServiceClient;
4040
import com.ibm.g11n.pipeline.client.ServiceException;
41+
import com.ibm.g11n.pipeline.resfilter.Bundle;
4142
import com.ibm.g11n.pipeline.resfilter.ResourceFilter;
4243
import com.ibm.g11n.pipeline.resfilter.ResourceFilterFactory;
4344
import com.ibm.g11n.pipeline.resfilter.ResourceString;
@@ -243,17 +244,17 @@ private void mergeTranslation(ServiceClient client, String bundleId, String lang
243244
return;
244245
}
245246

246-
Collection<ResourceString> resStrings = null;
247+
Bundle resBundle = null;
247248
try {
248-
resStrings = getResourceStrings(client, bundleId, language, false);
249+
resBundle = getBundle(client, bundleId, language, false);
249250
} catch (ServiceException e) {
250251
throw new MojoFailureException("Globalization Pipeline service error", e);
251252
}
252253

253254
ResourceFilter filter = ResourceFilterFactory.get(type);
254255
try (FileOutputStream fos = new FileOutputStream(outFile);
255256
FileInputStream fis = new FileInputStream(srcFile)) {
256-
filter.merge(fis, fos, language, resStrings);
257+
filter.merge(fis, fos, language, resBundle);
257258
} catch (IOException e) {
258259
throw new MojoFailureException("I/O error while merging the translated values to "
259260
+ outFile.getAbsolutePath(), e);
@@ -262,23 +263,23 @@ private void mergeTranslation(ServiceClient client, String bundleId, String lang
262263

263264
private void exportTranslation(ServiceClient client, String bundleId, String language,
264265
ResourceType type, File outFile, boolean withFallback) throws MojoFailureException {
265-
Collection<ResourceString> resStrings = null;
266+
Bundle resBundle = null;
266267
try {
267-
resStrings = getResourceStrings(client, bundleId, language, withFallback);
268+
resBundle = getBundle(client, bundleId, language, withFallback);
268269
} catch (ServiceException e) {
269270
throw new MojoFailureException("Globalization Pipeline service error", e);
270271
}
271272

272273
ResourceFilter filter = ResourceFilterFactory.get(type);
273274
try (FileOutputStream fos = new FileOutputStream(outFile)) {
274-
filter.write(fos, language, resStrings);
275+
filter.write(fos, language, resBundle);
275276
} catch (IOException e) {
276277
throw new MojoFailureException("Failed to write the translated resoruce data to "
277278
+ outFile.getAbsolutePath(), e);
278279
}
279280
}
280281

281-
private Collection<ResourceString> getResourceStrings(ServiceClient client,
282+
private Bundle getBundle(ServiceClient client,
282283
String bundleId, String language, boolean withFallback) throws ServiceException {
283284
Map<String, ResourceEntryData> resEntries = client.getResourceEntries(bundleId, language);
284285
Collection<ResourceString> resStrings = new LinkedList<>();
@@ -298,6 +299,6 @@ private Collection<ResourceString> getResourceStrings(ServiceClient client,
298299
resStrings.add(resString);
299300
}
300301
}
301-
return resStrings;
302+
return new Bundle(resStrings, null);
302303
}
303304
}

gp-maven-plugin/src/main/java/com/ibm/g11n/pipeline/maven/GPUploadMojo.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.ibm.g11n.pipeline.client.NewResourceEntryData;
3434
import com.ibm.g11n.pipeline.client.ServiceClient;
3535
import com.ibm.g11n.pipeline.client.ServiceException;
36+
import com.ibm.g11n.pipeline.resfilter.Bundle;
3637
import com.ibm.g11n.pipeline.resfilter.ResourceFilter;
3738
import com.ibm.g11n.pipeline.resfilter.ResourceFilterFactory;
3839
import com.ibm.g11n.pipeline.resfilter.ResourceString;
@@ -94,7 +95,8 @@ public void execute() throws MojoExecutionException, MojoFailureException {
9495
Map<String, NewResourceEntryData> resEntries = new HashMap<>();
9596

9697
try (FileInputStream fis = new FileInputStream(bf.getFile())) {
97-
Collection<ResourceString> resStrings = filter.parse(fis);
98+
Bundle resBundle = filter.parse(fis);
99+
Collection<ResourceString> resStrings = resBundle.getResourceStrings();
98100
for (ResourceString resString : resStrings) {
99101
NewResourceEntryData resEntryData = new NewResourceEntryData(resString.getValue());
100102
int seqNum = resString.getSequenceNumber();
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
eclipse.preferences.version=1
22
encoding//src/main/java=UTF-8
33
encoding//src/test/java=UTF-8
4-
encoding/<project>=UTF-8

gp-res-filter/src/main/java/com/ibm/g11n/pipeline/resfilter/AndroidStringsResource.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import java.text.BreakIterator;
2626
import java.util.Collection;
2727
import java.util.HashMap;
28+
import java.util.LinkedList;
29+
import java.util.List;
2830
import java.util.Locale;
2931
import java.util.Map;
3032
import java.util.TreeSet;
@@ -90,10 +92,10 @@ public Bundle parse(InputStream in) throws IOException {
9092

9193
Element elem = document.getDocumentElement();
9294
NodeList nodeList = elem.getChildNodes();
93-
Bundle result = new Bundle();
94-
collectResourceStrings(nodeList, 1 /* the first sequence number */, result.getResourceStrings());
95+
List<ResourceString> resStrings = new LinkedList<>();
96+
collectResourceStrings(nodeList, 1 /* the first sequence number */, resStrings);
9597

96-
return result;
98+
return new Bundle(resStrings, null);
9799
}
98100

99101
/**
Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,68 @@
1+
/*
2+
* Copyright IBM Corp. 2016
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
116
package com.ibm.g11n.pipeline.resfilter;
217

318
import java.util.ArrayList;
19+
import java.util.Collection;
20+
import java.util.Collections;
421
import java.util.LinkedList;
522
import java.util.List;
623

7-
public class Bundle {
8-
private ArrayList<String> notes;
9-
private LinkedList<ResourceString> resStrings;
10-
24+
public final class Bundle {
25+
private List<String> notes;
26+
private Collection<ResourceString> resStrings;
27+
1128
public Bundle () {
12-
notes = new ArrayList<String>();
13-
resStrings = new LinkedList<ResourceString>();
1429
}
15-
30+
31+
public Bundle(Collection<ResourceString> resStrings, List<String> notes) {
32+
if (resStrings != null) {
33+
this.resStrings = new ArrayList<>(resStrings);
34+
}
35+
if (notes != null) {
36+
this.notes = new ArrayList<>(notes);
37+
}
38+
}
39+
40+
public void addResourceString(ResourceString resString) {
41+
if (resStrings == null) {
42+
resStrings = new LinkedList<>();
43+
}
44+
resStrings.add(resString);
45+
}
46+
1647
public void addResourceString(String key, String value, int sequenceNumber) {
17-
ResourceString newString = new ResourceString(key, value, sequenceNumber);
18-
resStrings.add(newString);
48+
addResourceString(new ResourceString(key, value, sequenceNumber));
1949
}
2050

2151
public void addNote(String note) {
2252
notes.add(note);
2353
}
24-
25-
public List<ResourceString> getResourceStrings() {
26-
return resStrings;
54+
55+
public Collection<ResourceString> getResourceStrings() {
56+
if (resStrings == null) {
57+
return Collections.emptyList();
58+
}
59+
return Collections.unmodifiableCollection(resStrings);
2760
}
28-
61+
2962
public List<String> getNotes() {
30-
return notes;
63+
if (notes == null) {
64+
return Collections.emptyList();
65+
}
66+
return Collections.unmodifiableList(notes);
3167
}
3268
}

gp-res-filter/src/main/java/com/ibm/g11n/pipeline/resfilter/ResourceString.java

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616
package com.ibm.g11n.pipeline.resfilter;
1717

1818
import java.util.Comparator;
19+
import java.util.Objects;
1920

2021
/**
2122
* @author parth
2223
*
2324
*/
2425

25-
public class ResourceString {
26+
public final class ResourceString {
2627
private final String note;
2728
private final String key;
2829
private final String value;
@@ -65,10 +66,14 @@ public int getSequenceNumber() {
6566

6667
@Override
6768
public boolean equals(Object obj) {
68-
if (obj.getClass() != ResourceString.class) return false;
69+
if (!(obj instanceof ResourceString)) {
70+
return false;
71+
}
6972
ResourceString rs = (ResourceString) obj;
70-
return getKey().equals(rs.getKey()) && getValue().equals(rs.getValue())
71-
&& getSequenceNumber() == rs.getSequenceNumber();
73+
return Objects.equals(this.key, rs.key)
74+
&& Objects.equals(this.value, rs.value)
75+
&& Objects.equals(this.note, rs.note)
76+
&& this.sequenceNumber == rs.sequenceNumber;
7277
}
7378

7479
@Override
@@ -121,25 +126,31 @@ public int compare(ResourceString o1, ResourceString o2) {
121126
// Either sequence values are same or both sequence value are not
122127
// available.
123128
// Use key value's natural order as tie-breaker.
124-
String key1 = o1.getKey();
125-
String key2 = o2.getKey();
126-
127-
// Note: key must not be null for valid ResoruceString. This
128-
// implementation
129-
// uses null key as lowest value.
130-
// Also two keys must not be same in a valid ResourceString
131-
// collection.
132-
if (key1 == null) {
133-
if (key2 == null) {
129+
int cmp = compareStrings(o1.getKey(), o2.getKey());
130+
if (cmp == 0) {
131+
// Use value's natural order as tie-breaker
132+
cmp = compareStrings(o1.getValue(), o2.getValue());
133+
if (cmp == 0) {
134+
// Note value's natural order as tie-breaker
135+
cmp = compareStrings(o1.getNote(), o2.getNote());
136+
}
137+
}
138+
139+
return cmp;
140+
}
141+
142+
private static int compareStrings(String s1, String s2) {
143+
// null as lowest value
144+
if (s1 == null) {
145+
if (s2 == null) {
134146
return 0;
135147
} else {
136148
return -1;
137149
}
138-
} else if (key2 == null) {
150+
} else if (s2 == null) {
139151
return 1;
140152
}
141-
142-
return key1.compareTo(key2);
153+
return s1.compareTo(s2);
143154
}
144155
}
145156
}

gp-res-filter/src/test/java/com/ibm/g11n/pipeline/resfilter/AmdJsResourceTest.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,16 @@
2424
import java.io.IOException;
2525
import java.io.InputStream;
2626
import java.io.OutputStream;
27+
import java.util.ArrayList;
2728
import java.util.Collection;
29+
import java.util.Collections;
2830
import java.util.LinkedList;
31+
import java.util.List;
2932

3033
import org.junit.Test;
3134

35+
import com.ibm.g11n.pipeline.resfilter.ResourceString.ResourceStringComparator;
36+
3237
/**
3338
* @author Farhan Arshad
3439
*
@@ -45,13 +50,16 @@ public class AmdJsResourceTest {
4550
private static final File EXPECTED_MERGE_2_FILE = new File("src/test/resource/resfilter/amdjs/merge-output-2.js");
4651
private static final File EXPECTED_MERGE_3_FILE = new File("src/test/resource/resfilter/amdjs/merge-output-3.js");
4752

48-
private static Collection<ResourceString> EXPECTED_INPUT_RES_LIST;
53+
private static final Collection<ResourceString> EXPECTED_INPUT_RES_LIST;
4954

5055
static {
51-
EXPECTED_INPUT_RES_LIST = new LinkedList<ResourceString>();
52-
EXPECTED_INPUT_RES_LIST.add(new ResourceString("bear 1", "Brown Bear", 1));
53-
EXPECTED_INPUT_RES_LIST.add(new ResourceString("frog 2", "Red-eyed Tree Frog", 2));
54-
EXPECTED_INPUT_RES_LIST.add(new ResourceString("owl 3", "Great Horned Owl", 3));
56+
List<ResourceString> lst = new LinkedList<ResourceString>();
57+
lst.add(new ResourceString("bear 1", "Brown Bear", 1));
58+
lst.add(new ResourceString("frog 2", "Red-eyed Tree Frog", 2));
59+
lst.add(new ResourceString("owl 3", "Great Horned Owl", 3));
60+
61+
Collections.sort(lst, new ResourceStringComparator());
62+
EXPECTED_INPUT_RES_LIST = lst;
5563
}
5664

5765
private static Bundle WRITE_BUNDLE;
@@ -109,7 +117,9 @@ public void testParse() throws IOException {
109117

110118
try (InputStream is = new FileInputStream(INPUT_FILE)) {
111119
Bundle bundle = res.parse(is);
112-
assertEquals("ResourceStrings did not match.", EXPECTED_INPUT_RES_LIST, bundle.getResourceStrings());
120+
List<ResourceString> resStrList = new ArrayList<>(bundle.getResourceStrings());
121+
Collections.sort(resStrList, new ResourceStringComparator());
122+
assertEquals("ResourceStrings did not match.", EXPECTED_INPUT_RES_LIST, resStrList);
113123
}
114124
}
115125

0 commit comments

Comments
 (0)