package AstroIX; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParser; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.Attributes; import java.util.HashMap; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** Servlet, das eine Ressource aufgrund ihrer als Query-String mitgegebenen Guid identifiziert und den Browser zu einem Redirect auf ihre URL veranlasst. @see <a href="http://www.astrotexte.ch/sources/about_index.html#8">Über den Index</a>*/ public class GetByGuid extends HttpServlet { /** Puffer für die Beziehung Guid -> Href */ static HashMap hrefMap = new HashMap(); /** SAX Event Handler, als innere Klasse definiert,der die Beziehung Guid -> URL aus dem <code>index.xml</code> Dokument aufbauen kann. */ class DocumentHandler extends DefaultHandler { String key=null; public void startElement(String namespaceURI, String sName, String qName, Attributes attrs) throws SAXException { String href; // <item>-Element und darin enthaltenes <link>-Element abfangen // Wenn <item> ein guid-Attribut hat, guid mit href in Hash aufnehmen if ( qName.equals("item") && (key=attrs.getValue("guid"))!=null) // Sonderzeichen aus Guid entfernen, um URL-Encoding zu vermeiden key=key.replaceAll("[^0-9a-fA-F]",""); else if ((key != null) && qName.equals("link") && ((href = attrs.getValue("href"))!=null)) { // Eintrag aufnehmen hrefMap.put(key,href); // Globales Feld key zurücksetzen key = null; } } } /** Get-Methode; nimmt aus der URL die Guid entgegen, deren Ressource zu suchen ist und führt den Redirect auf diese Ressource aus. Für ungültige Guids wird eine entsprechende Fehlermeldung im <code>text/plain</code>-Format zurückgesendet. */ public void doGet(HttpServletRequest request, HttpServletResponse response) { java.io.PrintWriter out = null; String indexURL; String key; // Um eine Fehlermeldung im Browser auszugeben, falls ID nicht gefunden response.setContentType("text/plain"); try { out = response.getWriter(); key = request.getRequestURI(); key = key.substring(key.lastIndexOf('/')+1).toUpperCase(); // Guid nicht gefunden? Dann muss evtl. der Index neu gelesen werden if (hrefMap.get(key) == null) { indexURL = request. getRequestURL().toString(). replaceFirst("(/servlet)?/getByGuid.*$","/sources/index.xml"); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); saxParser.parse( indexURL , new DocumentHandler() ); } // Nachschlagen. ob Guid existiert if (hrefMap.get(key) == null) // Nein - Fehlermeldung ausgeben... out.println( "ID " + key + " wurde nicht gefunden"); else // Ja - Browser zum Redirect veranlassen response.sendRedirect( ((String) hrefMap.get(key)).substring(1)); // Alles abfangen } catch (Throwable t) { if (out == null) t.printStackTrace( System.out ); else t.printStackTrace( out ); }; } }