blackpanther
blackpanther

Reputation: 11486

IllegalArgumentException - Google Guava convert String to HashMap

I am trying to convert the following String into a HashMap as it has key-value pairs:

0,2343:1,ORDER:4,Name:5,:6,:7,London:8,null:9,postcode:10,Field 1:11,Fake Place:13,:14,:15,:16,null:17,postcode:18,0208 1192000:20,Field 1:23,1:24,19700101:25,ORDNO90654:38,Fake Company:50,GB:68,null:69,0:70,1:75,KGS:21,0:79,null null GBR null null:80,GB:1222,null:21-2,0:79-2,null null GBR null null:80-2,GB:1222-2,null:112,0:116,0:119,10200:190,N:99,:

I am using Google's Guava library to do that within a Unit test called FlightProcessorTest:

Map<String, String> messageMap = Splitter.on(",")
            .withKeyValueSeparator(":")
            .split(keyValueSplit);

However, I get the following exception:

java.lang.IllegalArgumentException: Chunk [0] is not a valid entry
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:145)
    at com.google.common.base.Splitter$MapSplitter.split(Splitter.java:508)
    at com.xxxx.test.FlightProcessorTest.testProcessMessage(FlightProcessorTest.java:180)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:88)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:96)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

Upvotes: 2

Views: 5140

Answers (2)

Joop Eggen
Joop Eggen

Reputation: 109567

You might try a reular expression with look behind (?<= ), identifying the value. Here ":" followed by digits. Alternatively (?<=\\:[^,:]+).

Map<String, String> messageMap = Splitter.onPattern("(?<=\\:\\d+),")
        .withKeyValueSeparator(":")
        .split(keyValueSplit);

(I could not try it out.)

Upvotes: 1

kropla
kropla

Reputation: 163

The problem is in the beginning of the parsed string: 0,2343:1

You use Splitter.on(",").withKeyValueSeparator(":") so the first value is unknown.

I see more places when it will fail- for example:

postcode:18,0208 1192000:20,

Upvotes: 3

Related Questions