Skip to content
Snippets Groups Projects
Commit da770a7d authored by felmer's avatar felmer
Browse files

SSDM-5031: Test deleteGraphOfMaterials added to MaterialDeletionTest. Bug...

SSDM-5031: Test deleteGraphOfMaterials added to MaterialDeletionTest. Bug fixed by order materials by level.

SVN: 38253
parent cefd90c8
No related branches found
No related tags found
No related merge requests found
......@@ -16,9 +16,15 @@
package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.material;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......@@ -27,9 +33,11 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.delete.MaterialDeletion
import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.id.IMaterialId;
import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.AbstractDeleteEntityExecutor;
import ch.systemsx.cisd.openbis.generic.server.business.bo.IMaterialBO;
import ch.systemsx.cisd.common.collection.SimpleComparator;
import ch.systemsx.cisd.openbis.generic.server.business.bo.IMaterialTable;
import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPropertyPE;
/**
* @author Jakub Straszewski
......@@ -38,6 +46,15 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
public class DeleteMaterialExecutor extends AbstractDeleteEntityExecutor<Void, IMaterialId, MaterialPE, MaterialDeletionOptions> implements
IDeleteMaterialExecutor
{
private static final Comparator<Entry<Integer, List<TechId>>> INVERSE_LEVEL_COMPARATOR =
new SimpleComparator<Entry<Integer, List<TechId>>, Integer>()
{
@Override
public Integer evaluate(Entry<Integer, List<TechId>> item)
{
return -item.getKey();
}
};
@Autowired
private IMapMaterialByIdExecutor mapMaterialByIdExecutor;
......@@ -66,12 +83,63 @@ public class DeleteMaterialExecutor extends AbstractDeleteEntityExecutor<Void, I
@Override
protected Void delete(IOperationContext context, Collection<MaterialPE> materials, MaterialDeletionOptions deletionOptions)
{
IMaterialBO materialBO = businessObjectFactory.createMaterialBO(context.getSession());
for (MaterialPE material : materials)
Map<String, String> links = createLinks(materials);
List<Entry<Integer, List<TechId>>> entries = orderMaterialsByLevel(materials, links);
IMaterialTable materialTable = businessObjectFactory.createMaterialTable(context.getSession());
for (Entry<Integer, List<TechId>> entry : entries)
{
materialBO.deleteByTechId(new TechId(material.getId()), deletionOptions.getReason());
materialTable.deleteByTechIds(entry.getValue(), deletionOptions.getReason());
}
return null;
}
private Map<String, String> createLinks(Collection<MaterialPE> materials)
{
Map<String, String> links = new HashMap<>();
for (MaterialPE material : materials)
{
Set<MaterialPropertyPE> properties = material.getProperties();
for (MaterialPropertyPE property : properties)
{
MaterialPE materialProperty = property.getMaterialValue();
if (materialProperty != null)
{
links.put(material.getPermId(), materialProperty.getPermId());
}
}
}
return links;
}
private List<Entry<Integer, List<TechId>>> orderMaterialsByLevel(Collection<MaterialPE> materials,
Map<String, String> links)
{
Map<Integer, List<TechId>> levelMap = new HashMap<>();
for (MaterialPE material : materials)
{
int level = getLevel(material.getPermId(), links, 0);
List<TechId> ids = levelMap.get(level);
if (ids == null)
{
ids = new ArrayList<>();
levelMap.put(level, ids);
}
ids.add(new TechId(material));
}
List<Entry<Integer, List<TechId>>> entries = new ArrayList<>(levelMap.entrySet());
Collections.sort(entries, INVERSE_LEVEL_COMPARATOR);
return entries;
}
private int getLevel(String material, Map<String, String> links, int level)
{
String nextMaterial = links.get(material);
if (nextMaterial == null)
{
return level;
}
return getLevel(nextMaterial, links, level + 1);
}
}
......@@ -735,10 +735,15 @@ public abstract class DeletionTest extends AbstractTest
}
protected MaterialPermId createMaterial(String code, Map<String, String> properties)
{
return createMaterial(code, "DELETION_TEST", properties);
}
protected MaterialPermId createMaterial(String code, String typeCode, Map<String, String> properties)
{
MaterialCreation material = new MaterialCreation();
material.setCode(code);
material.setTypeId(new EntityTypePermId("DELETION_TEST"));
material.setTypeId(new EntityTypePermId(typeCode));
for (Map.Entry<String, String> entry : properties.entrySet())
{
......
package ch.ethz.sis.openbis.systemtest.deletion;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.springframework.test.annotation.Rollback;
import org.testng.annotations.Test;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.create.MaterialCreation;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.id.MaterialPermId;
public class MaterialDeletionTest extends DeletionTest
......@@ -54,4 +58,44 @@ public class MaterialDeletionTest extends DeletionTest
assertPropertiesHistory(material.getCode(), "ORGANISM", "FLY [ORGANISM]", "GORILLA [ORGANISM]", "DOG [ORGANISM]");
assertPropertiesHistory(material.getCode(), "BACTERIUM", "BACTERIUM-X [BACTERIUM]", "BACTERIUM-Y [BACTERIUM]", "BACTERIUM2 [BACTERIUM]");
}
@Test
public void deleteGraphOfMaterials() throws Exception
{
MaterialCreator creator = new MaterialCreator();
MaterialPermId m1 = creator.create(null);
MaterialPermId m2 = creator.create(m1);
MaterialPermId m3 = creator.create(m1);
MaterialPermId m4 = creator.create(m3);
MaterialPermId m5 = creator.create(m3);
MaterialPermId m6 = creator.create(m1);
MaterialPermId m7 = creator.create(m6);
delete(m1, m2, m3, m4, m5, m6, m7);
}
private class MaterialCreator
{
private String baseCode;
private int counter;
MaterialCreator()
{
baseCode = "MAT-" + System.currentTimeMillis() + "-";
}
MaterialPermId create(MaterialPermId permId)
{
Map<String, String> props;
String description = "desc " + ++counter;
if (permId == null)
{
props = props("DESCRIPTION", description);
} else
{
props = props("DESCRIPTION", description, "ANY_MATERIAL", permId.toString());
}
return createMaterial(baseCode + counter, "OTHER_REF", props);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment