← Back to team overview

dhis2-devs team mailing list archive

Re: [Branch ~dhis2-devs-core/dhis2/trunk] Rev 19296: WIP proper error reporting on failed GML parsing during import

 

Hi guys

I've been trying to reproduce your bug this morning, but I'm not able to. I
restored the db, and imported the xml without any issues, I tested on both
2.19 and 2.20, so I will need more information to reproduce.

This was the command I used to import:
curl -X POST -d @dxfstream.xml -H "Content-Type: application/xml" -v -u
admin:district http://localhost:8080/api/metadata

--
Morten

On Sun, Jun 28, 2015 at 5:16 AM, Halvdan Grelland <halvdanhg@xxxxxxxxx>
wrote:

> So. The stack size thing was just a qualified guess derived from the stack
> trace. It's pretty obviously not the cause. I'll wait on feedback from
> Morten before going any further on this.
> On Jun 27, 2015 6:50 PM, "Calle Hedberg" <calle.hedberg@xxxxxxxxx> wrote:
>
>> Halvdan,
>>
>> I understand from your last email that the root cause of the problem is a
>> 2.19 software issue - the meta data importer in 2.19 is not able to handle
>> OrgUnit attribute values when present. That makes sense, and it is likely
>> that the root cause of this bug / design flaw is a 2.19 change (since the
>> same import worked fine in 2.18). Morten and/or Lars will hopefully know
>> what change(s) caused this.
>>
>> With regard to JVM running out of heap space, and in relation to the
>> (outdated - very!) chapter 8.2.8 you referenced:
>>
>> Firstly, with regard to the 150+ instances we are hosting on our data
>> centre servers, we do have some constraints at the moment: Those servers
>> have 32GB RAM only, and most instances are in reality running on 1-3GB.
>> That will only change from next week, when we start moving to new servers
>> with (initially) 128GB RAM. That should on average provide 6-8GB per
>> instance (varying between 2 and 32GB).
>>
>> Secondly, finding the correct Java 7 and 8 (64 bits) and Tomcat 8.23 (64
>> bits) memory allocations on my Windows notebook (32GB RAM) has been a
>> nightmare - the people writing up java and tomcat documentation are
>> useless, they seem unable to give any quantified advice at all where any
>> normal person can find it. (In comparison, chapter 8.2.8 although outdated
>> is super-clear). I am currently using the following setting for Java:
>>
>> JAVA_OPTS: -Xms4096m -Xmx8192m -XX:PermSize=512m -XX:MaxPermSize=1024m
>>
>> For some reason I/we do not understand, it seems Tomcat 8.23 does not use
>> CATALINA_OPTS settings, so I ended up using the "Configure Tomcat" and then
>> specify the following under the "Java" tab:
>> Java options:
>> -Dcatalina.home=C:\Program Files\Apache Software Foundation\Tomcat 8.0
>> -Dcatalina.base=C:\Program Files\Apache Software Foundation\Tomcat 8.0
>> -Djava.endorsed.dirs=C:\Program Files\Apache Software Foundation\Tomcat
>> 8.0\endorsed
>> -Djava.io.tmpdir=C:\Program Files\Apache Software Foundation\Tomcat
>> 8.0\temp
>> -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
>> -Djava.util.logging.config.file=C:\Program Files\Apache Software
>> Foundation\Tomcat 8.0\conf\logging.properties
>> -XX:MaxPermSize=4096m
>>
>> (NOTE: the -XX value here is different from what I currently have in the
>> JAVA_OPTS environmental variable - I cannot find any info on which of them
>> takes precedence
>>
>> Also under that same "Java" tab on "Configure Tomcat":
>> Initial memory pool: 4096MB
>> Maximum memory pool: 8192MB
>> Thread stack size: 4096KB (4MB)
>>
>> Based on your initial advice to increase the stack size, I tried to
>> increase it to 8MB (GML import still crashing), 64MB (GML import still
>> crashing), and 132MB (GML import went completely haywire). Which is
>> understandable, given your subsequent finding that the root cause of the
>> problem was not related to heap/stack settings.
>>
>> So I've set the thread stack size back to 4096KB (4MB) - even if I don't
>> know whether that's correct or not (seems high to my layman eyes, but maybe
>> DHIS2 require it?)
>>
>> If anybody actually KNOWS what memory/stack sizes that I optimal for a
>> 32GB Windows machine, I would appreciate the advice...
>>
>> Regards
>> Calle
>>
>> On 26 June 2015 at 20:26, Halvdan Grelland <halvdanhg@xxxxxxxxx> wrote:
>>
>>> Ok, I could have a look, but am preoccupied at the moment. Will get back
>>> to you.
>>>
>>> In the meantime, it seems that you're facing a stack overflow error,
>>> which could be caused by the JVM running out of heap space. Could you
>>> please check the allocated heap for tomcat? If it is not being set (in the
>>> CATALINA_OPTS env variable), please set it to something quite large and try
>>> again.
>>>
>>> Under chapter 8.2.8 at the following link is a brief guide
>>> https://www.dhis2.org/doc/snapshot/en/implementer/html/ch08s02.html
>>>
>>> Please let me know how this works out for you. :)
>>>
>>> 2015-06-26 11:44 GMT+02:00 Calle Hedberg <calle.hedberg@xxxxxxxxx>:
>>>
>>>> Halvdan,
>>>>
>>>> Here's a stripped down version of the Free State instance (no records
>>>> in the data value table). Restore it as za_fs_s (psql -U dhis
>>>> -f za_fs_s_26062015ext.sql -d za_fs_s, password dhis)
>>>>
>>>> You have got that single-record country GML file already.
>>>>
>>>> I would appreciate any help in figuring out what's happening. Just note
>>>> that I'm using Postgresql 9.4, Java 7.79 64bits, and tomcat 8.23.
>>>>
>>>> Best regards
>>>> Calle
>>>>
>>>> On 26 June 2015 at 11:17, Calle Hedberg <calle.hedberg@xxxxxxxxx>
>>>> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I ran it again (revision 19247) and pulled out the first part of the
>>>>> log error:
>>>>>
>>>>> * INFO  2015-06-26 11:04:18,338 User 'Calle_Hedberg' started import at
>>>>> Fri Jun 26 11:04:18 CAT 2015 (DefaultImportService.java [taskScheduler-1])
>>>>> * INFO  2015-06-26 11:04:18,348 [Level: INFO, category:
>>>>> METADATA_IMPORT, time: Fri Jun 26 11:04:18 CAT 2015, message: Importing
>>>>> meta-data] (InMemoryNotifier.java [taskScheduler-1])
>>>>> * INFO  2015-06-26 11:04:18,348 Building object-bridge maps
>>>>> (preheatCache: true). (DefaultObjectBridge.java [taskScheduler-1])
>>>>> * INFO  2015-06-26 11:04:21,141 Building object-bridge maps took 2.79
>>>>> seconds. (DefaultObjectBridge.java [taskScheduler-1])
>>>>> * INFO  2015-06-26 11:04:21,141 [Level: INFO, category:
>>>>> METADATA_IMPORT, time: Fri Jun 26 11:04:21 CAT 2015, message: Importing 1
>>>>> OrganisationUnits] (InMemoryNotifier.java [taskScheduler-1])
>>>>> * INFO  2015-06-26 11:04:21,151 Deleted objects associated with object
>>>>> of type AttributeValue (DefaultDeletionManager.java [taskScheduler-1])
>>>>> * INFO  2015-06-26 11:04:21,151 Deleted objects associated with object
>>>>> of type AttributeValue (DefaultDeletionManager.java [taskScheduler-1])
>>>>> * INFO  2015-06-26 11:04:21,151 Deleted objects associated with object
>>>>> of type AttributeValue (DefaultDeletionManager.java [taskScheduler-1])
>>>>> * ERROR 2015-06-26 11:04:21,432 Unexpected error occurred in scheduled
>>>>> task. (TaskUtils.java [taskScheduler-1])
>>>>> java.lang.StackOverflowError
>>>>> at java.util.regex.Pattern$BmpCharProperty.<init>(Unknown Source)
>>>>> at java.util.regex.Pattern$BmpCharProperty.<init>(Unknown Source)
>>>>> at java.util.regex.Pattern$BitClass.<init>(Unknown Source)
>>>>> at java.util.regex.Pattern.clazz(Unknown Source)
>>>>> at java.util.regex.Pattern.sequence(Unknown Source)
>>>>> at java.util.regex.Pattern.expr(Unknown Source)
>>>>> at java.util.regex.Pattern.compile(Unknown Source)
>>>>> at java.util.regex.Pattern.<init>(Unknown Source)
>>>>> at java.util.regex.Pattern.compile(Unknown Source)
>>>>> at java.lang.String.replaceAll(Unknown Source)
>>>>> at com.google.common.base.MoreObjects.simpleName(MoreObjects.java:134)
>>>>> at
>>>>> com.google.common.base.MoreObjects.toStringHelper(MoreObjects.java:95)
>>>>> at org.hisp.dhis.attribute.Attribute.toString(Attribute.java:396)
>>>>> at sun.reflect.GeneratedMethodAccessor626.invoke(Unknown Source)
>>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>>>>> at java.lang.reflect.Method.invoke(Unknown Source)
>>>>> at
>>>>> org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:196)
>>>>> at
>>>>> org.hisp.dhis.attribute.Attribute_$$_jvst804_10.toString(Attribute_$$_jvst804_10.java)
>>>>> at java.lang.String.valueOf(Unknown Source)
>>>>> at java.lang.StringBuilder.append(Unknown Source)
>>>>> at
>>>>> org.hisp.dhis.attribute.AttributeValue.toString(AttributeValue.java:122)
>>>>> at java.lang.String.valueOf(Unknown Source)
>>>>> at java.lang.StringBuilder.append(Unknown Source)
>>>>> at java.util.AbstractCollection.toString(Unknown Source)
>>>>> at
>>>>> org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:327)
>>>>> at java.lang.String.valueOf(Unknown Source)
>>>>> at java.lang.StringBuilder.append(Unknown Source)
>>>>> at
>>>>> com.google.common.base.MoreObjects$ToStringHelper.toString(MoreObjects.java:359)
>>>>>
>>>>> Any ideas?
>>>>>
>>>>> Regards
>>>>> Calle
>>>>>
>>>>> On 26 June 2015 at 10:12, Calle Hedberg <calle.hedberg@xxxxxxxxx>
>>>>> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> Firstly, yes we are using a custom revision - although it is SUPPOSED
>>>>>> to be based on a 2.19 version from a few days ago. I will check that.
>>>>>>
>>>>>> BUT I have tried the import using revision 19247 too, and the
>>>>>> problem/behaviour is exactly the same - it hangs. Whereas if I import into
>>>>>> an older version of the same provincial instance that still runs on 2.18,
>>>>>> it imports fine.
>>>>>>
>>>>>> The fact that the same GML file imports in the Sierra Leone demo - I
>>>>>> cannot explain that, and the tomcat log only shows that
>>>>>> Attribute.toString() looping...
>>>>>>
>>>>>> Can I create a stripped down version of the instance and upload it
>>>>>> for you to test?
>>>>>>
>>>>>> Regards
>>>>>> Calle
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 26 June 2015 at 04:09, Morten Olav Hansen <mortenoh@xxxxxxxxx>
>>>>>> wrote:
>>>>>>
>>>>>>> It seems to be looping in Attribute.toString(), I remember this was
>>>>>>> an issue at some point.. but that was a long long time ago.. so maybe you
>>>>>>> need a revision bump
>>>>>>>
>>>>>>> --
>>>>>>> Morten
>>>>>>>
>>>>>>> On Fri, Jun 26, 2015 at 6:52 AM, Halvdan Grelland <
>>>>>>> halvdanhg@xxxxxxxxx> wrote:
>>>>>>>
>>>>>>>> I tried your example GML on both our demo servers (dev on 2.20 and
>>>>>>>> demo on 2.19, same rev as your server) and it works just fine.
>>>>>>>>
>>>>>>>> If you're experiencing it hanging and not finishing you might be
>>>>>>>> experiencing some kind of performance and/or memory issue. The coordinate
>>>>>>>> set is fairly large (though it works well on our demos, but does take some
>>>>>>>> time to finish). You can verify by trying yourself to create the orgunit
>>>>>>>> (with the exact name) and import the GML on the Sierra Leone demo.
>>>>>>>>
>>>>>>>> The fact that the dry run seems to "work" for you (as well as the
>>>>>>>> stack trace you provided) also points at the issue not residing in the GML
>>>>>>>> processing but rather in the actual import stage (the GML importer uses the
>>>>>>>> metadata importer as it's backend).
>>>>>>>>
>>>>>>>> Another thing: The instance you linked to is using a revision of 16783
>>>>>>>> and ver. 2.19, which is sept. 2014 (current is 2.19 is at 19247).
>>>>>>>> Are you using a custom build? Does it contain customizations to the core in
>>>>>>>> any way? That would also be a possible source of issues, obviously.
>>>>>>>>
>>>>>>>> You could try deploying this war
>>>>>>>> https://apps.dhis2.org/ci/job/dhis-2.19/lastBuild/artifact/dhis-2/dhis-web/dhis-web-portal/target/dhis.war
>>>>>>>> and replicate the issue using the za South Africa orgunit.
>>>>>>>>
>>>>>>>> 2015-06-26 0:35 GMT+02:00 Calle Hedberg <calle.hedberg@xxxxxxxxx>:
>>>>>>>>
>>>>>>>>> Halvdan,
>>>>>>>>>
>>>>>>>>> The GML files I'm trying to import using 2.19 is the same GML
>>>>>>>>> files I've been using successfully for 2.17, 2.18 (so it's using NAME).
>>>>>>>>> Something in the import has changed:
>>>>>>>>>
>>>>>>>>> I have attached the small GML file I'm trying to import - it has
>>>>>>>>> the international boundary of SA, so there is only ONE GIS record (top node
>>>>>>>>> in all our OrgHierarchies). It imports with no problems in 2.18.
>>>>>>>>>
>>>>>>>>> In 2.19, if I choose YES for dry run, it will complete with usual
>>>>>>>>> import summary etc.
>>>>>>>>>
>>>>>>>>> If I choose NO for dry run, I get
>>>>>>>>> 2015-06-25 22:18:15Importing 1 OrganisationUnits  2015-06-25
>>>>>>>>> 22:18:11Importing meta-data
>>>>>>>>> and there it hangs. Nothing gets imported.
>>>>>>>>>
>>>>>>>>> The online instance you can try to import into is
>>>>>>>>> http://fs.dhis.dhmis.org/staging/
>>>>>>>>>
>>>>>>>>> When I try to import into a local instance, it seems to enter some
>>>>>>>>> kind of endless loop based on the tomcat log:
>>>>>>>>>   at org.hisp.dhis.attribute.Attribute.toString(Attribute.java:397)
>>>>>>>>>   at sun.reflect.GeneratedMethodAccessor723.invoke(Unknown Source)
>>>>>>>>>   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown
>>>>>>>>> Source)
>>>>>>>>>   at java.lang.reflect.Method.invoke(Unknown Source)
>>>>>>>>>   at
>>>>>>>>> org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:192)
>>>>>>>>>   at
>>>>>>>>> org.hisp.dhis.attribute.Attribute_$$_javassist_16.toString(Attribute_$$_javassist_16.java)
>>>>>>>>>   at java.lang.String.valueOf(Unknown Source)
>>>>>>>>>   at java.lang.StringBuilder.append(Unknown Source)
>>>>>>>>>   at
>>>>>>>>> org.hisp.dhis.attribute.AttributeValue.toString(AttributeValue.java:136)
>>>>>>>>>   at java.lang.String.valueOf(Unknown Source)
>>>>>>>>>   at java.lang.StringBuilder.append(Unknown Source)
>>>>>>>>>   at java.util.AbstractCollection.toString(Unknown Source)
>>>>>>>>>   at
>>>>>>>>> org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:327)
>>>>>>>>>   at java.lang.String.valueOf(Unknown Source)
>>>>>>>>>   at java.lang.StringBuilder.append(Unknown Source)
>>>>>>>>>   at
>>>>>>>>> com.google.common.base.MoreObjects$ToStringHelper.toString(MoreObjects.java:359)
>>>>>>>>>   at org.hisp.dhis.attribute.Attribute.toString(Attribute.java:397)
>>>>>>>>>   at sun.reflect.GeneratedMethodAccessor723.invoke(Unknown Source)
>>>>>>>>>   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown
>>>>>>>>> Source)
>>>>>>>>>   at java.lang.reflect.Method.invoke(Unknown Source)
>>>>>>>>>   at
>>>>>>>>> org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:192)
>>>>>>>>>   at
>>>>>>>>> org.hisp.dhis.attribute.Attribute_$$_javassist_16.toString(Attribute_$$_javassist_16.java)
>>>>>>>>>   at java.lang.String.valueOf(Unknown Source)
>>>>>>>>>   at java.lang.StringBuilder.append(Unknown Source)
>>>>>>>>>   at
>>>>>>>>> org.hisp.dhis.attribute.AttributeValue.toString(AttributeValue.java:136)
>>>>>>>>>   at java.lang.String.valueOf(Unknown Source)
>>>>>>>>>   at java.lang.StringBuilder.append(Unknown Source)
>>>>>>>>>   at java.util.AbstractCollection.toString(Unknown Source)
>>>>>>>>>   at
>>>>>>>>> org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:327)
>>>>>>>>>   at java.lang.String.valueOf(Unknown Source)
>>>>>>>>>   at java.lang.StringBuilder.append(Unknown Source)
>>>>>>>>>   at
>>>>>>>>> com.google.common.base.MoreObjects$ToStringHelper.toString(MoreObjects.java:359)
>>>>>>>>>   at org.hisp.dhis.attribute.Attribute.toString(Attribute.java:397)
>>>>>>>>>   at sun.reflect.GeneratedMethodAccessor723.invoke(Unknown Source)
>>>>>>>>>   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown
>>>>>>>>> Source)
>>>>>>>>>   at java.lang.reflect.Method.invoke(Unknown Source)
>>>>>>>>>
>>>>>>>>> On 25 June 2015 at 18:16, Halvdan Grelland <halvdanhg@xxxxxxxxx>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> Hi Calle,
>>>>>>>>>>
>>>>>>>>>> The commit you've replied to implements (but not fully, therefore
>>>>>>>>>> 'WIP', there's another commit following it pretty soon after) better error
>>>>>>>>>> reporting feedback to the user through the interface. I.e. not having to
>>>>>>>>>> see the stacktrace on the server to determine if and why something went
>>>>>>>>>> wrong. I believe you have been among the people requesting this too :)
>>>>>>>>>>
>>>>>>>>>> Also, as you're referencing, we've made some other changes to GML
>>>>>>>>>> import. In particular the importer will now match on uid, code or name, as
>>>>>>>>>> oppsed to the former mode of matching only on name. This is not reflected
>>>>>>>>>> in the UI as it is a backend enhancement only, and does not change the
>>>>>>>>>> import options at all. It IS, however, documented and ready for you to read
>>>>>>>>>> about. Short version: it matches on a prioritized list of uid -> code ->
>>>>>>>>>> name. Long version:
>>>>>>>>>> https://www.dhis2.org/doc/snapshot/en/user/html/ch18s02.html
>>>>>>>>>>
>>>>>>>>>> Be adviced that the commit you've referenced is towards
>>>>>>>>>> development trunk, and is not backported to 2.19, the match on multiple
>>>>>>>>>> identifiers, however, was introduced in 2.19 and should work in current
>>>>>>>>>> 2.19 stable. If you're having problems with it you can send me a full stack
>>>>>>>>>> trace and preferably the GML input data.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> 2015-06-25 17:54 GMT+02:00 Calle Hedberg <calle.hedberg@xxxxxxxxx
>>>>>>>>>> >:
>>>>>>>>>>
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> I'm unable to import GML files using 2.19 (the same files import
>>>>>>>>>>> fine in 2.18) - the import simply hangs (endless rolling progress bar icon).
>>>>>>>>>>>
>>>>>>>>>>> Will the above bug-fix sort out that problem - I do not
>>>>>>>>>>> understand what the above actually means, or if the GML format has changed
>>>>>>>>>>> in some way.
>>>>>>>>>>>
>>>>>>>>>>> Note also that the final 2.19 release was supposed to include a
>>>>>>>>>>> more diversified GML import - but I cannot see WHERE to do that (I still
>>>>>>>>>>> see the same two buttons: choose file and import, either dry run or not)
>>>>>>>>>>>
>>>>>>>>>>> Regards
>>>>>>>>>>> Calle
>>>>>>>>>>>
>>>>>>>>>>> On 5 June 2015 at 14:57, <noreply@xxxxxxxxxxxxx> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> ------------------------------------------------------------
>>>>>>>>>>>> revno: 19296
>>>>>>>>>>>> committer: Halvdan Hoem Grelland <halvdanhg@xxxxxxxxx>
>>>>>>>>>>>> branch nick: dhis2
>>>>>>>>>>>> timestamp: Fri 2015-06-05 14:56:34 +0200
>>>>>>>>>>>> message:
>>>>>>>>>>>>   WIP proper error reporting on failed GML parsing during import
>>>>>>>>>>>> added:
>>>>>>>>>>>>
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/GmlPreProcessingResult.java
>>>>>>>>>>>> modified:
>>>>>>>>>>>>
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/DefaultGmlImportService.java
>>>>>>>>>>>>
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/GmlImportService.java
>>>>>>>>>>>>
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/gml/GmlImportServiceTest.java
>>>>>>>>>>>>
>>>>>>>>>>>> dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/SpringScheduler.java
>>>>>>>>>>>>
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/dxf2/MetaDataImportAction.java
>>>>>>>>>>>>
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/util/ImportMetaDataGmlTask.java
>>>>>>>>>>>>
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/resources/org/hisp/dhis/importexport/i18n_module.properties
>>>>>>>>>>>>
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/webapp/dhis-web-importexport/importMetaDataSummary.vm
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> lp:dhis2
>>>>>>>>>>>> https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk
>>>>>>>>>>>>
>>>>>>>>>>>> Your team DHIS 2 developers is subscribed to branch lp:dhis2.
>>>>>>>>>>>> To unsubscribe from this branch go to
>>>>>>>>>>>> https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
>>>>>>>>>>>>
>>>>>>>>>>>> === modified file
>>>>>>>>>>>> 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/DefaultGmlImportService.java'
>>>>>>>>>>>> ---
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/DefaultGmlImportService.java
>>>>>>>>>>>>   2015-06-03 15:00:19 +0000
>>>>>>>>>>>> +++
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/DefaultGmlImportService.java
>>>>>>>>>>>>   2015-06-05 12:56:34 +0000
>>>>>>>>>>>> @@ -32,6 +32,8 @@
>>>>>>>>>>>>  import com.google.common.base.Strings;
>>>>>>>>>>>>  import com.google.common.collect.Iterators;
>>>>>>>>>>>>  import com.google.common.collect.Maps;
>>>>>>>>>>>> +import org.apache.commons.io.IOUtils;
>>>>>>>>>>>> +import org.hibernate.Hibernate;
>>>>>>>>>>>>  import org.hisp.dhis.common.IdentifiableObjectManager;
>>>>>>>>>>>>  import org.hisp.dhis.common.IdentifiableProperty;
>>>>>>>>>>>>  import org.hisp.dhis.common.MergeStrategy;
>>>>>>>>>>>> @@ -88,13 +90,91 @@
>>>>>>>>>>>>      // GmlImportService implementation
>>>>>>>>>>>>      //
>>>>>>>>>>>> -------------------------------------------------------------------------
>>>>>>>>>>>>
>>>>>>>>>>>> +    @Transactional
>>>>>>>>>>>> +    @Override
>>>>>>>>>>>> +    public GmlPreProcessingResult preProcessGml( InputStream
>>>>>>>>>>>> inputStream )
>>>>>>>>>>>> +    {
>>>>>>>>>>>> +        InputStream dxfStream = null;
>>>>>>>>>>>> +        MetaData metaData = null;
>>>>>>>>>>>> +
>>>>>>>>>>>> +        try
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            dxfStream = transformGml( inputStream );
>>>>>>>>>>>> +            metaData = renderService.fromXml( dxfStream,
>>>>>>>>>>>> MetaData.class );
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +        catch ( IOException | TransformerException e )
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            return GmlPreProcessingResult.failure( e );
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +        finally
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            IOUtils.closeQuietly( dxfStream );
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +
>>>>>>>>>>>> +        Map<String, OrganisationUnit> uidMap  =
>>>>>>>>>>>> Maps.newHashMap(), codeMap = Maps.newHashMap(), nameMap = Maps.newHashMap();
>>>>>>>>>>>> +
>>>>>>>>>>>> +        matchAndFilterOnIdentifiers(
>>>>>>>>>>>> metaData.getOrganisationUnits(), uidMap, codeMap, nameMap );
>>>>>>>>>>>> +
>>>>>>>>>>>> +        Map<String, OrganisationUnit> persistedUidMap  =
>>>>>>>>>>>> getMatchingPersistedOrgUnits( uidMap.keySet(),  IdentifiableProperty.UID );
>>>>>>>>>>>> +        Map<String, OrganisationUnit> persistedCodeMap =
>>>>>>>>>>>> getMatchingPersistedOrgUnits( codeMap.keySet(), IdentifiableProperty.CODE );
>>>>>>>>>>>> +        Map<String, OrganisationUnit> persistedNameMap =
>>>>>>>>>>>> getMatchingPersistedOrgUnits( nameMap.keySet(), IdentifiableProperty.NAME );
>>>>>>>>>>>> +
>>>>>>>>>>>> +        Iterator<OrganisationUnit> persistedIterator =
>>>>>>>>>>>> Iterators.concat( persistedUidMap.values().iterator(),
>>>>>>>>>>>> +            persistedCodeMap.values().iterator(),
>>>>>>>>>>>> persistedNameMap.values().iterator() );
>>>>>>>>>>>> +
>>>>>>>>>>>> +        while ( persistedIterator.hasNext() )
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            OrganisationUnit persisted =
>>>>>>>>>>>> persistedIterator.next(), imported = null;
>>>>>>>>>>>> +
>>>>>>>>>>>> +            if ( !Strings.isNullOrEmpty( persisted.getUid() )
>>>>>>>>>>>> && uidMap.containsKey( persisted.getUid() ) )
>>>>>>>>>>>> +            {
>>>>>>>>>>>> +                imported = uidMap.get( persisted.getUid() );
>>>>>>>>>>>> +            }
>>>>>>>>>>>> +            else if ( !Strings.isNullOrEmpty(
>>>>>>>>>>>> persisted.getCode() ) && codeMap.containsKey( persisted.getCode() ) )
>>>>>>>>>>>> +            {
>>>>>>>>>>>> +                imported = codeMap.get( persisted.getCode() );
>>>>>>>>>>>> +            }
>>>>>>>>>>>> +            else if ( !Strings.isNullOrEmpty(
>>>>>>>>>>>> persisted.getName() ) && nameMap.containsKey( persisted.getName() ) )
>>>>>>>>>>>> +            {
>>>>>>>>>>>> +                imported = nameMap.get( persisted.getName() );
>>>>>>>>>>>> +            }
>>>>>>>>>>>> +
>>>>>>>>>>>> +            if ( imported == null || imported.getCoordinates()
>>>>>>>>>>>> == null || imported.getFeatureType() == null )
>>>>>>>>>>>> +            {
>>>>>>>>>>>> +                continue; // Failed to dereference a persisted
>>>>>>>>>>>> entity for this org unit or geo data incomplete/missing, therefore ignore
>>>>>>>>>>>> +            }
>>>>>>>>>>>> +
>>>>>>>>>>>> +            mergeNonGeoData( persisted, imported );
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +
>>>>>>>>>>>> +        return GmlPreProcessingResult.success( metaData );
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +
>>>>>>>>>>>>      @Override
>>>>>>>>>>>>      public MetaData fromGml( InputStream inputStream )
>>>>>>>>>>>>          throws IOException, TransformerException
>>>>>>>>>>>>      {
>>>>>>>>>>>> -        InputStream dxfStream = transformGml( inputStream );
>>>>>>>>>>>> -        MetaData metaData = renderService.fromXml( dxfStream,
>>>>>>>>>>>> MetaData.class );
>>>>>>>>>>>> -        dxfStream.close();
>>>>>>>>>>>> +        InputStream dxfStream;
>>>>>>>>>>>> +        MetaData metaData;
>>>>>>>>>>>> +
>>>>>>>>>>>> +        try
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            dxfStream = transformGml( inputStream );
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +        catch (Exception e)
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            dxfStream = null;
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +
>>>>>>>>>>>> +        if(dxfStream != null)
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            metaData = renderService.fromXml( dxfStream,
>>>>>>>>>>>> MetaData.class );
>>>>>>>>>>>> +            dxfStream.close();
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +        else
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            return null;
>>>>>>>>>>>> +        }
>>>>>>>>>>>>
>>>>>>>>>>>>          Map<String, OrganisationUnit> uidMap  =
>>>>>>>>>>>> Maps.newHashMap(), codeMap = Maps.newHashMap(), nameMap = Maps.newHashMap();
>>>>>>>>>>>>
>>>>>>>>>>>> @@ -143,6 +223,7 @@
>>>>>>>>>>>>          importService.importMetaData( userUid, fromGml(
>>>>>>>>>>>> inputStream ), importOptions, taskId );
>>>>>>>>>>>>      }
>>>>>>>>>>>>
>>>>>>>>>>>> +    @Transactional
>>>>>>>>>>>>      @Override
>>>>>>>>>>>>      public void importGml( MetaData metaData, String userUid,
>>>>>>>>>>>> ImportOptions importOptions, TaskId taskId )
>>>>>>>>>>>>      {
>>>>>>>>>>>>
>>>>>>>>>>>> === modified file
>>>>>>>>>>>> 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/GmlImportService.java'
>>>>>>>>>>>> ---
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/GmlImportService.java
>>>>>>>>>>>>  2015-06-03 15:00:19 +0000
>>>>>>>>>>>> +++
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/GmlImportService.java
>>>>>>>>>>>>  2015-06-05 12:56:34 +0000
>>>>>>>>>>>> @@ -62,6 +62,24 @@
>>>>>>>>>>>>          throws IOException, TransformerException;
>>>>>>>>>>>>
>>>>>>>>>>>>      /**
>>>>>>>>>>>> +     * Pre-process a GML document. The process, in short,
>>>>>>>>>>>> entails the following:
>>>>>>>>>>>> +     * <ol>
>>>>>>>>>>>> +     *     <li>Parse the GML payload and transform it into
>>>>>>>>>>>> DXF2 format</li>
>>>>>>>>>>>> +     *     <li>Get the given identifiers (uid, code or name)
>>>>>>>>>>>> from the parsed payload and fetch
>>>>>>>>>>>> +     *     the corresponding entities from the DB</li>
>>>>>>>>>>>> +     *     <li>Merge the geospatial data given in the input
>>>>>>>>>>>> GML into DB entities and return</li>
>>>>>>>>>>>> +     * </ol>
>>>>>>>>>>>> +     *
>>>>>>>>>>>> +     * The result of this process in returned in a {@link
>>>>>>>>>>>> GmlPreProcessingResult} which
>>>>>>>>>>>> +     * encapsulates the returned {@link MetaData} object or
>>>>>>>>>>>> the exception in cause of parse
>>>>>>>>>>>> +     * failure due to IO errors or malformed input.
>>>>>>>>>>>> +     *
>>>>>>>>>>>> +     * @param gmlInputStream the InputStream providing the GML
>>>>>>>>>>>> input.
>>>>>>>>>>>> +     * @return a GmlPreProcessingResult representing the end
>>>>>>>>>>>> result of the process.
>>>>>>>>>>>> +     */
>>>>>>>>>>>> +    GmlPreProcessingResult preProcessGml( InputStream
>>>>>>>>>>>> gmlInputStream );
>>>>>>>>>>>> +
>>>>>>>>>>>> +    /**
>>>>>>>>>>>>       * Imports GML data and merges the geospatial data updates
>>>>>>>>>>>> into the database.
>>>>>>>>>>>>       * See {@link #fromGml(InputStream)} for details on the
>>>>>>>>>>>> underlying process.
>>>>>>>>>>>>       *
>>>>>>>>>>>>
>>>>>>>>>>>> === added file
>>>>>>>>>>>> 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/GmlPreProcessingResult.java'
>>>>>>>>>>>> ---
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/GmlPreProcessingResult.java
>>>>>>>>>>>>    1970-01-01 00:00:00 +0000
>>>>>>>>>>>> +++
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/gml/GmlPreProcessingResult.java
>>>>>>>>>>>>    2015-06-05 12:56:34 +0000
>>>>>>>>>>>> @@ -0,0 +1,70 @@
>>>>>>>>>>>> +package org.hisp.dhis.dxf2.gml;
>>>>>>>>>>>> +
>>>>>>>>>>>> +import org.hisp.dhis.dxf2.metadata.MetaData;
>>>>>>>>>>>> +
>>>>>>>>>>>> +import java.io.InputStream;
>>>>>>>>>>>> +
>>>>>>>>>>>> +/**
>>>>>>>>>>>> + * Wraps the result of {@link
>>>>>>>>>>>> GmlImportService#preProcessGml(InputStream)}.
>>>>>>>>>>>> + * This is necessary when performing GML import on a context
>>>>>>>>>>>> where exceptions
>>>>>>>>>>>> + * due to malformed input cannot be caught, thus leaving the
>>>>>>>>>>>> user uninformed of
>>>>>>>>>>>> + * the error. This class will wrap the failure and provide the
>>>>>>>>>>>> Throwable to the
>>>>>>>>>>>> + * consuming class on error or the resulting MetaData object
>>>>>>>>>>>> on success.
>>>>>>>>>>>> + *
>>>>>>>>>>>> + * @author Halvdan Hoem grelland <halvdanhg@xxxxxxxxx>
>>>>>>>>>>>> + */
>>>>>>>>>>>> +public final class GmlPreProcessingResult
>>>>>>>>>>>> +{
>>>>>>>>>>>> +    private boolean isSuccess;
>>>>>>>>>>>> +    private MetaData resultMetaData;
>>>>>>>>>>>> +    private Throwable throwable;
>>>>>>>>>>>> +
>>>>>>>>>>>> +    private GmlPreProcessingResult(){}
>>>>>>>>>>>> +
>>>>>>>>>>>> +    public static GmlPreProcessingResult success( MetaData
>>>>>>>>>>>> resultMetaData ) {
>>>>>>>>>>>> +        GmlPreProcessingResult result = new
>>>>>>>>>>>> GmlPreProcessingResult();
>>>>>>>>>>>> +        result.setResultMetaData( resultMetaData );
>>>>>>>>>>>> +        result.setSuccess( true );
>>>>>>>>>>>> +
>>>>>>>>>>>> +        return result;
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +
>>>>>>>>>>>> +    public static GmlPreProcessingResult failure( Throwable
>>>>>>>>>>>> throwable )
>>>>>>>>>>>> +    {
>>>>>>>>>>>> +        GmlPreProcessingResult result = new
>>>>>>>>>>>> GmlPreProcessingResult();
>>>>>>>>>>>> +        result.setThrowable( throwable );
>>>>>>>>>>>> +        result.setSuccess( false );
>>>>>>>>>>>> +
>>>>>>>>>>>> +        return result;
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +
>>>>>>>>>>>> +    private void setSuccess( boolean isSuccess )
>>>>>>>>>>>> +    {
>>>>>>>>>>>> +        this.isSuccess = isSuccess;
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +
>>>>>>>>>>>> +    public boolean isSuccess()
>>>>>>>>>>>> +    {
>>>>>>>>>>>> +        return isSuccess;
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +
>>>>>>>>>>>> +    private void setResultMetaData( MetaData resultMetaData )
>>>>>>>>>>>> +    {
>>>>>>>>>>>> +        this.resultMetaData = resultMetaData;
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +
>>>>>>>>>>>> +    public MetaData getResultMetaData()
>>>>>>>>>>>> +    {
>>>>>>>>>>>> +        return resultMetaData;
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +
>>>>>>>>>>>> +    private void setThrowable( Throwable throwable )
>>>>>>>>>>>> +    {
>>>>>>>>>>>> +        this.throwable = throwable;
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +
>>>>>>>>>>>> +    public Throwable getThrowable()
>>>>>>>>>>>> +    {
>>>>>>>>>>>> +        return throwable;
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +}
>>>>>>>>>>>>
>>>>>>>>>>>> === modified file
>>>>>>>>>>>> 'dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/gml/GmlImportServiceTest.java'
>>>>>>>>>>>> ---
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/gml/GmlImportServiceTest.java
>>>>>>>>>>>>      2015-01-17 07:41:26 +0000
>>>>>>>>>>>> +++
>>>>>>>>>>>> dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/gml/GmlImportServiceTest.java
>>>>>>>>>>>>      2015-06-05 12:56:34 +0000
>>>>>>>>>>>> @@ -117,4 +117,6 @@
>>>>>>>>>>>>          assertEquals( 1, units.get(
>>>>>>>>>>>> "Blindern").getCoordinatesAsList().get( 0 ).getNumberOfCoordinates() );
>>>>>>>>>>>>          assertEquals( 76, units.get( "Forskningsparken"
>>>>>>>>>>>> ).getCoordinatesAsList().get(0).getNumberOfCoordinates() );
>>>>>>>>>>>>      }
>>>>>>>>>>>> +
>>>>>>>>>>>> +    // TODO Add test for
>>>>>>>>>>>> GmlImportService#preProcessGml(InputStream)
>>>>>>>>>>>>  }
>>>>>>>>>>>>
>>>>>>>>>>>> === modified file
>>>>>>>>>>>> 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/SpringScheduler.java'
>>>>>>>>>>>> ---
>>>>>>>>>>>> dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/SpringScheduler.java
>>>>>>>>>>>> 2015-05-30 13:36:07 +0000
>>>>>>>>>>>> +++
>>>>>>>>>>>> dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/SpringScheduler.java
>>>>>>>>>>>> 2015-06-05 12:56:34 +0000
>>>>>>>>>>>> @@ -77,7 +77,7 @@
>>>>>>>>>>>>      {
>>>>>>>>>>>>          taskExecutor.execute( task );
>>>>>>>>>>>>      }
>>>>>>>>>>>> -
>>>>>>>>>>>> +
>>>>>>>>>>>>      @Override
>>>>>>>>>>>>      public boolean scheduleTask( String key, Runnable task,
>>>>>>>>>>>> String cronExpr )
>>>>>>>>>>>>      {
>>>>>>>>>>>>
>>>>>>>>>>>> === modified file
>>>>>>>>>>>> 'dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/dxf2/MetaDataImportAction.java'
>>>>>>>>>>>> ---
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/dxf2/MetaDataImportAction.java
>>>>>>>>>>>>       2015-05-28 16:10:07 +0000
>>>>>>>>>>>> +++
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/dxf2/MetaDataImportAction.java
>>>>>>>>>>>>       2015-06-05 12:56:34 +0000
>>>>>>>>>>>> @@ -187,7 +187,7 @@
>>>>>>>>>>>>          }
>>>>>>>>>>>>          else if ( "gml".equals( importFormat ) )
>>>>>>>>>>>>          {
>>>>>>>>>>>> -            scheduler.executeTask( new ImportMetaDataGmlTask(
>>>>>>>>>>>> userId, gmlImportService, importOptions, in, taskId ) );
>>>>>>>>>>>> +            scheduler.executeTask( new ImportMetaDataGmlTask(
>>>>>>>>>>>> userId, gmlImportService, notifier, importOptions, in, taskId ) );
>>>>>>>>>>>>          }
>>>>>>>>>>>>          else if ( "json".equals( importFormat ) ||
>>>>>>>>>>>> "xml".equals( importFormat ) )
>>>>>>>>>>>>          {
>>>>>>>>>>>>
>>>>>>>>>>>> === modified file
>>>>>>>>>>>> 'dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/util/ImportMetaDataGmlTask.java'
>>>>>>>>>>>> ---
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/util/ImportMetaDataGmlTask.java
>>>>>>>>>>>>      2015-04-11 14:06:51 +0000
>>>>>>>>>>>> +++
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/util/ImportMetaDataGmlTask.java
>>>>>>>>>>>>      2015-06-05 12:56:34 +0000
>>>>>>>>>>>> @@ -28,14 +28,18 @@
>>>>>>>>>>>>   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>>>>>>>>>>>>   */
>>>>>>>>>>>>
>>>>>>>>>>>> +import org.apache.commons.lang.exception.ExceptionUtils;
>>>>>>>>>>>>  import org.apache.commons.logging.Log;
>>>>>>>>>>>>  import org.apache.commons.logging.LogFactory;
>>>>>>>>>>>>  import org.hisp.dhis.dxf2.common.ImportOptions;
>>>>>>>>>>>>  import org.hisp.dhis.dxf2.gml.GmlImportService;
>>>>>>>>>>>> +import org.hisp.dhis.dxf2.gml.GmlPreProcessingResult;
>>>>>>>>>>>>  import org.hisp.dhis.scheduling.TaskId;
>>>>>>>>>>>> +import org.hisp.dhis.system.notification.NotificationLevel;
>>>>>>>>>>>> +import org.hisp.dhis.system.notification.Notifier;
>>>>>>>>>>>> +import org.springframework.web.util.HtmlUtils;
>>>>>>>>>>>> +import org.xml.sax.SAXParseException;
>>>>>>>>>>>>
>>>>>>>>>>>> -import javax.xml.transform.TransformerException;
>>>>>>>>>>>> -import java.io.IOException;
>>>>>>>>>>>>  import java.io.InputStream;
>>>>>>>>>>>>
>>>>>>>>>>>>  /**
>>>>>>>>>>>> @@ -50,12 +54,15 @@
>>>>>>>>>>>>
>>>>>>>>>>>>      private String userUid;
>>>>>>>>>>>>
>>>>>>>>>>>> +
>>>>>>>>>>>>      //
>>>>>>>>>>>> -------------------------------------------------------------------------
>>>>>>>>>>>>      // Dependencies
>>>>>>>>>>>>      //
>>>>>>>>>>>> -------------------------------------------------------------------------
>>>>>>>>>>>>
>>>>>>>>>>>>      private GmlImportService gmlImportService;
>>>>>>>>>>>>
>>>>>>>>>>>> +    private Notifier notifier;
>>>>>>>>>>>> +
>>>>>>>>>>>>      private ImportOptions importOptions;
>>>>>>>>>>>>
>>>>>>>>>>>>      private InputStream inputStream;
>>>>>>>>>>>> @@ -64,11 +71,12 @@
>>>>>>>>>>>>      // Constructors
>>>>>>>>>>>>      //
>>>>>>>>>>>> -------------------------------------------------------------------------
>>>>>>>>>>>>
>>>>>>>>>>>> -    public ImportMetaDataGmlTask( String userUid,
>>>>>>>>>>>> GmlImportService gmlImportService,
>>>>>>>>>>>> +    public ImportMetaDataGmlTask( String userUid,
>>>>>>>>>>>> GmlImportService gmlImportService, Notifier notifier,
>>>>>>>>>>>>          ImportOptions importOptions, InputStream inputStream,
>>>>>>>>>>>> TaskId taskId )
>>>>>>>>>>>>      {
>>>>>>>>>>>>          this.userUid = userUid;
>>>>>>>>>>>>          this.gmlImportService = gmlImportService;
>>>>>>>>>>>> +        this.notifier = notifier;
>>>>>>>>>>>>          this.importOptions = importOptions;
>>>>>>>>>>>>          this.inputStream = inputStream;
>>>>>>>>>>>>          this.taskId = taskId;
>>>>>>>>>>>> @@ -83,15 +91,37 @@
>>>>>>>>>>>>      {
>>>>>>>>>>>>          importOptions.setImportStrategy( "update" ); // Force
>>>>>>>>>>>> update only for GML import
>>>>>>>>>>>>
>>>>>>>>>>>> -        try
>>>>>>>>>>>> -        {
>>>>>>>>>>>> -            gmlImportService.importGml( inputStream, userUid,
>>>>>>>>>>>> importOptions, taskId );
>>>>>>>>>>>> -        }
>>>>>>>>>>>> -        catch ( IOException | TransformerException e )
>>>>>>>>>>>> -        {
>>>>>>>>>>>> -            log.error( "Unable to read GML data from input
>>>>>>>>>>>> stream", e );
>>>>>>>>>>>> -
>>>>>>>>>>>> -            throw new RuntimeException( "Failed to parse GML
>>>>>>>>>>>> input stream", e );
>>>>>>>>>>>> -        }
>>>>>>>>>>>> +        GmlPreProcessingResult gmlPreProcessingResult =
>>>>>>>>>>>> gmlImportService.preProcessGml( inputStream );
>>>>>>>>>>>> +
>>>>>>>>>>>> +        if ( !gmlPreProcessingResult.isSuccess() )
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            Throwable throwable =
>>>>>>>>>>>> gmlPreProcessingResult.getThrowable();
>>>>>>>>>>>> +            String message = createErrorMessage( throwable );
>>>>>>>>>>>> +
>>>>>>>>>>>> +            notifier.notify( taskId, NotificationLevel.ERROR,
>>>>>>>>>>>> message, false );
>>>>>>>>>>>> +            log.error( "GML import failed: " + message,
>>>>>>>>>>>> throwable );
>>>>>>>>>>>> +
>>>>>>>>>>>> +            return;
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +
>>>>>>>>>>>> +        gmlImportService.importGml(
>>>>>>>>>>>> gmlPreProcessingResult.getResultMetaData(), userUid, importOptions, taskId
>>>>>>>>>>>> );
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +
>>>>>>>>>>>> +    private String createErrorMessage( Throwable throwable )
>>>>>>>>>>>> +    {
>>>>>>>>>>>> +        String message = "";
>>>>>>>>>>>> +        Throwable rootThrowable = ExceptionUtils.getRootCause(
>>>>>>>>>>>> throwable );
>>>>>>>>>>>> +
>>>>>>>>>>>> +        if ( rootThrowable instanceof SAXParseException )
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            SAXParseException e = (SAXParseException)
>>>>>>>>>>>> rootThrowable;
>>>>>>>>>>>> +            message += "Syntax error on line " +
>>>>>>>>>>>> e.getLineNumber() + ". " + e.getMessage();
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +        else
>>>>>>>>>>>> +        {
>>>>>>>>>>>> +            message += rootThrowable.getMessage();
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +
>>>>>>>>>>>> +        return HtmlUtils.htmlEscape( message );
>>>>>>>>>>>>      }
>>>>>>>>>>>>  }
>>>>>>>>>>>>
>>>>>>>>>>>> === modified file
>>>>>>>>>>>> 'dhis-2/dhis-web/dhis-web-importexport/src/main/resources/org/hisp/dhis/importexport/i18n_module.properties'
>>>>>>>>>>>> ---
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/resources/org/hisp/dhis/importexport/i18n_module.properties
>>>>>>>>>>>> 2015-02-20 11:17:31 +0000
>>>>>>>>>>>> +++
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/resources/org/hisp/dhis/importexport/i18n_module.properties
>>>>>>>>>>>> 2015-06-05 12:56:34 +0000
>>>>>>>>>>>> @@ -300,6 +300,7 @@
>>>>>>>>>>>>  ignored=Ignored
>>>>>>>>>>>>  conflicts=Conflicts
>>>>>>>>>>>>  no_conflicts_found=No conflicts found
>>>>>>>>>>>> +no_import_summary_available=No summary available
>>>>>>>>>>>>  type=Type
>>>>>>>>>>>>  count=Count
>>>>>>>>>>>>  export_as_xml=Export as XML
>>>>>>>>>>>>
>>>>>>>>>>>> === modified file
>>>>>>>>>>>> 'dhis-2/dhis-web/dhis-web-importexport/src/main/webapp/dhis-web-importexport/importMetaDataSummary.vm'
>>>>>>>>>>>> ---
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/webapp/dhis-web-importexport/importMetaDataSummary.vm
>>>>>>>>>>>>       2013-03-21 09:15:24 +0000
>>>>>>>>>>>> +++
>>>>>>>>>>>> dhis-2/dhis-web/dhis-web-importexport/src/main/webapp/dhis-web-importexport/importMetaDataSummary.vm
>>>>>>>>>>>>       2015-06-05 12:56:34 +0000
>>>>>>>>>>>> @@ -1,4 +1,6 @@
>>>>>>>>>>>>  <h3>$i18n.getString( "import_summary" )</h3>
>>>>>>>>>>>> +
>>>>>>>>>>>> +#if( $summary ) ## ImportSummary can be null on failed GML
>>>>>>>>>>>> import (pre-processing fails)
>>>>>>>>>>>>  <h4>$i18n.getString( "import_count" )</h4>
>>>>>>>>>>>>
>>>>>>>>>>>>  $summary.importCount.imported Imported<br/>
>>>>>>>>>>>> @@ -54,3 +56,6 @@
>>>>>>>>>>>>  #else
>>>>>>>>>>>>  <p>$i18n.getString( "no_conflicts_found" )</p>
>>>>>>>>>>>>  #end
>>>>>>>>>>>> +#else
>>>>>>>>>>>> +    $i18n.getString( "no_summary_available" )
>>>>>>>>>>>> +#end
>>>>>>>>>>>> \ No newline at end of file
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>> Mailing list: https://launchpad.net/~dhis2-devs
>>>>>>>>>>>> Post to     : dhis2-devs@xxxxxxxxxxxxxxxxxxx
>>>>>>>>>>>> Unsubscribe : https://launchpad.net/~dhis2-devs
>>>>>>>>>>>> More help   : https://help.launchpad.net/ListHelp
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>>
>>>>>>>>>>> *******************************************
>>>>>>>>>>>
>>>>>>>>>>> Calle Hedberg
>>>>>>>>>>>
>>>>>>>>>>> 46D Alma Road, 7700 Rosebank, SOUTH AFRICA
>>>>>>>>>>>
>>>>>>>>>>> Tel/fax (home): +27-21-685-6472
>>>>>>>>>>>
>>>>>>>>>>> Cell: +27-82-853-5352
>>>>>>>>>>>
>>>>>>>>>>> Iridium SatPhone: +8816-315-19274
>>>>>>>>>>>
>>>>>>>>>>> Email: calle.hedberg@xxxxxxxxx
>>>>>>>>>>>
>>>>>>>>>>> Skype: calle_hedberg
>>>>>>>>>>>
>>>>>>>>>>> *******************************************
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> _______________________________________________
>>>>>>>>>>> Mailing list: https://launchpad.net/~dhis2-devs
>>>>>>>>>>> Post to     : dhis2-devs@xxxxxxxxxxxxxxxxxxx
>>>>>>>>>>> Unsubscribe : https://launchpad.net/~dhis2-devs
>>>>>>>>>>> More help   : https://help.launchpad.net/ListHelp
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>>
>>>>>>>>> *******************************************
>>>>>>>>>
>>>>>>>>> Calle Hedberg
>>>>>>>>>
>>>>>>>>> 46D Alma Road, 7700 Rosebank, SOUTH AFRICA
>>>>>>>>>
>>>>>>>>> Tel/fax (home): +27-21-685-6472
>>>>>>>>>
>>>>>>>>> Cell: +27-82-853-5352
>>>>>>>>>
>>>>>>>>> Iridium SatPhone: +8816-315-19274
>>>>>>>>>
>>>>>>>>> Email: calle.hedberg@xxxxxxxxx
>>>>>>>>>
>>>>>>>>> Skype: calle_hedberg
>>>>>>>>>
>>>>>>>>> *******************************************
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Mailing list: https://launchpad.net/~dhis2-devs
>>>>>>>> Post to     : dhis2-devs@xxxxxxxxxxxxxxxxxxx
>>>>>>>> Unsubscribe : https://launchpad.net/~dhis2-devs
>>>>>>>> More help   : https://help.launchpad.net/ListHelp
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>>
>>>>>> *******************************************
>>>>>>
>>>>>> Calle Hedberg
>>>>>>
>>>>>> 46D Alma Road, 7700 Rosebank, SOUTH AFRICA
>>>>>>
>>>>>> Tel/fax (home): +27-21-685-6472
>>>>>>
>>>>>> Cell: +27-82-853-5352
>>>>>>
>>>>>> Iridium SatPhone: +8816-315-19274
>>>>>>
>>>>>> Email: calle.hedberg@xxxxxxxxx
>>>>>>
>>>>>> Skype: calle_hedberg
>>>>>>
>>>>>> *******************************************
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>>
>>>>> *******************************************
>>>>>
>>>>> Calle Hedberg
>>>>>
>>>>> 46D Alma Road, 7700 Rosebank, SOUTH AFRICA
>>>>>
>>>>> Tel/fax (home): +27-21-685-6472
>>>>>
>>>>> Cell: +27-82-853-5352
>>>>>
>>>>> Iridium SatPhone: +8816-315-19274
>>>>>
>>>>> Email: calle.hedberg@xxxxxxxxx
>>>>>
>>>>> Skype: calle_hedberg
>>>>>
>>>>> *******************************************
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> *******************************************
>>>>
>>>> Calle Hedberg
>>>>
>>>> 46D Alma Road, 7700 Rosebank, SOUTH AFRICA
>>>>
>>>> Tel/fax (home): +27-21-685-6472
>>>>
>>>> Cell: +27-82-853-5352
>>>>
>>>> Iridium SatPhone: +8816-315-19274
>>>>
>>>> Email: calle.hedberg@xxxxxxxxx
>>>>
>>>> Skype: calle_hedberg
>>>>
>>>> *******************************************
>>>>
>>>>
>>>
>>
>>
>> --
>>
>> *******************************************
>>
>> Calle Hedberg
>>
>> 46D Alma Road, 7700 Rosebank, SOUTH AFRICA
>>
>> Tel/fax (home): +27-21-685-6472
>>
>> Cell: +27-82-853-5352
>>
>> Iridium SatPhone: +8816-315-19274
>>
>> Email: calle.hedberg@xxxxxxxxx
>>
>> Skype: calle_hedberg
>>
>> *******************************************
>>
>>

Follow ups

References