diff --git a/org.sofproject.alsa.topo/.classpath b/org.sofproject.alsa.topo/.classpath index eca7bdb..2bce911 100644 --- a/org.sofproject.alsa.topo/.classpath +++ b/org.sofproject.alsa.topo/.classpath @@ -1,6 +1,10 @@ - + + + + + diff --git a/org.sofproject.alsa.topo/src/org/sofproject/alsa/topo/model/AlsaTopoGraph.java b/org.sofproject.alsa.topo/src/org/sofproject/alsa/topo/model/AlsaTopoGraph.java index 6bd194a..c3b606f 100644 --- a/org.sofproject.alsa.topo/src/org/sofproject/alsa/topo/model/AlsaTopoGraph.java +++ b/org.sofproject.alsa.topo/src/org/sofproject/alsa/topo/model/AlsaTopoGraph.java @@ -36,6 +36,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; +import java.io.StringWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; @@ -536,6 +537,11 @@ public void serialize() throws CoreException, IOException { } outputFile.getParent().refreshLocal(1, null); } + + @Override + public String getPipelinesString() { + return null; + } @Override public IRemoteOpsProvider getRemoteOpsProvider() { diff --git a/org.sofproject.fw.ui/.classpath b/org.sofproject.fw.ui/.classpath index eca7bdb..2bce911 100644 --- a/org.sofproject.fw.ui/.classpath +++ b/org.sofproject.fw.ui/.classpath @@ -1,6 +1,10 @@ - + + + + + diff --git a/org.sofproject.gst.topo/.classpath b/org.sofproject.gst.topo/.classpath index eca7bdb..e06c67a 100644 --- a/org.sofproject.gst.topo/.classpath +++ b/org.sofproject.gst.topo/.classpath @@ -1,7 +1,14 @@ - + + + + + + + + diff --git a/org.sofproject.gst.topo/META-INF/MANIFEST.MF b/org.sofproject.gst.topo/META-INF/MANIFEST.MF index dd4cd5d..8223b1c 100644 --- a/org.sofproject.gst.topo/META-INF/MANIFEST.MF +++ b/org.sofproject.gst.topo/META-INF/MANIFEST.MF @@ -10,3 +10,8 @@ Require-Bundle: org.sofproject.core, org.sofproject.ui, org.sofproject.topo.ui, com.jcraft.jsch +Bundle-ClassPath: lib/jackson-annotations-2.10.1.jar, + lib/jackson-core-2.10.1.jar, + lib/jackson-databind-2.10.1.jar, + . +Export-Package: org.sofproject.gst.json diff --git a/org.sofproject.gst.topo/build.properties b/org.sofproject.gst.topo/build.properties index e9863e2..950c215 100644 --- a/org.sofproject.gst.topo/build.properties +++ b/org.sofproject.gst.topo/build.properties @@ -2,4 +2,7 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ .,\ - plugin.xml + plugin.xml,\ + lib/jackson-annotations-2.10.1.jar,\ + lib/jackson-core-2.10.1.jar,\ + lib/jackson-databind-2.10.1.jar diff --git a/org.sofproject.gst.topo/lib/jackson-annotations-2.10.1.jar b/org.sofproject.gst.topo/lib/jackson-annotations-2.10.1.jar new file mode 100644 index 0000000..a10399c Binary files /dev/null and b/org.sofproject.gst.topo/lib/jackson-annotations-2.10.1.jar differ diff --git a/org.sofproject.gst.topo/lib/jackson-core-2.10.1.jar b/org.sofproject.gst.topo/lib/jackson-core-2.10.1.jar new file mode 100644 index 0000000..1640a4e Binary files /dev/null and b/org.sofproject.gst.topo/lib/jackson-core-2.10.1.jar differ diff --git a/org.sofproject.gst.topo/lib/jackson-databind-2.10.1.jar b/org.sofproject.gst.topo/lib/jackson-databind-2.10.1.jar new file mode 100644 index 0000000..abe3748 Binary files /dev/null and b/org.sofproject.gst.topo/lib/jackson-databind-2.10.1.jar differ diff --git a/org.sofproject.gst.topo/src/org/sofproject/gst/json/JsonCustomOptionPane.java b/org.sofproject.gst.topo/src/org/sofproject/gst/json/JsonCustomOptionPane.java new file mode 100644 index 0000000..afe1b54 --- /dev/null +++ b/org.sofproject.gst.topo/src/org/sofproject/gst/json/JsonCustomOptionPane.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2018, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Intel Corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +package org.sofproject.gst.json; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.swt.widgets.Monitor; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.sofproject.topo.ui.graph.ITopoGraph; +import org.sofproject.gst.json.JsonUtils; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.sofproject.gst.topo.model.GstTopoGraph; + +public class JsonCustomOptionPane { + + ITopoGraph graph; + + private static boolean isInteger(String s) { + try { + Integer.parseInt(s); + } catch (NumberFormatException e) { + return false; + } catch (NullPointerException e) { + return false; + } + return true; + } + + public JsonCustomOptionPane(Display display, ITopoGraph graph) { + this.graph = graph; + Shell shell = new Shell(display, SWT.CLOSE | SWT.TITLE | SWT.MIN); + + shell.setText("Serialize JSON"); + + GridLayout gridLayout = new GridLayout(4, false); + gridLayout.verticalSpacing = 8; + shell.setLayout(gridLayout); + + new Label(shell, SWT.NULL).setText("Name:"); + Text nameText = new Text(shell, SWT.SINGLE | SWT.BORDER); + GridData nameGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + nameGridData.horizontalSpan = 3; + nameText.setLayoutData(nameGridData); + + new Label(shell, SWT.NULL).setText("Version:"); + Text versionText = new Text(shell, SWT.BORDER); + GridData versionGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + versionGridData.horizontalSpan = 3; + versionText.setLayoutData(versionGridData); + + new Label(shell, SWT.NULL).setText("Description:"); + Text descriptionText = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); + GridData descriptionGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + descriptionGridData.horizontalSpan = 3; + descriptionGridData.heightHint = 100; + descriptionGridData.widthHint = 200; + descriptionText.setLayoutData(descriptionGridData); + + new Label(shell, SWT.NULL).setText("Type:"); + Combo typeCombo = new Combo(shell, SWT.READ_ONLY); + typeCombo.setBounds(50, 50, 200, 65); + String items[] = { "Gstreamer", "Ffmpeg" }; + typeCombo.setItems(items); + typeCombo.setText(items[0]); + GridData typeGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + typeGridData.horizontalSpan = 3; + typeCombo.setLayoutData(typeGridData); + + Button okButton = new Button(shell, SWT.PUSH); + okButton.setText("Ok"); + GridData buttonGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + okButton.setLayoutData(buttonGridData); + okButton.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + if (nameText.getText().isEmpty()) { + MessageBox messageBox = new MessageBox(shell, SWT.ERROR); + messageBox.setMessage("Name cannot be empty!"); + messageBox.open(); + } else if (!isInteger(versionText.getText())) { + MessageBox messageBox = new MessageBox(shell, SWT.ERROR); + messageBox.setMessage("Version number should be an integer!"); + messageBox.open(); + } else { + try { + JsonProperty jsonProperty = new JsonProperty(nameText.getText(), descriptionText.getText(), + versionText.getText(), typeCombo.getItem(typeCombo.getSelectionIndex())); + new JsonUtils().serializeJson(jsonProperty, graph.getPipelinesString()); + shell.close(); + } catch (CoreException | IOException error) { + error.printStackTrace(); // TODO: + } + } + } + }); + + Button cancelButton = new Button(shell, SWT.PUSH); + cancelButton.setText("Cancel"); + GridData cancelbuttonGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + cancelButton.setLayoutData(cancelbuttonGridData); + cancelButton.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + shell.close(); + } + }); + + Monitor primary = display.getPrimaryMonitor(); + Rectangle bounds = primary.getBounds(); + Rectangle rect = shell.getBounds(); + int x = bounds.x + (bounds.width - rect.width) / 2; + int y = bounds.y + (bounds.height - rect.height) / 2; + shell.setLocation(x, y); + + shell.pack(); + shell.open(); + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) + display.sleep(); + } + } + +} diff --git a/org.sofproject.gst.topo/src/org/sofproject/gst/json/JsonProperty.java b/org.sofproject.gst.topo/src/org/sofproject/gst/json/JsonProperty.java new file mode 100644 index 0000000..7db9f4b --- /dev/null +++ b/org.sofproject.gst.topo/src/org/sofproject/gst/json/JsonProperty.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2019, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Intel Corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +package org.sofproject.gst.json; + +public class JsonProperty { + + private String name; + private String description; + private String version; + private String type; + private String template; + + public JsonProperty(String name, String description, String version, String type) { + this.name = name; + this.description = description; + this.version = version; + this.type = type; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public String getVersion() { + return version; + } + + public String getType() { + return type; + } + + public String getTemplate() { + return template; + } + + public void setTemplate(String newTemplate) { + this.template = newTemplate; + } +} diff --git a/org.sofproject.gst.topo/src/org/sofproject/gst/json/JsonUtils.java b/org.sofproject.gst.topo/src/org/sofproject/gst/json/JsonUtils.java new file mode 100644 index 0000000..be886f4 --- /dev/null +++ b/org.sofproject.gst.topo/src/org/sofproject/gst/json/JsonUtils.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Intel Corporation nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +package org.sofproject.gst.json; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +import org.eclipse.core.runtime.CoreException; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JsonUtils { + + public void serializeJson(JsonProperty jsonProperty, String pipelineString) throws CoreException, IOException { + try { + File file = new File(jsonProperty.getName() + ".json"); + jsonProperty.setTemplate(pipelineString); + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + ObjectMapper obj = new ObjectMapper(); + obj.writeValue(writer, jsonProperty); + writer.close(); + + } catch (Exception e) { + System.out.println(e.toString()); + } + } + +} diff --git a/org.sofproject.gst.topo/src/org/sofproject/gst/topo/model/GstTopoGraph.java b/org.sofproject.gst.topo/src/org/sofproject/gst/topo/model/GstTopoGraph.java index 761fff4..dd89d08 100644 --- a/org.sofproject.gst.topo/src/org/sofproject/gst/topo/model/GstTopoGraph.java +++ b/org.sofproject.gst.topo/src/org/sofproject/gst/topo/model/GstTopoGraph.java @@ -34,8 +34,11 @@ import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; +import java.io.PrintWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; @@ -48,6 +51,7 @@ import org.eclipse.jface.window.Window; import org.sofproject.core.binfile.BinFile; import org.sofproject.core.ops.IRemoteOpsProvider; +import org.sofproject.gst.json.JsonProperty; import org.sofproject.gst.topo.ops.GstGraphOpsProvider; import org.sofproject.gst.topo.plugins.GstElement; import org.sofproject.gst.topo.plugins.GstPlugin; @@ -58,6 +62,8 @@ import org.sofproject.topo.ui.graph.ITopoGraph; import org.sofproject.topo.ui.graph.ITopoNode; +import com.fasterxml.jackson.databind.ObjectMapper; + public class GstTopoGraph implements ITopoGraph { public static final String[] NODE_TYPE_IDS = { "org.sofproject.gst.topo.element" }; @@ -192,7 +198,8 @@ public void serialize() throws CoreException, IOException { fileInput.setContents(new ByteArrayInputStream(os.toByteArray()), true, false, null); } - public String getPipelineString() { + @Override + public String getPipelinesString() { try { ByteArrayOutputStream os = new ByteArrayOutputStream(); Writer writer = new BufferedWriter(new OutputStreamWriter(os)); diff --git a/org.sofproject.gst.topo/src/org/sofproject/gst/topo/ops/GstTopoTestOperation.java b/org.sofproject.gst.topo/src/org/sofproject/gst/topo/ops/GstTopoTestOperation.java index cb2fbc9..e53e75a 100644 --- a/org.sofproject.gst.topo/src/org/sofproject/gst/topo/ops/GstTopoTestOperation.java +++ b/org.sofproject.gst.topo/src/org/sofproject/gst/topo/ops/GstTopoTestOperation.java @@ -71,7 +71,7 @@ public void run(IProgressMonitor monitor) throws InvocationTargetException, Inte AudioDevNodeProject proj = conn.getProject(); GstNodeExtension gstNode = (GstNodeExtension) proj.getExtension(IGstNodeConst.GST_NODE_EXTENSION_ID); - String pplString = graph.getPipelineString(); + String pplString = graph.getPipelinesString(); monitor.subTask("Running: " + pplString); Session session = conn.getSession(); diff --git a/org.sofproject.topo.ui/META-INF/MANIFEST.MF b/org.sofproject.topo.ui/META-INF/MANIFEST.MF index e524341..4a39a02 100644 --- a/org.sofproject.topo.ui/META-INF/MANIFEST.MF +++ b/org.sofproject.topo.ui/META-INF/MANIFEST.MF @@ -22,7 +22,8 @@ Import-Package: com.google.common.collect;version="21.0.0", com.google.inject;version="1.3.0", com.google.inject.binder;version="1.3.0", com.google.inject.multibindings;version="1.3.0", - com.google.inject.util;version="1.3.0" + com.google.inject.util;version="1.3.0", + org.sofproject.gst.json Bundle-Vendor: Intel Corporation Export-Package: org.sofproject.topo.ui.editor, org.sofproject.topo.ui.graph diff --git a/org.sofproject.topo.ui/src/org/sofproject/topo/ui/editor/policies/TopoEditorOnClickHandler.java b/org.sofproject.topo.ui/src/org/sofproject/topo/ui/editor/policies/TopoEditorOnClickHandler.java index ac9b9de..0ac21f7 100644 --- a/org.sofproject.topo.ui/src/org/sofproject/topo/ui/editor/policies/TopoEditorOnClickHandler.java +++ b/org.sofproject.topo.ui/src/org/sofproject/topo/ui/editor/policies/TopoEditorOnClickHandler.java @@ -29,6 +29,7 @@ package org.sofproject.topo.ui.editor.policies; +import java.awt.Frame; import java.io.IOException; import org.eclipse.core.runtime.CoreException; @@ -42,6 +43,7 @@ import org.eclipse.gef.mvc.fx.viewer.InfiniteCanvasViewer; import org.eclipse.swt.widgets.Display; import org.sofproject.core.ops.IRemoteOpsProvider; +import org.sofproject.gst.json.JsonCustomOptionPane; import org.sofproject.topo.ui.graph.GefTopoNode; import org.sofproject.topo.ui.graph.ITopoGraph; import org.sofproject.topo.ui.graph.ITopoNode; @@ -129,6 +131,18 @@ public void handle(ActionEvent event) { } }); menu.getItems().add(miSerialize); + + MenuItem miSerializeJson = new MenuItem("Serialize Topology to Json"); + miSerializeJson.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + + menu.hide(); + new JsonCustomOptionPane(Display.getCurrent(), getGraphFromHost()); + } + }); + menu.getItems().add(miSerializeJson); + menu.show(((InfiniteCanvasViewer) viewer).getScene().getWindow(), e.getScreenX(), e.getScreenY()); } } diff --git a/org.sofproject.topo.ui/src/org/sofproject/topo/ui/graph/ITopoGraph.java b/org.sofproject.topo.ui/src/org/sofproject/topo/ui/graph/ITopoGraph.java index 34b896f..1a9f065 100644 --- a/org.sofproject.topo.ui/src/org/sofproject/topo/ui/graph/ITopoGraph.java +++ b/org.sofproject.topo.ui/src/org/sofproject/topo/ui/graph/ITopoGraph.java @@ -69,6 +69,8 @@ public interface ITopoGraph { public BinFile getBinTopology(); public void serialize() throws CoreException, IOException; - + + public String getPipelinesString(); + public IRemoteOpsProvider getRemoteOpsProvider(); }