diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertPropertiesToYamlTest.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertPropertiesToYamlRefactoringTest.java similarity index 99% rename from eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertPropertiesToYamlTest.java rename to eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertPropertiesToYamlRefactoringTest.java index e2ec85e27..ca412e565 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertPropertiesToYamlTest.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertPropertiesToYamlRefactoringTest.java @@ -38,7 +38,7 @@ import org.springframework.ide.eclipse.boot.test.BootProjectTestHarness; import org.springsource.ide.eclipse.commons.frameworks.core.util.IOUtil; import org.springsource.ide.eclipse.commons.tests.util.StsTestUtil; -public class ConvertPropertiesToYamlTest { +public class ConvertPropertiesToYamlRefactoringTest { public interface Checker { void check(T it) throws Exception; diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertYamlToPropertiesTest.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertYamlToPropertiesRefactoringTest.java similarity index 93% rename from eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertYamlToPropertiesTest.java rename to eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertYamlToPropertiesRefactoringTest.java index 6d62bd8e7..582039e74 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertYamlToPropertiesTest.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring.test/src/org/springframework/ide/eclipse/boot/refactoring/test/ConvertYamlToPropertiesRefactoringTest.java @@ -34,12 +34,12 @@ import org.eclipse.ltk.core.refactoring.RefactoringStatusEntry; import org.junit.Before; import org.junit.Test; import org.springframework.ide.eclipse.boot.refactoring.ConvertYamlToPropertiesRefactoring; -import org.springframework.ide.eclipse.boot.refactoring.test.ConvertPropertiesToYamlTest.Checker; +import org.springframework.ide.eclipse.boot.refactoring.test.ConvertPropertiesToYamlRefactoringTest.Checker; import org.springframework.ide.eclipse.boot.test.BootProjectTestHarness; import org.springsource.ide.eclipse.commons.frameworks.core.util.IOUtil; import org.springsource.ide.eclipse.commons.tests.util.StsTestUtil; -public class ConvertYamlToPropertiesTest { +public class ConvertYamlToPropertiesRefactoringTest { BootProjectTestHarness projects = new BootProjectTestHarness(getWorkspace()); @@ -281,6 +281,35 @@ public class ConvertYamlToPropertiesTest { ); } + @Test public void multipleDocsConversion() throws Exception { + do_conversionTest( + "some:\n" + + " other:\n" + + " thing: blah\n" + + " thing: vvvv\n" + + "\n" + + "---\n" + + "some:\n" + + " other:\n" + + " thing: blah\n" + + " thing: vvvv\n" + + "\n" + + "---\n" + + "some:\n" + + " other:\n" + + " thing: blah\n" + + " thing: vvvv\n" + , // ==> + "some.other.thing=blah\n" + + "some.thing=vvvv\n" + + "#---\n" + + "some.other.thing=blah\n" + + "some.thing=vvvv\n" + + "#---\n" + + "some.other.thing=blah\n" + + "some.thing=vvvv\n" + ); + } } diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring/src/org/springframework/ide/eclipse/boot/refactoring/ConvertYamlToPropertiesRefactoring.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring/src/org/springframework/ide/eclipse/boot/refactoring/ConvertYamlToPropertiesRefactoring.java index 717743d5a..04a1aa7ed 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring/src/org/springframework/ide/eclipse/boot/refactoring/ConvertYamlToPropertiesRefactoring.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.boot.refactoring/src/org/springframework/ide/eclipse/boot/refactoring/ConvertYamlToPropertiesRefactoring.java @@ -33,6 +33,7 @@ import org.eclipse.text.edits.ReplaceEdit; import org.springsource.ide.eclipse.commons.livexp.util.ExceptionUtil; import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.comments.CommentType; import org.yaml.snakeyaml.events.CommentEvent; import org.yaml.snakeyaml.events.Event; import org.yaml.snakeyaml.events.StreamEndEvent; @@ -44,11 +45,12 @@ public class ConvertYamlToPropertiesRefactoring extends Refactoring { private IFile propsFile; private final IFile yamlFile; - private String propsContent; + private StringBuilder propsContent; private int inputTextLen; public ConvertYamlToPropertiesRefactoring(IFile yamlFile) { this.yamlFile = yamlFile; + this.propsContent = new StringBuilder(); } @Override @@ -93,34 +95,42 @@ public class ConvertYamlToPropertiesRefactoring extends Refactoring { return status; } - Map o = null; try (InputStream content = yamlFile.getContents()) { - o = new Yaml().load(content); + for (Object d : new Yaml().loadAll(yamlFile.getContents())) { + if (d instanceof Map) { + // Add doc divider if not empty + @SuppressWarnings("unchecked") + Map o = (Map) d; + try { + YamlToPropertiesConverter converter = new YamlToPropertiesConverter(o); + Properties props = converter.getProperties(); + StringWriter write = new StringWriter(); + props.store(write, null); + write.flush(); + write.close(); + if (!propsContent.isEmpty()) { + propsContent.append("#---\n"); + } + // Skip over the date header. Comments are not present but date header is. + if (write.getBuffer().charAt(0) == '#') { + int idx = write.getBuffer().indexOf("\n"); + this.propsContent.append(idx >= 0 && idx < write.getBuffer().length() ? write.getBuffer().substring(idx + 1) : write.getBuffer().toString()); + } else { + this.propsContent.append(write.getBuffer().toString()); + } + status.merge(converter.getStatus()); + } catch (IOException e) { + status.merge(RefactoringStatus.create(ExceptionUtil.status(e, "Problems writing to .properties file: "+propsFile.getFullPath()))); + } + } else if (d == null) { + if (!propsContent.isEmpty()) { + propsContent.append("#---\n"); + } + } + } } catch (Exception e) { status.merge(RefactoringStatus.create(ExceptionUtil.status(e, "Problems parsing as a .yaml file: "+yamlFile.getFullPath()))); } - if (o != null) { - try { - YamlToPropertiesConverter converter = new YamlToPropertiesConverter(o); - Properties props = converter.getProperties(); - StringWriter write = new StringWriter(); - props.store(write, null); - write.flush(); - write.close(); - // Skip over the date header. Comments are not present but date header is. - if (write.getBuffer().charAt(0) == '#') { - int idx = write.getBuffer().indexOf("\n"); - this.propsContent = idx >= 0 && idx < write.getBuffer().length() ? write.getBuffer().substring(idx + 1) : write.getBuffer().toString(); - } else { - this.propsContent = write.getBuffer().toString(); - } - status.merge(converter.getStatus()); - } catch (IOException e) { - status.merge(RefactoringStatus.create(ExceptionUtil.status(e, "Problems writing to .properties file: "+propsFile.getFullPath()))); - } - } else { - propsContent = ""; - } return status; } @@ -135,8 +145,12 @@ public class ConvertYamlToPropertiesRefactoring extends Refactoring { if (e instanceof StreamEndEvent) { inputTextLen = e.getEndMark().getIndex(); } - if (!hasComments && e instanceof CommentEvent) { - hasComments = true; + if (!hasComments && e instanceof CommentEvent ce) { + if (ce.getCommentType() == CommentType.BLANK_LINE) { + // document separator + } else { + hasComments = true; + } } } return hasComments; @@ -152,7 +166,7 @@ public class ConvertYamlToPropertiesRefactoring extends Refactoring { public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { CompositeChange changes = new CompositeChange(getName()); TextFileChange textChange = new TextFileChange(getName(), yamlFile); - textChange.setEdit(new ReplaceEdit(0, inputTextLen, propsContent)); + textChange.setEdit(new ReplaceEdit(0, inputTextLen, propsContent.toString())); changes.add(textChange); changes.add(new RenameResourceChange(yamlFile.getFullPath(), propsFile.getName())); changes.initializeValidationData(pm);