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,52 @@ 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+ (propertiesElement != null ) ? elementToString (propertiesElement ) : elementInString .toString ();
105+ if (StringUtils .isEmpty (value )) {
106+ return null ;
107+ }
108+ // Add the new content inside the <properties> section
109+ updateResponse .add (new TextEdit (new Range (initialRange .getStart (), initialRange .getStart ()), value ));
110+ return updateResponse ;
111+ } catch (ParserConfigurationException e ) {
112+ LOGGER .log (Level .SEVERE , "Error parsing the POM file : " + e .getMessage ());
113+ return null ;
114+ }
115+ }
116+
72117 public static UpdateResponse updateDependency (String projectUri , UpdateDependencyRequest request ) {
73118 try {
74119 DocumentBuilder builder = factory .newDocumentBuilder ();
@@ -300,6 +345,68 @@ private static List<String> readPom(String projectUri) {
300345 }
301346 }
302347
348+ private static Range getPropertiesRange (List <String > pomContent ) {
349+ if (pomContent == null || pomContent .isEmpty ()) {
350+ return null ;
351+ }
352+ XMLStreamReader reader = null ;
353+ try {
354+ reader = getXMLReader (pomContent );
355+ Deque <String > elementStack = new ArrayDeque <>();
356+ int startLine = -1 , startChar = -1 ;
357+ int endLine = -1 , endChar = -1 ;
358+
359+ while (reader .hasNext ()) {
360+ int event = reader .next ();
361+
362+ if (event == XMLStreamConstants .START_ELEMENT ) {
363+ String localName = reader .getLocalName ();
364+ elementStack .push (localName );
365+
366+ if (Constants .PROPERTIES .equals (localName ) && elementStack .size () == 2 &&
367+ Constant .PROJECT .equals (elementStack .peekLast ())) {
368+ hasProperties = true ;
369+ startLine = reader .getLocation ().getLineNumber ();
370+ startChar = reader .getLocation ().getColumnNumber () + localName .length () + 2 ; // After <properties>
371+ }
372+ }
373+
374+ if (event == XMLStreamConstants .END_ELEMENT ) {
375+ String localName = reader .getLocalName ();
376+
377+ if (Constants .PROPERTIES .equals (localName ) && startLine != -1 && elementStack .size () == 2 &&
378+ Constant .PROJECT .equals (elementStack .peekLast ())) {
379+ endLine = reader .getLocation ().getLineNumber ();
380+ endChar = reader .getLocation ().getColumnNumber (); // At </properties>
381+ break ;
382+ }
383+
384+ elementStack .pop ();
385+ }
386+ }
387+
388+ if (startLine == -1 || endLine == -1 || startChar == -1 || endChar == -1 ) {
389+ return null ;
390+ }
391+
392+ Position start = new Position (startLine , startChar );
393+ Position end = new Position (endLine , endChar );
394+ return new Range (start , end );
395+
396+ } catch (Exception e ) {
397+ LOGGER .log (Level .SEVERE , "Error reading the POM file: " + e .getMessage ());
398+ return null ;
399+ } finally {
400+ if (reader != null ) {
401+ try {
402+ reader .close ();
403+ } catch (XMLStreamException e ) {
404+ LOGGER .log (Level .WARNING , "Error closing XMLStreamReader: " + e .getMessage ());
405+ }
406+ }
407+ }
408+ }
409+
303410 private static Position getDependenciesStartPosition (List <String > pomContent ) {
304411 try {
305412 XMLStreamReader reader = getXMLReader (pomContent );
@@ -345,6 +452,12 @@ private static Position getDependenciesStartPosition(List<String> pomContent) {
345452 }
346453 }
347454
455+ private static Element createPropertyElement (Document document , PropertyDetails propertyDetails ) {
456+ Element property = document .createElement (propertyDetails .getName ());
457+ property .setTextContent (propertyDetails .getValue ());
458+ return property ;
459+ }
460+
348461 private static Element createDependencyElement (Document document , DependencyDetails dependencyDetails ) {
349462 Element dependency = document .createElement (Constants .DEPENDENCY );
350463 Element groupId = document .createElement (Constants .GROUP_ID );
0 commit comments