package org.splat.service;
-import java.awt.Graphics2D;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Scanner;
import java.util.Set;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;
import org.hibernate.Criteria;
-import org.hibernate.Hibernate;
import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
-import org.hibernate.proxy.HibernateProxy;
-import org.jfree.chart.ChartFactory;
-import org.jfree.chart.JFreeChart;
-import org.jfree.chart.plot.PlotOrientation;
-import org.jfree.data.xy.XYSeries;
-import org.jfree.data.xy.XYSeriesCollection;
-import org.splat.common.properties.MessageKeyEnum;
import org.splat.dal.bo.kernel.Relation;
import org.splat.dal.bo.kernel.User;
import org.splat.dal.bo.som.ActorRelation;
import org.splat.dal.bo.som.DescriptionAttribute;
import org.splat.dal.bo.som.DocumentType;
import org.splat.dal.bo.som.IDBuilder;
+import org.splat.dal.bo.som.KnowledgeElement;
import org.splat.dal.bo.som.ProgressState;
-import org.splat.dal.bo.som.ProjectElement;
import org.splat.dal.bo.som.Publication;
+import org.splat.dal.bo.som.ReaderRelation;
import org.splat.dal.bo.som.Scenario;
import org.splat.dal.bo.som.SimulationContext;
import org.splat.dal.bo.som.Study;
import org.splat.dal.bo.som.ValidationCycle.Actor;
import org.splat.dal.dao.som.DescriptionAttributeDAO;
import org.splat.dal.dao.som.DocumentDAO;
+import org.splat.dal.dao.som.DocumentTypeDAO;
import org.splat.dal.dao.som.IDBuilderDAO;
import org.splat.dal.dao.som.PublicationDAO;
import org.splat.dal.dao.som.ScenarioDAO;
import org.splat.dal.dao.som.UsedByRelationDAO;
import org.splat.dal.dao.som.ValidationCycleDAO;
import org.splat.exception.BusinessException;
-import org.splat.exception.IncompatibleDataException;
import org.splat.exception.InvalidParameterException;
import org.splat.kernel.InvalidPropertyException;
-import org.splat.kernel.MismatchException;
import org.splat.kernel.MissedPropertyException;
import org.splat.kernel.MultiplyDefinedException;
import org.splat.log.AppLogger;
-import org.splat.service.dto.DocToCompareDTO;
-import org.splat.service.dto.DocumentDTO;
-import org.splat.service.dto.StudyFacadeDTO;
+import org.splat.service.dto.UserDTO;
import org.splat.service.technical.IndexService;
import org.splat.service.technical.ProjectSettingsService;
import org.splat.service.technical.ProjectSettingsServiceImpl;
import org.splat.service.technical.RepositoryService;
-import org.splat.service.technical.ProjectSettingsService.Step;
import org.splat.som.Revision;
+import org.splat.util.BeanHelper;
import org.springframework.transaction.annotation.Transactional;
-import com.lowagie.text.Document;
-import com.lowagie.text.DocumentException;
-import com.lowagie.text.Rectangle;
-import com.lowagie.text.pdf.DefaultFontMapper;
-import com.lowagie.text.pdf.PdfContentByte;
-import com.lowagie.text.pdf.PdfTemplate;
-import com.lowagie.text.pdf.PdfWriter;
-
/**
* This class defines all methods for creation, modification the study.
*
* Injected description attribute DAO.
*/
private DescriptionAttributeDAO _descriptionAttributeDAO;
+ /**
+ * Injected document type DAO.
+ */
+ private DocumentTypeDAO _documentTypeDAO;
/**
* {@inheritDoc}
*/
@Transactional
public boolean addContributor(final Study aStudy, final User user) {
- List<User> contributor = getModifiableContributors(aStudy); // Initializes contributor
- for (Iterator<User> i = contributor.iterator(); i.hasNext();) {
- User present = i.next();
- if (present.equals(user)) {
- return false;
+ List<User> contributors = getModifiableContributors(aStudy); // Initializes contributor
+
+ if (contributors.contains(user)) {
+ return false;
+ }
+
+ // Remove user from readers
+ try {
+ List<UserDTO> readers = getReaders(aStudy.getIndex());
+ for (UserDTO reader : readers) {
+ if (reader.getIndex() == user.getIndex()) {
+ // user must be the actual user in the relationship object in the aStudy object for this to work
+ aStudy.removeRelation(ReaderRelation.class, user);
+ }
}
+ } catch (InvalidParameterException e) {
+ LOG.error(e.getMessage(), e);
}
+
boolean absent = getModifiableActors(aStudy).add(user); // User may already be a reviewer or an approver
aStudy.addRelation(new ContributorRelation(aStudy, user));
return true;
}
- /**
- * Moves this study from the Public to the Reference area of the repository. For being moved to the Reference area, the study must
- * previously be approved.
- *
- * @param aStudy
- * the study to move
- * @return true if the move succeeded.
- * @see #moveToPublic()
- * @see #isPublic()
- * @see Publication#approve(Date)
- */
- public boolean moveToReference(final Study aStudy) {
- if (aStudy.getProgressState() != ProgressState.APPROVED) {
- return false;
- }
- if (aStudy.getVisibility() != Visibility.PUBLIC) {
- return false;
- }
-
- aStudy.setVisibility(Visibility.REFERENCE);
- if (update(aStudy)) {
- return updateKnowledgeElementsIndex(aStudy); // If fails, the database roll-back is under responsibility of the caller
- }
- return false;
- }
-
/**
* {@inheritDoc}
*
* @see org.splat.service.StudyService#update(org.splat.dal.bo.som.Study, org.splat.dal.bo.som.Study.Properties)
*/
+ @Transactional
public boolean update(final Study aStudy, final Properties sprop)
throws InvalidPropertyException {
if (sprop.getTitle() != null) {
*/
@Transactional
public boolean removeContributor(final Study aStudy, final User... users) {
- List<User> contributor = getModifiableContributors(aStudy); // Initializes contributor
+ List<User> contributors = getModifiableContributors(aStudy); // Initializes contributor
Boolean done = false;
- for (int i = 0; i < users.length; i++) {
- User user = users[i];
- for (Iterator<User> j = contributor.iterator(); j.hasNext();) {
- User present = j.next();
- if (!present.equals(user)) {
- continue;
- }
-
+ for (User user : users) {
+ if (contributors.contains(user)) {
aStudy.removeRelation(ContributorRelation.class, user);
- j.remove(); // Updates the contributor shortcut
+ contributors.remove(user);
done = true;
- break;
}
}
if (done) {
*
* @see org.splat.service.StudyService#removeProjectContext(org.splat.dal.bo.som.Study, org.splat.dal.bo.som.SimulationContext)
*/
+ @Transactional
public boolean removeProjectContext(final Study aStudy,
final SimulationContext context) {
boolean done = getStepService().removeSimulationContext(
ValidationCycleRelation link = cycle.getContext();
aStudy.addRelation(link);
+ getValidationCycleDAO().flush();
aStudyDTO.getAllRelations().add(link); // RKV
validactor.put(cname, link.getTo()); // Replaces the cycle if exists as default,
update(aStudy); // Re-index the study, just in case
}
- /**
- * Demotes this study from In-Check to In-Draft then In-Work states. This function is called internally when demoting the final result
- * document of the study.
- *
- * @param aStudy
- * a study to demote
- * @return true if the demotion succeeded.
- */
- public boolean demote(final Study aStudy) {
- if (aStudy.getProgressState() == ProgressState.inCHECK) {
- aStudy.setProgressState(ProgressState.inDRAFT);
- } else if (aStudy.getProgressState() == ProgressState.inDRAFT) {
- aStudy.setProgressState(ProgressState.inWORK);
- } else {
- return false;
- }
- return update(aStudy);
- }
-
/**
* {@inheritDoc}
*
}
/**
- * Promotes this study from In-Work to In-Draft then In-Check and APPROVED states. This function is called internally when promoting the
- * final result document of the study.
+ * Promotes this study from In-Work to In-Draft then In-Check and APPROVED <BR>
+ * states. This function takes into account statuses of final result<BR>
+ * documents of the study.
*
* @param aStudy
* a study to promote
- * @return true if the demotion succeeded.
+ * @return true if the promotion succeeded.
*/
@Transactional
public boolean promote(final Study aStudy) {
- if (aStudy.getProgressState() == ProgressState.inWORK) {
+ boolean res = true;
+ ValidationCycle cycle = getValidationCycleOf(aStudy,
+ getStudyResultType(aStudy));
+
+ if (aStudy.getProgressState() == ProgressState.inWORK
+ && cycle.enables(ValidationStep.REVIEW)
+ && canBePromoted(aStudy)) {
aStudy.setProgressState(ProgressState.inDRAFT);
- } else if (aStudy.getProgressState() == ProgressState.inDRAFT) {
+ } else if (((!cycle.enables(ValidationStep.REVIEW) && ((aStudy
+ .getProgressState() == ProgressState.inWORK) || (aStudy
+ .getProgressState() == ProgressState.inDRAFT))) || (cycle
+ .enables(ValidationStep.REVIEW) && (aStudy.getProgressState() == ProgressState.inDRAFT)))
+ && canBeReviewed(aStudy)) {
aStudy.setProgressState(ProgressState.inCHECK);
Revision myvers = new Revision(aStudy.getVersion());
if (myvers.isMinor()) {
aStudy.setVersion(myvers.incrementAs(aStudy.getProgressState())
.toString());
}
- } else if (aStudy.getProgressState() == ProgressState.inCHECK) {
+ } else if (aStudy.getProgressState() == ProgressState.inCHECK
+ && canBeApproved(aStudy)) {
aStudy.setProgressState(ProgressState.APPROVED);
+ updateKnowledgeElementsState(aStudy);
} else {
- return false;
+ res = false;
+ }
+ if (res) {
+ res = update(aStudy);
}
- return update(aStudy);
+ return res;
+ }
+
+ /**
+ * Demotes this study from In-Check or In-Draft to In-Work states.
+ *
+ * @param aStudy
+ * a study to demote
+ * @return true if the demotion succeeded.
+ */
+ @Transactional
+ public boolean demote(final Study aStudy) {
+ boolean res;
+
+ if (aStudy.getProgressState() == ProgressState.inCHECK
+ || aStudy.getProgressState() == ProgressState.inDRAFT) {
+ aStudy.setProgressState(ProgressState.inWORK);
+ res = update(aStudy);
+ } else {
+ res = false;
+ }
+ return res;
}
/**
if (aStudy.getVisibility() == Visibility.PRIVATE) {
aStudy.setVisibility(Visibility.PUBLIC);
if (update(aStudy)) {
- isOk = updateKnowledgeElementsIndex(aStudy); // If fails, the database roll-back is under responsibility of the caller
+ isOk = updateKnowledgeElementsState(aStudy); // If fails, the database roll-back is under responsibility of the caller
}
}
return isOk;
if (aStudy.getVisibility() == Visibility.PUBLIC) {
aStudy.setVisibility(Visibility.PRIVATE);
if (update(aStudy)) {
- isOk = updateKnowledgeElementsIndex(aStudy); // If fails, the database roll-back is under responsibility of the caller
+ isOk = updateKnowledgeElementsState(aStudy); // If fails, the database roll-back is under responsibility of the caller
}
}
return isOk;
* the study to update
* @return true if the study is updated successfully
*/
- @Transactional
private boolean update(final Study aStudy) {
boolean isOk = false;
try {
}
/**
- * Update lucene index for the study knowledge elements.
+ * Update knowledge elements states.
*
* @param aStudy
* the study
- * @return true if reindexing succeeded
+ * @return true if succeeded
*/
- private boolean updateKnowledgeElementsIndex(final Study aStudy) {
- // boolean isOk = false;
- // try {
- // IndexService lucin = getIndex();
- //
- // for (Iterator<Scenario> i = aStudy.getScenariiList().iterator(); i
- // .hasNext();) {
- // Scenario scene = i.next();
- // for (Iterator<KnowledgeElement> j = scene
- // .getAllKnowledgeElements().iterator(); j.hasNext();) {
- // KnowledgeElement kelm = j.next();
- // lucin.update(kelm);
- // }
- // }
- // isOk = true;
- // } catch (Exception error) {
- // LOG.error("Unable to re-index Knowledge Elements, reason:",
- // error);
- // }
- // return isOk;
+ private boolean updateKnowledgeElementsState(final Study aStudy) {
+ for (Scenario scenario : aStudy.getScenariiList()) {
+ for (KnowledgeElement element : scenario.getAllKnowledgeElements()) {
+ element.setProgressState(aStudy.getProgressState());
+ }
+ }
return true;
}
*/
public ValidationCycle getValidationCycleOf(final Study aStudy,
final DocumentType type) {
- if (aStudy.getValidationCycles() == null
- || aStudy.getValidationCycles().isEmpty()) {
- setShortCuts(aStudy);
+ ValidationCycle result = null;
+ if (aStudy != null) {
+ if (aStudy.getValidationCycles() == null
+ || aStudy.getValidationCycles().isEmpty()) {
+ setShortCuts(aStudy);
+ }
+ if (type != null) {
+ result = aStudy.getValidationCycles().get(type.getName());
+ }
}
- ValidationCycle result = aStudy.getValidationCycles().get(
- type.getName());
- if (result == null) {
- if (type.isStepResult()) {
+ if ((result == null) && (aStudy != null)) {
+ if ((type == null) || type.isStepResult()) {
result = aStudy.getValidationCycles().get("default"); // "default" validation cycle defined in the configuration, if exist
}
if (result == null) {
*
* @see org.splat.service.StudyService#markStudyAsReference(org.splat.dal.bo.som.Study)
*/
- @Override
@Transactional
- public void markStudyAsReference(final Study aStudy) {
-
- aStudy.setMarkreference(1);
- aStudy.setProgressState(ProgressState.TEMPLATE);
- getStudyDAO().merge(aStudy);
+ public boolean markStudyAsReference(final Study aStudy) {
+ boolean res = false;
+ if (aStudy.getProgressState() == ProgressState.APPROVED) {
+ aStudy.setMarkreference(1);
+ aStudy.setProgressState(ProgressState.TEMPLATE);
+ res = updateKnowledgeElementsState(aStudy);
+ getStudyDAO().merge(aStudy);
+ }
+ return res;
}
/**
*
* @see org.splat.service.StudyService#removeStudyAsReference(org.splat.dal.bo.som.Study)
*/
- @Override
@Transactional
public void removeStudyAsReference(final Study aStudy) {
-
aStudy.setMarkreference(0);
aStudy.setProgressState(ProgressState.APPROVED);
+ updateKnowledgeElementsState(aStudy);
getStudyDAO().merge(aStudy);
}
*
* @see org.splat.service.StudyService#setDescription(java.lang.Long, java.lang.String)
*/
- @Override
@Transactional
public void setDescription(final Long studyId, final String descriptionText)
throws InvalidParameterException {
*
* @see org.splat.service.StudyService#removeStudyDescription(java.lang.Long)
*/
- @Override
@Transactional
public boolean removeDescription(final Long studyId)
throws InvalidParameterException {
}
/**
- *
* {@inheritDoc}
*
- * @see org.splat.service.StudyService#compare(java.util.List)
+ * @see org.splat.service.StudyService#getReaders(long)
*/
- @Override
- public String compare(final List<DocToCompareDTO> docsList,
- final String userName) throws IncompatibleDataException {
-
- String axis1Name = "";
- String axis2Name = "";
- String chartTitle = "";
- String resultPath = "";
-
- XYSeriesCollection dataset = new XYSeriesCollection();
-
- Iterator<DocToCompareDTO> docListIter = docsList.iterator();
-
- for (; docListIter.hasNext();) {
-
- DocToCompareDTO docDTO = docListIter.next();
- String pathToFile = docDTO.getPathToFile();
- File compDocFile = new File(pathToFile);
-
- resultPath = pathToFile.substring(0, pathToFile.indexOf("vault"))
- + "downloads" + File.separator + userName + File.separator
- + "ComparisonResult.pdf";
-
- XYSeries series = new XYSeries("Study: " + docDTO.getStudyTitle()
- + " Scenario: " + docDTO.getScenarioTitle() + " Document: "
- + docDTO.getDocumentTitle());
-
- // read the file and get points information.
- try {
- Scanner input = new Scanner(compDocFile);
-
- // get the title of the chart.
- if (input.hasNext()) {
- chartTitle = input.nextLine();
- }
-
- // get the name of the axis.
- if (input.hasNext()) {
- String[] tokens = input.nextLine().split(",");
-
- if (tokens.length < 2) {
- throw new IncompatibleDataException(
- MessageKeyEnum.IDT_000001.toString());
- }
-
- if ("".equals(axis1Name)) {
- axis1Name = tokens[0];
- } else if (!axis1Name.equals(tokens[0])) {
- LOG.debug("Axis must be the same for all documents");
- throw new IncompatibleDataException(
- MessageKeyEnum.IDT_000001.toString());
- }
-
- if ("".equals(axis2Name)) {
- axis2Name = tokens[1];
- } else if (!axis2Name.equals(tokens[1])) {
- LOG.debug("Axis must be the same for all documents");
- throw new IncompatibleDataException(
- MessageKeyEnum.IDT_000001.toString());
- }
- }
-
- // Get the XY points series.
- while (input.hasNext()) {
-
- String currentString = input.nextLine();
-
- if (!("".equals(currentString))) {
- String[] tokens = currentString.split(" ");
- series.add(Double.valueOf(tokens[0]), Double
- .valueOf(tokens[1]));
- }
-
- } // while
+ @Transactional(readOnly = true)
+ public List<UserDTO> getReaders(final long studyId)
+ throws InvalidParameterException {
+ Study aStudy = selectStudy(studyId);
+ if (aStudy == null) {
+ throw new InvalidParameterException(PARAM_STUDY_ID, String
+ .valueOf(studyId));
+ }
+ List<Relation> relations = aStudy.getRelations(ReaderRelation.class);
+ List<UserDTO> result = new ArrayList<UserDTO>();
+ for (Relation relation : relations) {
+ result.add(BeanHelper.copyBean(relation.getTo(), UserDTO.class));
+ }
+ return Collections.unmodifiableList(result);
+ }
- dataset.addSeries(series);
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.StudyService#addReader(long, long)
+ */
+ @Transactional
+ public boolean addReader(final long studyId, final long userId)
+ throws InvalidParameterException {
+ Study aStudy = selectStudy(studyId);
+ if (aStudy == null) {
+ throw new InvalidParameterException(PARAM_STUDY_ID, String
+ .valueOf(studyId));
+ }
+ User user = _userService.selectUser(userId);
+ if (user == null) {
+ throw new InvalidParameterException("userId", String
+ .valueOf(userId));
+ }
- } catch (FileNotFoundException e) {
- LOG.error("Sorry, the file is not found.", e);
+ for (Relation relation : aStudy.getRelations(ReaderRelation.class)) {
+ if (user.equals(relation.getTo())) {
+ return false;
}
- } // for
-
- JFreeChart chart = ChartFactory.createXYLineChart(chartTitle, // Title
- axis1Name, // x-axis Label
- axis2Name, // y-axis Label
- dataset, // Dataset
- PlotOrientation.VERTICAL, // Plot Orientation
- true, // Show Legend
- true, // Use tooltips
- false // Configure chart to generate URLs?
- );
-
- // export to PDF - file.
- int x = 500;
- int y = 300;
- Rectangle pagesize = new Rectangle(x, y);
- Document document = new Document(pagesize, 50, 50, 50, 50);
- PdfWriter writer;
- try {
- File resFile = new File(resultPath);
- File resFolder = new File(resultPath.substring(0, resultPath
- .lastIndexOf(File.separator)));
- resFolder.mkdirs();
- writer = PdfWriter.getInstance(document, new FileOutputStream(
- resFile));
-
- document.open();
- PdfContentByte cb = writer.getDirectContent();
- PdfTemplate tp = cb.createTemplate(x, y);
- Graphics2D g2 = tp.createGraphics(x, y, new DefaultFontMapper());
- chart.draw(g2, new java.awt.Rectangle(x, y));
- g2.dispose();
- cb.addTemplate(tp, 0, 0);
- document.close();
+ }
+ aStudy.addRelation(new ReaderRelation(aStudy, user));
+ update(aStudy);
+ return true;
+ }
- } catch (FileNotFoundException e) {
- LOG.error("Sorry, the file is not found.", e);
- } catch (DocumentException e) {
- LOG.error("Sorry, the DocumentException is thrown.", e);
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.StudyService#removeReader(long, long)
+ */
+ @Transactional
+ public boolean removeReader(final long studyId, final long userId)
+ throws InvalidParameterException {
+ Study aStudy = selectStudy(studyId);
+ if (aStudy == null) {
+ throw new InvalidParameterException(PARAM_STUDY_ID, String
+ .valueOf(studyId));
+ }
+ User user = _userService.selectUser(userId);
+ if (user == null) {
+ throw new InvalidParameterException("userId", String
+ .valueOf(userId));
}
- return resultPath;
+ Relation relation = aStudy.removeRelation(ReaderRelation.class, user);
+ update(aStudy);
+ return relation != null;
}
/**
_userService = userService;
}
- /**
- * {@inheritDoc}
- *
- * @see org.splat.service.StudyService#getComparableStudies()
- */
- @Transactional(readOnly = true)
- public List<StudyFacadeDTO> getComparableStudies(final long userId)
- throws MismatchException {
- // retrieve the number of the "Analyze the results" step
- List<Step> allSteps = _projectSettings.getAllSteps();
- Step theAnalyzeStep = null;
- for (Step step : allSteps) {
- if (step.getKey().equals("postprocessing")) {
- theAnalyzeStep = step;
- }
- }
- if (theAnalyzeStep == null) { // TODO: throw some other exception
- throw new MismatchException(
- "no step with key 'postprocessing' found."
- + "Probably, customization settings have been changed.");
- }
-
- List<Publication> publications = _publicationDAO.getFilteredList(
- "mydoc", Restrictions.eq("step", Integer.valueOf(theAnalyzeStep
- .getNumber())));
-
- // split retrieved publications into groups by studies and scenarios
- Map<Study, List<ProjectElement>> studyMap = new HashMap<Study, List<ProjectElement>>();
- Map<ProjectElement, List<Publication>> scenarioMap = new HashMap<ProjectElement, List<Publication>>();
-
- for (Publication publication : publications) {
- // filter out publications corresponding to a document of given step which is not a _result_ document
- if (!publication.value().getType().isResultOf(theAnalyzeStep)
- || !"srd".equals(publication.getSourceFile().getFormat())) {
- continue;
- }
-
- // check the study visibility to the user
- if (!isStaffedBy(publication.getOwnerStudy(), _userService
- .selectUser(userId))
- && Visibility.PUBLIC.equals(publication.getOwnerStudy()
- .getVisibility())) {
- continue;
- }
-
- Study study = publication.getOwnerStudy();
- ProjectElement scenario = publication.getOwner();
-
- Hibernate.initialize(scenario);
- if (scenario instanceof HibernateProxy) {
- scenario = (ProjectElement) ((HibernateProxy) scenario)
- .getHibernateLazyInitializer().getImplementation();
- }
-
- if (!(scenario instanceof Scenario)) {
- throw new MismatchException(
- "publications from postprocessing step are supposed to have owner scenario");
- }
-
- if (!studyMap.containsKey(study)) {
- studyMap.put(study, new ArrayList<ProjectElement>());
- }
-
- if (!studyMap.get(study).contains(scenario)) {
- studyMap.get(study).add(scenario);
- }
-
- if (!scenarioMap.containsKey(scenario)) {
- scenarioMap.put(scenario, new ArrayList<Publication>());
- }
- scenarioMap.get(scenario).add(publication);
- }
-
- // Create the result DTOs
- List<StudyFacadeDTO> result = new ArrayList<StudyFacadeDTO>();
- for (Study study : studyMap.keySet()) {
-
- StudyFacadeDTO studyDTO = new StudyFacadeDTO();
- studyDTO.setName(study.getTitle());
- studyDTO.setScenarios(new ArrayList<StudyFacadeDTO.ScenarioDTO>());
- result.add(studyDTO);
-
- for (ProjectElement scenario : studyMap.get(study)) {
-
- StudyFacadeDTO.ScenarioDTO scenarioDTO = new StudyFacadeDTO.ScenarioDTO();
- scenarioDTO.setName(scenario.getTitle());
- scenarioDTO.setDocs(new ArrayList<DocumentDTO>());
- studyDTO.getScenarios().add(scenarioDTO);
-
- for (Publication publication : scenarioMap.get(scenario)) {
-
- DocumentDTO documentDTO = new DocumentDTO();
- documentDTO.setId(publication.getIndex());
- documentDTO.setTitle(publication.value().getTitle());
-
- scenarioDTO.getDocs().add(documentDTO);
- }
- }
- }
- return result;
- }
-
/**
* Get the publicationDAO.
*
_usedByRelationDAO = usedByRelationDAO;
}
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.StudyService#getStudyResultType(org.splat.dal.bo.som.Study)
+ */
+ @Override
+ @Transactional(readOnly = true)
+ public DocumentType getStudyResultType(final Study study) {
+ DetachedCriteria query = DetachedCriteria.forClass(DocumentType.class)
+ .addOrder(Order.desc("result"));
+ return getDocumentTypeDAO().getFirstResult(query);
+ }
+
+ /**
+ * Get the documentTypeDAO.
+ *
+ * @return the documentTypeDAO
+ */
+ public DocumentTypeDAO getDocumentTypeDAO() {
+ return _documentTypeDAO;
+ }
+
+ /**
+ * Set the documentTypeDAO.
+ *
+ * @param documentTypeDAO
+ * the documentTypeDAO to set
+ */
+ public void setDocumentTypeDAO(final DocumentTypeDAO documentTypeDAO) {
+ _documentTypeDAO = documentTypeDAO;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.StudyService#canBeApproved(org.splat.dal.bo.som.Study)
+ */
+ @Override
+ @Transactional(readOnly = true)
+ public boolean canBeApproved(final Study study) {
+ return resultDocsAtLeast(study, ProgressState.APPROVED);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.StudyService#canBePromoted(org.splat.dal.bo.som.Study)
+ */
+ @Override
+ @Transactional(readOnly = true)
+ public boolean canBePromoted(final Study study) {
+ boolean res;
+ if (study.getProgressState().compareTo(ProgressState.inDRAFT) < 0) {
+ res = resultDocsAtLeast(study, ProgressState.inDRAFT);
+ } else {
+ res = canBeReviewed(study);
+ }
+ return res;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.StudyService#canBeReviewed(org.splat.dal.bo.som.Study)
+ */
+ @Override
+ @Transactional(readOnly = true)
+ public boolean canBeReviewed(final Study study) {
+ return resultDocsAtLeast(study, ProgressState.inCHECK);
+ }
+
+ /**
+ * Check that all result documents of the study are at least in the given state.
+ *
+ * @param study
+ * the study to check
+ * @param state
+ * the minimal acceptable state
+ * @return true if study result documents have acceptable states
+ */
+ private boolean resultDocsAtLeast(final Study study,
+ final ProgressState state) {
+ boolean res = true;
+ // Check that all study result documents have the state APPROVED or more.
+ for (Publication pub : getProjectElementService().getLastStep(study)
+ .getResultDocuments()) {
+ res = pub.getProgressState().compareTo(state) >= 0;
+ if (!res) {
+ break;
+ }
+ }
+ return res;
+ }
}