title: Spring REST Web Service | Update an XML and send it in response
body: <p>I am working on a Spring Restful Web service wherein I am returning an xml file as a response. This XML file is placed inside the main/resources folder of the MAVEN project build in eclipse. The service accepts certain parameters from the caller and based on those parameters, it should update the XML file. This project is deployed as WAR in the production server. On my local project, I can see the xml file being updated but in the production server it is not. How can I get this working in the production server ?</p>
  
  <p>Below is the code for controller accepting the incoming request</p>
  
  <pre><code>@RestController
  public class HelloWorldRestController {
  
  @Autowired
  UserService userService; // Service which will do all data
                              // retrieval/manipulation work
  
  @Autowired
  DialogServiceXml dialogService;
  
  // Returning an xml file in the response
  @CrossOrigin(origins = "*")
  @RequestMapping(value = "/getUpdatedDialog", method = RequestMethod.POST, produces = "application/xml")
  public ResponseEntity&lt;InputStreamResource&gt; downloadXMLFile(@RequestBody Dialog dialog,
          UriComponentsBuilder ucBuilder) throws IOException {
  
      // Update the xml file named : "mor_dialog.xml"
      dialogService.updateXml(new StringBuilder(dialog.getClassName()), new StringBuilder(dialog.getResponse()));
  
      // Pick up the updated file from the classpath
      ClassPathResource xmlFile = null;
      try {
          xmlFile = new ClassPathResource("mor_dialog.xml");
      } catch (Exception exception) {
          exception.printStackTrace();
      }
  
      // Code to prevent caching so that always the latest version of the file
      // is being sent.
      HttpHeaders httpHeaders = new HttpHeaders();
      httpHeaders.add("Cache-Control", "no-cache, np-store, must-revalidate");
      httpHeaders.add("Pragma", "no-cache");
      httpHeaders.add("Expires", "0");
      //httpHeaders.add("Access-Control-Allow-Origin", "http://nlc-mor-furniture.mybluemix.net");
  
      return ResponseEntity.ok().headers(httpHeaders).contentLength(xmlFile.contentLength())
              .contentType(MediaType.parseMediaType("application/octet-stream"))
              .body(new InputStreamResource(xmlFile.getInputStream()));
     }
  }
  </code></pre>
  
  <p>Below is the class that unmarshals the XML, updates it based on the input parameters, then marshals it back</p>
  
  <pre><code>@Service("dialogService")
  public class DialogServiceXml implements DialogServiceXmlImpl {
  
  @SuppressWarnings({ "rawtypes", "unchecked" })
  @Override
  public void updateXml(StringBuilder className, StringBuilder response) {
      JAXBContext jaxbContext = null;
      ClassLoader classLoader = getClass().getClassLoader();
      try {
          jaxbContext = JAXBContext.newInstance("com.sau.watson.dialog.xsd.beans");
  
          Unmarshaller JAXBUnmarshaller = jaxbContext.createUnmarshaller();
  
          Marshaller JAXBMarshaller = jaxbContext.createMarshaller();
          JAXBMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
          JAXBMarshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, "WatsonDialogDocument_1.0.xsd");
  
          File mor_dialog = new File(classLoader.getResource("mor_dialog.xml").getFile());
          //File mor_dialog = new File(classLoader.getResource("../../mor_dialog.xml").getFile());
  
          mor_dialog.setWritable(true);
          //File mor_dialog_updated = new File(classLoader.getResource("mor_dialog_updated.xml").getFile());
  
          InputStream is = new FileInputStream(mor_dialog);
  
          JAXBElement dialog = (JAXBElement) JAXBUnmarshaller.unmarshal(is);
          is.close();
  
          //JAXBElement dialog = (JAXBElement) JAXBUnmarshaller.unmarshal(new FileInputStream("src/main/java/com/sau/watson/dialog/xml/mor_dialog.xml"));
  
          DialogType dialogType = (DialogType) dialog.getValue();
          // System.out.println(dialogType.toString());
          // System.out.println(dialogType);
  
          FlowType flowType = (FlowType) dialogType.getFlow();
  
          for (FolderNodeType folderNodeType : flowType.getFolder()) {
              // System.out.println(folderNodeType.getLabel());
  
              if (folderNodeType.getLabel().equalsIgnoreCase("Library")) {
  
                  for (ChatflowNode libChatFlowNode : folderNodeType.getInputOrOutputOrDefault()) {
                      FolderNodeType libraryFolderNode = (FolderNodeType) libChatFlowNode;
                      // System.out.println(libraryFolderNode.getId());
                      // System.out.println(libraryFolderNode.getLabel());
  
                      StringBuilder classNameFromXml = new StringBuilder();
  
                      for (ChatflowNode node : libraryFolderNode.getInputOrOutputOrDefault()) {
                          InputNodeType inputNodeType = (InputNodeType) node;
  
                          // Getting the class. Class name are encapsulated
                          // inside the &lt;grammar&gt; node
                          /**
                           * &lt;grammar&gt; &lt;item&gt;Salesperson_Great&lt;/item&gt;
                           * &lt;item&gt;Great&lt;/item&gt; &lt;/grammar&gt;
                           */
                          for (Object grammerTypeObj : inputNodeType.getActionOrScriptOrGrammar()) {
                              GrammarType grammarType = (GrammarType) grammerTypeObj;
  
                              // We are always getting the first item as it is
                              // assumed that there is only one class in each
                              // grammar node
                              classNameFromXml
                                      .append(grammarType.getItemOrSourceOrParam().get(0).getValue().toString());
                              System.out.println("Class Name is : " + className);
                          }
  
                          // We are always getting the first item as it is
                          // assumed that there is only one class in each
                          // grammar node
                          /*
                           * List&lt;Object&gt; grammarTypeObj =
                           * inputNodeType.getActionOrScriptOrGrammar();
                           * GrammarType grammarType = (GrammarType)
                           * grammarTypeObj;
                           * 
                           * String className =
                           * grammarType.getItemOrSourceOrParam().get(0).
                           * getValue().toString();
                           * 
                           * System.out.println("Class Name is : "+className);
                           */
  
                          if (!classNameFromXml.toString().equalsIgnoreCase(className.toString())) {
                              continue;
                          }
  
                          // Getting all the response items corresponding to
                          // this class
                          for (ChatflowNode outputNodeObj : inputNodeType.getInputOrOutputOrDefault()) {
  
                              OutputNodeType outputNode = (OutputNodeType) outputNodeObj;
                              for (Object promptTypeObj : outputNode.getActionOrScriptOrPrompt()) {
  
                                  PromptType promptType = (PromptType) promptTypeObj;
  
                                  List&lt;Serializable&gt; responseItemObjs = promptType.getContent();
                                  for (Object responseItemObj : responseItemObjs) {
  
                                      /*
                                       * if (responseItemObj instanceof
                                       * String) {
                                       * System.out.println(((String)
                                       * responseItemObj).trim()); }
                                       */
                                      if (responseItemObj instanceof JAXBElement) {
                                          // System.out.println("JAXBElement
                                          // Instance");
  
                                          JAXBElement responseItem = (JAXBElement) responseItemObj;
  
                                          System.out.println("The old response is : " + responseItem.getValue().toString());
                                          responseItem.setValue(response.toString());
                                      }
                                  }
                              }
                          }
                      }
                  }
              }
          }
  
          FileOutputStream os = new FileOutputStream(mor_dialog);
  
          JAXBMarshaller.marshal(dialog, os);             
          //os.flush();
          os.close();
  
          //JAXBMarshaller.marshal(dialog, new FileOutputStream("src/main/java/com/sau/watson/dialog/xml/mor_dialog.xml"));
  
      } catch (Exception ex) {
          ex.printStackTrace();
      }
  }
  
  
  }
  </code></pre>