revision 8251 merged from trunk

This commit is contained in:
anupsawant 2011-06-17 20:46:53 +00:00
commit ab121ef274
9 changed files with 179 additions and 96 deletions

View file

@ -57,7 +57,7 @@ public abstract class UserAccountsEditPageStrategy extends UserAccountsPage {
private static class EmailStrategy extends UserAccountsEditPageStrategy {
private static final String PARAMETER_RESET_PASSWORD = "resetPassword";
private static final String EMAIL_TEMPLATE = "userAccounts-resetPasswordEmail.ftl";
private static final String EMAIL_TEMPLATE = "userAccounts-passwordResetPendingEmail.ftl";
public static final String RESET_PASSWORD_URL = "/accounts/resetPassword";

View file

@ -26,7 +26,7 @@ public class UserAccountsResetPasswordPage extends UserAccountsPasswordBasePage
private static final String TEMPLATE_NAME = "userAccounts-resetPassword.ftl";
private static final String EMAIL_TEMPLATE = "userAccounts-passwordResetEmail.ftl";
private static final String EMAIL_TEMPLATE = "userAccounts-passwordResetCompleteEmail.ftl";
protected UserAccountsResetPasswordPage(VitroRequest vreq) {
super(vreq);

View file

@ -4,7 +4,6 @@ package edu.cornell.mannlib.vitro.webapp.controller.accounts.user;
import static edu.cornell.mannlib.vedit.beans.LoginStatusBean.AuthenticationSource.EXTERNAL;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -18,7 +17,6 @@ import edu.cornell.mannlib.vitro.webapp.controller.authenticate.LoginRedirector;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.RedirectResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean;
/**
* Parcel out the different actions required of the UserAccounts GUI.

View file

@ -114,7 +114,7 @@ public class IndividualController extends FreemarkerHttpServlet {
return doNotFound(vreq);
}
ContentType rdfFormat = checkForLinkedDataRequest(url, vreq);
ContentType rdfFormat = checkUrlForLinkedDataRequest(url, vreq);
if( rdfFormat != null ){
return doRdf(vreq, individual, rdfFormat);
}
@ -472,110 +472,119 @@ public class IndividualController extends FreemarkerHttpServlet {
* to a GET request because it can only send bytes and not things. The server
* sends a 303, to mean "you asked for something I cannot send you, but I can
* send you this other stream of bytes about that thing."
* In the case of a request like http://vivo.cornell.edu/individual/n1234/n1234.rdf,
* In the case of a request like http://vivo.cornell.edu/individual/n1234/n1234.rdf
* or http://vivo.cornell.edu/individual/n1234?format=rdfxml,
* the request is for a set of bytes rather than an individual, so no 303 is needed.
*/
private static Pattern URI_PATTERN = Pattern.compile("^/individual/([^/]*)$");
private String checkForRedirect(String url, VitroRequest vreq) {
Matcher m = URI_PATTERN.matcher(url);
if( m.matches() && m.groupCount() == 1 ){
ContentType c = checkForLinkedDataRequest(url, vreq);
if( c != null ){
String redirectUrl = "/individual/" + m.group(1) + "/" + m.group(1) ;
if( RDFXML_MIMETYPE.equals( c.getMediaType()) ){
return redirectUrl + ".rdf";
}else if( N3_MIMETYPE.equals( c.getMediaType() )){
return redirectUrl + ".n3";
}else if( TTL_MIMETYPE.equals( c.getMediaType() )){
return redirectUrl + ".ttl";
}//else send them to html
}
//else redirect to HTML representation
return "display/" + m.group(1);
}else{
return null;
}
String formatParam = (String) vreq.getParameter("format");
if ( formatParam == null ) {
Matcher m = URI_PATTERN.matcher(url);
if ( m.matches() && m.groupCount() == 1 ) {
ContentType c = checkAcceptHeaderForLinkedDataRequest(url, vreq);
if ( c != null ) {
String redirectUrl = "/individual/" + m.group(1) + "/" + m.group(1) ;
if ( RDFXML_MIMETYPE.equals( c.getMediaType() ) ) {
return redirectUrl + ".rdf";
} else if ( N3_MIMETYPE.equals( c.getMediaType() ) ) {
return redirectUrl + ".n3";
} else if ( TTL_MIMETYPE.equals( c.getMediaType() ) ) {
return redirectUrl + ".ttl";
}//else send them to html
}
//else redirect to HTML representation
return "display/" + m.group(1);
}
}
return null;
}
private static Pattern RDF_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.rdf$");
private static Pattern N3_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.n3$");
private static Pattern TTL_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.ttl$");
private static Pattern HTML_REQUEST = Pattern.compile("^/display/([^/]*)$");
protected ContentType checkAcceptHeaderForLinkedDataRequest(String url, VitroRequest vreq) {
try {
/*
* Check the accept header. This request will trigger a
* redirect with a 303 ("see also"), because the request is for
* an individual but the server can only provide a set of bytes.
*/
String acceptHeader = vreq.getHeader("accept");
if (acceptHeader != null) {
String ctStr = ContentType.getBestContentType(
ContentType.getTypesAndQ(acceptHeader),
getAcceptedContentTypes());
if (ctStr!=null && (
RDFXML_MIMETYPE.equals(ctStr) ||
N3_MIMETYPE.equals(ctStr) ||
TTL_MIMETYPE.equals(ctStr) ))
return new ContentType(ctStr);
}
} catch (Throwable th) {
log.error("Problem while checking accept header " , th);
}
return null;
}
public static final Pattern RDFXML_FORMAT = Pattern.compile("rdfxml");
public static final Pattern N3_FORMAT = Pattern.compile("n3");
public static final Pattern TTL_FORMAT = Pattern.compile("ttl");
private static Pattern RDF_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.rdf$");
private static Pattern N3_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.n3$");
private static Pattern TTL_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.ttl$");
private static Pattern HTML_REQUEST = Pattern.compile("^/display/([^/]*)$");
/**
* @return null if this is not a linked data request, returns content type if it is a
* linked data request.
* linked data request.
* These are Vitro-specific ways of requesting rdf, unrelated to semantic web standards.
* They do not trigger a redirect with a 303, because the request is for a set of bytes
* rather than an individual.
*/
protected ContentType checkForLinkedDataRequest(String url, VitroRequest vreq ) {
try {
Matcher m;
/*
* Check for url param specifying format.
* Example: http://vivo.cornell.edu/individual/n23?format=rdfxml
* This request will trigger a redirect with a 303.
*/
String formatParam = (String) vreq.getParameter("format");
if (formatParam != null) {
m = RDFXML_FORMAT.matcher(formatParam);
if ( m.matches() ) {
return ContentType.RDFXML;
}
m = N3_FORMAT.matcher(formatParam);
if( m.matches() ) {
return ContentType.N3;
}
m = TTL_FORMAT.matcher(formatParam);
if( m.matches() ) {
return ContentType.TURTLE;
}
}
/*
* Check the accept header. This request will trigger a
* redirect with a 303, because the request is for an individual
* but the server can only provide a set of bytes.
*/
String acceptHeader = vreq.getHeader("accept");
if (acceptHeader != null) {
String ctStr = ContentType.getBestContentType(
ContentType.getTypesAndQ(acceptHeader),
getAcceptedContentTypes());
if (ctStr!=null && (
RDFXML_MIMETYPE.equals(ctStr) ||
N3_MIMETYPE.equals(ctStr) ||
TTL_MIMETYPE.equals(ctStr) ))
return new ContentType(ctStr);
}
/*
* Check for parts of URL that indicate request for RDF
* http://vivo.cornell.edu/individual/n23/n23.rdf
* http://vivo.cornell.edu/individual/n23/n23.n3
* http://vivo.cornell.edu/individual/n23/n23.ttl
* This request will not trigger a redirect and 303, because
* the request is for a set of bytes rather than an individual.
*/
m = RDF_REQUEST.matcher(url);
if( m.matches() ) {
return ContentType.RDFXML;
protected ContentType checkUrlForLinkedDataRequest(String url, VitroRequest vreq ) {
Matcher m;
/*
* Check for url param specifying format.
* Example: http://vivo.cornell.edu/individual/n23?format=rdfxml
*/
String formatParam = (String) vreq.getParameter("format");
if (formatParam != null) {
m = RDFXML_FORMAT.matcher(formatParam);
if ( m.matches() ) {
return ContentType.RDFXML;
}
m = N3_REQUEST.matcher(url);
if( m.matches() ) {
return ContentType.N3;
}
m = TTL_REQUEST.matcher(url);
if( m.matches() ) {
return ContentType.TURTLE;
}
m = N3_FORMAT.matcher(formatParam);
if( m.matches() ) {
return ContentType.N3;
}
m = TTL_FORMAT.matcher(formatParam);
if( m.matches() ) {
return ContentType.TURTLE;
}
}
/*
* Check for parts of URL that indicate request for RDF. Examples:
* http://vivo.cornell.edu/individual/n23/n23.rdf
* http://vivo.cornell.edu/individual/n23/n23.n3
* http://vivo.cornell.edu/individual/n23/n23.ttl
*/
m = RDF_REQUEST.matcher(url);
if( m.matches() ) {
return ContentType.RDFXML;
}
m = N3_REQUEST.matcher(url);
if( m.matches() ) {
return ContentType.N3;
}
m = TTL_REQUEST.matcher(url);
if( m.matches() ) {
return ContentType.TURTLE;
}
} catch (Throwable th) {
log.error("problem while checking accept header " , th);
}
return null;
}