diff --git a/PlayWallCore/src/de/tobias/playpad/pad/Pad.java b/PlayWallCore/src/de/tobias/playpad/pad/Pad.java index fc37a84959f38c155a973d0c0ba2d9ddaa9f77c5..ae4adf2d2df16e8188455b46ec81dc8f01df1aa1 100644 --- a/PlayWallCore/src/de/tobias/playpad/pad/Pad.java +++ b/PlayWallCore/src/de/tobias/playpad/pad/Pad.java @@ -3,14 +3,10 @@ package de.tobias.playpad.pad; import java.nio.file.Path; import java.util.HashMap; -import org.dom4j.Element; - import de.tobias.playpad.layout.CartLayout; import de.tobias.playpad.layout.LayoutRegistry; import de.tobias.playpad.pad.conntent.PadContent; -import de.tobias.playpad.pad.conntent.PadContentRegistry; import de.tobias.playpad.pad.conntent.Pauseable; -import de.tobias.playpad.pad.conntent.UnkownPadContentException; import de.tobias.playpad.pad.triggerlistener.PadTriggerContentListener; import de.tobias.playpad.pad.triggerlistener.PadTriggerDurationListener; import de.tobias.playpad.pad.triggerlistener.PadTriggerStatusListener; @@ -21,7 +17,6 @@ import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.Warning; import de.tobias.playpad.tigger.Trigger; import de.tobias.playpad.tigger.TriggerPoint; -import de.tobias.utils.settings.UserDefaults; import javafx.beans.binding.BooleanBinding; import javafx.beans.property.BooleanProperty; import javafx.beans.property.DoubleProperty; @@ -75,9 +70,8 @@ public class Pad { private transient IPadViewController controller; private transient Project project; - public Pad(Project project, Element element) { + public Pad(Project project) { this.project = project; - load(element); initPadListener(); // Update Trigger ist nicht notwendig, da es in load(Element) ausgerufen wird @@ -375,7 +369,7 @@ public class Pad { this.ignoreTrigger = ignoreTrigger; } - private void updateTrigger() { + void updateTrigger() { for (TriggerPoint point : TriggerPoint.values()) { if (!triggers.containsKey(point)) { Trigger trigger = new Trigger(point); @@ -420,163 +414,6 @@ public class Pad { } } - // Storage - private static final String INDEX_ATTR = "index"; - private static final String NAME_ATTR = "name"; - private static final String STATUS_ATTR = "status"; - - private static final String SETTINGS_ELEMENT = "Settings"; - private static final String VOLUME_ELEMENT = "Volume"; - private static final String LOOP_ELEMENT = "Loop"; - private static final String TIMEMODE_ELEMENT = "TimeMode"; - private static final String FADE_ELEMENT = "Fade"; - private static final String WARNING_ELEMENT = "Warning"; - - private static final String LAYOUTS_ELEMENT = "Layouts"; - private static final String LAYOUT_ACTIVE_ATTR = "active"; - private static final String LAYOUT_TYPE_ATTR = "type"; - private static final String LAYOUT_ELEMENT = "Layout"; - - private static final String CUSTOM_SETTINGS_ITEM_ELEMENT = "Item"; - private static final String CUSTOM_SETTINGS_TYPE_ATTR = "key"; - private static final String CUSTOM_SETTINGS_ELEMENT = "CustomSettings"; - - public static final String CONTENT_ELEMENT = "Content"; - private static final String CONTENT_TYPE_ATTR = "type"; - - public void load(Element element) { - indexProperty.set(Integer.valueOf(element.attributeValue(INDEX_ATTR))); - nameProperty.set(element.attributeValue(NAME_ATTR)); - PadStatus status = PadStatus.valueOf(element.attributeValue(STATUS_ATTR)); - if (status == PadStatus.EMPTY || status == PadStatus.READY) - statusProperty.set(status); - - // Settings - Element settingsElement = element.element(SETTINGS_ELEMENT); - if (settingsElement.element(VOLUME_ELEMENT) != null) - volumeProperty.set(Double.valueOf(settingsElement.element(VOLUME_ELEMENT).getStringValue())); - if (settingsElement.element(LOOP_ELEMENT) != null) - loopProperty.set(Boolean.valueOf(settingsElement.element(LOOP_ELEMENT).getStringValue())); - if (settingsElement.element(TIMEMODE_ELEMENT) != null) - timeModeProperty.set(TimeMode.valueOf(settingsElement.element(TIMEMODE_ELEMENT).getStringValue())); - if (settingsElement.element(FADE_ELEMENT) != null) - fadeProperty.set(Fade.load(settingsElement.element(FADE_ELEMENT))); - if (settingsElement.element(WARNING_ELEMENT) != null) - warningProperty.set(Warning.load(settingsElement.element(WARNING_ELEMENT))); - - // Laoyut - Element layoutsElement = settingsElement.element(LAYOUTS_ELEMENT); - if (layoutsElement != null) { - if (layoutsElement.attributeValue(LAYOUT_ACTIVE_ATTR) != null) { - customLayoutProperty.set(Boolean.valueOf(layoutsElement.attributeValue(LAYOUT_ACTIVE_ATTR))); - } - - for (Object layoutObj : layoutsElement.elements(LAYOUT_ELEMENT)) { - if (layoutObj instanceof Element) { - Element layoutElement = (Element) layoutObj; - String type = layoutElement.attributeValue(LAYOUT_TYPE_ATTR); - CartLayout layout = LayoutRegistry.getLayout(type).newCartLayout(); - layout.load(layoutElement); - - layouts.put(type, layout); - } - } - } - - Element userInfoElement = settingsElement.element(CUSTOM_SETTINGS_ELEMENT); - if (userInfoElement != null) { - for (Object object : userInfoElement.elements()) { - if (object instanceof Element) { - Element item = (Element) object; - String key = item.attributeValue(CUSTOM_SETTINGS_TYPE_ATTR); - Object data = UserDefaults.loadElement(item); - customSettings.put(key, data); - } - } - } - - // Trigger - Element triggersElement = element.element("Triggers"); // TODO Externalize - if (triggersElement != null) { - for (Object triggerObj : triggersElement.elements("Trigger")) { - if (triggerObj instanceof Element) { - Element triggerElement = (Element) triggerObj; - Trigger trigger = new Trigger(); - trigger.load(triggerElement); - triggers.put(trigger.getTriggerPoint(), trigger); - } - } - } - updateTrigger(); // Damit alle Points da sind - - // Content - Element contentElement = element.element(CONTENT_ELEMENT); - if (contentElement != null) { - String contentType = contentElement.attributeValue(CONTENT_TYPE_ATTR); - try { - PadContent content = PadContentRegistry.getPadContentConnect(contentType).newInstance(this); - content.load(contentElement); - setContent(content); - } catch (UnkownPadContentException e) { - e.printStackTrace(); - throwException(null, e); - } - } - } - - public void save(Element element) { - element.addAttribute(INDEX_ATTR, String.valueOf(indexProperty.get())); - element.addAttribute(NAME_ATTR, nameProperty.get()); - if (statusProperty.get() == PadStatus.EMPTY || statusProperty.get() == PadStatus.ERROR) { - element.addAttribute(STATUS_ATTR, PadStatus.EMPTY.name()); - } else { - element.addAttribute(STATUS_ATTR, PadStatus.READY.name()); - } - - // Settings - Element settingsElement = element.addElement(SETTINGS_ELEMENT); - settingsElement.addElement(VOLUME_ELEMENT).addText(String.valueOf(volumeProperty.get())); - settingsElement.addElement(LOOP_ELEMENT).addText(String.valueOf(loopProperty.get())); - if (timeModeProperty.isNotNull().get()) - settingsElement.addElement(TIMEMODE_ELEMENT).addText(String.valueOf(timeModeProperty.get())); - if (warningProperty.isNotNull().get()) - warningProperty.get().save(settingsElement.addElement(WARNING_ELEMENT)); - if (fadeProperty.isNotNull().get()) - fadeProperty.get().save(settingsElement.addElement(FADE_ELEMENT)); - - // Layout - Element layoutsElement = settingsElement.addElement(LAYOUTS_ELEMENT); - layoutsElement.addAttribute(LAYOUT_ACTIVE_ATTR, String.valueOf(customLayoutProperty.get())); - for (String layoutType : layouts.keySet()) { - Element layoutElement = layoutsElement.addElement(LAYOUT_ELEMENT); - layoutElement.addAttribute(LAYOUT_TYPE_ATTR, layoutType); - - CartLayout cartLayout = layouts.get(layoutType); - cartLayout.save(layoutElement); - } - - Element userInfoElement = settingsElement.addElement(CUSTOM_SETTINGS_ELEMENT); - for (String key : customSettings.keySet()) { - Element itemElement = userInfoElement.addElement(CUSTOM_SETTINGS_ITEM_ELEMENT); - UserDefaults.save(itemElement, customSettings.get(key), key); - } - - // Trigger - Element triggersElement = element.addElement("Triggers"); - for (TriggerPoint point : triggers.keySet()) { - Trigger trigger = triggers.get(point); - Element triggerElement = triggersElement.addElement("Trigger"); - trigger.save(triggerElement); - } - - // Content - if (contentProperty.get() != null) { - Element contentElement = element.addElement(CONTENT_ELEMENT); - contentElement.addAttribute(CONTENT_TYPE_ATTR, contentProperty.get().getType()); - contentProperty.get().save(contentElement); - } - } - @Override public String toString() { return "Pad: " + indexProperty.get() + " - " + nameProperty.get(); @@ -598,4 +435,8 @@ public class Pad { public DoubleProperty customVolumeProperty() { return customVolumeProperty; } + + HashMap<String, CartLayout> getLayouts() { + return layouts; + } } diff --git a/PlayWallCore/src/de/tobias/playpad/pad/PadSerializer.java b/PlayWallCore/src/de/tobias/playpad/pad/PadSerializer.java new file mode 100644 index 0000000000000000000000000000000000000000..298456087dcecb18d89aa53c655a4472979a247d --- /dev/null +++ b/PlayWallCore/src/de/tobias/playpad/pad/PadSerializer.java @@ -0,0 +1,191 @@ +package de.tobias.playpad.pad; + +import org.dom4j.Element; + +import de.tobias.playpad.layout.CartLayout; +import de.tobias.playpad.layout.LayoutRegistry; +import de.tobias.playpad.pad.conntent.PadContent; +import de.tobias.playpad.pad.conntent.PadContentRegistry; +import de.tobias.playpad.pad.conntent.UnkownPadContentException; +import de.tobias.playpad.project.Project; +import de.tobias.playpad.settings.Fade; +import de.tobias.playpad.settings.Warning; +import de.tobias.playpad.tigger.Trigger; +import de.tobias.playpad.tigger.TriggerPoint; +import de.tobias.playpad.xml.XMLDeserializer; +import de.tobias.playpad.xml.XMLSerializer; +import de.tobias.utils.settings.UserDefaults; + +public class PadSerializer implements XMLSerializer<Pad>, XMLDeserializer<Pad> { + + private static final String INDEX_ATTR = "index"; + private static final String NAME_ATTR = "name"; + private static final String STATUS_ATTR = "status"; + + private static final String SETTINGS_ELEMENT = "Settings"; + private static final String VOLUME_ELEMENT = "Volume"; + private static final String LOOP_ELEMENT = "Loop"; + private static final String TIMEMODE_ELEMENT = "TimeMode"; + private static final String FADE_ELEMENT = "Fade"; + private static final String WARNING_ELEMENT = "Warning"; + + private static final String LAYOUTS_ELEMENT = "Layouts"; + private static final String LAYOUT_ACTIVE_ATTR = "active"; + private static final String LAYOUT_TYPE_ATTR = "type"; + private static final String LAYOUT_ELEMENT = "Layout"; + + private static final String CUSTOM_SETTINGS_ITEM_ELEMENT = "Item"; + private static final String CUSTOM_SETTINGS_TYPE_ATTR = "key"; + private static final String CUSTOM_SETTINGS_ELEMENT = "CustomSettings"; + + public static final String CONTENT_ELEMENT = "Content"; + private static final String CONTENT_TYPE_ATTR = "type"; + + // TODO Remove project var + private Project project; + + public PadSerializer(Project project) { + this.project = project; + } + + public PadSerializer() {} + + @Override + public Pad loadElement(Element element) { + Pad pad = new Pad(project); + + pad.setIndex(Integer.valueOf(element.attributeValue(INDEX_ATTR))); + pad.setName(element.attributeValue(NAME_ATTR)); + PadStatus status = PadStatus.valueOf(element.attributeValue(STATUS_ATTR)); + if (status == PadStatus.EMPTY || status == PadStatus.READY) + pad.setStatus(status); + + // Settings + Element settingsElement = element.element(SETTINGS_ELEMENT); + if (settingsElement.element(VOLUME_ELEMENT) != null) + pad.setVolume(Double.valueOf(settingsElement.element(VOLUME_ELEMENT).getStringValue())); + if (settingsElement.element(LOOP_ELEMENT) != null) + pad.setLoop(Boolean.valueOf(settingsElement.element(LOOP_ELEMENT).getStringValue())); + if (settingsElement.element(TIMEMODE_ELEMENT) != null) + pad.setTimeMode(TimeMode.valueOf(settingsElement.element(TIMEMODE_ELEMENT).getStringValue())); + if (settingsElement.element(FADE_ELEMENT) != null) + pad.setFade(Fade.load(settingsElement.element(FADE_ELEMENT))); + if (settingsElement.element(WARNING_ELEMENT) != null) + pad.setWarning(Warning.load(settingsElement.element(WARNING_ELEMENT))); + + // Laoyut + Element layoutsElement = settingsElement.element(LAYOUTS_ELEMENT); + if (layoutsElement != null) { + if (layoutsElement.attributeValue(LAYOUT_ACTIVE_ATTR) != null) { + pad.setCustomLayout(Boolean.valueOf(layoutsElement.attributeValue(LAYOUT_ACTIVE_ATTR))); + } + + for (Object layoutObj : layoutsElement.elements(LAYOUT_ELEMENT)) { + if (layoutObj instanceof Element) { + Element layoutElement = (Element) layoutObj; + String type = layoutElement.attributeValue(LAYOUT_TYPE_ATTR); + CartLayout layout = LayoutRegistry.getLayout(type).newCartLayout(); + layout.load(layoutElement); + + pad.setLayout(layout, type); + } + } + } + + Element userInfoElement = settingsElement.element(CUSTOM_SETTINGS_ELEMENT); + if (userInfoElement != null) { + for (Object object : userInfoElement.elements()) { + if (object instanceof Element) { + Element item = (Element) object; + String key = item.attributeValue(CUSTOM_SETTINGS_TYPE_ATTR); + Object data = UserDefaults.loadElement(item); + pad.getCustomSettings().put(key, data); + } + } + } + + // Trigger + Element triggersElement = element.element("Triggers"); // TODO Externalize + if (triggersElement != null) { + for (Object triggerObj : triggersElement.elements("Trigger")) { + if (triggerObj instanceof Element) { + Element triggerElement = (Element) triggerObj; + Trigger trigger = new Trigger(); + trigger.load(triggerElement); + pad.getTriggers().put(trigger.getTriggerPoint(), trigger); + } + } + } + pad.updateTrigger(); // Damit alle Points da sind + + // Content + Element contentElement = element.element(CONTENT_ELEMENT); + if (contentElement != null) { + String contentType = contentElement.attributeValue(CONTENT_TYPE_ATTR); + try { + PadContent content = PadContentRegistry.getPadContentConnect(contentType).newInstance(pad); + content.load(contentElement); + pad.setContent(content); + } catch (UnkownPadContentException e) { + e.printStackTrace(); + pad.throwException(null, e); + } + } + + return pad; + } + + @Override + public void saveElement(Element element, Pad data) { + element.addAttribute(INDEX_ATTR, String.valueOf(data.getIndex())); + element.addAttribute(NAME_ATTR, data.getName()); + if (data.getStatus() == PadStatus.EMPTY || data.getStatus() == PadStatus.ERROR) { + element.addAttribute(STATUS_ATTR, PadStatus.EMPTY.name()); + } else { + element.addAttribute(STATUS_ATTR, PadStatus.READY.name()); + } + + // Settings + Element settingsElement = element.addElement(SETTINGS_ELEMENT); + settingsElement.addElement(VOLUME_ELEMENT).addText(String.valueOf(data.getVolume())); + settingsElement.addElement(LOOP_ELEMENT).addText(String.valueOf(data.isLoop())); + if (data.getTimeMode() != null) + settingsElement.addElement(TIMEMODE_ELEMENT).addText(String.valueOf(data.getTimeMode())); + if (data.isCustomWarning() != false) + data.getWarning().save(settingsElement.addElement(WARNING_ELEMENT)); + if (data.getFade() != null) + data.getFade().save(settingsElement.addElement(FADE_ELEMENT)); + + // Layout + Element layoutsElement = settingsElement.addElement(LAYOUTS_ELEMENT); + layoutsElement.addAttribute(LAYOUT_ACTIVE_ATTR, String.valueOf(data.isCustomLayout())); + for (String layoutType : data.getLayouts().keySet()) { + Element layoutElement = layoutsElement.addElement(LAYOUT_ELEMENT); + layoutElement.addAttribute(LAYOUT_TYPE_ATTR, layoutType); + + CartLayout cartLayout = data.getLayouts().get(layoutType); + cartLayout.save(layoutElement); + } + + Element userInfoElement = settingsElement.addElement(CUSTOM_SETTINGS_ELEMENT); + for (String key : data.getCustomSettings().keySet()) { + Element itemElement = userInfoElement.addElement(CUSTOM_SETTINGS_ITEM_ELEMENT); + UserDefaults.save(itemElement, data.getCustomSettings().get(key), key); + } + + // Trigger + Element triggersElement = element.addElement("Triggers"); + for (TriggerPoint point : data.getTriggers().keySet()) { + Trigger trigger = data.getTriggers().get(point); + Element triggerElement = triggersElement.addElement("Trigger"); + trigger.save(triggerElement); + } + + // Content + if (data.getContent() != null) { + Element contentElement = element.addElement(CONTENT_ELEMENT); + contentElement.addAttribute(CONTENT_TYPE_ATTR, data.getContent().getType()); + data.getContent().save(contentElement); + } + } +} diff --git a/PlayWallCore/src/de/tobias/playpad/project/Project.java b/PlayWallCore/src/de/tobias/playpad/project/Project.java index 39beedc9b363f351d99cd22a6d1f0acdca38f2ea..f166c6d300916a1308b6a757d67879d4f6284d77 100644 --- a/PlayWallCore/src/de/tobias/playpad/project/Project.java +++ b/PlayWallCore/src/de/tobias/playpad/project/Project.java @@ -5,20 +5,20 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; -import org.dom4j.io.OutputFormat; -import org.dom4j.io.SAXReader; -import org.dom4j.io.XMLWriter; import de.tobias.playpad.pad.Pad; import de.tobias.playpad.pad.PadException; +import de.tobias.playpad.pad.PadSerializer; import de.tobias.playpad.pad.PadStatus; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.ProfileNotFoundException; +import de.tobias.playpad.xml.XMLHandler; import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -133,25 +133,13 @@ public class Project { Project project = new Project(ref); - SAXReader reader = new SAXReader(); - Document document = reader.read(Files.newInputStream(projectPath)); - - Element rootElement = document.getRootElement(); + XMLHandler<Pad> handler = new XMLHandler<>(projectPath); + List<Pad> pads = handler.loadElements(PAD_ELEMENT, new PadSerializer(project)); - for (Object padObj : rootElement.elements(PAD_ELEMENT)) { - if (padObj instanceof Element) { - Element padElement = (Element) padObj; - - // Load Pad Settings - Pad pad = new Pad(project, padElement); - - // Load Media - if (loadMedia) { - pad.loadContent(); - } - - project.pads.put(pad.getIndex(), pad); - } + for (Pad pad : pads) { + if (loadMedia) + pad.loadContent(); + project.pads.put(pad.getIndex(), pad); } return project; @@ -165,21 +153,15 @@ public class Project { Document document = DocumentHelper.createDocument(); Element rootElement = document.addElement(ROOT_ELEMENT); - for (int index : pads.keySet()) { - Pad pad = pads.get(index); - Element padElement = rootElement.addElement(PAD_ELEMENT); - pad.save(padElement); - } + XMLHandler<Pad> handler = new XMLHandler<>(rootElement); + handler.saveElements(PAD_ELEMENT, pads.values(), new PadSerializer()); if (Files.notExists(projectPath)) { Files.createDirectories(projectPath.getParent()); Files.createFile(projectPath); } - - XMLWriter writer = new XMLWriter(Files.newOutputStream(projectPath), OutputFormat.createPrettyPrint()); - writer.write(document); - writer.close(); + XMLHandler.save(projectPath, document); } public HashMap<Integer, Pad> getPads() { diff --git a/PlayWallCore/src/de/tobias/playpad/project/ProjectExporter.java b/PlayWallCore/src/de/tobias/playpad/project/ProjectExporter.java index 01267080ca680f5b267373814cb8bf08cf02ebbf..756c508a2f5e922ea8609f02905b295ce50d2456 100644 --- a/PlayWallCore/src/de/tobias/playpad/project/ProjectExporter.java +++ b/PlayWallCore/src/de/tobias/playpad/project/ProjectExporter.java @@ -15,6 +15,7 @@ import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import de.tobias.playpad.pad.Pad; +import de.tobias.playpad.pad.PadSerializer; import de.tobias.playpad.settings.ProfileReference; import de.tobias.utils.application.App; import de.tobias.utils.application.ApplicationUtils; @@ -115,9 +116,11 @@ public class ProjectExporter { if (padObj instanceof Element) { Element padElement = (Element) padObj; - Pad pad = new Pad(null, padElement); // Null für Project, da das pad nicht weiter verwendet wird + PadSerializer serializer = new PadSerializer(); + Pad pad = serializer.loadElement(padElement); + if (pad.getContent() != null) { - pad.getContent().exportMedia(zip, padElement.element(Pad.CONTENT_ELEMENT)); + pad.getContent().exportMedia(zip, padElement.element(PadSerializer.CONTENT_ELEMENT)); } } diff --git a/PlayWallCore/src/de/tobias/playpad/project/ProjectImporter.java b/PlayWallCore/src/de/tobias/playpad/project/ProjectImporter.java index d7c075fcec6fbde1c463e28b655b5c03f975a8f9..57ebef70dc69976a9c3c1c20afd0c11549659e30 100644 --- a/PlayWallCore/src/de/tobias/playpad/project/ProjectImporter.java +++ b/PlayWallCore/src/de/tobias/playpad/project/ProjectImporter.java @@ -15,6 +15,7 @@ import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import de.tobias.playpad.pad.Pad; +import de.tobias.playpad.pad.PadSerializer; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.ProfileReference; import de.tobias.utils.application.App; @@ -161,9 +162,11 @@ public class ProjectImporter { if (padObj instanceof Element) { Element padElement = (Element) padObj; - Pad pad = new Pad(null, padElement); // Null für Project, da das pad nicht weiter verwendet wird + PadSerializer serializer = new PadSerializer(); + Pad pad = serializer.loadElement(padElement); + if (pad.getContent() != null) { - pad.getContent().importMedia(destination, zip, padElement.element(Pad.CONTENT_ELEMENT)); + pad.getContent().importMedia(destination, zip, padElement.element(PadSerializer.CONTENT_ELEMENT)); } } }