=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObjectManager.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObjectManager.java 2012-04-13 10:38:21 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObjectManager.java 2012-04-13 14:11:00 +0000 @@ -44,6 +44,10 @@ T get( Class clazz, String uid ); + T getByCode( Class clazz, String code ); + + T getByName( Class clazz, String name ); + Collection getAll( Class clazz ); void delete( IdentifiableObject object ); === modified file 'dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultImportService.java' --- dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultImportService.java 2012-04-13 10:38:21 +0000 +++ dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultImportService.java 2012-04-13 14:11:00 +0000 @@ -78,7 +78,7 @@ // the correct order // FIXME this is not currently in the "correct" order - doImport( metaData.getConcepts(), importOptions, importSummary ); +/* doImport( metaData.getConcepts(), importOptions, importSummary ); doImport( metaData.getConstants(), importOptions, importSummary ); doImport( metaData.getDocuments(), importOptions, importSummary ); doImport( metaData.getAttributeTypes(), importOptions, importSummary ); @@ -99,7 +99,11 @@ doImport( metaData.getMapLegendSets(), importOptions, importSummary ); doImport( metaData.getMapLayers(), importOptions, importSummary ); doImport( metaData.getMessageConversations(), importOptions, importSummary ); +*/ + doImport( metaData.getOrganisationUnits(), importOptions, importSummary ); + +/* doImport( metaData.getOrganisationUnitGroups(), importOptions, importSummary ); doImport( metaData.getOrganisationUnitGroupSets(), importOptions, importSummary ); doImport( metaData.getSqlViews(), importOptions, importSummary ); @@ -113,7 +117,7 @@ doImport( metaData.getReportTables(), importOptions, importSummary ); doImport( metaData.getCharts(), importOptions, importSummary ); doImport( metaData.getDataSets(), importOptions, importSummary ); - +*/ return importSummary; } === modified file 'dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultImporter.java' --- dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultImporter.java 2012-04-13 10:38:21 +0000 +++ dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultImporter.java 2012-04-13 14:11:00 +0000 @@ -118,13 +118,13 @@ return null; } - // log.info( "Trying to save new object with UID: " + object.getUid() ); + log.info( "Trying to save new object with UID: " + object.getUid() ); findAndUpdateReferences( object ); - //manager.save( object ); - //updateIdMaps( object ); + manager.save( object ); + updateIdMaps( object ); - // log.info( "Save successful." ); + log.info( "Save successful." ); return null; } @@ -144,13 +144,13 @@ return null; } - // log.info( "Trying to update object with UID: " + oldObject.getUid() ); + log.info( "Starting update of object " + getDisplayName( oldObject ) + " (" + oldObject.getClass().getSimpleName() + ")" ); findAndUpdateReferences( object ); - // oldObject.mergeWith( object ); - // manager.update( oldObject ); + oldObject.mergeWith( object ); + manager.update( oldObject ); - // log.info( "Update successful." ); + log.info( "Update successful." ); return null; } @@ -259,6 +259,19 @@ */ protected String getDisplayName( IdentifiableObject object ) { + if ( object.getUid() != null ) + { + return object.getUid(); + } + else if ( object.getCode() != null ) + { + return object.getCode(); + } + else if ( object.getName() != null ) + { + return object.getName(); + } + return object.getClass().getName(); } @@ -267,7 +280,7 @@ * * @return Name of object */ - protected String getObjectName() + protected String getClassName() { return importerClass.getSimpleName(); } @@ -556,11 +569,31 @@ return matchedObject; } + private IdentifiableObject findObjectByReference( IdentifiableObject identifiableObject ) + { + IdentifiableObject match = null; + + if ( identifiableObject.getUid() != null ) + { + match = manager.get( identifiableObject.getClass(), identifiableObject.getUid() ); + } + else if ( identifiableObject.getCode() != null ) + { + match = manager.getByCode( identifiableObject.getClass(), identifiableObject.getCode() ); + } + else if ( identifiableObject.getName() != null ) + { + match = manager.getByName( identifiableObject.getClass(), identifiableObject.getName() ); + } + + return match; + } + private void findAndUpdateReferences( T object ) { Field[] fields = object.getClass().getDeclaredFields(); - log.info( "Finding and updating references for " + object.getClass().getSimpleName() ); + log.info( "-> Finding and updating references." ); for ( Field field : fields ) { @@ -570,22 +603,22 @@ if ( identifiableObject != null ) { - log.info( "Verifying field " + field.getName() ); - if ( Period.class.isAssignableFrom( identifiableObject.getClass() ) ) { + // FIXME log.info( "Skipping Period.class" ); } else { - IdentifiableObject ref = manager.get( identifiableObject.getClass(), identifiableObject.getUid() ); + IdentifiableObject ref = findObjectByReference( identifiableObject ); if ( ref != null ) { + ReflectionUtils.invokeSetterMethod( field.getName(), object, ref ); } else { - log.info( "Reference " + identifiableObject + " not found." ); + log.info( "--> Ignored reference " + getDisplayName( identifiableObject ) + "." ); } } } @@ -598,30 +631,26 @@ { Collection identifiableObjects = ReflectionUtils.invokeGetterMethod( field.getName(), object ); - if ( identifiableObjects == null ) - { - log.info( "identifiableObjects is null for field " + field.getName() ); - } - else if ( !identifiableObjects.isEmpty() ) - { - log.info( "Verifying field " + field.getName() ); - + if ( identifiableObjects != null && !identifiableObjects.isEmpty() ) + { for ( IdentifiableObject identifiableObject : identifiableObjects ) { if ( Period.class.isAssignableFrom( identifiableObject.getClass() ) ) { + // FIXME log.info( "Skipping Period.class" ); continue; } - IdentifiableObject ref = manager.get( identifiableObject.getClass(), identifiableObject.getUid() ); + IdentifiableObject ref = findObjectByReference( identifiableObject ); if ( ref != null ) { + ReflectionUtils.invokeSetterMethod( field.getName(), object, ref ); } else { - log.info( "Reference " + identifiableObject + " not found." ); + log.info( "--> Ignored reference " + getDisplayName( identifiableObject ) + "." ); } } } === modified file 'dhis-2/dhis-dxf2/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-dxf2/src/main/resources/META-INF/dhis/beans.xml 2012-04-13 01:16:51 +0000 +++ dhis-2/dhis-dxf2/src/main/resources/META-INF/dhis/beans.xml 2012-04-13 14:11:00 +0000 @@ -49,6 +49,10 @@ + + + + === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultIdentifiableObjectManager.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultIdentifiableObjectManager.java 2012-04-13 10:38:21 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultIdentifiableObjectManager.java 2012-04-13 14:11:00 +0000 @@ -99,6 +99,28 @@ return null; } + @Override + public T getByCode( Class clazz, String code ) + { + if ( objectStoreMap.get( clazz ) != null ) + { + return (T) objectStoreMap.get( clazz ).getByCode( code ); + } + + return null; + } + + @Override + public T getByName( Class clazz, String name ) + { + if ( objectStoreMap.get( clazz ) != null ) + { + return (T) objectStoreMap.get( clazz ).getByName( name ); + } + + return null; + } + @SuppressWarnings( "unchecked" ) public Collection getAll( Class clazz ) { === modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java 2012-04-07 12:44:57 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java 2012-04-13 14:11:00 +0000 @@ -205,6 +205,17 @@ } } + public static Method findSetterMethod( String fieldName, Object object ) + { + try + { + return object.getClass().getMethod( "set" + StringUtils.capitalize( fieldName ) ); + } catch ( NoSuchMethodException e ) + { + return null; + } + } + public static T invokeGetterMethod( String fieldName, Object object ) { Method method = findGetterMethod( fieldName, object ); @@ -226,6 +237,27 @@ } } + public static T invokeSetterMethod( String fieldName, Object object, Object... objects ) + { + Method method = findSetterMethod( fieldName, object ); + + if ( method == null ) + { + return null; + } + + try + { + return (T) method.invoke( object, objects ); + } catch ( InvocationTargetException e ) + { + return null; + } catch ( IllegalAccessException e ) + { + return null; + } + } + public static boolean isType( Field field, Class clazz ) { Class type = field.getType(); === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/MetaDataController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/MetaDataController.java 2012-04-13 01:16:51 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/MetaDataController.java 2012-04-13 14:11:00 +0000 @@ -27,21 +27,10 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.io.BufferedInputStream; -import java.io.IOException; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.xml.bind.JAXBException; - import org.hisp.dhis.api.utils.ContextUtils; import org.hisp.dhis.common.view.ExportView; import org.hisp.dhis.dxf2.importsummary.ImportSummary; import org.hisp.dhis.dxf2.metadata.*; -import org.hisp.dhis.dxf2.metadata.MetaData; import org.hisp.dhis.dxf2.utils.JacksonUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; @@ -51,6 +40,12 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.bind.JAXBException; +import java.io.IOException; +import java.util.zip.*; + /** * @author Morten Olav Hansen */ @@ -73,9 +68,9 @@ @PreAuthorize( "hasRole('ALL') or hasRole('F_METADATA_EXPORT')" ) public String export( ExportOptions exportOptions, Model model ) { - MetaData dxf2 = exportService.getMetaData( exportOptions ); + MetaData metaData = exportService.getMetaData( exportOptions ); - model.addAttribute( "model", dxf2 ); + model.addAttribute( "model", metaData ); model.addAttribute( "view", "export" ); return "export"; @@ -85,7 +80,7 @@ @PreAuthorize( "hasRole('ALL') or hasRole('F_METADATA_EXPORT')" ) public void exportZippedXML( ExportOptions exportOptions, HttpServletResponse response ) throws IOException, JAXBException { - MetaData dxf2 = exportService.getMetaData( exportOptions ); + MetaData metaData = exportService.getMetaData( exportOptions ); response.setContentType( ContextUtils.CONTENT_TYPE_ZIP ); response.addHeader( "Content-Disposition", "attachment; filename=\"export.xml.zip\"" ); @@ -94,14 +89,14 @@ ZipOutputStream zip = new ZipOutputStream( response.getOutputStream() ); zip.putNextEntry( new ZipEntry( "export.xml" ) ); - JacksonUtils.toXmlWithView( zip, dxf2, ExportView.class ); + JacksonUtils.toXmlWithView( zip, metaData, ExportView.class ); } @RequestMapping( value = MetaDataController.RESOURCE_PATH + ".zip", method = RequestMethod.GET, headers = {"Accept=application/json"} ) @PreAuthorize( "hasRole('ALL') or hasRole('F_METADATA_EXPORT')" ) public void exportZippedJSON( ExportOptions exportOptions, HttpServletResponse response ) throws IOException, JAXBException { - MetaData dxf2 = exportService.getMetaData( exportOptions ); + MetaData metaData = exportService.getMetaData( exportOptions ); response.setContentType( ContextUtils.CONTENT_TYPE_ZIP ); response.addHeader( "Content-Disposition", "attachment; filename=\"export.json.zip\"" ); @@ -110,7 +105,31 @@ ZipOutputStream zip = new ZipOutputStream( response.getOutputStream() ); zip.putNextEntry( new ZipEntry( "export.json" ) ); - JacksonUtils.toJsonWithView( zip, dxf2, ExportView.class ); + JacksonUtils.toJsonWithView( zip, metaData, ExportView.class ); + } + + @RequestMapping( value = MetaDataController.RESOURCE_PATH + ".gz", method = RequestMethod.GET, headers = {"Accept=application/xml, text/*"} ) + @PreAuthorize( "hasRole('ALL') or hasRole('F_METADATA_EXPORT')" ) + public void exportGZippedXML( ExportOptions exportOptions, HttpServletResponse response ) throws IOException, JAXBException + { + MetaData metaData = exportService.getMetaData( exportOptions ); + + response.setContentType( ContextUtils.CONTENT_TYPE_GZIP ); + GZIPOutputStream gzip = new GZIPOutputStream( response.getOutputStream() ); + + JacksonUtils.toXmlWithView( gzip, metaData, ExportView.class ); + } + + @RequestMapping( value = MetaDataController.RESOURCE_PATH + ".gz", method = RequestMethod.GET, headers = {"Accept=application/json"} ) + @PreAuthorize( "hasRole('ALL') or hasRole('F_METADATA_EXPORT')" ) + public void exportGZippedJSON( ExportOptions exportOptions, HttpServletResponse response ) throws IOException, JAXBException + { + MetaData metaData = exportService.getMetaData( exportOptions ); + + response.setContentType( ContextUtils.CONTENT_TYPE_GZIP ); + GZIPOutputStream gzip = new GZIPOutputStream( response.getOutputStream() ); + + JacksonUtils.toJsonWithView( gzip, metaData, ExportView.class ); } //------------------------------------------------------------------------------------------------------- @@ -121,10 +140,10 @@ @PreAuthorize( "hasRole('ALL') or hasRole('F_METADATA_IMPORT')" ) public void importXml( ImportOptions importOptions, HttpServletResponse response, HttpServletRequest request ) throws JAXBException, IOException { - MetaData dxf2 = JacksonUtils.fromXml( request.getInputStream(), MetaData.class ); - System.err.println( dxf2 ); + MetaData metaData = JacksonUtils.fromXml( request.getInputStream(), MetaData.class ); + System.err.println( metaData ); - ImportSummary summary = importService.importMetaData( dxf2, importOptions ); + ImportSummary summary = importService.importMetaData( metaData, importOptions ); response.setContentType( MediaType.APPLICATION_XML.toString() ); JacksonUtils.toXml( response.getOutputStream(), summary ); @@ -134,10 +153,10 @@ @PreAuthorize( "hasRole('ALL') or hasRole('F_METADATA_IMPORT')" ) public void importJson( ImportOptions importOptions, HttpServletResponse response, HttpServletRequest request ) throws IOException { - MetaData dxf2 = JacksonUtils.fromJson( request.getInputStream(), MetaData.class ); - System.err.println( dxf2 ); + MetaData metaData = JacksonUtils.fromJson( request.getInputStream(), MetaData.class ); + System.err.println( metaData ); - ImportSummary summary = importService.importMetaData( dxf2, importOptions ); + ImportSummary summary = importService.importMetaData( metaData, importOptions ); response.setContentType( MediaType.APPLICATION_JSON.toString() ); JacksonUtils.toJson( response.getOutputStream(), summary ); @@ -147,13 +166,13 @@ @PreAuthorize( "hasRole('ALL') or hasRole('F_METADATA_IMPORT')" ) public void importZippedXml( ImportOptions importOptions, HttpServletResponse response, HttpServletRequest request ) throws JAXBException, IOException { - ZipInputStream zip = new ZipInputStream( new BufferedInputStream( request.getInputStream() ) ); + ZipInputStream zip = new ZipInputStream( request.getInputStream() ); ZipEntry entry = zip.getNextEntry(); - MetaData dxf2 = JacksonUtils.fromXml( zip, MetaData.class ); - System.err.println( dxf2 ); + MetaData metaData = JacksonUtils.fromXml( zip, MetaData.class ); + System.err.println( metaData ); - ImportSummary summary = importService.importMetaData( dxf2, importOptions ); + ImportSummary summary = importService.importMetaData( metaData, importOptions ); response.setContentType( MediaType.APPLICATION_XML.toString() ); JacksonUtils.toXml( response.getOutputStream(), summary ); @@ -166,10 +185,42 @@ ZipInputStream zip = new ZipInputStream( request.getInputStream() ); ZipEntry entry = zip.getNextEntry(); - MetaData dxf2 = JacksonUtils.fromJson( zip, MetaData.class ); - System.err.println( dxf2 ); - - ImportSummary summary = importService.importMetaData( dxf2, importOptions ); + MetaData metaData = JacksonUtils.fromJson( zip, MetaData.class ); + System.err.println( metaData ); + + ImportSummary summary = importService.importMetaData( metaData, importOptions ); + + response.setContentType( MediaType.APPLICATION_JSON.toString() ); + JacksonUtils.toJson( response.getOutputStream(), summary ); + } + + + @RequestMapping( value = MetaDataController.RESOURCE_PATH + ".gz", method = RequestMethod.POST, headers = {"Content-Type=application/xml, text/xml"} ) + @PreAuthorize( "hasRole('ALL') or hasRole('F_METADATA_IMPORT')" ) + public void importGZippedXml( ImportOptions importOptions, HttpServletResponse response, HttpServletRequest request ) throws JAXBException, IOException + { + GZIPInputStream gzip = new GZIPInputStream( request.getInputStream() ); + MetaData metaData = JacksonUtils.fromXml( gzip, MetaData.class ); + + System.err.println( metaData ); + + ImportSummary summary = importService.importMetaData( metaData, importOptions ); + + response.setContentType( MediaType.APPLICATION_XML.toString() ); + JacksonUtils.toXml( response.getOutputStream(), summary ); + } + + @RequestMapping( value = MetaDataController.RESOURCE_PATH + ".gz", method = RequestMethod.POST, headers = {"Content-Type=application/json"} ) + @PreAuthorize( "hasRole('ALL') or hasRole('F_METADATA_IMPORT')" ) + public void importGZippedJson( ImportOptions importOptions, HttpServletResponse response, HttpServletRequest request ) throws IOException + { + GZIPInputStream gzip = new GZIPInputStream( request.getInputStream() ); + + MetaData metaData = JacksonUtils.fromJson( gzip, MetaData.class ); + + System.err.println( metaData ); + + ImportSummary summary = importService.importMetaData( metaData, importOptions ); response.setContentType( MediaType.APPLICATION_JSON.toString() ); JacksonUtils.toJson( response.getOutputStream(), summary );