Klassen des Pakets AstroIX: Zur Doku-Startseite Zurück zur Homepage

Klasse GetByGuid

Javadoc von GetByGuid   GetByGuid.java herunterladen

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 ); };

  }

}

Zum Seitenanfang Lizenzbedingungen Der Quellcode wird mit dem GNU source-highlight 1.7 dargestellt