Skip to content
Snippets Groups Projects
Commit 0b990617 authored by Robert Goldmann's avatar Robert Goldmann
Browse files

#157 - migrate old project on startup

parent 86638336
No related branches found
No related tags found
No related merge requests found
package de.tobias.playpad.update;
import de.thecodelabs.logger.Logger;
import de.thecodelabs.utils.application.App;
import de.thecodelabs.utils.application.container.PathType;
import de.thecodelabs.utils.application.update.UpdateService;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class VersionUpdater implements UpdateService {
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.MessageFormat;
import java.util.UUID;
public class VersionUpdater implements UpdateService
{
@Override
public void update(App app, long oldVersion, long newVersion) {
public void update(App app, long oldVersion, long newVersion)
{
try
{
if(oldVersion < 44)
{
updateTo44(app);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void updateTo44(App app) throws DocumentException, IOException
{
Logger.debug("Updating to app version 44...");
SAXReader reader = new SAXReader();
Document projectsDocument = reader.read(Files.newInputStream(app.getPath(PathType.CONFIGURATION, "Projects.xml")));
for(Element element : projectsDocument.getRootElement().elements("Project"))
{
final String projectName = element.attributeValue("name");
final UUID projectUUID = UUID.fromString(element.attributeValue("uuid"));
Logger.debug(MessageFormat.format("Updating project \"{0}\" (id: {1})...", projectName, projectUUID));
Path projectPath = app.getPath(PathType.DOCUMENTS, projectUUID.toString() + ".xml");
final Document migratedProject = updateProject(Files.newInputStream(projectPath));
XMLWriter writer = new XMLWriter(Files.newOutputStream(projectPath), OutputFormat.createPrettyPrint());
writer.write(migratedProject);
writer.close();
}
}
public static Document updateProject(InputStream projectInputStream) throws DocumentException
{
SAXReader reader = new SAXReader();
Document projectDocument = reader.read(projectInputStream);
Element rootProjectElement = projectDocument.getRootElement();
for(Element page : rootProjectElement.elements())
{
for(Element pad : page.elements())
{
final Element settings = pad.element("Settings");
if(settings == null)
{
continue;
}
final Element designElement = settings.element("Design");
if(designElement == null)
{
continue;
}
final Attribute customFlag = designElement.attribute("custom");
if(customFlag == null)
{
continue;
}
designElement.remove(customFlag);
if(customFlag.getValue().equals("false"))
{
continue;
}
designElement.addElement("EnableCustomBackgroundColor").addText("true");
designElement.addElement("EnableCustomPlayColor").addText("true");
designElement.addElement("EnableCustomCueInColor").addText("true");
}
}
return projectDocument;
}
}
package de.tobias.playpad.update;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.junit.Test;
import java.io.InputStream;
import static org.assertj.core.api.Assertions.assertThat;
public class VersionUpdaterTest
{
@Test
public void testMigrateProject_UpdatePadDesignSettings() throws DocumentException
{
final InputStream projectInputStream = VersionUpdaterTest.class.getClassLoader().getResourceAsStream("de/tobias/playpad/update/ProjectToMigrateToVersion44.xml");
final Document migratedProject = VersionUpdater.updateProject(projectInputStream);
final Element rootElement = migratedProject.getRootElement();
final Element pageElement = rootElement.elements().get(0);
// pad with custom design enabled
final Element padElement = pageElement.elements().get(0);
final Element designElement = padElement.element("Settings").element("Design");
assertThat(designElement.attribute("custom")).isNull();
assertThat(designElement.element("EnableCustomBackgroundColor").getStringValue()).isEqualTo("true");
assertThat(designElement.element("BackgroundColor").getStringValue()).isEqualTo("RED2");
assertThat(designElement.element("EnableCustomPlayColor").getStringValue()).isEqualTo("true");
assertThat(designElement.element("PlayColor").getStringValue()).isEqualTo("YELLOW2");
assertThat(designElement.element("EnableCustomCueInColor").getStringValue()).isEqualTo("true");
assertThat(designElement.element("CueInColor").getStringValue()).isEqualTo("LIGHT_GREEN2");
// pad without custom design
final Element padElement2 = pageElement.elements().get(1);
final Element designElement2 = padElement2.element("Settings").element("Design");
assertThat(designElement2.attribute("custom")).isNull();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<Project>
<Page uuid="a40033c7-4a85-49c9-bdfe-00e0e8a35fa2" id="0" name="">
<Pad uuid="1028ee71-aebb-4975-8bfd-40d6872bc1b0" index="0" name="" status="EMPTY">
<Settings id="cc73d33f-e3dc-4b58-b199-2a77577b1d89">
<Volume>1.0</Volume>
<Loop>false</Loop>
<Design id="5603c0a3-f3e6-4191-857b-978ba3846e28" custom="true">
<BackgroundColor>RED2</BackgroundColor>
<PlayColor>YELLOW2</PlayColor>
<CueInColor>LIGHT_GREEN2</CueInColor>
</Design>
<CustomSettings/>
<Triggers>
<Trigger point="START"/>
<Trigger point="EOF_STOP"/>
</Triggers>
</Settings>
</Pad>
<Pad uuid="bde56734-a606-4c19-a19b-7ef20aa7b827" index="1" name="" status="EMPTY">
<Settings id="0be18dbe-f914-4a11-a470-b4279fe98e0f">
<Volume>1.0</Volume>
<Loop>false</Loop>
<Design custom="false"/>
<CustomSettings/>
<Triggers>
<Trigger point="START"/>
<Trigger point="EOF_STOP"/>
</Triggers>
</Settings>
</Pad>
</Page>
<Settings>
<Columns>2</Columns>
<Rows>1</Rows>
<MediaPath active="false"/>
</Settings>
</Project>
......@@ -10,7 +10,7 @@
<packaging>pom</packaging>
<properties>
<project.build.code>43</project.build.code>
<project.build.code>44</project.build.code>
<project.versionDate>${maven.build.timestamp}</project.versionDate>
<maven.build.timestamp.format>yyyy-MM-dd</maven.build.timestamp.format>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment