package org.splat.simer;
+
/**
*
* @author Daniel Brunier-Coulin
import java.util.List;
import java.util.ResourceBundle;
-import org.apache.log4j.Logger;
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.splat.kernel.Do;
import org.splat.dal.bo.kernel.User;
-import org.splat.manox.Toolbox;
-import org.splat.manox.Writer;
-import org.splat.dal.dao.som.Database;
import org.splat.dal.bo.som.Document;
import org.splat.dal.bo.som.DocumentType;
import org.splat.dal.bo.som.KnowledgeElement;
import org.splat.dal.bo.som.ProgressState;
-import org.splat.service.ProjectElementService;
-import org.splat.service.ScenarioService;
-import org.splat.service.StepService;
-import org.splat.service.technical.RepositoryService;
import org.splat.dal.bo.som.Publication;
-import org.splat.som.Revision;
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.UsesRelation;
+import org.splat.kernel.Do;
+import org.splat.log.AppLogger;
+import org.splat.manox.Toolbox;
+import org.splat.manox.Writer;
+import org.splat.service.DocumentService;
+import org.splat.service.DocumentTypeService;
+import org.splat.service.StepService;
+import org.splat.service.StudyService;
+import org.splat.service.dto.KnowledgeElementDTO;
+import org.splat.service.technical.RepositoryService;
+import org.splat.som.Revision;
import org.splat.som.Step;
import org.splat.som.StepRights;
-import org.splat.dal.bo.som.Study;
import org.splat.som.StudyRights;
-import org.splat.wapp.Menu;
+import org.splat.util.BeanHelper;
+import org.splat.wapp.Constants;
import org.splat.wapp.ToolBar;
-
-public class OpenStudy extends OpenObject implements OpenStudyServices {
+/**
+ * Presentation of the currently open study.
+ */
+public class OpenStudy extends AbstractOpenObject implements OpenStudyServices {
/**
* Serial version ID.
*/
- protected final static Logger logger = org.splat.simer.Action.logger;
-
- private Study mystudy;
- private StudyRights urightstudy; // User rights on the open study
- private StepRights urightstep; // User rights on the selected step
- private String version;
- private String credate;
- private String lasdate;
- private Publication selecdoc;
+ protected final static AppLogger LOGGER = org.splat.simer.Action.LOG;
+
+ /**
+ * The currently open study.
+ */
+ private transient Study _mystudy;
+ /**
+ * User rights on the open study.
+ */
+ private transient StudyRights _urightstudy;
/**
- * Injected project element service.
+ * User rights on the selected step.
*/
- private ProjectElementService _projectElementService;
+ private transient StepRights _urightstep;
/**
- * Injected scenario service.
+ * The study version.
*/
- private ScenarioService _scenarioService;
+ private transient String _version;
+ /**
+ * The study creation date.
+ */
+ private transient String _credate;
+ /**
+ * The study modification date.
+ */
+ private transient String _lasdate;
+ /**
+ * The selected document publication.
+ */
+ private transient Publication _selecdoc;
/**
* Injected step service.
*/
* Injected repository service.
*/
private RepositoryService _repositoryService;
-// ==============================================================================================================================
-// Constructor
-// ==============================================================================================================================
-
- /**
- * Open the given study in the current http session.
- * @param user the current user
- * @param study the study to open
- * @return this open study object
- */
- public OpenStudy open (User user, Study study) {
-// -----------------------------------------
- ResourceBundle custom = ResourceBundle.getBundle("som", ApplicationSettings.getCurrentLocale());
- SimpleDateFormat datstring = new SimpleDateFormat(custom.getString("date.format"));
- Revision.Format verstring = new Revision.Format(getProjectSettings().getRevisionPattern());
-
- cuser = user; // May be null if nobody connected
- mystudy = study;
- selection = "0.1"; // Default selection
- selecdoc = null;
-
-// Preparation of the display
- version = verstring.format(mystudy.getVersion());
- credate = datstring.format(mystudy.getDate());
- lasdate = ""; // Not yet supported
- description = mystudy.getDescription();
- involving = new ArrayList<Step>(1);
- context = new ArrayList<SimulationContextFacade>();
- ustep = getProjectElementService().getFirstStep(mystudy);
- ustep.setActor(cuser);
- involving.add(ustep);
- for (Iterator<SimulationContext> i=ustep.getAllSimulationContexts().iterator(); i.hasNext(); ) {
- context.add( new SimulationContextFacade(i.next(), getProjectSettings().getAllSteps()) );
- }
- if (mystudy.isStaffedBy(cuser) || mystudy.hasActor(cuser)) {
-// ProgressState state = mystudy.getProgressState();
-// if (state == ProgressState.inCHECK) popup = ApplicationSettings.getPopupMenu("stapprovable");
-// else if (state == ProgressState.APPROVED) popup = ApplicationSettings.getPopupMenu("stapproved");
-/* else */ popup = ApplicationSettings.getPopupMenu("steditable");
- popup.setContext("study", new StudyRights(cuser, mystudy));
- }
- urightstudy = new StudyRights(cuser, mystudy);
- urightstep = new StepRights(cuser, ustep);
-
-//RKV menu = new StudyMenu(mystudy);
- menu = ((StudyMenu)getMenu()).init(mystudy); //RKV
- menu.selects(selection); // Initializes menu items to be displayed
- setupContents(); // Initializes documents and knowledge at ustep
- return this;
- }
-
-// ==============================================================================================================================
-// Getters
-// ==============================================================================================================================
+ /**
+ * Injected document type service.
+ */
+ private DocumentTypeService _documentTypeService;
+ /**
+ * Injected document service.
+ */
+ private DocumentService _documentService;
+ /**
+ * The injected Study service.
+ */
+ private StudyService _studyService;
+
+ // =========================================================================
+ // Constructor
+ // =========================================================================
+ /**
+ * Open the given study in the current http session.
+ *
+ * @param user
+ * the current user
+ * @param study
+ * the study to open
+ * @return this open study object
+ */
+ public OpenStudy open(final User user, final Study study) {
+ ResourceBundle custom = ResourceBundle.getBundle("som",
+ getApplicationSettings().getCurrentLocale());
+ SimpleDateFormat datstring = new SimpleDateFormat(custom
+ .getString("date.format"), getApplicationSettings()
+ .getCurrentLocale());
+ Revision.Format verstring = new Revision.Format(getProjectSettings()
+ .getRevisionPattern());
+
+ _cuser = user; // May be null if nobody connected
+ if(!study.equals(_mystudy)) {
+ _selection = "0.1"; // Default selection
+ }
+ _mystudy = study;
+ _selecdoc = null;
+
+ // Preparation of the display
+ _version = verstring.format(_mystudy.getVersion());
+ _credate = datstring.format(_mystudy.getDate());
+ _lasdate = datstring.format(_mystudy.getLastModificationDate());
+ _description = _mystudy.getDescription();
+ //_involving = new ArrayList<Step>(1);
+ _context = new ArrayList<SimulationContextFacade>();
+ if (_selection.equals("0.1")) {
+ _ustep = getProjectElementService().getFirstStep(_mystudy);
+ }
+ _ustep.setActor(_cuser);
+ if ((_involving.isEmpty()) || (_involving.get(0).getOwnerStudy().getIndex()
+ != _ustep.getOwnerStudy().getIndex())) {
+ _involving.clear();
+ _involving.add(_ustep);
+ }
+ for (Iterator<SimulationContext> i = _ustep.getAllSimulationContexts()
+ .iterator(); i.hasNext();) {
+ _context.add(new SimulationContextFacade(i.next(),
+ getProjectSettings().getAllSteps(),
+ getApplicationSettings()));
+ }
+ if (getStudyService().isStaffedBy(_mystudy, _cuser)
+ || getStudyService().hasActor(_mystudy, _cuser)) {
+ // ProgressState state = mystudy.getProgressState();
+ // if (state == ProgressState.inCHECK) popup = getApplicationSettings().getPopupMenu("stapprovable");
+ // else if (state == ProgressState.APPROVED) popup = getApplicationSettings().getPopupMenu("stapproved");
+ /* else */
+
+ if (_mystudy.getProgressState() == ProgressState.TEMPLATE) {
+ if (_mystudy.isPublic()) {
+ _popup = getApplicationSettings().getPopupMenu(
+ "steditableunmarkprivate");
+ } else {
+ _popup = getApplicationSettings().getPopupMenu(
+ "steditableunmarkpublic");
+ }
+ } else {
+
+ if (_mystudy.isPublic()) {
+ _popup = getApplicationSettings().getPopupMenu(
+ "steditablemarkprivate");
+ } else {
+ String key = null;
+ switch(_mystudy.getProgressState()) {
+ case inWORK:
+ key = "steditable";
+ break;
+ case inDRAFT:
+ key = "streviewable";
+ break;
+ case inCHECK:
+ key = "stapprovable";
+ break;
+ default: // APPROVED
+ key = "steditablemarkpublic";
+ break;
+ }
+ if(Long.valueOf(getSelectedScenarioId()) != 0) {
+ key += "ScenarioSelected";
+ }
+ _popup = getApplicationSettings().getPopupMenu(key);
+ }
+
+ }
+ _popup.setContext(Constants.STUDY_MENU, new StudyRights(_cuser,
+ _mystudy));
+ }
+ _urightstudy = new StudyRights(_cuser, _mystudy);
+ _urightstep = new StepRights(_cuser, _ustep);
+
+ // RKV menu = new StudyMenu(mystudy);
+ _menu = (getMenu()).init(_mystudy); // RKV
+ _menu.selects(_selection); // Initializes menu items to be displayed
+ setupContents(); // Initializes documents and knowledge at ustep
+ return this;
+ }
+
+ // =========================================================================
+ // Getters
+ // =========================================================================
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.dto.Proxy#getAuthorName()
+ */
+ @Override
public String getAuthorName() {
-// -----------------------------
- return mystudy.getAuthor().toString();
- }
- public Long getIndex() {
-// -------------------------
- return mystudy.getIndex();
- }
- public String getDate () {
-// ------------------------
- return credate;
- }
- public StudyMenu getMenu () {
-// ---------------------------
- return (StudyMenu)menu;
- }
- public ProgressState getProgressState() {
-// ----------------------------------------
- return mystudy.getProgressState();
- }
- public String getLastModificationDate () {
-// ----------------------------------------
- return lasdate;
- }
- public ToolBar getModuleBar () {
-// ------------------------------
- return ApplicationSettings.getMe().getModuleBar(getSelectedStep());
- }
- public String getReference() {
-// ----------------------------
- return mystudy.getReference();
- }
- public Publication getSelectedDocument () {
-// -----------------------------------------
- return selecdoc;
- }
- public StepRights getSelectedStepRights () {
-// ------------------------------------------
- return urightstep;
- }
- public StudyRights getStudyRights () {
-// ------------------------------------
- return urightstudy;
- }
- public Study getStudyObject () {
-// ------------------------------
- return mystudy;
- }
- public String getTitle() {
-// ------------------------
- return mystudy.getTitle();
- }
- public String getType () {
-// ------------------------
- return ResourceBundle.getBundle("labels", ApplicationSettings.getCurrentLocale()).getString("label.study");
- }
- public String getVersion () {
-// ---------------------------
- return version;
- }
- public boolean isStepEnabled () {
-// -------------------------------
- return urightstep.isEnabled();
- }
-
-// ==============================================================================================================================
-// Public services
-// ==============================================================================================================================
-
- public URL newTemplateBasedDocument (String typename, User author) {
-// ------------------------------------------------------------------
- String filename = typename + ".xml"; // Only XML templates are writeable
- File template = new File(getRepositoryService().getTemplatePath() + filename);
- if (!template.exists()) return null;
-
- Session connex = Database.getSession();
- Transaction transax = connex.beginTransaction();
- try {
- File udir = getRepositoryService().getDownloadDirectory(author);
- File credoc = new File(udir.getPath() + "/" + filename);
-
-// Creation of the meta-document
- Step step = getSelectedStep(); // Should we check if the given document type is compatible ?
- DocumentType type = Document.selectType(typename);
- Document.Properties dprop = new Document.Properties();
- Document medoc = getStepService().createDocument(step, dprop.setType(type).setFormat("xml").setAuthor(author)).value();
- transax.commit();
-
-// Instantiation of the template into the user download directory
- if (!udir.exists()) udir.mkdir();
- if (credoc.exists()) credoc.delete();
- Do.copy(template, credoc);
-
-// Transfer to the document of all known properties
- ResourceBundle locale = ResourceBundle.getBundle("som", ApplicationSettings.getCurrentLocale());
- SimpleDateFormat get = new SimpleDateFormat(locale.getString("date.format"));
- Writer tool = Toolbox.getWriter(credoc);
- List<Step> slist = getInvolvedSteps();
- for (Iterator<Step> i=slist.iterator(); i.hasNext(); ) {
- List<SimulationContext> clist = i.next().getAllSimulationContexts();
- for (Iterator<SimulationContext> j=clist.iterator(); j.hasNext(); ) {
- SimulationContext context = j.next();
- tool.updateProperty(context.getType().getName(), context.getValue());
- }
- }
- tool.updateProperty("reference", medoc.getReference());
- tool.updateProperty("study", mystudy.getTitle());
- tool.updateProperty("step", locale.getString("folder.step." + step.getNumber()).replaceAll("''", "'"));
- tool.updateProperty("author", author.getUsername().toUpperCase());
- tool.updateProperty("date", get.format(medoc.getCreationDate()));
- tool.updateProperty("history", locale.getString("label.creation").replaceAll("''", "'"));
- tool.save();
-
- return new URL(ApplicationSettings.getDownloadURL(author) + filename);
- }
- catch (Exception saverror) {
- logger.error("Reason:", saverror);
- if (transax != null && transax.isActive()) {
-// Second try-catch as the rollback could fail as well
- try {
- transax.rollback();
- } catch (HibernateException backerror) {
- logger.debug("Error rolling back transaction", backerror);
- }
- }
- return null;
- }
- }
-
- public void selectDocument (String docurl) {
-// ------------------------------------------
- String prefix = ApplicationSettings.getRepositoryURL();
-
- if (docurl.startsWith(prefix)) try {
- Session connex = Database.getSession();
- Transaction transax = connex.beginTransaction();
- String path = docurl.substring(prefix.length());
- String[] parse = path.split("'");
-
- path = parse[0];
- for (int i=1; i<parse.length; i++) path = path + "''" + parse[i];
-// Better call Database.selectDocument(path), but this service does not exist (overloading issue)
- String query = "from Document where path='" + path + "'";
- Document value = (Document)Database.getSession().createQuery(query).uniqueResult();
-
- selecdoc = ustep.getDocument(value.getIndex());
- transax.commit();
- }
- catch (Exception error) {
- logger.error("Reason:", error);
- }
- }
-
- public void setSelection (String step) {
-// --------------------------------------
- if (!step.equals(selection)) {
- selection = step;
- selecdoc = null;
- setupPreviousToSelectedSteps();
- updateSimulationContexts(); // Initializes contexts according to the selected steps
- }
- ustep = involving.get(involving.size()-1);
- urightstep = new StepRights(cuser, ustep);
- ustep.setActor(cuser);
- menu.selects(selection); // Updates menu items to be displayed
- setupContents(); // The contents may have changed even if the selection is the same
- }
-
-// ==============================================================================================================================
-// Protected services
-// ==============================================================================================================================
-
- protected void add (Publication doc) {
-// ------------------------------------
- DocumentFacade facade = new DocumentFacade(this, doc, getProjectSettings(), getPublicationService());
- boolean first = (contents.size() == 0);
-
- docpres.put(doc.getIndex(), facade);
- contents.add(0, facade); // Prepend the new publication
- if (first) this.getMenu().refreshSelectedItem();
-
- }
-
- protected void add (SimulationContext contex) {
-// ---------------------------------------------
- SimulationContextFacade facade = new SimulationContextFacade(contex, getProjectSettings().getAllSteps());
-
- context.add(facade);
- }
-
- protected void add (KnowledgeElement kelm) {
-// ------------------------------------------
- KnowledgeElementFacade facade = new KnowledgeElementFacade(kelm);
-//RKV KnowledgeIterator known = knowledge.get(kelm.getType().getIndex() - 2);
- // Knowledges are ordered by type index, from 0 to n-1, the first one being reserved (reason for -2)
- //RKV:Begin: Find a knowledge iterator for appropriate knowledge type
- KnowledgeIterator known = null;
- for (KnowledgeIterator aKnowledgeSection : knowledge) {
- if (aKnowledgeSection.getIndex().equals(String.valueOf(kelm.getType().getIndex()))) {
- known = aKnowledgeSection;
- break;
- }
- }
- if (known != null) { //RKV:End
- knowpres.put(kelm.getIndex(), facade);
- known.list.add(facade); // Insert the new knowledge at the end of the corresponding knowledge type
- }
- }
-
- protected void remove (Publication doctag) {
-// ------------------------------------------
- for (Iterator<DocumentFacade> i=contents.iterator(); i.hasNext(); ) {
- DocumentFacade facade = i.next();
- if (!facade.isFacadeOf(doctag)) continue;
- i.remove();
- break;
- }
- if (contents.size() == 0) this.getMenu().refreshSelectedItem();
- }
-
- protected void changeUser (User user) {
-// -------------------------------------
- cuser = user;
- popup = null;
- if (mystudy.isStaffedBy(cuser)) {
- popup = ApplicationSettings.getPopupMenu("steditable");
- popup.setContext("study", new StudyRights(cuser, mystudy));
- }
- ustep.setActor(cuser);
- urightstudy = new StudyRights(cuser, mystudy);
- urightstep = new StepRights(cuser, ustep);
- }
-
- protected void remove (SimulationContext contex) {
-// ------------------------------------------------
- for (Iterator<SimulationContextFacade> i=context.iterator(); i.hasNext(); ) {
- SimulationContextFacade facade = i.next();
- if (!facade.isFacadeOf(contex)) continue;
- i.remove();
- break;
- }
- }
-
- protected void remove (KnowledgeElement kelm) {
-// ---------------------------------------------
- KnowledgeIterator known = knowledge.get((int)(kelm.getType().getIndex() - 2));
- // Knowledges are ordered by type index, from 0 to n-1, the first one being reserved (reason for -2)
- knowpres.remove(kelm.getIndex());
- for (Iterator<KnowledgeElementFacade> i=known.list.iterator(); i.hasNext(); ) {
- KnowledgeElementFacade facade = i.next();
- if (!facade.isFacadeOf(kelm)) continue;
- i.remove();
- break;
- }
- }
-
- protected void update (Publication doc) {
-// ---------------------------------------
- DocumentFacade facade = docpres.get(doc.getIndex());
- if (facade != null) {
- facade.refresh();
- }
- }
-
- protected void update (KnowledgeElement kelm) {
-// ---------------------------------------------
- KnowledgeElementFacade facade = knowpres.get(kelm.getIndex());
- if (facade != null) {
- facade.refresh();
- }
- }
-
- protected void updateSimulationContexts () {
-// ------------------------------------------
- context.clear();
- for (Iterator<Step> i=involving.iterator(); i.hasNext(); ) {
- for (Iterator<SimulationContext> j=i.next().getAllSimulationContexts().iterator(); j.hasNext(); ) {
- context.add( new SimulationContextFacade(j.next(), getProjectSettings().getAllSteps()) );
- }
- }
- }
-
-// ==============================================================================================================================
-// Private services
-// ==============================================================================================================================
-
- private void setupPreviousToSelectedSteps () {
-// --------------------------------------------
- String[] item = selection.split("\\x2E");
- int major = Integer.valueOf(item[0]);
- int minor = Integer.valueOf(item[1]);
- int base = minor;
- Step[] step;
-
- involving.clear();
- if (major > 0) {
- Scenario[] branch = mystudy.getScenarii();
- Scenario scenar = branch[0];
- for (int i=0; i<branch.length; i++) {
- scenar = branch[i];
- if (scenar.getIndex() == major) break; // Supposed exist
- }
- step = getProjectElementService().getSteps(scenar);
- base = step[0].getNumber() - 1;
- for (int i=0; i+base<minor; i++) {
- involving.add(step[i]);
- }
- }
- step = getProjectElementService().getSteps(mystudy);
- for (int i=step.length-1; i>-1; i--) {
- Step firstep = step[i];
- if(firstep.getNumber() > base) continue;
- involving.add(0, firstep);
- }
- }
-
- /**
- * Get the projectElementService.
- *
- * @return the projectElementService
- */
- public ProjectElementService getProjectElementService() {
- return _projectElementService;
- }
-
- /**
- * Set the projectElementService.
- *
- * @param projectElementService
- * the projectElementService to set
- */
- public void setProjectElementService(
- ProjectElementService projectElementService) {
- _projectElementService = projectElementService;
- }
-
- /**
- * Get the scenarioService.
- *
- * @return the scenarioService
- */
- public ScenarioService getScenarioService() {
- return _scenarioService;
- }
-
- /**
- * Set the scenarioService.
- *
- * @param scenarioService
- * the scenarioService to set
+ return _mystudy.getAuthor().toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.dto.Proxy#getIndex()
+ */
+ @Override
+ public Long getIndex() {
+ return _mystudy.getIndex();
+ }
+
+ /**
+ * Get creation date.
+ *
+ * @return the date
+ */
+ public String getDate() {
+ return _credate;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.simer.AbstractOpenObject#getMenu()
+ */
+ @Override
+ public StudyMenu getMenu() {
+ return (StudyMenu) _menu;
+ }
+
+ /**
+ * Set study menu.
+ *
+ * @param aMenu
+ * the study menu
+ */
+ public void setMenu(final StudyMenu aMenu) {
+ _menu = aMenu;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.dto.Proxy#getProgressState()
+ */
+ @Override
+ public ProgressState getProgressState() {
+ return _mystudy.getProgressState();
+ }
+
+ /**
+ * Get last modification date.
+ *
+ * @return the date
+ */
+ public String getLastModificationDate() {
+ return _lasdate;
+ }
+
+ /**
+ * Get the toolbar with buttons of available modules.
+ *
+ * @return the toolbar
+ */
+ public ToolBar getModuleBar() {
+ return getApplicationSettings().getModuleBar(getSelectedStep());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.dto.Proxy#getReference()
+ */
+ @Override
+ public String getReference() {
+ return _mystudy.getReference();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.simer.OpenStudyServices#getSelectedDocument()
+ */
+ @Override
+ public Publication getSelectedDocument() {
+ return _selecdoc;
+ }
+
+ /**
+ * Get user rights for the selected step.
+ *
+ * @return user step rights
+ */
+ public StepRights getSelectedStepRights() {
+ return _urightstep;
+ }
+
+ /**
+ * Get user rights for the study.
+ *
+ * @return user study rights
+ */
+ public StudyRights getStudyRights() {
+ return _urightstudy;
+ }
+
+ /**
+ * Get the detached study object.
+ *
+ * @return the detached study object
+ */
+ public Study getStudyObject() {
+ return _mystudy;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.dto.Proxy#getTitle()
+ */
+ @Override
+ public String getTitle() {
+ return _mystudy.getTitle();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.splat.service.dto.Proxy#getType()
+ */
+ @Override
+ public String getType() {
+ return Constants.STUDY_MENU;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.splat.simer.AbstractOpenObject#getTypeName()
+ */
+ @Override
+ public String getTypeName() {
+ return ResourceBundle.getBundle("labels", getApplicationSettings().getCurrentLocale()).getString( "label.study");
+ }
+
+ /**
+ * Get the study version.
+ *
+ * @return the version string
+ */
+ public String getVersion() {
+ return _version;
+ }
+
+ /**
+ * Check if the selected step is enabled for writing.
+ *
+ * @return true if the selected step is enabled for writing
+ */
+ public boolean isStepEnabled() {
+ return _urightstep.isEnabled();
+ }
+
+ // =========================================================================
+ // Public services
+ // =========================================================================
+
+ @Override
+ public URL newTemplateBasedDocument(final String typename, final User author) {
+ String filename = typename + ".xml"; // Only XML templates are writeable
+ File template = new File(getRepositoryService().getTemplatePath()
+ + filename);
+ if (!template.exists()) {
+ return null;
+ }
+
+ // Session connex = Database.getCurSession();
+ // Transaction transax = connex.beginTransaction();
+ try {
+ File udir = getRepositoryService().getDownloadDirectory(author);
+ File credoc = new File(udir.getPath() + "/" + filename);
+
+ // Creation of the meta-document
+ Step step = getSelectedStep(); // Should we check if the given document type is compatible ?
+ DocumentType type = getDocumentTypeService().selectType(typename);
+ Document.Properties dprop = new Document.Properties();
+ Document medoc = getStepService().createDocument(step,
+ dprop.setType(type).setFormat("xml").setAuthor(author))
+ .value();
+ // transax.commit();
+
+ // Instantiation of the template into the user download directory
+ if (!udir.exists()) {
+ udir.mkdir();
+ }
+ if (credoc.exists()) {
+ credoc.delete();
+ }
+ Do.copy(template, credoc);
+
+ // Transfer to the document of all known properties
+ ResourceBundle locale = ResourceBundle.getBundle("som",
+ getApplicationSettings().getCurrentLocale());
+ SimpleDateFormat get = new SimpleDateFormat(locale
+ .getString("date.format"), getApplicationSettings()
+ .getCurrentLocale());
+ Writer tool = Toolbox.getWriter(credoc);
+ List<Step> slist = getInvolvedSteps();
+ for (Iterator<Step> i = slist.iterator(); i.hasNext();) {
+ List<SimulationContext> clist = i.next()
+ .getAllSimulationContexts();
+ for (Iterator<SimulationContext> j = clist.iterator(); j
+ .hasNext();) {
+ SimulationContext context = j.next();
+ tool.updateProperty(context.getType().getName(), context
+ .getValue());
+ }
+ }
+ tool.updateProperty("reference", medoc.getReference());
+ tool.updateProperty(Constants.STUDY_MENU, _mystudy.getTitle());
+ tool.updateProperty("step", locale.getString(
+ "folder.step." + step.getNumber()).replaceAll("''", "'"));
+ tool.updateProperty("author", author.getUsername().toUpperCase());
+ tool.updateProperty("date", get.format(medoc.getCreationDate()));
+ tool.updateProperty("history", locale.getString("label.creation")
+ .replaceAll("''", "'"));
+ tool.save();
+
+ return new URL(getApplicationSettings().getDownloadURL(author)
+ + filename);
+ } catch (Exception saverror) {
+ LOGGER.error("Reason:", saverror);
+ return null;
+ }
+ }
+
+ public void selectDocument(final String docurl) {
+ String prefix = getApplicationSettings().getRepositoryURL();
+
+ if (docurl.startsWith(prefix)) {
+ try {
+ String path = docurl.substring(prefix.length());
+ Document value = getDocumentService().getDocumentByPath(path);
+
+ _selecdoc = _ustep.getDocument(value.getIndex());
+ } catch (Exception error) {
+ LOGGER.error("Reason:", error);
+ }
+ }
+ }
+
+ /**
+ * Select an activity (step).
+ *
+ * @param step
+ * the key of the step to select
+ */
+ public void setSelection(final String step) {
+ if (!step.equals(_selection)) {
+ _selection = step;
+ _selecdoc = null;
+ setupPreviousToSelectedSteps();
+ updateSimulationContexts(); // Initializes contexts according to the selected steps
+ }
+ _ustep = _involving.get(_involving.size() - 1);
+ _urightstep = new StepRights(_cuser, _ustep);
+ _ustep.setActor(_cuser);
+ _menu.selects(_selection); // Updates menu items to be displayed
+ setupContents(); // The contents may have changed even if the selection is the same
+ }
+
+ // =========================================================================
+ // Protected services
+ // =========================================================================
+
+ /**
+ * Add a new document presentation facade.
+ *
+ * @param doc
+ * the document publication
+ */
+ protected void add(final Publication doc) {
+ DocumentFacade facade = new DocumentFacade(this, doc,
+ getProjectSettings(), getPublicationService(),
+ getApplicationSettings());
+ boolean first = (_contents.size() == 0);
+
+ _docpres.put(doc.getIndex(), facade);
+ _contents.add(0, facade); // Prepend the new publication
+ if (first) {
+ this.getMenu().refreshSelectedItem();
+ }
+ // Refresh dependencies. They can not be removed until removing this document.
+ for (Publication pub : doc.getRelations(UsesRelation.class)) {
+ update(pub);
+ }
+ }
+
+ /**
+ * Add a simulation context presentation facade.
+ *
+ * @param contex
+ * the simulation context to add
+ */
+ protected void add(final SimulationContext contex) {
+ SimulationContextFacade facade = new SimulationContextFacade(contex,
+ getProjectSettings().getAllSteps(), getApplicationSettings());
+
+ _context.add(facade);
+ }
+
+ /**
+ * Add a knowledge element presentation facade.
+ *
+ * @param kelm
+ * the knowledge element to add
+ */
+ protected void add(final KnowledgeElement kelm) {
+ KnowledgeElementFacade facade = new KnowledgeElementFacade(BeanHelper
+ .copyBean(kelm, KnowledgeElementDTO.class),
+ getApplicationSettings());
+ // RKV KnowledgeIterator known = knowledge.get(kelm.getType().getIndex() - 2);
+ // Knowledges are ordered by type index, from 0 to n-1, the first one being reserved (reason for -2)
+ // RKV:Begin: Find a knowledge iterator for appropriate knowledge type
+ KnowledgeIterator known = null;
+ for (KnowledgeIterator aKnowledgeSection : _knowledge) {
+ if (aKnowledgeSection.getIndex().equals(
+ String.valueOf(kelm.getType().getIndex()))) {
+ known = aKnowledgeSection;
+ break;
+ }
+ }
+ if (known != null) { // RKV:End
+ _knowpres.put(kelm.getIndex(), facade);
+ known._list.add(facade); // Insert the new knowledge at the end of the corresponding knowledge type
+ }
+ }
+
+ /**
+ * Remove the document presentation facade.
+ *
+ * @param doctag
+ * the document publication to remove
+ */
+ protected void remove(final Publication doctag) {
+ for (Iterator<DocumentFacade> i = _contents.iterator(); i.hasNext();) {
+ DocumentFacade facade = i.next();
+ if (facade.isFacadeOf(doctag)) {
+ i.remove();
+ break;
+ }
+ }
+ if (_contents.size() == 0) {
+ this.getMenu().refreshSelectedItem();
+ }
+ }
+
+ /**
+ * Change the currently connected user and refresh user's rights.
+ *
+ * @param user
+ * the new connected user
+ */
+ protected void changeUser(final User user) {
+ _cuser = user;
+ _popup = null;
+ if (getStudyService().isStaffedBy(_mystudy, _cuser)) {
+ _popup = getApplicationSettings().getPopupMenu(
+ "steditablemarkpublic");
+ _popup.setContext(Constants.STUDY_MENU, new StudyRights(_cuser,
+ _mystudy));
+ }
+ // ustep = getProjectElementService().getFirstStep(mystudy);
+ if (_ustep != null) {
+ _ustep.setActor(_cuser);
+ }
+ _urightstudy = new StudyRights(_cuser, _mystudy);
+ _urightstep = new StepRights(_cuser, _ustep);
+ }
+
+ /**
+ * Remove the simulation context presentation facade.
+ *
+ * @param contex
+ * the simulation context to remove
+ */
+ protected void remove(final SimulationContext contex) {
+ for (Iterator<SimulationContextFacade> i = _context.iterator(); i
+ .hasNext();) {
+ SimulationContextFacade facade = i.next();
+ if (facade.isFacadeOf(contex)) {
+ i.remove();
+ break;
+ }
+ }
+ }
+
+ /**
+ * Remove the knowledge element presentation facade.
+ *
+ * @param kelm
+ * the knowledge element to remove
+ */
+ protected void remove(final KnowledgeElement kelm) {
+ // RKV: KnowledgeIterator known = _knowledge.get((int) (kelm.getType()
+ // RKV: .getIndex() - 2));
+ // Knowledges are ordered by type index, from 0 to n-1, the first one being reserved (reason for -2)
+ // RKV:Begin: Find a knowledge iterator for appropriate knowledge type
+ KnowledgeIterator known = null;
+ for (KnowledgeIterator aKnowledgeSection : _knowledge) {
+ if (aKnowledgeSection.getIndex().equals(
+ String.valueOf(kelm.getType().getIndex()))) {
+ known = aKnowledgeSection;
+ break;
+ }
+ }
+ if (known != null) { // RKV:End
+ _knowpres.remove(kelm.getIndex());
+ for (Iterator<KnowledgeElementFacade> i = known._list.iterator(); i
+ .hasNext();) {
+ KnowledgeElementFacade facade = i.next();
+ if (!facade.isFacadeOf(BeanHelper.copyBean(kelm,
+ KnowledgeElementDTO.class))) {
+ continue;
+ }
+ i.remove();
+ break;
+ }
+ }
+ }
+
+ /**
+ * Refresh the document presentation facade.
+ *
+ * @param doc
+ * the document publication
*/
- public void setScenarioService(ScenarioService scenarioService) {
- _scenarioService = scenarioService;
+ protected void update(final Publication doc) {
+ DocumentFacade facade = _docpres.get(doc.getIndex());
+ if (facade != null) {
+ _contents.remove(facade);
+ facade = new DocumentFacade(this, doc,
+ getProjectSettings(), getPublicationService(),
+ getApplicationSettings());
+ _docpres.put(doc.getIndex(), facade);
+ _contents.add(facade);
+ }
+ }
+
+ /**
+ * Refresh the knowledge element presentation facade.
+ *
+ * @param kelm
+ * the knowledge element DTO
+ */
+ protected void update(final KnowledgeElementDTO kelm) {
+ KnowledgeElementFacade facade = _knowpres.get(kelm.getIndex());
+ if (facade != null) {
+ facade.refresh(kelm);
+ }
+ }
+
+ /**
+ * Refresh simulation contexts presentation facades.
+ */
+ protected void updateSimulationContexts() {
+ _context.clear();
+ for (Iterator<Step> i = _involving.iterator(); i.hasNext();) {
+ for (Iterator<SimulationContext> j = i.next()
+ .getAllSimulationContexts().iterator(); j.hasNext();) {
+ _context.add(new SimulationContextFacade(j.next(),
+ getProjectSettings().getAllSteps(),
+ getApplicationSettings()));
+ }
+ }
+ }
+
+ // =========================================================================
+ // Private services
+ // =========================================================================
+
+ private void setupPreviousToSelectedSteps() {
+ String[] item = _selection.split("\\x2E");
+ int major = Integer.valueOf(item[0]);
+ int minor = Integer.valueOf(item[1]);
+ int base = minor;
+ Step[] step;
+
+ _involving.clear();
+ if (major > 0) {
+ Scenario[] branch = _mystudy.getScenarii();
+ Scenario scenar = branch[0];
+ for (int i = 0; i < branch.length; i++) {
+ scenar = branch[i];
+ if (scenar.getIndex() == major) {
+ break; // Supposed exist
+ }
+ }
+ step = getProjectElementService().getSteps(scenar);
+ base = step[0].getNumber() - 1;
+ for (int i = 0; i + base < minor; i++) {
+ _involving.add(step[i]);
+ }
+ }
+ step = getProjectElementService().getSteps(_mystudy);
+ for (int i = step.length - 1; i > -1; i--) {
+ Step firstep = step[i];
+ if (firstep.getNumber() <= base) {
+ _involving.add(0, firstep);
+ }
+ }
}
/**
* Get the stepService.
+ *
* @return the stepService
*/
public StepService getStepService() {
/**
* Set the stepService.
- * @param stepService the stepService to set
+ *
+ * @param stepService
+ * the stepService to set
*/
- public void setStepService(StepService stepService) {
+ public void setStepService(final StepService stepService) {
_stepService = stepService;
}
/**
* Get the repositoryService.
+ *
* @return the repositoryService
*/
public RepositoryService getRepositoryService() {
/**
* Set the repositoryService.
- * @param repositoryService the repositoryService to set
+ *
+ * @param repositoryService
+ * the repositoryService to set
*/
- public void setRepositoryService(RepositoryService repositoryService) {
+ public void setRepositoryService(final RepositoryService repositoryService) {
_repositoryService = repositoryService;
}
+
+ /**
+ * Get the documentTypeService.
+ *
+ * @return the documentTypeService
+ */
+ public DocumentTypeService getDocumentTypeService() {
+ return _documentTypeService;
+ }
+
+ /**
+ * Set the documentTypeService.
+ *
+ * @param documentTypeService
+ * the documentTypeService to set
+ */
+ public void setDocumentTypeService(
+ final DocumentTypeService documentTypeService) {
+ _documentTypeService = documentTypeService;
+ }
+
+ /**
+ * Get the studyService.
+ *
+ * @return the studyService
+ */
+ public StudyService getStudyService() {
+ return _studyService;
+ }
+
+ /**
+ * Set the studyService.
+ *
+ * @param studyService
+ * the studyService to set
+ */
+ public void setStudyService(final StudyService studyService) {
+ _studyService = studyService;
+ }
+
+ /**
+ * Get the documentService.
+ *
+ * @return the documentService
+ */
+ public DocumentService getDocumentService() {
+ return _documentService;
+ }
+
+ /**
+ * Set the documentService.
+ *
+ * @param documentService
+ * the documentService to set
+ */
+ public void setDocumentService(final DocumentService documentService) {
+ _documentService = documentService;
+ }
+
+ /**
+ * Get the detached study object.
+ *
+ * @return the detached study object
+ */
+ public Study getMystudy() {
+ return _mystudy;
+ }
+
+ /**
+ * Set the study to present.
+ *
+ * @param mystudy
+ * the selected study detached object
+ */
+ public void setMystudy(final Study mystudy) {
+ this._mystudy = mystudy;
+ }
+
+ /**
+ * Update the current step.
+ *
+ */
+ public final void updateCurrentStep() {
+ setupPreviousToSelectedSteps();
+ _ustep = _involving.get(_involving.size() - 1);
+ }
}
\ No newline at end of file