<%@ page contentType="text/plain;charset=ISO-8859-1" import="java.io.*" %> <% /************************************************ * This is an example implementation of a Kepler AuthNamespace web service. * * The output parameters are * error, namespace * The optional input parameters are * username, password, namespace * ************************************ * Kepler AuthNamespace Web Service * ************************************ * * The namespace that is returned shall always be unique for the given URL regardless of URI input parameters * The file type returned by the webservice shall be text/plain and shall contain the two output parameters * formatted in accordance with the java.util.Properties specification. * * Optionally a username and password parameter may be supplied to the webservice for authenticating users * or simply for disallowing robots from accessing the service. * Implementations of the AuthNamespace service may also optionally accept a namespace as an input, * check to see if that namespace is available, and return it if it is available or return an error if it is not. * ************************************************/ try { /* * The authority string should exactly match the URL this service is accessed by. * This prevents having multiple URLs accessing this same JSP page which would be bad * since the namespaces generated by an authority must be unique to that authority. */ String authority = "http://library.kepler-project.org/kepler/style/skins/kepler/keplerAuthNameSpace.jsp"; String accessedAuthority = request.getRequestURL().toString(); /* * Get username and password inputs. */ String user = request.getParameter( "username" ); String pass = request.getParameter( "password" ); /* * Make sure the URL used to access this service is the correct authority URL. */ if ( accessedAuthority != null && accessedAuthority.equals( authority )) { /* * Check to make sure the "kepler" username/password was given * This will prevent stray robots or users from incrementing namespaces arbitrarily. */ if ( user != null && user.equals("kepler") ) { if ( pass != null && pass.equals("kepler") ) { if ( request.getParameter( "namespace" ) != null ) { // TODO query a database for the requested namespace // print namespace if it is not already taken and insert it into the database // return an error if the namespace has already been reserved } else { /* Store an incrementing integer in a file. * This approach may fail due to collisions under high load conditions. * But works fine for this example implementation. */ ServletContext context = session.getServletContext(); String fname = "/var/kepler/last_issued_namespace.txt"; Integer inc = new Integer(0); File f = new File( fname ); if (f.exists()) { // Read in the previous Integer InputStream is = new FileInputStream(fname); ObjectInput oi = new ObjectInputStream(is); inc = (Integer) oi.readObject(); oi.close(); int i = inc.intValue() + 1; inc = new Integer( i ); } // Write out the incremented integer (or 0 if the file does not exist) OutputStream os = new FileOutputStream(fname); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject( inc ); oos.flush(); /* * Print out the incremented Integer as the namespace output * in java.util.Properties format. */ out.println( "namespace=" + inc + "\n" ); } } else { throw new Exception("The specified password is incorrect"); } } else { throw new Exception("The specified username is incorrect."); } } else { throw new Exception("The specified authority URL is incorrect."); } } catch (Exception e) { /* * Print out the error in java.util.Properties format. */ out.println( "error=" + e.getMessage() + "\n" ); } %>