=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/preheat/PreheatService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/preheat/PreheatService.java 2016-01-21 05:06:57 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/preheat/PreheatService.java 2016-01-22 04:05:17 +0000 @@ -28,6 +28,11 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import org.hisp.dhis.common.IdentifiableObject; + +import java.util.Collection; +import java.util.Map; + /** * @author Morten Olav Hansen */ @@ -46,4 +51,13 @@ * @param params PreheatParams */ void validate( PreheatParams params ) throws PreheatException; + + /** + * Scan object and collect all references (both id object and collections with id objects). + * + * @param object Object to scan + * @param identifier Identifier to collect + * @return Maps classes to collections of identifiers + */ + Map, Collection> scanObjectForReferences( Object object, PreheatIdentifier identifier ); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/preheat/DefaultPreheatService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/preheat/DefaultPreheatService.java 2016-01-21 09:05:12 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/preheat/DefaultPreheatService.java 2016-01-22 04:05:17 +0000 @@ -28,14 +28,30 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import org.hisp.dhis.common.IdentifiableObject; +import org.hisp.dhis.schema.Property; +import org.hisp.dhis.schema.PropertyType; +import org.hisp.dhis.schema.Schema; +import org.hisp.dhis.schema.SchemaService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * @author Morten Olav Hansen */ @Transactional public class DefaultPreheatService implements PreheatService { + @Autowired + private SchemaService schemaService; + @Override public Preheat preheat( PreheatParams params ) { @@ -64,4 +80,36 @@ throw new PreheatException( "Invalid preheat mode." ); } } + + @Override + @SuppressWarnings( "unchecked" ) + public Map, Collection> scanObjectForReferences( Object object, PreheatIdentifier identifier ) + { + Map, Collection> map = new HashMap<>(); + + if ( object == null ) + { + return map; + } + + Schema schema = schemaService.getDynamicSchema( object.getClass() ); + List properties = schema.getProperties().stream() + .filter( p -> p.isPersisted() && p.isOwner() && (PropertyType.REFERENCE == p.getPropertyType() || PropertyType.REFERENCE == p.getItemPropertyType()) ) + .collect( Collectors.toList() ); + + properties.forEach( p -> { + if ( !p.isCollection() ) + { + Class klass = (Class) p.getKlass(); + if ( !map.containsKey( klass ) ) map.put( klass, new ArrayList<>() ); + } + else + { + Class klass = (Class) p.getItemKlass(); + if ( !map.containsKey( klass ) ) map.put( klass, new ArrayList<>() ); + } + } ); + + return map; + } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/preheat/PreheatServiceTest.java' --- dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/preheat/PreheatServiceTest.java 2016-01-21 09:05:12 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/preheat/PreheatServiceTest.java 2016-01-22 04:05:17 +0000 @@ -30,10 +30,21 @@ import com.google.common.collect.Lists; import org.hisp.dhis.DhisSpringTest; +import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.dataelement.DataElementCategoryCombo; +import org.hisp.dhis.dataelement.DataElementGroup; +import org.hisp.dhis.legend.LegendSet; +import org.hisp.dhis.option.OptionSet; +import org.hisp.dhis.user.User; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import java.util.Collection; +import java.util.Map; + +import static org.junit.Assert.assertTrue; + /** * @author Morten Olav Hansen */ @@ -74,4 +85,30 @@ preheatService.validate( params ); } + + @Test + public void testScanNoObjectsDE() + { + DataElement dataElement = new DataElement( "DataElementA" ); + dataElement.setAutoFields(); + + Map, Collection> references = preheatService.scanObjectForReferences( dataElement, PreheatIdentifier.UID ); + + assertTrue( references.containsKey( OptionSet.class ) ); + assertTrue( references.containsKey( LegendSet.class ) ); + assertTrue( references.containsKey( DataElementCategoryCombo.class ) ); + assertTrue( references.containsKey( User.class ) ); + } + + @Test + public void testScanNoObjectsDEG() + { + DataElementGroup dataElementGroup = new DataElementGroup( "DataElementGroupA" ); + dataElementGroup.setAutoFields(); + + Map, Collection> references = preheatService.scanObjectForReferences( dataElementGroup, PreheatIdentifier.UID ); + + assertTrue( references.containsKey( DataElement.class ) ); + assertTrue( references.containsKey( User.class ) ); + } }