Support yaml documents for yaml->props

This commit is contained in:
aboyko
2024-03-21 17:09:36 -04:00
parent 01a69ba306
commit ea4775d55e
3 changed files with 74 additions and 31 deletions

View File

@@ -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<T> {
void check(T it) throws Exception;

View File

@@ -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"
);
}
}

View File

@@ -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<String, ?> 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<String, ?> o = (Map<String, ?>) 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);