summaryrefslogblamecommitdiffstats
path: root/dozentenmodul/src/main/java/util/News.java
blob: 239d06e3238d37abdb8adf3083cba6358b47dca2 (plain) (tree)






















































































































































































































                                                                                                                                                        
package util;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.Date;

import javax.swing.JOptionPane;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import models.SessionData;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

// Class representing the news given by the satellite
// Makes use of the News-API of the webservice slx-admin:
// 		http://satellite.ip/slx-admin/api.php?do=news
//
// Access the 'headline', 'content' and 'date' by their public getters:
//		String newsContent = News.getContent();

public class News {

	// Private members representing the news
	private static String headline = null;
	private static String content = null;
	private static Date date = null;
	 
	// Public getters
	public static String getHeadline() {
		if (headline != null)
			return headline;
		else {
			init();
			// check if it is still null
			if (headline != null)
				return headline;
			else
				return null;
		}
	}
	public static String getContent() {
		if (content != null)
			return content;
		else {
			init();
			if (content != null)
				return content;
			else
				return null;
		}
	}
	public static Date getDate() {
		if (date != null)
			return date;
		else {
			init();
			if (date != null)
				return date;
			else
				return null;
		}
	}
	
	// Private setters
	private static void setHeadline(String s) {
		if (s != null) headline = s;
	}
	private static void setContent(String s) {
		if (s != null) content = s;
	}
	private static void setDate(Date d) {
		if (d != null) date = d;
	}
	
	
	// Private 'init' function doing the main work.
	// It is called by getters if their object is null. 
	//
	// Follows these steps:
	// 	- Opens URL as stream
	// 	- Parse stream as (XML-)Document
	// 	- Check validity of the news format:
	//	  	<news>
	//			<headline>...</headline>
	//			<content>...</content>
	//			<date>...</date>
	//		</news>
	//
	//	- Sets private members
	private static void init(){
		// Document representing the XML
		Document doc = null;
		
		// URL to news api
		URL url = null;
		try {
			url = new URL("http://" + SessionData.session.getServerAdress() + "/slx-admin/api.php?do=news");
		} catch (MalformedURLException e2) {
			e2.printStackTrace();
			// This shouldn't happen, but in case it does, alert user.
			JOptionPane.showMessageDialog(null,
					"News-URL falsch formatiert!",
					"Fehler", JOptionPane.ERROR_MESSAGE);
		}
		
		// check for argument
		if (url == null) {
			// no URL, alert user.
			JOptionPane.showMessageDialog(null,
					"Keine News-URL angegben!",
					"Fehler", JOptionPane.ERROR_MESSAGE);
			return;
		}
				
		// prepare stream
		InputStream is = null;
		try {
			is = url.openStream();
		} catch (IOException e1) {
			e1.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"Konnte den News-URL-Stream nicht öffnen!",
					"Fehler", JOptionPane.ERROR_MESSAGE);
		}
		
		// use java's DocumentBuilder engine to parse the XML
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = null;
		
		try {
			builder = factory.newDocumentBuilder();
		} catch (ParserConfigurationException e1) {
			e1.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"XML-Parser falsch konfiguriert!",
					"Fehler", JOptionPane.ERROR_MESSAGE);
		}
		
		// try the parsing
		try {
			doc = builder.parse(is);
		} catch (SAXException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"Konnte die News-XML nicht parsen!",
					"Fehler", JOptionPane.ERROR_MESSAGE);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null,
					"IO-Fehler!",
					"Fehler", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}

		// now that we have parsed the XML, check if it is valid
		Element docRoot = doc.getDocumentElement();
		
		// first element has to be name "news"
		if (docRoot.getNodeName().equals("news")) {
			Node headlineNode = null;
			Node contentNode = null;
			Node dateNode = null;
			
			// get list of every child
			NodeList nList = docRoot.getElementsByTagName("*");		
			
			// fail if the list is empty
			if (nList == null) return;
			
			// now we go through the list looking for our elements
			// TODO: get definition of tags externally/through static api?
			for (int i = 0; i < nList.getLength(); i++) {
				Node current = nList.item(i);
				if (current.getNodeType() == Node.ELEMENT_NODE) {
					if (current.getNodeName().equals("headline") && 
							current.getFirstChild().getNodeType() == Node.TEXT_NODE) headlineNode = current.getFirstChild();
					if (current.getNodeName().equals("info") &&
							current.getFirstChild().getNodeType() == Node.TEXT_NODE) contentNode = current.getFirstChild();
					if (current.getNodeName().equals("date") &&
							current.getFirstChild().getNodeType() == Node.TEXT_NODE) dateNode = current.getFirstChild();
				}
			}
			
			// set what the elements we found
			if (headlineNode != null) setHeadline(headlineNode.getNodeValue().trim());
			if (contentNode != null)  setContent(contentNode.getNodeValue().trim());
			if (dateNode != null) {
				// for the date we need a bit more stuff
				Date tmpDate = null;
				try {
					tmpDate = new Date(Long.parseLong(dateNode.getNodeValue().trim()));
				} catch (NumberFormatException nfe) {
					nfe.printStackTrace();
					JOptionPane.showMessageDialog(null,
							"Zeitstempel aus der XML is invalid!",
							"Fehler", JOptionPane.ERROR_MESSAGE);
				}
				// Date creation worked, save it
				if (tmpDate != null) setDate(tmpDate);
			}
		} else {
			JOptionPane.showMessageDialog(null,
					"Invalides XML! Kein 'news' Wurzelelement. News wird leer gelassen.",
					"Fehler", JOptionPane.ERROR_MESSAGE);
			return;
		}
	}	
}