/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package webcamstudio.studio; import java.io.File; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.lang.reflect.Field; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import webcamstudio.WebcamStudio; import webcamstudio.channels.MasterChannels; import webcamstudio.channels.transitions.Transition; import webcamstudio.mixers.MasterMixer; import webcamstudio.sources.effects.Blink; import webcamstudio.sources.effects.Block; import webcamstudio.sources.effects.Cartoon; import webcamstudio.sources.effects.ChromaKey; import webcamstudio.sources.effects.ComboGhost; import webcamstudio.sources.effects.Contrast; import webcamstudio.sources.effects.Crop; import webcamstudio.sources.effects.Edge; import webcamstudio.sources.effects.Effect; import webcamstudio.sources.effects.Emboss; import webcamstudio.sources.effects.FaceDetectorAlpha; import webcamstudio.sources.effects.FlipHorizontal; import webcamstudio.sources.effects.FlipVertical; import webcamstudio.sources.effects.Gain; import webcamstudio.sources.effects.Ghosting; import webcamstudio.sources.effects.Gray; import webcamstudio.sources.effects.HSB; import webcamstudio.sources.effects.Marble; import webcamstudio.sources.effects.Mirror1; import webcamstudio.sources.effects.Mirror2; import webcamstudio.sources.effects.Mirror3; import webcamstudio.sources.effects.Mirror4; import webcamstudio.sources.effects.Mosaic; import webcamstudio.sources.effects.MotionAlpha; import webcamstudio.sources.effects.NoBackground; import webcamstudio.sources.effects.Opacity; import webcamstudio.sources.effects.Perspective; import webcamstudio.sources.effects.RGB; import webcamstudio.sources.effects.Radar; import webcamstudio.sources.effects.RevealLeftNFade; import webcamstudio.sources.effects.RevealRightNFade; import webcamstudio.sources.effects.Rotation; import webcamstudio.sources.effects.SaltNPepper; import webcamstudio.sources.effects.Shapes; import webcamstudio.sources.effects.Sharpen; import webcamstudio.sources.effects.Stretch; import webcamstudio.sources.effects.SwapRedBlue; import webcamstudio.sources.effects.Twirl; import webcamstudio.sources.effects.WaterFx; import webcamstudio.sources.effects.Weave; import webcamstudio.sources.effects.ZoomZoom; import webcamstudio.streams.SourceAudioSource; import webcamstudio.streams.SourceChannel; import webcamstudio.streams.SourceDV; import webcamstudio.streams.SourceDVB; import webcamstudio.streams.SourceDesktop; import webcamstudio.streams.SourceIPCam; import webcamstudio.streams.SourceImageGif; import webcamstudio.streams.SourceMovie; import webcamstudio.streams.SourceMusic; import webcamstudio.streams.SourceText; import static webcamstudio.streams.SourceText.Shape.NONE; import static webcamstudio.streams.SourceText.Shape.OVAL; import static webcamstudio.streams.SourceText.Shape.RECTANGLE; import static webcamstudio.streams.SourceText.Shape.ROUNDRECT; import webcamstudio.streams.SourceURL; import webcamstudio.streams.Stream; /** * * @author patrick (modified by karl) */ public class Studio { private static final String ELEMENT_SOURCES = "Sources"; private static final String ELEMENT_CHANNELS = "Channels"; private static final String ELEMENT_EFFECTS = "Effects"; private static final String ELEMENT_SOURCE = "Source"; private static final String ELEMENT_CHANNEL = "Channel"; private static final String ELEMENT_ROOT = "WebcamStudio"; private static final String ELEMENT_MIXER = "Mixer"; public static ArrayList<Stream> extstream = new ArrayList<>(); public static ArrayList<SourceChannel> chanLoad = new ArrayList<>(); public static File filename; public static String shapeImg = null; public static ArrayList<SourceText> LText = new ArrayList<>(); public static ArrayList<String> ImgMovMus = new ArrayList<>(); public static ArrayList<String> aGifKeys = new ArrayList<>(); static boolean FirstChannel=false; static Listener listener = null; public static void setListener(Studio.Listener l) { listener = l; } public static void load(File file, String loadType) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException { Studio studio = new Studio(); System.out.println("Loading Studio ..."); filename = file; Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file); XPath path = XPathFactory.newInstance().newXPath(); //Loading channels NodeList nodeChannels = (NodeList) path.evaluate("/WebcamStudio/Channels/Channel", doc.getDocumentElement(), XPathConstants.NODESET); for (int i = 0; i < nodeChannels.getLength(); i++) { Node channel = nodeChannels.item(i); String name = channel.getAttributes().getNamedItem("name").getTextContent(); String nxname = channel.getAttributes().getNamedItem("NextChannel").getTextContent(); String Sduration = channel.getAttributes().getNamedItem("duration").getTextContent(); int duration = Integer.parseInt(Sduration); studio.channels.add(name); studio.nextChannel.add(nxname); studio.Durations.add(duration); System.out.println("Channel: " + name + " - Duration: " + duration); } // Loading mixer settings if (loadType.equals("load")) { Node nodeMixer = (Node) path.evaluate("/WebcamStudio/Mixer", doc.getDocumentElement(), XPathConstants.NODE); String width = nodeMixer.getAttributes().getNamedItem("width").getTextContent(); int widthInt = Integer.parseInt(width); MasterMixer.getInstance().setWidth(widthInt); String height = nodeMixer.getAttributes().getNamedItem("height").getTextContent(); int heightInt = Integer.parseInt(height); MasterMixer.getInstance().setHeight(heightInt); String rate = nodeMixer.getAttributes().getNamedItem("rate").getTextContent(); int rateInt = Integer.parseInt(rate); MasterMixer.getInstance().setRate(rateInt); System.out.println("Setting Mixer to: " + width + "X" + height + "@" + rate + "fps"); } } public static void save(File file) throws IOException, XMLStreamException, TransformerConfigurationException, TransformerException, IllegalArgumentException, IllegalAccessException { ArrayList<String> channels = MasterChannels.getInstance().getChannels(); ArrayList<Stream> streams = MasterChannels.getInstance().getStreams(); ArrayList<Integer> Durations = listener.getCHTimers(); ArrayList<String> nextChannel = listener.getCHCurrNext(); StringWriter writer = new StringWriter(); System.out.println("Saving Studio ..."); XMLStreamWriter xml = javax.xml.stream.XMLOutputFactory.newFactory().createXMLStreamWriter(writer); xml.writeStartDocument(); xml.writeStartElement(ELEMENT_ROOT); // Save Channels xml.writeStartElement(ELEMENT_CHANNELS); for (String c : channels) { int index = channels.indexOf(c); xml.writeStartElement(ELEMENT_CHANNEL); System.out.println("Saving Channel: "+c); xml.writeAttribute("name", c); xml.writeAttribute("duration", Durations.get(index) + ""); xml.writeAttribute("NextChannel", nextChannel.get(index) + ""); xml.writeEndElement(); } xml.writeEndElement(); xml.writeStartElement(ELEMENT_SOURCES); for (Stream s : streams) { String clazzSink = s.getClass().getCanonicalName(); if (clazzSink.contains("Sink")){ // System.out.println("Skipping Sink: "+clazzSink); } else { System.out.println("Saving Stream: "+s.getName()); xml.writeStartElement(ELEMENT_SOURCE); writeObject(s, xml); xml.writeEndElement(); // Save Source } } xml.writeEndElement(); //Save Sources xml.writeStartElement(ELEMENT_MIXER); xml.writeAttribute("width", MasterMixer.getInstance().getWidth() + ""); xml.writeAttribute("height", MasterMixer.getInstance().getHeight() + ""); xml.writeAttribute("rate", MasterMixer.getInstance().getRate() + ""); xml.writeEndElement(); //Save Mixer xml.writeEndElement(); //Save WebcamStudio xml.writeEndDocument(); xml.flush(); xml.close(); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); transformer.transform(new StreamSource(new StringReader(writer.getBuffer().toString())), new StreamResult(file)); } private static void writeObject(Object o, XMLStreamWriter xml) throws IllegalArgumentException, IllegalAccessException, XMLStreamException { Field[] fields = o.getClass().getDeclaredFields(); Field[] superFields = null; if (o instanceof Stream) { superFields = o.getClass().getSuperclass().getDeclaredFields(); } String clazz = o.getClass().getCanonicalName(); if (clazz != null) { xml.writeAttribute("clazz", clazz); } if (superFields != null) { for (Field f : superFields) { f.setAccessible(true); String name = f.getName(); Object value = f.get(o); if (value instanceof Integer) { xml.writeAttribute(name, f.getInt(o) + ""); } else if (value instanceof Float) { xml.writeAttribute(name, f.getFloat(o) + ""); } else if (value instanceof Boolean) { xml.writeAttribute(name, f.getBoolean(o) + ""); } } } for (Field f : fields) { f.setAccessible(true); String name = f.getName(); Object value = f.get(o); if (value instanceof Integer) { xml.writeAttribute(name, f.getInt(o) + ""); } else if (value instanceof Float) { xml.writeAttribute(name, f.getFloat(o) + ""); } else if (value instanceof Boolean) { xml.writeAttribute(name, f.getBoolean(o) + ""); } } if (superFields != null) { for (Field f : superFields) { f.setAccessible(true); String name = f.getName(); Object value = f.get(o); if (value instanceof String) { xml.writeStartElement(name); xml.writeCData(value.toString()); xml.writeEndElement(); } else if (value instanceof File) { xml.writeStartElement(name); xml.writeCData(((File) value).getAbsolutePath()); xml.writeEndElement(); } } } for (Field f : fields) { f.setAccessible(true); String name = f.getName(); Object value = f.get(o); if (value instanceof String) { xml.writeStartElement(name); xml.writeCData(value.toString()); xml.writeEndElement(); } else if (value instanceof File) { xml.writeStartElement(name); xml.writeCData(((File) value).getAbsolutePath()); xml.writeEndElement(); } } if (superFields != null) { for (Field f : superFields) { f.setAccessible(true); String name = f.getName(); Object value = f.get(o); if (value instanceof List) { switch (name) { case "channels": xml.writeStartElement(ELEMENT_CHANNELS); for (Object subO : ((Iterable<? extends Object>) value)) { if (clazz != null){ xml.writeStartElement(name); writeObject(subO, xml); xml.writeEndElement(); } } break; case "effects": xml.writeStartElement(ELEMENT_EFFECTS); for (Object subO : ((Iterable<? extends Object>) value)) { if (clazz != null){ xml.writeStartElement(name); writeObject(subO, xml); xml.writeEndElement(); } } break; default: xml.writeStartElement(name); for (Object subO : ((Iterable<? extends Object>) value)) { if (clazz != null){ writeObject(subO, xml); } } break; } xml.writeEndElement(); } } } for (Field f : fields) { f.setAccessible(true); String name = f.getName(); Object value = f.get(o); if (value instanceof List) { if ("effects".equals(name)) { xml.writeStartElement(ELEMENT_EFFECTS); for (Object subO : ((Iterable<? extends Object>) value)) { if (clazz != null){ xml.writeStartElement(name); writeObject(subO, xml); xml.writeEndElement(); } } } else { xml.writeStartElement(name); for (Object subO : ((Iterable<? extends Object>) value)) { writeObject(subO, xml); } } xml.writeEndElement(); } } } private static void loadTransitions(ArrayList<SourceChannel> SCL, Stream stream, ArrayList<String> subSTrans, ArrayList<String> subETrans, ArrayList<String> SubChNames, ArrayList<String> SubText, ArrayList<String> SubFont) { int op=0; for (SourceChannel scs : SCL) { scs.setName(SubChNames.get(op)); if (SubText != null) { scs.setText(SubText.get(op)); scs.setFont(SubFont.get(op)); } if (!subSTrans.isEmpty() && subSTrans.get(op) != null){ if (subSTrans.get(op).endsWith("FadeIn")){ Transition t = Transition.getInstance(stream, "FadeIn"); scs.startTransitions.add(t); } if (subSTrans.get(op).endsWith("AudioFadeIn")){ Transition t = Transition.getInstance(stream, "AudioFadeIn"); scs.startTransitions.add(t); } if (subSTrans.get(op).endsWith("TranslateIn")){ Transition t = Transition.getInstance(stream, "TranslateIn"); scs.startTransitions.add(t); } if (subSTrans.get(op).endsWith("ResizeIn")){ Transition t = Transition.getInstance(stream, "ResizeIn"); scs.startTransitions.add(t); } if (subSTrans.get(op).endsWith("RevealLeft")){ Transition t = Transition.getInstance(stream, "RevealLeft"); scs.startTransitions.add(t); } if (subSTrans.get(op).endsWith("CornerResize")){ Transition t = Transition.getInstance(stream, "CornerResize"); scs.startTransitions.add(t); } if (subSTrans.get(op).endsWith("RevealRight")){ Transition t = Transition.getInstance(stream, "RevealRight"); scs.startTransitions.add(t); } } if (!subETrans.isEmpty() && subETrans.get(op) != null){ if (subETrans.get(op).endsWith("FadeOut")){ Transition t = Transition.getInstance(stream, "FadeOut"); scs.endTransitions.add(t); } if (subETrans.get(op).endsWith("TranslateOut")){ Transition t = Transition.getInstance(stream, "TranslateOut"); scs.endTransitions.add(t); } if (subETrans.get(op).endsWith("AudioFadeOut")){ Transition t = Transition.getInstance(stream, "AudioFadeOut"); scs.endTransitions.add(t); } if (subETrans.get(op).endsWith("ShrinkOut")){ Transition t = Transition.getInstance(stream, "ShrinkOut"); scs.endTransitions.add(t); } if (subETrans.get(op).endsWith("HideLeft")){ Transition t = Transition.getInstance(stream, "HideLeft"); scs.endTransitions.add(t); } if (subETrans.get(op).endsWith("HideRight")){ Transition t = Transition.getInstance(stream, "HideRight"); scs.endTransitions.add(t); } if (subETrans.get(op).endsWith("CornerShrink")){ Transition t = Transition.getInstance(stream, "CornerShrink"); scs.endTransitions.add(t); } } stream.addChannel(scs); op+=1; } SCL.clear(); SubChNames.clear(); subSTrans.clear(); subETrans.clear(); } private static Effect loadEffects(String sClazz, Node SuperChild){ Effect effeX = null; try { if (sClazz.endsWith("ChromaKey")) { effeX = new ChromaKey(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("ComboGhost")) { effeX = new ComboGhost(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Ghosting")) { effeX = new Ghosting(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Blink")) { effeX = new Blink(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Block")) { effeX = new Block(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Cartoon")) { effeX = new Cartoon(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Contrast")) { effeX = new Contrast(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Edge")) { effeX = new Edge(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("FlipHorizontal")) { effeX = new FlipHorizontal(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("FlipVertical")) { effeX = new FlipVertical(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Gain")) { effeX = new Gain(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Gray")) { effeX = new Gray(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("HSB")) { effeX = new HSB(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Sharpen")) { effeX = new Sharpen(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("SaltNPepper")) { effeX = new SaltNPepper(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Mirror1")) { effeX = new Mirror1(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Mirror2")) { effeX = new Mirror2(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Mirror3")) { effeX = new Mirror3(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Mirror4")) { effeX = new Mirror4(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Mosaic")) { effeX = new Mosaic(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("NoBackground")) { effeX = new NoBackground(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Crop")) { effeX = new Crop(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Opacity")) { effeX = new Opacity(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Perspective")) { effeX = new Perspective(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("RGB")) { effeX = new RGB(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Radar")) { effeX = new Radar(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("RevealRightNFade")) { effeX = new RevealRightNFade(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("RevealLeftNFade")) { effeX = new RevealLeftNFade(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Stretch")) { effeX = new Stretch(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Rotation")) { effeX = new Rotation(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Emboss")) { effeX = new Emboss(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("SwapRedBlue")) { effeX = new SwapRedBlue(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Twirl")) { effeX = new Twirl(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("ZoomZoom")) { effeX = new ZoomZoom(); readObjectFx(effeX, SuperChild); // } else if (sClazz.endsWith("Green")) { // effeX = new Green(); // readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Shapes")) { effeX = new Shapes(); readObjectFx(effeX, SuperChild); effeX.setShape(shapeImg); } else if (sClazz.endsWith("Marble")) { effeX = new Marble(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("Weave")) { effeX = new Weave(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("WaterFx")) { effeX = new WaterFx(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("MotionAlpha")) { effeX = new MotionAlpha(); readObjectFx(effeX, SuperChild); } else if (sClazz.endsWith("FaceDetectorAlpha")) { effeX = new FaceDetectorAlpha(); readObjectFx(effeX, SuperChild); } } catch (IllegalArgumentException | IllegalAccessException illegalArgumentException) { } return effeX; } private static void readStreams (Document xml) throws IllegalArgumentException, IllegalAccessException, XPathExpressionException{ XPath path = XPathFactory.newInstance().newXPath(); NodeList sources = (NodeList) path.evaluate("/" + ELEMENT_ROOT + "/" + ELEMENT_SOURCES + "/" + ELEMENT_SOURCE, xml.getDocumentElement(), XPathConstants.NODESET); String videoDev; ArrayList<String> videoDevs = new ArrayList<>(); ArrayList<Stream> extstreamBis = new ArrayList<>(); if (sources != null) { for (int i = 0; i < sources.getLength(); i++) { Node source = sources.item(i); String clazz = source.getAttributes().getNamedItem("clazz").getTextContent(); String file = null; String ObjText = null; String fontName = null; String webUrl = null; String ipcPWD = null; String ipcUser = null; String pBrand = null; String comm = null; String desktopXid = null; String elementXid = null; String streamTime = null; String streamAudioSrc = null; String strShapez = null; String guid = null; String chNameDvb = null; ArrayList<String> SubChNames = new ArrayList<>(); ArrayList<String> SubText = new ArrayList<>(); ArrayList<String> SubFont = new ArrayList<>(); ArrayList<String> subSTrans = new ArrayList<>(); ArrayList<String> subETrans = new ArrayList<>(); ArrayList<String> sNames = new ArrayList<>(); String sName = null; Stream stream = null; SourceChannel sc = null; Effect effeX = null; ArrayList<SourceChannel> SCL = new ArrayList<>(); ArrayList<Effect> fXL = new ArrayList<>(); SourceText text; for (int j = 0; j < source.getChildNodes().getLength(); j++) { Node child = source.getChildNodes().item(j); if (child.getNodeName().equals("file")) { file = child.getTextContent(); ImgMovMus.add(file); if (child.getTextContent().contains("/dev/video")){ videoDev = child.getTextContent(); videoDevs.add(videoDev); } } if (child.getNodeName().equals("name")) { sName = child.getTextContent(); sNames.add(sName); } if (child.getNodeName().equals("content")) { ObjText = child.getTextContent(); } if (child.getNodeName().equals("fontName")) { fontName = child.getTextContent(); } if (child.getNodeName().equals("strShape")) { strShapez = child.getTextContent(); } if (child.getNodeName().equals("webURL")) { webUrl = child.getTextContent(); } if (child.getNodeName().equals("guid")) { guid = child.getTextContent(); } if (child.getNodeName().equals("ptzBrand")) { pBrand = child.getTextContent(); } if (child.getNodeName().equals("ipcUser")) { ipcUser = child.getTextContent(); } if (child.getNodeName().equals("ipcPWD")) { ipcPWD = child.getTextContent(); } if (child.getNodeName().equals("chNameDVB")) { chNameDvb = child.getTextContent(); } if (child.getNodeName().equals("comm")) { comm = child.getTextContent(); } if (child.getNodeName().equals("desktopXid")) { desktopXid = child.getTextContent(); } if (child.getNodeName().equals("elementXid")) { elementXid = child.getTextContent(); } if (child.getNodeName().equals("streamTime")) { streamTime = child.getTextContent(); } if (child.getNodeName().equals("audioSource")) { streamAudioSrc = child.getTextContent(); } if (child.getNodeName().equals("Effects")) { // Read Effects // System.out.println("childnodename: "+child.getNodeName()); for (int nc = 0; nc < child.getChildNodes().getLength(); nc++) { Node SuperChild = child.getChildNodes().item(nc); // System.out.println("SuperChildnodename: "+SuperChild.getNodeName()); if (SuperChild.getNodeName().equals("effects")) { for (int ncc = 0; ncc < SuperChild.getChildNodes().getLength(); ncc++) { Node SSuperChild = SuperChild.getChildNodes().item(ncc); if (SSuperChild.getNodeName().equals("shapeS")){ shapeImg = SSuperChild.getTextContent(); // System.out.println("Ass ShapeImg: "+ shapeImg); } } String sClazz = SuperChild.getAttributes().getNamedItem("clazz").getTextContent(); effeX = loadEffects (sClazz, SuperChild); fXL.add(effeX); // System.out.println("effect clazz: "+ sClazz); } } } if (child.getNodeName().equals("Channels")) { // Read SourceChannels for (int nc = 0; nc < child.getChildNodes().getLength(); nc++) { Node SuperChild = child.getChildNodes().item(nc); for (int ncc = 0; ncc < SuperChild.getChildNodes().getLength(); ncc++) { Node SSuperChild = SuperChild.getChildNodes().item(ncc); if (SSuperChild.getNodeName().equals("name")) { SubChNames.add(SSuperChild.getTextContent()); sc = new SourceChannel(); readObjectSC(sc, SuperChild); SCL.add(sc); chanLoad.add(sc); } if (SSuperChild.getNodeName().equals("Effects")) { for (int ncs = 0; ncs < SSuperChild.getChildNodes().getLength(); ncs++) { Node SSSuperChild = SSuperChild.getChildNodes().item(ncs); if (SSSuperChild.getNodeName().equals("effects")) { for (int nccC = 0; nccC < SSSuperChild.getChildNodes().getLength(); nccC++) { Node SSSSuperChildC = SSSuperChild.getChildNodes().item(nccC); if (SSSSuperChildC.getNodeName().equals("shapeS")){ shapeImg = SSSSuperChildC.getTextContent(); // System.out.println("Ass ShapeImg Chan: "+ shapeImg); } } String sClazz = SSSuperChild.getAttributes().getNamedItem("clazz").getTextContent(); effeX = loadEffects (sClazz, SSSuperChild); sc.addEffects(effeX); // System.out.println("channel effect clazz: "+ sClazz); } } } if (SSuperChild.getNodeName().equals("startTransitions")) { if (SSuperChild.getAttributes().getLength()!= 0) { String sClazz = SSuperChild.getAttributes().getNamedItem("clazz").getTextContent(); subSTrans.add(sClazz); } else { subSTrans.add("None"); } } if (SSuperChild.getNodeName().equals("endTransitions")) { if (SSuperChild.getAttributes().getLength()!= 0) { String sClazz = SSuperChild.getAttributes().getNamedItem("clazz").getTextContent(); subETrans.add(sClazz); } else { subETrans.add("None"); } } if (SSuperChild.getNodeName().equals("text") && SSuperChild.getTextContent() != null) { SubText.add(SSuperChild.getTextContent()); } if (SSuperChild.getNodeName().equals("font") && SSuperChild.getTextContent() != null) { SubFont.add(SSuperChild.getTextContent()); } } } } } if (file != null) { File fileL = new File(file); stream = Stream.getInstance(fileL); extstream.add(stream); extstreamBis.add(stream); readObject(stream, source); stream.setComm(comm); for (Effect fx : fXL) { if (fx.getName().endsWith("Shapes")){ fx.setDoOne(true); } stream.addEffect(fx); } if (streamTime != null){ stream.setStreamTime(streamTime); } else { if (stream instanceof SourceMovie || stream instanceof SourceMusic) { WebcamStudio.getVideoParams(stream, fileL, null); } } stream.setLoaded(true); loadTransitions(SCL, stream, subSTrans, subETrans, SubChNames, null, null); stream.setName(sName); fXL.clear(); } else if (clazz.toLowerCase().endsWith("sourcedesktop")) { stream = new SourceDesktop(); extstream.add(stream); extstreamBis.add(stream); ImgMovMus.add("Desktop"); readObject(stream, source); stream.setComm(comm); if (!"".equals(desktopXid)){ stream.setSingleWindow(true); } for (Effect fx : fXL) { if (fx.getName().endsWith("Shapes")){ fx.setDoOne(true); } stream.addEffect(fx); } stream.setLoaded(true); loadTransitions(SCL, stream, subSTrans, subETrans, SubChNames, null, null); } else if (clazz.toLowerCase().endsWith("sourcetext")) { text = new SourceText(ObjText); LText.add(text); readObject(text, source); for (Effect fx : fXL) { if (fx.getName().endsWith("Shapes")){ fx.setDoOne(true); } text.addEffect(fx); } if (strShapez != null) { switch (strShapez) { case "none": text.setBackground(NONE); text.setStrBackground("none"); break; case "rectangle": text.setBackground(RECTANGLE); text.setStrBackground("rectangle"); break; case "oval": text.setBackground(OVAL); text.setStrBackground("oval"); break; case "roundrect": text.setBackground(ROUNDRECT); text.setStrBackground("roundrect"); break; } } text.setFont(fontName); text.setLoaded(true); loadTransitions(SCL, text, subSTrans, subETrans, SubChNames, SubText, SubFont); SCL.clear(); SubChNames.clear(); subSTrans.clear(); subETrans.clear(); } else if (clazz.toLowerCase().endsWith("sourcedvb")) { stream = new SourceDVB(); stream.setChName(chNameDvb); extstream.add(stream); extstreamBis.add(stream); ImgMovMus.add("DVB-T"); readObject(stream, source); for (Effect fx : fXL) { if (fx.getName().endsWith("Shapes")){ fx.setDoOne(true); } stream.addEffect(fx); } loadTransitions(SCL, stream, subSTrans, subETrans, SubChNames, null, null); } else if (clazz.toLowerCase().endsWith("sourcedv")) { stream = new SourceDV(); extstream.add(stream); extstreamBis.add(stream); ImgMovMus.add("DV"); readObject(stream, source); stream.setGuid(guid); for (Effect fx : fXL) { if (fx.getName().endsWith("Shapes")){ fx.setDoOne(true); } stream.addEffect(fx); } stream.setLoaded(true); loadTransitions(SCL, stream, subSTrans, subETrans, SubChNames, null, null); } else if (clazz.toLowerCase().endsWith("sourceurl")) { stream = new SourceURL(); stream.setWebURL(webUrl); extstream.add(stream); extstreamBis.add(stream); ImgMovMus.add("URL"); readObject(stream, source); stream.setComm(comm); stream.setLoaded(true); for (Effect fx : fXL) { if (fx.getName().endsWith("Shapes")){ fx.setDoOne(true); } stream.addEffect(fx); } loadTransitions(SCL, stream, subSTrans, subETrans, SubChNames, null, null); } else if (clazz.toLowerCase().endsWith("sourceipcam")) { stream = new SourceIPCam(); stream.setWebURL(webUrl); extstream.add(stream); extstreamBis.add(stream); ImgMovMus.add("URL"); readObject(stream, source); if (stream.getProtected()){ stream.setIPUser(ipcUser); stream.setIPPwd(ipcPWD); } stream.setPtzBrand(pBrand); stream.setComm(comm); stream.setLoaded(true); for (Effect fx : fXL) { if (fx.getName().endsWith("Shapes")){ fx.setDoOne(true); } stream.addEffect(fx); } loadTransitions(SCL, stream, subSTrans, subETrans, SubChNames, null, null); } else if (clazz.toLowerCase().endsWith("sourceaudiosource")) { stream = new SourceAudioSource(); extstream.add(stream); extstreamBis.add(stream); ImgMovMus.add("Mic"); readObject(stream, source); stream.setComm(comm); stream.setAudioSource(streamAudioSrc); stream.setLoaded(true); loadTransitions(SCL, stream, subSTrans, subETrans, SubChNames, null, null); } else if (clazz.toLowerCase().endsWith("sourceimagegif")) { for (int an=0;an < webcamstudio.WebcamStudio.cboAnimations.getItemCount(); an++){ for (String aKey : sNames){ if (aKey == null ? webcamstudio.WebcamStudio.cboAnimations.getItemAt(an).toString() == null : aKey.equals(webcamstudio.WebcamStudio.cboAnimations.getItemAt(an).toString())){ String res = webcamstudio.WebcamStudio.animations.getProperty(aKey); URL url = WebcamStudio.class.getResource("/webcamstudio/resources/animations/" + res); stream = new SourceImageGif(aKey, url); extstream.add(stream); extstreamBis.add(stream); ImgMovMus.add("ImageGif"); readObject(stream, source); loadTransitions(SCL, stream, subSTrans, subETrans, SubChNames, null, null); } } } } else { System.err.println("Cannot handle " + clazz); } } for (Stream dST : extstreamBis) { int multi=0; String streamName = dST.getName(); // System.out.println("Found Stream Name: "+streamName); for (String vDev : videoDevs){ if (vDev.contains(streamName)){ multi += 1; } } if (multi>1) { extstream.remove(dST); ImgMovMus.remove("/dev/"+streamName); // System.out.println(dST+" Removed ..."); // System.out.println(streamName+" Removed ..."); multi=0; } } } } private static void readObject(Stream stream, Node source) throws IllegalArgumentException, IllegalAccessException { Field[] fields = stream.getClass().getDeclaredFields(); Field[] superFields = stream.getClass().getSuperclass().getDeclaredFields(); // Read integer and floats for (Field field : superFields) { field.setAccessible(true); String name = field.getName(); String value; if (source.getAttributes().getNamedItem(name) != null) { value = source.getAttributes().getNamedItem(name).getTextContent(); if (field.get(stream) instanceof Integer) { field.setInt(stream, new Integer(value)); } else if (field.get(stream) instanceof Float) { field.setFloat(stream, new Float(value)); } else if (field.get(stream) instanceof Boolean) { field.setBoolean(stream, Boolean.valueOf(value)); } else if (field.get(stream) instanceof String) { for (int i = 0; i < source.getChildNodes().getLength(); i++) { Node node = source.getChildNodes().item(i); if (node.getNodeName().equals(name)) { field.set(stream, node.getTextContent()); } } } } } for (Field field : fields) { field.setAccessible(true); String name = field.getName(); String value; if (source.getAttributes().getNamedItem(name) != null) { value = source.getAttributes().getNamedItem(name).getTextContent(); if (field.get(stream) instanceof Integer) { field.setInt(stream, new Integer(value)); } else if (field.get(stream) instanceof Float) { field.setFloat(stream, new Float(value)); } else if (field.get(stream) instanceof Boolean) { field.setBoolean(stream, Boolean.valueOf(value)); } else if (field.get(stream) instanceof String) { for (int i = 0; i < source.getChildNodes().getLength(); i++) { Node node = source.getChildNodes().item(i); if (node.getNodeName().equals(name)) { field.set(stream, node.getTextContent()); } } } } } // Read List } private static void readObjectFx(Effect fx, Node source) throws IllegalArgumentException, IllegalAccessException { Field[] fields = fx.getClass().getDeclaredFields(); Field[] superFields = fx.getClass().getSuperclass().getDeclaredFields(); // Read integer and floats for (Field field : superFields) { field.setAccessible(true); String name = field.getName(); String value; if (source.getAttributes().getNamedItem(name) != null) { value = source.getAttributes().getNamedItem(name).getTextContent(); if (field.get(fx) instanceof Integer) { field.setInt(fx, new Integer(value)); } else if (field.get(fx) instanceof Float) { field.setFloat(fx, new Float(value)); } else if (field.get(fx) instanceof Boolean) { field.setBoolean(fx, Boolean.valueOf(value)); } else if (field.get(fx) instanceof String) { for (int i = 0; i < source.getChildNodes().getLength(); i++) { Node node = source.getChildNodes().item(i); if (node.getNodeName().equals(name)) { field.set(fx, node.getTextContent()); } } } } } for (Field field : fields) { field.setAccessible(true); String name = field.getName(); String value; if (source.getAttributes().getNamedItem(name) != null) { value = source.getAttributes().getNamedItem(name).getTextContent(); if (field.get(fx) instanceof Integer) { field.setInt(fx, new Integer(value)); } else if (field.get(fx) instanceof Float) { field.setFloat(fx, new Float(value)); } else if (field.get(fx) instanceof Boolean) { field.setBoolean(fx, Boolean.valueOf(value)); } else if (field.get(fx) instanceof String) { for (int i = 0; i < source.getChildNodes().getLength(); i++) { Node node = source.getChildNodes().item(i); if (node.getNodeName().equals(name)) { field.set(fx, node.getTextContent()); } } } } } // Read List } private static void readObjectSC (SourceChannel sc, Node source) throws IllegalArgumentException, IllegalAccessException { Field[] fields = sc.getClass().getDeclaredFields(); Field[] superFields = sc.getClass().getSuperclass().getDeclaredFields(); // Read integer and floats for (Field field : superFields) { field.setAccessible(true); String name = field.getName(); String value; if (source.getAttributes().getNamedItem(name) != null) { value = source.getAttributes().getNamedItem(name).getTextContent(); if (field.get(sc) instanceof Integer) { field.setInt(sc, new Integer(value)); } else if (field.get(sc) instanceof Float) { field.setFloat(sc, new Float(value)); } else if (field.get(sc) instanceof Boolean) { field.setBoolean(sc, Boolean.valueOf(value)); } else if (field.get(sc) instanceof String) { for (int i = 0; i < source.getChildNodes().getLength(); i++) { Node node = source.getChildNodes().item(i); if (node.getNodeName().equals(name)) { field.set(sc, node.getTextContent()); } } } } } for (Field field : fields) { field.setAccessible(true); String name = field.getName(); String value; if (source.getAttributes().getNamedItem(name) != null) { value = source.getAttributes().getNamedItem(name).getTextContent(); if (field.get(sc) instanceof Integer) { field.setInt(sc, new Integer(value)); } else if (field.get(sc) instanceof Float) { field.setFloat(sc, new Float(value)); } else if (field.get(sc) instanceof Boolean) { field.setBoolean(sc, Boolean.valueOf(value)); } else if (field.get(sc) instanceof String) { for (int i = 0; i < source.getChildNodes().getLength(); i++) { Node node = source.getChildNodes().item(i); if (node.getNodeName().equals(name)) { field.set(sc, node.getTextContent()); } } } } } // Read List } public static void main() { // removed (String[] args) try { try { Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(Studio.filename); readStreams(doc); } catch ( IllegalArgumentException | IllegalAccessException | XPathExpressionException | SAXException | IOException ex) { Logger.getLogger(Studio.class.getName()).log(Level.SEVERE, null, ex); } } catch (ParserConfigurationException ex) { Logger.getLogger(Studio.class.getName()).log(Level.SEVERE, null, ex); } } private final ArrayList<String> channels = MasterChannels.getInstance().getChannels(); private final ArrayList<Integer> Durations = listener.getCHTimers(); private final ArrayList<String> nextChannel = listener.getCHCurrNext(); ArrayList<Stream> streams = MasterChannels.getInstance().getStreams(); Stream streamC = null; protected Studio() { } public interface Listener { public ArrayList<String> getCHCurrNext (); public ArrayList<Integer> getCHTimers (); } }