All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.molgenis.omx.studymanager.OmxStudyManagerService Maven / Gradle / Ivy

The newest version!
package org.molgenis.omx.studymanager;

import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.apache.commons.lang3.StringUtils;
import org.molgenis.catalog.CatalogItem;
import org.molgenis.catalog.UnknownCatalogException;
import org.molgenis.data.DataService;
import org.molgenis.data.Query;
import org.molgenis.data.support.QueryImpl;
import org.molgenis.omx.auth.MolgenisUser;
import org.molgenis.omx.observ.ObservableFeature;
import org.molgenis.omx.observ.Protocol;
import org.molgenis.omx.study.StudyDataRequest;
import org.molgenis.security.user.MolgenisUserService;
import org.molgenis.study.StudyDefinition;
import org.molgenis.study.StudyDefinition.Status;
import org.molgenis.study.UnknownStudyDefinitionException;
import org.molgenis.studymanager.StudyManagerService;

import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;

public class OmxStudyManagerService implements StudyManagerService
{
	private final DataService dataService;
	private final MolgenisUserService molgenisUserService;

	public OmxStudyManagerService(DataService dataService, MolgenisUserService molgenisUserService)
	{
		if (dataService == null) throw new IllegalArgumentException("DataService is null");
		if (molgenisUserService == null) throw new IllegalArgumentException("MolgenisUserService is null");
		this.dataService = dataService;
		this.molgenisUserService = molgenisUserService;
	}

	@Override
	public List getStudyDefinitions()
	{
		Iterable studyDataRequests = dataService.findAll(StudyDataRequest.ENTITY_NAME,
				StudyDataRequest.class);

		return Lists.newArrayList(Iterables.transform(studyDataRequests,
				new Function()
				{
					@Override
					public StudyDefinition apply(StudyDataRequest studyDataRequest)
					{
						return new OmxStudyDefinition(studyDataRequest, dataService);
					}
				}));
	}

	@Override
	public List getStudyDefinitions(Status status)
	{
		return findStudyDefinitions(status, null);
	}

	@Override
	public List getStudyDefinitions(String username)
	{
		MolgenisUser user = molgenisUserService.getUser(username);
		Iterable studyDataRequest = dataService.findAll(StudyDataRequest.ENTITY_NAME,
				new QueryImpl().eq(StudyDataRequest.MOLGENISUSER, user), StudyDataRequest.class);

		return Lists.newArrayList(Iterables.transform(studyDataRequest,
				new Function()
				{
					@Override
					public StudyDefinition apply(StudyDataRequest studyDataRequest)
					{
						return new OmxStudyDefinition(studyDataRequest, dataService);
					}
				}));
	}

	@Override
	public StudyDefinition getStudyDefinition(String id) throws UnknownStudyDefinitionException
	{
		StudyDataRequest studyDataRequest = dataService.findOne(StudyDataRequest.ENTITY_NAME,
				new QueryImpl().eq(StudyDataRequest.ID, id), StudyDataRequest.class);
		if (studyDataRequest == null) throw new UnknownStudyDefinitionException("Study definition [" + id
				+ "] does not exist");

		return new OmxStudyDefinition(studyDataRequest, dataService);
	}

	@Override
	public boolean canLoadStudyData()
	{
		return false;
	}

	@Override
	public void loadStudyData(String id) throws UnknownStudyDefinitionException
	{
		if (canLoadStudyData())
		{
			// FIXME implement load study data operation
			throw new UnknownStudyDefinitionException(
					"Study data loading not support, see http://www.molgenis.org/ticket/2072");
		}
	}

	@Override
	public boolean isStudyDataLoaded(String id) throws UnknownStudyDefinitionException
	{
		if (canLoadStudyData())
		{
			// FIXME implement load study data operation
			throw new UnknownStudyDefinitionException(
					"Study data loading not support, see http://www.molgenis.org/ticket/2072");
		}
		return false;
	}

	@Override
	public boolean isStudyDataActivated(String id) throws UnknownStudyDefinitionException
	{
		// FIXME mee after isStudyDataLoaded(String id) is implemented
		return isStudyDataLoaded(id);
	}

	@Override
	public StudyDefinition createStudyDefinition(String username, String catalogId)
	{
		return createStudyDefinition(username, catalogId, UUID.randomUUID().toString());
	}

	public StudyDefinition createStudyDefinition(String username, String catalogId, String omxIdentifier)
	{
		MolgenisUser user = molgenisUserService.getUser(username);
		Protocol protocol = dataService.findOne(Protocol.ENTITY_NAME, new QueryImpl().eq(Protocol.ID, catalogId),
				Protocol.class);

		StudyDataRequest studyDataRequest = new StudyDataRequest();
		studyDataRequest.setIdentifier(omxIdentifier);
		studyDataRequest.setName(Status.DRAFT.toString());
		studyDataRequest.setProtocol(protocol);
		studyDataRequest.setMolgenisUser(user);
		studyDataRequest.setRequestDate(new Date());
		studyDataRequest.setRequestStatus(Status.DRAFT.toString().toLowerCase());
		studyDataRequest.setRequestForm("placeholder");
		dataService.add(StudyDataRequest.ENTITY_NAME, studyDataRequest);

		// workaround when you want to create and update a study definition in one transaction and you can't perform a
		// flush because don't have a reference to DataService
		dataService.getCrudRepository(StudyDataRequest.ENTITY_NAME).flush();

		return new OmxStudyDefinition(studyDataRequest, dataService);
	}

	@Override
	public void updateStudyDefinition(StudyDefinition studyDefinition) throws UnknownStudyDefinitionException
	{
		String id = studyDefinition.getId();
		Query q = new QueryImpl().eq(StudyDataRequest.ID, id);
		StudyDataRequest studyDataRequest = dataService
				.findOne(StudyDataRequest.ENTITY_NAME, q, StudyDataRequest.class);
		if (studyDataRequest == null)
		{
			throw new UnknownStudyDefinitionException("Study definition [" + id + "] does not exist");
		}

		studyDataRequest.setName(studyDataRequest.getName());
		studyDataRequest.setFeatures(Lists.newArrayList(Iterables.transform(studyDefinition.getItems(),
				new Function()
				{

					@Override
					public ObservableFeature apply(CatalogItem catalogItem)
					{
						String id = catalogItem.getId();
						ObservableFeature feature = dataService.findOne(ObservableFeature.ENTITY_NAME,
								new QueryImpl().eq(ObservableFeature.ID, id), ObservableFeature.class);
						if (feature == null)
						{
							throw new RuntimeException("Observable feature does not exist identifier: " + id);
						}

						return feature;
					}
				})));
		studyDataRequest.setRequestStatus(studyDefinition.getStatus().toString().toLowerCase());

		dataService.update(StudyDataRequest.ENTITY_NAME, studyDataRequest);
	}

	@Override
	public void submitStudyDefinition(String id, String catalogId) throws UnknownStudyDefinitionException,
			UnknownCatalogException
	{
		Query q = new QueryImpl().eq(StudyDataRequest.ID, id);
		StudyDataRequest studyDataRequest = dataService
				.findOne(StudyDataRequest.ENTITY_NAME, q, StudyDataRequest.class);
		if (studyDataRequest == null)
		{
			throw new UnknownStudyDefinitionException("Study definition [" + id + "] does not exist");
		}

		if (!studyDataRequest.getRequestStatus().equalsIgnoreCase(Status.DRAFT.toString()))
		{
			throw new RuntimeException("Study data request with status '" + studyDataRequest.getRequestStatus()
					+ "' is not submittable");
		}
		studyDataRequest.setRequestStatus(Status.SUBMITTED.toString().toLowerCase());
		dataService.update(StudyDataRequest.ENTITY_NAME, studyDataRequest);
	}

	@Override
	public void exportStudyDefinition(String id, String catalogId) throws UnknownStudyDefinitionException,
			UnknownCatalogException
	{
		throw new UnsupportedOperationException("No export functionality available for OMX");
	}

	@Override
	public List findStudyDefinitions(Status status, String search)
	{
		Query q = new QueryImpl().eq(StudyDataRequest.REQUESTSTATUS, status.toString().toLowerCase());
		if (StringUtils.isNotBlank(search))
		{
			q.search(search);
		}

		Iterable studyDataRequest = dataService.findAll(StudyDataRequest.ENTITY_NAME, q,
				StudyDataRequest.class);

		return Lists.newArrayList(Iterables.transform(studyDataRequest,
				new Function()
				{
					@Override
					public StudyDefinition apply(StudyDataRequest studyDataRequest)
					{
						return new OmxStudyDefinition(studyDataRequest, dataService);
					}
				}));
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy