/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package webcamstudio.streams; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.TreeMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.ImageIcon; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * * @author pballeux */ public class SourceWidget extends Stream { public static void main(String[] args) { try { SourceWidget source = new SourceWidget(new URL("file:///home/pballeux/Desktop/widget.xml")); System.out.println("toString: " + source.toString()); System.out.println("Name: " + source.getName()); System.out.println("Description: " + source.description); System.out.println("Author: " + source.author); System.out.println("Data URL: " + source.data.toString()); System.out.println("Width: " + source.getCaptureWidth()); System.out.println("Height: " + source.getCaptureHeight()); // System.out.println("Frequency: " + source.getUpdateTimeLapse()); } catch (MalformedURLException ex) { Logger.getLogger(SourceWidget.class.getName()).log(Level.SEVERE, null, ex); } } private URL data = null; private String author = ""; private String description = ""; private TreeMap<String, String> treeValues = new TreeMap<>(); public SourceWidget(URL url) { // location = url.toString(); // frameRate = 1; // try { // loadXML(location, false); // } catch (ParserConfigurationException | SAXException | IOException ex) { // Logger.getLogger(SourceWidget.class.getName()).log(Level.SEVERE, null, ex); // } } public SourceWidget() { } private void loadData(String url) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); Document doc = docBuilder.parse(url); treeValues.clear(); buildTree(doc.getChildNodes(), ""); } private void buildTree(NodeList nodes, String path) { for (int i = 0; i < nodes.getLength(); i++) { String key = ""; String attrKey = ""; String value = ""; if (nodes.item(i).getNodeType() == Node.ELEMENT_NODE) { key = getNextKey(path, nodes.item(i).getNodeName()); value = nodes.item(i).getTextContent().trim(); treeValues.put(key, value); for (int j = 0; j < nodes.item(i).getAttributes().getLength(); j++) { attrKey = getNextKey(key, nodes.item(i).getAttributes().item(j).getNodeName()); value = nodes.item(i).getAttributes().item(j).getTextContent(); treeValues.put(attrKey, value); } buildTree(nodes.item(i).getChildNodes(), key); } } } private String getNextKey(String path, String key) { String retValue = path + "." + key; int index = 1; while (treeValues.containsKey(retValue)) { retValue = path + "." + key + "." + index++; } if (retValue.startsWith(".")) { retValue = retValue.substring(1); } //System.out.println(retValue); return retValue; } private void loadXML(String url, boolean render) throws ParserConfigurationException, SAXException, IOException { if (new File(url).exists()){ //This is local file // location = new File(url).toURI().toURL().toString(); // url=location; } DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); Document doc = docBuilder.parse(url); NodeList root = doc.getElementsByTagName("ws4gl"); Node rootNode = root.item(0); Color bgColor = null; int color = 0; int alpha = 0; //Initialize parameters for (int i = 0; i < rootNode.getAttributes().getLength(); i++) { Node attr = rootNode.getAttributes().item(i); if (attr.getNodeName().equalsIgnoreCase("width")) { captureWidth = new Integer(attr.getTextContent()); } else if (attr.getNodeName().equalsIgnoreCase("height")) { captureHeight = new Integer(attr.getTextContent()); } else if (attr.getNodeName().equalsIgnoreCase("updatefrequency")) { // updateTimeLaspe = new Integer(attr.getTextContent()) * 1000 * 60; //Value is in minutes } else if (render && attr.getNodeName().equalsIgnoreCase("xmldataurl")) { data = new URL(attr.getNodeValue()); loadData(data.toString()); } else if (attr.getNodeName().equalsIgnoreCase("bgcolor")) { color = Integer.decode(attr.getTextContent()); } else if (attr.getNodeName().equalsIgnoreCase("bgalpha")) { alpha = Integer.decode(attr.getTextContent()); } } bgColor = new Color(color, true); bgColor = new Color(bgColor.getRed(), bgColor.getGreen(), bgColor.getBlue(), alpha); // Init image // tempimage = new BufferedImage(captureWidth, captureHeight, BufferedImage.TYPE_INT_ARGB); //Go over all the items in the list NodeList elements = rootNode.getChildNodes(); for (int i = 0; i < elements.getLength(); i++) { Node item = elements.item(i); if (item.getNodeName().equalsIgnoreCase("name")) { name = item.getTextContent(); } else if (item.getNodeName().equalsIgnoreCase("description")) { description = item.getTextContent(); } else if (item.getNodeName().equalsIgnoreCase("author")) { author = item.getTextContent(); } else if (render && item.getNodeName().equalsIgnoreCase("image")) { drawImage(item); } else if (render && item.getNodeName().equalsIgnoreCase("text")) { drawText(item); } } // applyEffects(tempimage); // applyShape(tempimage); // image = tempimage; } private void drawImage(Node img) throws MalformedURLException, IOException { // Graphics2D g = tempimage.createGraphics(); // g.setRenderingHint(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC); // g.setRenderingHint(java.awt.RenderingHints.KEY_RENDERING, java.awt.RenderingHints.VALUE_RENDER_QUALITY); // g.setRenderingHint(java.awt.RenderingHints.KEY_DITHERING, java.awt.RenderingHints.VALUE_DITHER_ENABLE); // g.setRenderingHint(java.awt.RenderingHints.KEY_COLOR_RENDERING, java.awt.RenderingHints.VALUE_COLOR_RENDER_QUALITY); int x = 0; int y = 0; int w = 0; int h = 0; URL imgURL = null; for (int i = 0; i < img.getAttributes().getLength(); i++) { Node item = img.getAttributes().item(i); if (item.getNodeName().equalsIgnoreCase("x")) { x = new Integer(item.getTextContent()); } else if (item.getNodeName().equalsIgnoreCase("y")) { y = new Integer(item.getTextContent()); } else if (item.getNodeName().equalsIgnoreCase("width")) { w = new Integer(item.getTextContent()); } else if (item.getNodeName().equalsIgnoreCase("height")) { h = new Integer(item.getTextContent()); } else if (item.getNodeName().equalsIgnoreCase("url")) { imgURL = new URL(decodeValues(item.getTextContent())); } } if (imgURL != null) { BufferedImage tmp = javax.imageio.ImageIO.read(imgURL); // g.drawImage(tmp, x, y, x + w, y + h, 0, 0, tmp.getWidth(), tmp.getHeight(), null); } else { System.out.println("Image URL = NULL"); } } private void drawText(Node text) { // Graphics2D g = tempimage.createGraphics(); // fontSize = 12; int style = Font.PLAIN; String value = text.getTextContent(); // g.setRenderingHint(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC); // g.setRenderingHint(java.awt.RenderingHints.KEY_RENDERING, java.awt.RenderingHints.VALUE_RENDER_QUALITY); // g.setRenderingHint(java.awt.RenderingHints.KEY_DITHERING, java.awt.RenderingHints.VALUE_DITHER_ENABLE); // g.setRenderingHint(java.awt.RenderingHints.KEY_COLOR_RENDERING, java.awt.RenderingHints.VALUE_COLOR_RENDER_QUALITY); int x = 0; int y = 0; for (int i = 0; i < text.getAttributes().getLength(); i++) { Node item = text.getAttributes().item(i); if (item.getNodeName().equalsIgnoreCase("x")) { x = new Integer(item.getTextContent()); } else if (item.getNodeName().equalsIgnoreCase("y")) { y = new Integer(item.getTextContent()); } else if (item.getNodeName().equalsIgnoreCase("color")) { // g.setColor(new Color(Integer.decode(item.getTextContent()))); } else if (item.getNodeName().equalsIgnoreCase("fontname")) { fontName = item.getTextContent(); } else if (item.getNodeName().equalsIgnoreCase("fontsize")) { // fontSize = new Integer(item.getTextContent()); } else if (item.getNodeName().equalsIgnoreCase("bold")) { if (item.getTextContent().equalsIgnoreCase("true")) { style += Font.BOLD; } } else if (item.getNodeName().equalsIgnoreCase("italic") && item.getTextContent().equalsIgnoreCase("true")) { style += Font.ITALIC; } } // Font font = new Font(fontName, style, fontSize); // g.setFont(font); // g.drawString(decodeValues(value), x, y); } private String decodeValues(String value) { String retValue = value + ""; int startIndex = 0; int endIndex = 0; String key = ""; startIndex = retValue.indexOf('['); while (startIndex != -1) { endIndex = retValue.indexOf(']', startIndex); key = retValue.substring(startIndex + 1, endIndex); //System.out.println("KEY: " + key); if (treeValues.containsKey(key)) { retValue = retValue.substring(0, startIndex) + treeValues.get(key) + retValue.substring(endIndex + 1); } startIndex = retValue.indexOf('[', startIndex + 1); } return retValue; } // @Override public void startSource() { // isPlaying = true; // stopMe = false; new Thread(new Runnable() { @Override public void run() { // try { // loadXML(location, true); // } catch ( ParserConfigurationException | SAXException | IOException ex) { // Logger.getLogger(SourceWidget.class.getName()).log(Level.SEVERE, null, ex); // } long lastTimeStamp = System.currentTimeMillis(); // while (!stopMe) { // try { // Thread.sleep(1000); // if (updateTimeLaspe != 0 && (System.currentTimeMillis() - lastTimeStamp) > updateTimeLaspe) { // loadXML(location, true); // lastTimeStamp = System.currentTimeMillis(); // } // } catch (InterruptedException ex) { // Logger.getLogger(SourceWidget.class.getName()).log(Level.SEVERE, null, ex); // } catch (ParserConfigurationException | SAXException | IOException ex) { // Logger.getLogger(SourceWidget.class.getName()).log(Level.SEVERE, null, ex); // stopMe = true; // } // } // isPlaying = false; } }).start(); } // @Override // public void stopSource() { // stopMe = true; // isPlaying = false; // } // // @Override // public boolean canUpdateSource() { // return true; // } // @Override // public boolean hasText() { // return false; // } // // @Override // public boolean isPaused() { // return false; // } @Override public boolean isPlaying() { return true; //isPlaying; } @Override public void pause() { } @Override public void play() { } @Override public String toString() { return "Widget: " + name; } // @Override // public ImageIcon getThumbnail() { // ImageIcon icon = super.getCachedThumbnail(); // if (icon==null){ // icon = super.getThumbnail(); // try { // saveThumbnail(icon); // } catch (IOException ex) { // Logger.getLogger(SourceWidget.class.getName()).log(Level.SEVERE, null, ex); // } // } // return icon; // } @Override public void read() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void stop() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public boolean needSeek() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public BufferedImage getPreview() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void readNext() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } }