diff --git a/PlayWall/src/main/java/de/tobias/playpad/update/VersionUpdater.java b/PlayWall/src/main/java/de/tobias/playpad/update/VersionUpdater.java index b5f7c5be9793d58da416f0c68334c94194d36afe..96fc17c2f4c66c96fd4b8e5d9d4a26a0d80ff86d 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/update/VersionUpdater.java +++ b/PlayWall/src/main/java/de/tobias/playpad/update/VersionUpdater.java @@ -1,13 +1,106 @@ 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; + } } diff --git a/PlayWall/src/test/java/de/tobias/playpad/update/VersionUpdaterTest.java b/PlayWall/src/test/java/de/tobias/playpad/update/VersionUpdaterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..15339be0643a1dc3aa66ae68d6a7735129be8e0a --- /dev/null +++ b/PlayWall/src/test/java/de/tobias/playpad/update/VersionUpdaterTest.java @@ -0,0 +1,45 @@ +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(); + } +} diff --git a/PlayWall/src/test/resources/de/tobias/playpad/update/ProjectToMigrateToVersion44.xml b/PlayWall/src/test/resources/de/tobias/playpad/update/ProjectToMigrateToVersion44.xml new file mode 100644 index 0000000000000000000000000000000000000000..86a23a31d6079ae067eb9329594ba46cc50d65d9 --- /dev/null +++ b/PlayWall/src/test/resources/de/tobias/playpad/update/ProjectToMigrateToVersion44.xml @@ -0,0 +1,39 @@ +<?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> diff --git a/pom.xml b/pom.xml index 4e735ed3fdaf7d8165254248ab14d39fffd7fba2..c55300adc97f3a64a49997d54a7e54c79cd20602 100644 --- a/pom.xml +++ b/pom.xml @@ -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>