@@ -121,18 +121,19 @@ public void setWorkflowStatus(WorkflowStatus workflowStatus) {
121121 public void readXMLDiagram () {
122122 URI xmlDiagramURI = new File (
123123 ConfigCore .getKitodoDiagramDirectory () + encodeXMLDiagramName (this .workflow .getTitle ())).toURI ();
124-
125- try (InputStream inputStream = fileService .read (xmlDiagramURI );
126- BufferedReader bufferedReader = new BufferedReader (new InputStreamReader (inputStream ))) {
127- StringBuilder sb = new StringBuilder ();
128- String line = bufferedReader .readLine ();
129- while (Objects .nonNull (line )) {
130- sb .append (line ).append ("\n " );
131- line = bufferedReader .readLine ();
124+ if (fileService .fileExist (xmlDiagramURI )) {
125+ try (InputStream inputStream = fileService .read (xmlDiagramURI );
126+ BufferedReader bufferedReader = new BufferedReader (new InputStreamReader (inputStream ))) {
127+ StringBuilder sb = new StringBuilder ();
128+ String line = bufferedReader .readLine ();
129+ while (Objects .nonNull (line )) {
130+ sb .append (line ).append ("\n " );
131+ line = bufferedReader .readLine ();
132+ }
133+ xmlDiagram = sb .toString ();
134+ } catch (IOException e ) {
135+ Helper .setErrorMessage (e .getLocalizedMessage (), logger , e );
132136 }
133- xmlDiagram = sb .toString ();
134- } catch (IOException e ) {
135- Helper .setErrorMessage (e .getLocalizedMessage (), logger , e );
136137 }
137138 }
138139
@@ -352,7 +353,9 @@ private void saveWorkflow() throws DataException {
352353 * @return page
353354 */
354355 public String newWorkflow () {
355- return workflowEditPath + "&id=0" ;
356+ this .workflow = new Workflow ();
357+ this .workflow .setClient (ServiceManager .getUserService ().getSessionClientOfAuthenticatedUser ());
358+ return workflowEditPath + "&id=" + (Objects .isNull (this .workflow .getId ()) ? 0 : this .workflow .getId ());
356359 }
357360
358361 /**
@@ -371,27 +374,29 @@ public String duplicate(Integer itemId) {
371374 Map <String , URI > diagramsUris = getDiagramUris (baseWorkflow .getTitle ());
372375
373376 URI xmlDiagramURI = diagramsUris .get (XML_DIAGRAM_URI );
377+ URI svgDiagramURI = diagramsUris .get (SVG_DIAGRAM_URI );
374378
375379 this .workflow = ServiceManager .getWorkflowService ().duplicateWorkflow (baseWorkflow );
376380 setWorkflowStatus (WorkflowStatus .DRAFT );
377- Map <String , URI > diagramsCopyUris = getDiagramUris ();
378-
379- URI xmlDiagramCopyURI = diagramsCopyUris .get (XML_DIAGRAM_URI );
380381
382+ // Read XML diagram
381383 try (InputStream xmlInputStream = ServiceManager .getFileService ().read (xmlDiagramURI )) {
382384 this .xmlDiagram = IOUtils .toString (xmlInputStream , StandardCharsets .UTF_8 );
383- saveFile ( xmlDiagramCopyURI , this . xmlDiagram );
384- } catch ( IOException e ) {
385- Helper . setErrorMessage ( "unableToDuplicateWorkflow" , logger , e );
386- return this .stayOnCurrentPage ;
385+ }
386+ // Read SVG diagram (use a separate input stream)
387+ try ( InputStream svgInputStream = ServiceManager . getFileService (). read ( svgDiagramURI )) {
388+ this .svgDiagram = IOUtils . toString ( svgInputStream , StandardCharsets . UTF_8 ) ;
387389 }
388390 // Store duplicated workflow in Flash scope
389391 ExternalContext externalContext = FacesContext .getCurrentInstance ().getExternalContext ();
390392 externalContext .getFlash ().put ("duplicatedWorkflow" , this .workflow );
393+ externalContext .getFlash ().put ("xmlDiagram" , this .xmlDiagram );
394+ externalContext .getFlash ().put ("svgDiagram" , this .svgDiagram );
391395
392396 return workflowEditPath + "&id=0" ;
393397
394- } catch (DAOException e ) {
398+
399+ } catch (IOException | DAOException e ) {
395400 Helper .setErrorMessage (ERROR_DUPLICATE , new Object [] {ObjectType .WORKFLOW .getTranslationSingular () },
396401 logger , e );
397402 return this .stayOnCurrentPage ;
@@ -423,21 +428,28 @@ public void setWorkflowById(int id) {
423428 */
424429 public void load (int id ) {
425430 try {
426- ExternalContext externalContext = FacesContext .getCurrentInstance ().getExternalContext ();
427- Map <String , Object > flash = externalContext .getFlash ();
428- // Check if duplicated workflow is stored in Flash scope
429- if (flash .containsKey ("duplicatedWorkflow" )) {
430- this .workflow = (Workflow ) flash .get ("duplicatedWorkflow" );
431- setWorkflowStatus (workflow .getStatus ());
432- readXMLDiagram ();
433- this .dataEditorSettingsDefined = this .dataEditorSettingService .areDataEditorSettingsDefinedForWorkflow (workflow );
434- } else if (id > 0 ) {
431+ if (id > 0 ) {
435432 // Normal case: Load workflow from database
436433 Workflow workflow = ServiceManager .getWorkflowService ().getById (id );
437434 setWorkflow (workflow );
438435 setWorkflowStatus (workflow .getStatus ());
439436 readXMLDiagram ();
440437 this .dataEditorSettingsDefined = this .dataEditorSettingService .areDataEditorSettingsDefinedForWorkflow (workflow );
438+ } else {
439+ // Check if duplicated workflow is stored in Flash scope
440+ ExternalContext externalContext = FacesContext .getCurrentInstance ().getExternalContext ();
441+ Map <String , Object > flash = externalContext .getFlash ();
442+
443+ if (flash .containsKey ("duplicatedWorkflow" )) {
444+ this .workflow = (Workflow ) flash .get ("duplicatedWorkflow" );
445+ this .xmlDiagram = (String ) flash .get ("xmlDiagram" );
446+ this .svgDiagram = (String ) flash .get ("svgDiagram" );
447+ setWorkflowStatus (workflow .getStatus ());
448+ this .dataEditorSettingsDefined = this .dataEditorSettingService .areDataEditorSettingsDefinedForWorkflow (workflow );
449+ }
450+ if (this .workflow .getClient () == null ) {
451+ this .workflow .setClient (ServiceManager .getUserService ().getSessionClientOfAuthenticatedUser ());
452+ }
441453 }
442454 setSaveDisabled (false );
443455 } catch (DAOException e ) {
0 commit comments