1919import org .eclipse .lemminx .customservice .synapse .parser .DeployPluginDetails ;
2020import org .eclipse .lemminx .customservice .synapse .parser .DependencyDetails ;
2121import org .eclipse .lemminx .customservice .synapse .parser .OverviewPageDetailsResponse ;
22+ import org .eclipse .lemminx .customservice .synapse .parser .PropertyDetails ;
2223import org .eclipse .lemminx .customservice .synapse .parser .UpdateDependencyRequest ;
24+ import org .eclipse .lemminx .customservice .synapse .parser .UpdatePropertyRequest ;
2325import org .eclipse .lemminx .customservice .synapse .parser .UpdateResponse ;
2426import org .eclipse .lemminx .customservice .synapse .utils .Constant ;
2527import org .eclipse .lsp4j .Position ;
3739import javax .xml .parsers .SAXParser ;
3840import javax .xml .parsers .SAXParserFactory ;
3941import javax .xml .stream .Location ;
42+ import javax .xml .stream .XMLInputFactory ;
4043import javax .xml .stream .XMLStreamConstants ;
4144import javax .xml .stream .XMLStreamException ;
4245import javax .xml .stream .XMLStreamReader ;
5255import java .io .StringReader ;
5356import java .io .StringWriter ;
5457import java .nio .file .Files ;
58+ import java .util .ArrayDeque ;
59+ import java .util .Deque ;
5560import java .util .List ;
5661import java .util .logging .Level ;
5762import java .util .logging .Logger ;
@@ -63,12 +68,56 @@ public class PomParser {
6368 private static DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance ();
6469 private static TransformerFactory transformerFactory = TransformerFactory .newInstance ();
6570 private static boolean hasDependencies = false ;
71+ private static boolean hasProperties = false ;
6672
6773 public static void getPomDetails (String projectUri , OverviewPageDetailsResponse detailsResponse ) {
6874 pomDetailsResponse = detailsResponse ;
6975 extractPomContent (projectUri );
7076 }
7177
78+ public static UpdateResponse updateProperty (String projectUri , UpdatePropertyRequest request ) {
79+ try {
80+ DocumentBuilder builder = factory .newDocumentBuilder ();
81+ Document document = builder .newDocument ();
82+ UpdateResponse updateResponse = new UpdateResponse ();
83+ StringBuilder elementInString = new StringBuilder ();
84+ List <String > pomContent = readPom (projectUri );
85+ assert pomContent != null ;
86+ Element propertiesElement = null ;
87+ Range initialRange = getPropertiesRange (pomContent );
88+ if (!hasProperties ) {
89+ propertiesElement = document .createElement (Constants .PROPERTIES );
90+ }
91+ for (PropertyDetails property : request .properties ) {
92+ if (property .getRange () != null ) {
93+ updateResponse .add (new TextEdit (property .getRange (),
94+ elementToString (createPropertyElement (document , property ))));
95+ } else {
96+ if (propertiesElement != null ) {
97+ propertiesElement .appendChild (createPropertyElement (document , property ));
98+ } else {
99+ elementInString .append (elementToString (createPropertyElement (document , property )));
100+ }
101+ }
102+ }
103+ String value ;
104+ if (propertiesElement != null ) {
105+ value = elementToString (propertiesElement );
106+ } else {
107+ value = elementInString .toString ();
108+ }
109+ if (value == null ) {
110+ return null ;
111+ }
112+ // Add the new content inside the <properties> section
113+ updateResponse .add (new TextEdit (new Range (initialRange .getStart (), initialRange .getStart ()), value ));
114+ return updateResponse ;
115+ } catch (ParserConfigurationException e ) {
116+ LOGGER .log (Level .SEVERE , "Error parsing the POM file : " + e .getMessage ());
117+ return null ;
118+ }
119+ }
120+
72121 public static UpdateResponse updateDependency (String projectUri , UpdateDependencyRequest request ) {
73122 try {
74123 DocumentBuilder builder = factory .newDocumentBuilder ();
@@ -300,6 +349,68 @@ private static List<String> readPom(String projectUri) {
300349 }
301350 }
302351
352+ public static Range getPropertiesRange (List <String > pomContent ) {
353+ if (pomContent == null || pomContent .isEmpty ()) {
354+ return null ;
355+ }
356+ XMLStreamReader reader = null ;
357+ try {
358+ reader = getXMLReader (pomContent );
359+ Deque <String > elementStack = new ArrayDeque <>();
360+ int startLine = -1 , startChar = -1 ;
361+ int endLine = -1 , endChar = -1 ;
362+
363+ while (reader .hasNext ()) {
364+ int event = reader .next ();
365+
366+ if (event == XMLStreamConstants .START_ELEMENT ) {
367+ String localName = reader .getLocalName ();
368+ elementStack .push (localName );
369+
370+ if (Constants .PROPERTIES .equals (localName ) && elementStack .size () == 2 &&
371+ Constant .PROJECT .equals (elementStack .peekLast ())) {
372+ hasProperties = true ;
373+ startLine = reader .getLocation ().getLineNumber ();
374+ startChar = reader .getLocation ().getColumnNumber () + localName .length () + 2 ; // After <properties>
375+ }
376+ }
377+
378+ if (event == XMLStreamConstants .END_ELEMENT ) {
379+ String localName = reader .getLocalName ();
380+
381+ if (Constants .PROPERTIES .equals (localName ) && startLine != -1 && elementStack .size () == 2 &&
382+ Constant .PROJECT .equals (elementStack .peekLast ())) {
383+ endLine = reader .getLocation ().getLineNumber ();
384+ endChar = reader .getLocation ().getColumnNumber (); // At </properties>
385+ break ;
386+ }
387+
388+ elementStack .pop ();
389+ }
390+ }
391+
392+ if (startLine == -1 || endLine == -1 || startChar == -1 || endChar == -1 ) {
393+ return null ;
394+ }
395+
396+ Position start = new Position (startLine , startChar );
397+ Position end = new Position (endLine , endChar );
398+ return new Range (start , end );
399+
400+ } catch (Exception e ) {
401+ LOGGER .log (Level .SEVERE , "Error reading the POM file: " + e .getMessage ());
402+ return null ;
403+ } finally {
404+ if (reader != null ) {
405+ try {
406+ reader .close ();
407+ } catch (XMLStreamException e ) {
408+ LOGGER .log (Level .WARNING , "Error closing XMLStreamReader: " + e .getMessage ());
409+ }
410+ }
411+ }
412+ }
413+
303414 private static Position getDependenciesStartPosition (List <String > pomContent ) {
304415 try {
305416 XMLStreamReader reader = getXMLReader (pomContent );
@@ -345,6 +456,12 @@ private static Position getDependenciesStartPosition(List<String> pomContent) {
345456 }
346457 }
347458
459+ private static Element createPropertyElement (Document document , PropertyDetails propertyDetails ) {
460+ Element property = document .createElement (propertyDetails .getName ());
461+ property .setTextContent (propertyDetails .getValue ());
462+ return property ;
463+ }
464+
348465 private static Element createDependencyElement (Document document , DependencyDetails dependencyDetails ) {
349466 Element dependency = document .createElement (Constants .DEPENDENCY );
350467 Element groupId = document .createElement (Constants .GROUP_ID );
0 commit comments