Kasper Sørensen created METAMODEL-32:
----------------------------------------

             Summary: Excel module: XlsxSpreadsheetReaderDelegate is not thread 
safe
                 Key: METAMODEL-32
                 URL: https://issues.apache.org/jira/browse/METAMODEL-32
             Project: Metamodel
          Issue Type: Bug
            Reporter: Kasper Sørensen


XlsxSpreadsheetReaderDelegate uses a HashMap to store references to table names 
and internal IDs. It may occur that a new table is created, it's reference 
added to this HashMap, and then queried shortly after by another thread. But 
since HashMaps are not threadsafe or volatile, it may occur that the other 
thread will get a dirty write which will result in a stack trace like this 
because of a null reference passed on:

{code}
java.lang.NullPointerException: null
at java.util.TreeMap.getEntry(TreeMap.java:342) ~[na:1.7.0_45]
at java.util.TreeMap.get(TreeMap.java:273) ~[na:1.7.0_45]
at 
org.apache.poi.openxml4j.opc.PackageRelationshipCollection.getRelationshipByID(PackageRelationshipCollection.java:282)
 ~[poi-ooxml-3.8.jar:3.8]
at 
org.apache.poi.openxml4j.opc.PackagePart.getRelationship(PackagePart.java:379) 
~[poi-ooxml-3.8.jar:3.8]
at org.apache.poi.xssf.eventusermodel.XSSFReader.getSheet(XSSFReader.java:139) 
~[poi-ooxml-3.8.jar:3.8]
at 
org.eobjects.metamodel.excel.XlsxRowPublisherAction.run(XlsxRowPublisherAction.java:56)
 ~[MetaModel-excel-3.4.7.jar:na]
at 
org.eobjects.metamodel.excel.XlsxRowPublisherAction.run(XlsxRowPublisherAction.java:36)
 ~[MetaModel-excel-3.4.7.jar:na]
at 
org.eobjects.metamodel.data.RowPublisherDataSet$1.run(RowPublisherDataSet.java:88)
 ~[MetaModel-core-3.4.7.jar:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
~[na:1.7.0_45]
at java.util.concurrent.FutureTask.run(FutureTask.java:262) ~[na:1.7.0_45]
at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
[na:1.7.0_45]
at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
[na:1.7.0_45]
at java.lang.Thread.run(Thread.java:744) [na:1.7.0_45]
{code}

I suggest simply replacing the HashMap with a ConcurrentHashMap, since that 
will fix the issue. Furthermore we should check the used ID for null, so that 
we fail fast and avoid this stack which initially got us thinking it was an 
Apache POI issue.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to