package org.splat.service;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+
+import org.splat.dal.bo.som.Document;
+import org.splat.dal.bo.som.Scenario;
+import org.splat.dal.bo.som.Study;
+import org.splat.dal.bo.som.Document.Properties;
+import org.splat.dal.dao.som.Database;
+import org.splat.kernel.InvalidPropertyException;
+import org.splat.kernel.MissedPropertyException;
+import org.splat.kernel.NotApplicableException;
+import org.splat.service.technical.ProjectSettingsService;
+import org.splat.service.technical.ProjectSettingsServiceImpl;
+import org.splat.service.technical.ProjectSettingsServiceImpl.FileNaming;
+import org.splat.som.Step;
+
/**
* @author RKV
*
*/
public class DocumentServiceImpl implements DocumentService {
+ private StudyService _studyService;
+ private ProjectSettingsService _projectSettingsService;
+
+ public void generateDocumentId(Document aDoc, Properties dprop) {
+ Study owner = null;
+ if (dprop.getOwner() instanceof Study)
+ owner = (Study) dprop.getOwner();
+ else
+ owner = ((Scenario) dprop.getOwner()).getOwnerStudy();
+
+ SimpleDateFormat tostring = new SimpleDateFormat("yyyy");
+ String year = tostring.format(owner.getDate());
+ String filename = generateEncodedName(aDoc, owner);
+ String path = owner.getReference();
+ ProjectSettingsService.Step step = ProjectSettingsServiceImpl
+ .getStep(aDoc.getStep());
+ aDoc.setDid( new StringBuffer(path).append(".%").append(aDoc.suformat).toString()); // Document reference
+ path = new StringBuffer(year).append("/").append(path).append("/")
+ .append(step.getPath()) // File path relative to the repository vault
+ .append(filename).append(".").append(aDoc.getFile().getFormat()) // File name and extension
+ .toString();
+ aDoc.getFile().changePath(path);
+ }
+
+ private String generateEncodedName(Document aDoc, Study scope) {
+ // ------------------------------------------------
+ StringBuffer encoding = new StringBuffer();
+ FileNaming scheme = getProjectSettings().getFileNamingScheme();
+ DecimalFormat tostring = new DecimalFormat(aDoc.suformat);
+
+ int number = getStudyService().generateLocalIndex(scope);
+
+ if (scheme == FileNaming.encoded) {
+ encoding.append(scope.getReference()).append(".").append(
+ tostring.format(number));
+ } else { // title and (temporarily) asis
+ encoding.append(aDoc.getTitle()).append(".").append(tostring.format(number));
+ }
+ return encoding.toString();
+ }
+
+ private String getEncodedRootName(Document aDoc, Study scope) {
+ // -----------------------------------------------
+ FileNaming scheme = getProjectSettings().getFileNamingScheme();
+
+ if (scheme == FileNaming.encoded)
+ return scope.getReference();
+ else
+ return aDoc.getTitle();
+ }
+
+ /**
+ * Defines this document.
+ *
+ * @param dprop
+ * the properties of the document
+ *
+ * @see Step#createDocument(Properties)
+ * @see #isUndefined()
+ */
+ public void initialize(Document aDoc, Properties dprop) throws MissedPropertyException,
+ InvalidPropertyException, NotApplicableException {
+ // --------------------------------------------
+ if (!aDoc.isUndefined())
+ throw new NotApplicableException(
+ "Cannot initialize an existing Document");
+ if (dprop.getName() == null)
+ throw new MissedPropertyException("name");
+ if (dprop.getName().length() == 0)
+ throw new InvalidPropertyException("name");
+ if (dprop.getOwner() == null)
+ throw new MissedPropertyException("owner");
+ // if (dprop.owner instanceof Study && !ProjectSettings.getStep(step).appliesTo(Study.class)) {
+ // throw new InvalidPropertyException("step");
+ // }
+ aDoc.setTitle(dprop.getName());
+ aDoc.getFile().changePath(aDoc.getFile().getRelativePath().replace("%n",
+ getEncodedRootName(aDoc, (Study) dprop.getOwner())));
+ if (aDoc.getHistory() == -1)
+ aDoc.setHistory( 0 );
+ if (dprop.getDate() == null) {
+ Calendar current = Calendar.getInstance();
+ aDoc.setLastModificationDate(current.getTime()); // Today
+ } else {
+ aDoc.setLastModificationDate(dprop.getDate());
+ }
+ Database.getSession().update(aDoc);
+ }
+
+ /**
+ * Get the studyService.
+ * @return the studyService
+ */
+ public StudyService getStudyService() {
+ return _studyService;
+ }
+
+ /**
+ * Set the studyService.
+ * @param studyService the studyService to set
+ */
+ public void setStudyService(StudyService studyService) {
+ _studyService = studyService;
+ }
+
+ /**
+ * Get project settings.
+ *
+ * @return Project settings service
+ */
+ private ProjectSettingsService getProjectSettings() {
+ return _projectSettingsService;
+ }
+
+ /**
+ * Set project settings service.
+ *
+ * @param projectSettingsService
+ * project settings service
+ */
+ public void setProjectSettings(ProjectSettingsService projectSettingsService) {
+ _projectSettingsService = projectSettingsService;
+ }
+
}