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 class EmailStrategy extends UserAccountsEditPageStrategy {
private static final String PARAMETER_RESET_PASSWORD = "resetPassword"; 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"; 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 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) { protected UserAccountsResetPasswordPage(VitroRequest vreq) {
super(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 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.Log;
import org.apache.commons.logging.LogFactory; 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.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.RedirectResponseValues; 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.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean;
/** /**
* Parcel out the different actions required of the UserAccounts GUI. * Parcel out the different actions required of the UserAccounts GUI.

View file

@ -114,7 +114,7 @@ public class IndividualController extends FreemarkerHttpServlet {
return doNotFound(vreq); return doNotFound(vreq);
} }
ContentType rdfFormat = checkForLinkedDataRequest(url, vreq); ContentType rdfFormat = checkUrlForLinkedDataRequest(url, vreq);
if( rdfFormat != null ){ if( rdfFormat != null ){
return doRdf(vreq, individual, rdfFormat); return doRdf(vreq, individual, rdfFormat);
} }
@ -472,51 +472,83 @@ public class IndividualController extends FreemarkerHttpServlet {
* to a GET request because it can only send bytes and not things. The server * 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 * 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." * 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. * 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 static Pattern URI_PATTERN = Pattern.compile("^/individual/([^/]*)$");
private String checkForRedirect(String url, VitroRequest vreq) { private String checkForRedirect(String url, VitroRequest vreq) {
String formatParam = (String) vreq.getParameter("format");
if ( formatParam == null ) {
Matcher m = URI_PATTERN.matcher(url); Matcher m = URI_PATTERN.matcher(url);
if( m.matches() && m.groupCount() == 1 ){ if ( m.matches() && m.groupCount() == 1 ) {
ContentType c = checkForLinkedDataRequest(url, vreq); ContentType c = checkAcceptHeaderForLinkedDataRequest(url, vreq);
if( c != null ){ if ( c != null ) {
String redirectUrl = "/individual/" + m.group(1) + "/" + m.group(1) ; String redirectUrl = "/individual/" + m.group(1) + "/" + m.group(1) ;
if( RDFXML_MIMETYPE.equals( c.getMediaType()) ){ if ( RDFXML_MIMETYPE.equals( c.getMediaType() ) ) {
return redirectUrl + ".rdf"; return redirectUrl + ".rdf";
}else if( N3_MIMETYPE.equals( c.getMediaType() )){ } else if ( N3_MIMETYPE.equals( c.getMediaType() ) ) {
return redirectUrl + ".n3"; return redirectUrl + ".n3";
}else if( TTL_MIMETYPE.equals( c.getMediaType() )){ } else if ( TTL_MIMETYPE.equals( c.getMediaType() ) ) {
return redirectUrl + ".ttl"; return redirectUrl + ".ttl";
}//else send them to html }//else send them to html
} }
//else redirect to HTML representation //else redirect to HTML representation
return "display/" + m.group(1); return "display/" + m.group(1);
}else{ }
}
return null; return null;
} }
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 RDF_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.rdf$");
private static Pattern N3_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.n3$"); private static Pattern N3_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.n3$");
private static Pattern TTL_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.ttl$"); private static Pattern TTL_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.ttl$");
private static Pattern HTML_REQUEST = Pattern.compile("^/display/([^/]*)$"); private static Pattern HTML_REQUEST = Pattern.compile("^/display/([^/]*)$");
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");
/** /**
* @return null if this is not a linked data request, returns content type if it is a * @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 ) { protected ContentType checkUrlForLinkedDataRequest(String url, VitroRequest vreq ) {
try {
Matcher m; Matcher m;
/* /*
* Check for url param specifying format. * Check for url param specifying format.
* Example: http://vivo.cornell.edu/individual/n23?format=rdfxml * Example: http://vivo.cornell.edu/individual/n23?format=rdfxml
* This request will trigger a redirect with a 303.
*/ */
String formatParam = (String) vreq.getParameter("format"); String formatParam = (String) vreq.getParameter("format");
if (formatParam != null) { if (formatParam != null) {
@ -535,30 +567,10 @@ public class IndividualController extends FreemarkerHttpServlet {
} }
/* /*
* Check the accept header. This request will trigger a * Check for parts of URL that indicate request for RDF. Examples:
* 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.rdf
* http://vivo.cornell.edu/individual/n23/n23.n3 * http://vivo.cornell.edu/individual/n23/n23.n3
* http://vivo.cornell.edu/individual/n23/n23.ttl * 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); m = RDF_REQUEST.matcher(url);
if( m.matches() ) { if( m.matches() ) {
@ -573,9 +585,6 @@ public class IndividualController extends FreemarkerHttpServlet {
return ContentType.TURTLE; return ContentType.TURTLE;
} }
} catch (Throwable th) {
log.error("problem while checking accept header " , th);
}
return null; return null;
} }

View file

@ -0,0 +1,36 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#-- Default VIVO individual profile page template (extends individual.ftl in vitro) -->
<#include "individual-setup.ftl">
<#assign individualProductExtension>
<#-- Include for any class specific template additions -->
${classSpecificExtension!}
<#include "individual-overview.ftl">
</section> <!-- #individual-info -->
</section> <!-- #individual-intro -->
</#assign>
<#assign nameForOtherGroup = "other"> <#-- used by both individual-propertyGroupMenu.ftl and individual-properties.ftl -->
<h3>Menu management</h3>
<#-- Menu Ontology properties -->
<#include "individual-menu-properties.ftl">
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/individual/individual.css" />',
'<link rel="stylesheet" href="${urls.base}/css/individual/individual-vivo.css" />')}
${headScripts.add('<script type="text/javascript" src="${urls.base}/js/jquery_plugins/jquery.truncator.js"></script>',
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/getURLParam.js"></script>',
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/colorAnimations.js"></script>',
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/jquery.form.js"></script>',
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/qtip/jquery.qtip-1.0.0-rc3.min.js"></script>',
'<script type="text/javascript" src="${urls.base}/js/tiny_mce/tiny_mce.js"></script>',
'<script type="text/javascript" src="${urls.base}/js/controls.js"></script>',
'<script type="text/javascript" src="${urls.base}/js/toggle.js"></script>')}
${scripts.add('<script type="text/javascript" src="${urls.base}/js/imageUpload/imageUploadUtils.js"></script>',
'<script type="text/javascript" src="${urls.base}/js/individual/individualUtils.js"></script>')}

View file

@ -0,0 +1,24 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#-- Template for menu management page -->
<#import "lib-properties.ftl" as p>
<#list propertyGroups.all as group>
<#assign groupName = group.getName(nameForOtherGroup)>
<#-- Display the group heading -->
<#if groupName?has_content>
<h2 id="${groupName}">${groupName?capitalize}</h2>
</#if>
<#-- List the menu items(properties) in the group -->
<#list group.properties as property>
<#if property.localName == "hasElement">
<#-- List menu Items -->
<@p.objectProperty property editable property.template />
<br /><#--remove break-->
<@p.addLink property editable />
</#if>
</#list>
</#list>

View file

@ -75,7 +75,11 @@ Assumes property is non-null. -->
<#macro objectPropertyList property editable statements=property.statements template=property.template> <#macro objectPropertyList property editable statements=property.statements template=property.template>
<#list statements as statement> <#list statements as statement>
<#if property.localName == "hasElement">
<@menuItem property statement editable><#include "${template}"></@menuItem>
<#else>
<@propertyListItem property statement editable><#include "${template}"></@propertyListItem> <@propertyListItem property statement editable><#include "${template}"></@propertyListItem>
</#if>
</#list> </#list>
</#macro> </#macro>
@ -95,9 +99,13 @@ name will be used as the label. -->
<#--@dump var="property"/--> <#--@dump var="property"/-->
<#local url = property.addUrl> <#local url = property.addUrl>
<#if url?has_content> <#if url?has_content>
<#if property.localName == "hasElement">
<@showAddMenuItemLink property.localName label addParamsToEditUrl(url, extraParams) />
<#else>
<@showAddLink property.localName label addParamsToEditUrl(url, extraParams) /> <@showAddLink property.localName label addParamsToEditUrl(url, extraParams) />
</#if> </#if>
</#if> </#if>
</#if>
</#macro> </#macro>
<#function addParamsToEditUrl url extraParams=""> <#function addParamsToEditUrl url extraParams="">
@ -241,4 +249,12 @@ name will be used as the label. -->
<@editingLinks "label" label editable /> <@editingLinks "label" label editable />
</#macro> </#macro>
<#-- Add menu item button -->
<#macro showAddMenuItemLink propertyLocalName label url>
<a class="add-${propertyLocalName} green button" href="${url}" title="Add new ${label?lower_case} entry">Add menu item</a>
</#macro>
<#-- List menu items -->
<#macro menuItem property statement editable >
Position | <#nested> | <@editingLinks "${property.localName}" statement editable/> <br />
</#macro>