Compare commits

..

41 commits

Author SHA1 Message Date
234a849a19 Moved shortview config to VIVO branch 2021-06-28 20:02:53 +02:00
75557ca4aa Moved template change to VIVO branch 2021-06-28 14:41:22 +02:00
45f303c1ae Reverted changes to Vitro templates. Move files to VIVO branch. 2021-06-28 14:27:03 +02:00
f16eef642a Use unique key in account activation link and reset password link (#234)
* Use unique key for email activation and password reset

* Renamed old variable from hash to key

* Check for null before setting email key for backward compatibility. Removed comment about old behaviour.

* Send password_change_invalid_key message instead of password_change_not_pending on key mismatch.
2021-06-12 18:56:16 +02:00
Brian Lowe
0df4231b41 Move event listening to RDFServiceGraph level to avoid adding a new redundant listener each time a model is made for an existing RDFServiceGraph. Resolve https://jira.lyrasis.org/browse/VIVO-1976 2021-04-12 13:05:52 +02:00
Brian Lowe
48297bba56 Allow site admins to edit pages in page management. Resolve https://jira.lyrasis.org/browse/VIVO-1973 2021-04-09 15:34:15 +02:00
32f817e73a Autoselect hits per page from query. 2021-04-07 18:04:34 +02:00
Svetlana Rastegina
a9a89d220b Added classes for titles. 2021-03-31 14:21:04 +02:00
1dbbe6ed4c Renamed works to sources 2021-03-30 15:41:59 +02:00
4ab94d59af Fix compilation creation 2021-03-26 14:11:30 +01:00
c2429a6768 Allow table tags in TinyMCE 2021-03-25 12:40:40 +01:00
Svetlana Rastegina
64cd06fbbb Removed collapsible buttons paddings. 2021-03-22 23:08:22 +01:00
Svetlana Rastegina
0bdfe65d42 Removed margin top in search results. 2021-03-22 19:43:53 +01:00
8e3a98cc56 Collapse all results on virtual article display 2021-03-22 19:20:00 +01:00
e2d37bbb75 Moved create new compilation button inside container 2021-03-22 13:29:42 +01:00
caa1bc8412 Hide literature and bibliography by default 2021-03-22 13:17:12 +01:00
63f15a90ef Fixed delete individual url params 2021-03-01 21:56:42 +01:00
cb35b5f647 Open try block before creating query 2021-03-01 12:32:21 +01:00
2f8fa040db Allow admins delete individuals 2021-02-25 23:17:32 +01:00
75841b9fb2 Do not create compilation with no excerpts 2021-02-25 21:48:19 +01:00
1590d58830 Process query builder rules in custom search controller 2021-02-24 01:17:53 +01:00
a6fa88bd1f Cleaned custom search controller 2021-02-23 20:39:55 +01:00
d6eb01de9c Fix naming mistake in describe query 2021-02-18 18:53:07 +01:00
af9820b7f3 Added template model, freemarker macro and pass checks in EditRequestDispatchController for individual deletion 2021-02-18 18:33:52 +01:00
William Welling
2e0b3f0f05 VIVO-1929: patch authorizing create individual form (#206)
* patch authorizing create individual form

Resolves: https://jira.lyrasis.org/browse/VIVO-1929
2021-02-17 15:25:39 +01:00
4fdbb71fee Added code for deleting individuals 2021-02-17 14:15:10 +01:00
2a56ec8c30 fix 2021-01-30 17:43:36 +01:00
566ca88d6f Added scripts to fill out new compilation form from search results 2021-01-27 18:54:39 +01:00
9d48755893 Removed unused code 2020-09-21 15:21:44 +02:00
f6fbe83c90 Show query form in search error page 2020-09-03 17:23:08 +02:00
3e5e60e788 Added combined search form. 2020-09-03 15:37:54 +02:00
084801bf5e Reorder search results messages 2020-09-02 16:10:05 +02:00
df8c386663 Added query builder to search results 2020-08-25 10:48:29 +02:00
98398a58b6 Switch to custom search service 2020-08-18 15:07:34 +02:00
37579c5581 Changed ontology 2020-08-13 19:36:12 +02:00
ee16a2863d Configured used html tags 2020-08-03 16:53:44 +02:00
38e8d326a6 Fix compile error 2020-08-03 16:16:23 +02:00
d2a3a73d3c Antisamy policy fixes 2020-08-03 16:16:02 +02:00
06e1e104df Added search queries 2020-07-14 14:14:00 +02:00
f36881f24c Short view for virtual articles 2020-07-08 13:33:32 +02:00
d5a9a9bca6 Virtual articles search template 2020-07-08 13:19:23 +02:00
573 changed files with 4726 additions and 78903 deletions

View file

@ -1,34 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. Windows, Linux]
- Browser [e.g. chrome, safari]
- Tomcat version [e.g. 8, 9]
- VIVO version [e.g. 1.11.0, 1.12.0]
- Apache Solr or ElasticSearch version
**Additional context**
Add any other context about the problem here.

View file

@ -1,20 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -1,7 +1,7 @@
**Thank you for submitting a pull request! Title this pull request with a brief description of what the pull request fixes/improves/changes. Please describe the pull request in detail using the template below.**
* * *
**[VIVO GitHub issue](https://github.com/vivo-project/VIVO/issues)**: (please link to issue)
**[JIRA Issue](https://jira.duraspace.org/projects/VIVO)**: (please link to issue)
* Other Relevant Links (Mailing list discussion, related pull requests, etc.)
@ -29,7 +29,6 @@ Example:
* Does this change add any new dependencies?
* Does this change require any other modifications to be made to the repository?
* Could this change impact execution of existing code?
* Large pull requests should be avoided. If this PR is large (more than 1,000 lines of codes), please provide short explanation why your contribution can't be decoupled in smaller PRs.
# Interested parties
Tag (@ mention) interested parties or, if unsure, @VIVO-project/vivo-committers

View file

@ -1,32 +0,0 @@
name: Build
on: [ push, pull_request, workflow_dispatch ]
jobs:
build:
runs-on: ubuntu-latest
env:
MAVEN_OPTS: -Xmx1024M
steps:
- uses: actions/checkout@v3
with:
path: Vitro
- name: Maven Cache
uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-cache-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-cache-m2-
- name: Setup Java
uses: actions/setup-java@v1
with:
java-version: 11
- name: Maven Build
run: |
cd ./Vitro
mvn clean install

5
.gitignore vendored
View file

@ -24,8 +24,3 @@ utilities/sdb_to_tdb/.work
**/.classpath
**/.project
**/bin/
.fake
.ionide
.vscode

22
.travis.yml Normal file
View file

@ -0,0 +1,22 @@
language: java
dist: trusty
sudo: false
jdk:
- openjdk8
- oraclejdk8
env:
# Give Maven 1GB of memory to work with
- MAVEN_OPTS=-Xmx1024M
cache:
directories:
- .autoconf
- $HOME/.m2
install:
- "echo 'Skipping install stage, dependencies will be downloaded during build and test stages.'"
script:
- "mvn clean package -Dmaven.test.skip=false"

View file

@ -1,6 +1,6 @@
# What is Vitro?
[![Build](https://github.com/vivo-project/Vitro/workflows/Build/badge.svg)](https://github.com/vivo-project/Vitro/actions?query=workflow%3ABuild)
[![Build Status](https://travis-ci.org/vivo-project/Vitro.png?branch=develop)](https://travis-ci.org/vivo-project/Vitro)
Vitro is a general-purpose web-based ontology and instance editor with customizable public browsing.
@ -16,6 +16,7 @@ With Vitro, you can:
* Search your data with Apache Solr
Vitro was originally developed at Cornell University, and is used as the core of the popular
research and scholarship portal, [VIVO](https://vivo.lyrasis.org/).
research and scholarship portal, [VIVO](https://duraspace.org/vivo/).
For more information, contact the [VIVO community](https://duraspace.org/vivo/resources/contact/).
For more information, contact the [VIVO community](https://vivo.lyrasis.org/contact/).

View file

@ -7,13 +7,13 @@
<groupId>org.vivoweb</groupId>
<artifactId>vitro-api</artifactId>
<version>1.14.1-SNAPSHOT</version>
<version>1.11.2-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.vivoweb</groupId>
<artifactId>vitro-project</artifactId>
<version>1.14.1-SNAPSHOT</version>
<version>1.11.2-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
@ -21,13 +21,6 @@
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<runOrder>alphabetical</runOrder>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
@ -73,7 +66,7 @@
<dependency>
<groupId>org.vivoweb</groupId>
<artifactId>vitro-dependencies</artifactId>
<version>1.14.1-SNAPSHOT</version>
<version>1.11.2-SNAPSHOT</version>
<type>pom</type>
</dependency>
<dependency>
@ -92,7 +85,7 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>

View file

@ -8,7 +8,6 @@ public class DynamicFieldRow {
private int id = -1;
private String value = null;
private String language = "";
private Map parameterMap = null;
public int getId() {
@ -35,13 +34,4 @@ public class DynamicFieldRow {
this.parameterMap = parameterMap;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
if (language != null) {
this.language = language;
}
}
}

View file

@ -23,14 +23,10 @@ import edu.cornell.mannlib.vedit.beans.FormObject;
import edu.cornell.mannlib.vedit.beans.DynamicField;
import edu.cornell.mannlib.vedit.beans.DynamicFieldRow;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import edu.cornell.mannlib.vedit.tags.EditTag;
public class DynamicFieldsTag extends EditTag {
private static final String LANGUAGE = "language";
private char PATH_SEP = File.separatorChar;
public final String MARKUP_FILE_PATH = "templates"+PATH_SEP+"edit"+PATH_SEP+"specific"+PATH_SEP;
@ -179,12 +175,7 @@ public class DynamicFieldsTag extends EditTag {
String key = (String) paramIt.next();
String value = (String) row.getParameterMap().get(key);
byte[] valueInBase64 = Base64.encodeBase64(value.getBytes());
taName.append(key).append(":").append(new String(valueInBase64));
if (StringUtils.isNotBlank(row.getLanguage())) {
byte[] encodedLang = Base64.encodeBase64(row.getLanguage().getBytes());
taName.append(":").append(LANGUAGE).append(":").append(new String(encodedLang));
}
taName.append(";");
taName.append(key).append(":").append(new String(valueInBase64)).append(";");
}
if (row.getValue().length() > 0) {
String templateWithVars = templateMarkup;

View file

@ -6,6 +6,8 @@ import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@ -15,7 +17,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
@ -271,37 +272,6 @@ public class FormUtils {
return options;
}
public static List<Option> makeOptionListOfNotDisjointClasses(WebappDaoFactory wadf, String baseVclassUri, String selectedUri) {
VClassDao vClassDao = wadf.getVClassDao();
Set<String> uris = getNotDisjointClassUris(wadf, baseVclassUri, vClassDao);
uris.add(baseVclassUri);
List<Option> options = new LinkedList<>();
for (String vclassUri : uris) {
VClass vclass = vClassDao.getVClassByURI(vclassUri);
Option option = new Option();
option.setValue(vclass.getURI());
option.setBody(vclass.getPickListName());
options.add(option);
if (Objects.equals(selectedUri, vclass.getURI())) {
option.setSelected(true);
}
}
options.sort((o1, o2) -> o1.getBody().compareTo(o2.getBody()));
return options;
}
private static Set<String> getNotDisjointClassUris(WebappDaoFactory wadf, String classUri, VClassDao vClassDao) {
Set<String> allClasses = wadf.getVClassDao()
.getAllVclasses()
.stream()
.map(vclass -> vclass.getURI())
.collect(Collectors.toSet());
Set<String> disjointClasses = new HashSet<>(vClassDao.getDisjointWithClassURIs(classUri));
allClasses.removeAll(disjointClasses);
return allClasses;
}
public static void beanSet(Object newObj, String field, String value) {
beanSet (newObj, field, value, null);
}
@ -399,9 +369,6 @@ public class FormUtils {
for (String aParam : param) {
String[] p = aParam.split(":");
beanParamMap.put(p[0], new String(Base64.decodeBase64(p[1].getBytes())));
if (p.length > 3) {
beanParamMap.put(p[2], new String(Base64.decodeBase64(p[3].getBytes())));
}
}
return beanParamMap;
}

View file

@ -62,7 +62,6 @@ public class ApplicationSetup implements ServletContextListener {
private void locateApplicationConfigFile() {
Path path = this.vitroHomeDir.getPath().resolve(APPLICATION_SETUP_PATH);
if (!Files.exists(path)) {
throw new IllegalStateException("'" + path + "' does not exist.");
}

View file

@ -37,14 +37,7 @@ public class RootUserPolicy implements PolicyIface {
private static final Log log = LogFactory.getLog(RootUserPolicy.class);
private static final String PROPERTY_ROOT_USER_EMAIL = "rootUser.emailAddress";
/*
* UQAM Add-Feature For parameterization of rootUser
*/
private static final String PROPERTY_ROOT_USER_PASSWORD = "rootUser.password";
private static final String PROPERTY_ROOT_USER_PASSWORD_CHANGE_REQUIRED = "rootUser.passwordChangeRequired";
private static final String ROOT_USER_INITIAL_PASSWORD = "rootPassword";
private static final String ROOT_USER_INITIAL_PASSWORD_CHANGE_REQUIRED = "true";
/**
* This is the entire policy. If you are a root user, you are authorized.
@ -157,12 +150,10 @@ public class RootUserPolicy implements PolicyIface {
ua.setEmailAddress(configuredRootUser);
ua.setFirstName("root");
ua.setLastName("user");
// UQAM Add-Feature using getRootPasswordFromConfig()
ua.setArgon2Password(Authenticator.applyArgon2iEncoding(
getRootPasswordFromConfig()));
ROOT_USER_INITIAL_PASSWORD));
ua.setMd5Password("");
// UQAM Add-Feature using getRootPasswdChangeRequiredFromConfig()
ua.setPasswordChangeRequired(getRootPasswdChangeRequiredFromConfig().booleanValue());
ua.setPasswordChangeRequired(true);
ua.setStatus(Status.ACTIVE);
ua.setRootUser(true);
@ -200,31 +191,7 @@ public class RootUserPolicy implements PolicyIface {
ss.warning(this, "For security, "
+ "it is best to delete unneeded root user accounts.");
}
/*
* UQAM Add-Feature
* Add for getting rootUser.password property value from runtime.properties
*/
private String getRootPasswordFromConfig() {
String passwd = ConfigurationProperties.getBean(ctx).getProperty(
PROPERTY_ROOT_USER_PASSWORD);
if (passwd == null) {
passwd = ROOT_USER_INITIAL_PASSWORD;
}
return passwd;
}
/*
* UQAM Add-Feature
* Add for getting rootUser.passwordChangeRequired property value from runtime.properties
*/
private Boolean getRootPasswdChangeRequiredFromConfig() {
String passwdCR = ConfigurationProperties.getBean(ctx).getProperty(
PROPERTY_ROOT_USER_PASSWORD_CHANGE_REQUIRED);
if (passwdCR == null) {
passwdCR = ROOT_USER_INITIAL_PASSWORD_CHANGE_REQUIRED;
}
return new Boolean(passwdCR);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// Nothing to destroy

View file

@ -20,7 +20,6 @@ public class ApplicationBean {
public final static int VIVO_SEARCHBOX_SIZE = 20;
private final static String DEFAULT_APPLICATION_NAME = "Vitro";
private final static String DEFAULT_APPLICATION_AVAILABLE_LANGS_FILE = "available-langs";
private final static String DEFAULT_ROOT_LOGOTYPE_IMAGE = "";
private final static int DEFAULT_ROOT_LOGOTYPE_WIDTH = 0;
private final static int DEFAULT_ROOT_LOGOTYPE_HEIGHT = 0;
@ -34,7 +33,6 @@ public class ApplicationBean {
private boolean initialized = false;
private String sessionIdStr = null;
private String applicationName = DEFAULT_APPLICATION_NAME;
private String availableLangsFile = DEFAULT_APPLICATION_AVAILABLE_LANGS_FILE;
private String rootLogotypeImage = DEFAULT_ROOT_LOGOTYPE_IMAGE;
private int rootLogotypeWidth = DEFAULT_ROOT_LOGOTYPE_WIDTH;
@ -54,7 +52,6 @@ public class ApplicationBean {
output += " initialized from DB: [" + initialized + "]\n";
output += " session id: [" + sessionIdStr + "]\n";
output += " application name: [" + applicationName + "]\n";
output += " available langs file: [" + availableLangsFile + "]\n";
output += " root logotype image: [" + rootLogotypeImage + "]\n";
output += " root logotype width: [" + rootLogotypeWidth + "]\n";
output += " root logotype height: [" + rootLogotypeHeight + "]\n";
@ -180,10 +177,6 @@ public class ApplicationBean {
return "";
}
public String getAvailableLangsFile() {
return availableLangsFile;
}
/**
* Directory to find the images. Subdirectories include css, jsp and site_icons.
* Example: "themes/enhanced/"

View file

@ -87,11 +87,6 @@ public class DataProperty extends Property implements Comparable<DataProperty>,
public String getRangeDatatypeURI() {
return rangeDatatypeURI;
}
@Override
public String getRangeVClassURI() {
return rangeDatatypeURI;
}
public void setRangeDatatypeURI(String rangeDatatypeURI) {
this.rangeDatatypeURI = rangeDatatypeURI;

View file

@ -6,8 +6,6 @@ import static org.apache.jena.rdf.model.ResourceFactory.createResource;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
import edu.cornell.mannlib.vitro.webapp.auth.policy.bean.RoleRestrictedProperty;
/**
@ -22,9 +20,7 @@ public class FauxProperty extends BaseResourceBean implements ResourceBean,
private String configUri;
// Must not be null on insert or update. Partial identifier on delete.
private String rangeURI = "";
private String rootRangeURI;
private String rangeURI;
// May be null. Partial identifier on delete.
private String domainURI;
@ -59,7 +55,7 @@ public class FauxProperty extends BaseResourceBean implements ResourceBean,
*/
public FauxProperty(String domainURI, String baseURI, String rangeURI) {
super(Objects.requireNonNull(baseURI, "baseURI may not be null"));
this.setRangeURI(rangeURI);
this.rangeURI = rangeURI;
this.domainURI = domainURI;
}
@ -97,11 +93,7 @@ public class FauxProperty extends BaseResourceBean implements ResourceBean,
}
public void setRangeURI(String rangeURI) {
if (StringUtils.isEmpty(rangeURI)) {
this.rangeURI = "";
} else {
this.rangeURI = rangeURI;
}
this.rangeURI = rangeURI;
}
public String getBaseLabel() {
@ -113,14 +105,7 @@ public class FauxProperty extends BaseResourceBean implements ResourceBean,
}
public String getRangeLabel() {
if (StringUtils.isEmpty(rangeLabel)) {
if (StringUtils.isEmpty(rangeURI)) {
return "untyped";
}
return localName(rangeURI);
} else {
return rangeLabel;
}
return (rangeLabel == null) ? localName(rangeURI) : rangeLabel;
}
public void setRangeLabel(String rangeLabel) {
@ -262,12 +247,4 @@ public class FauxProperty extends BaseResourceBean implements ResourceBean,
public String getRangeVClassURI() {
return getRangeURI();
}
public void setRootRangeUri(String rootRangeUri) {
this.rootRangeURI = rootRangeUri;
}
public String getRootRangeUri() {
return rootRangeURI;
}
}

View file

@ -4,6 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.beans;
import java.beans.XMLEncoder;
import java.text.Collator;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;

View file

@ -15,7 +15,7 @@ import org.apache.commons.lang3.RandomStringUtils;
*/
public class UserAccount {
public static final int MIN_PASSWORD_LENGTH = 6;
public static final int MAX_PASSWORD_LENGTH = 64;
public static final int MAX_PASSWORD_LENGTH = 12;
public enum Status {
ACTIVE, INACTIVE;

View file

@ -109,7 +109,7 @@ public abstract class ConfigurationProperties {
throw new NullPointerException("bean may not be null.");
}
context.setAttribute(ATTRIBUTE_NAME, bean);
log.debug(bean);
log.info(bean);
}
/** Package access, so unit tests can call it. */

View file

@ -73,7 +73,7 @@ public class ConfigurationPropertiesSetup implements ServletContextListener {
vitroHomeDir, vitroHomeDirConfig);
File runtimePropertiesFile = locateRuntimePropertiesFile(
vitroHomeDir, vitroHomeDirConfig, ss);
vitroHomeDir, vitroHomeDirConfig, ss);
stream = new FileInputStream(runtimePropertiesFile);
Map<String, String> preempts = createPreemptiveProperties(
@ -118,6 +118,7 @@ public class ConfigurationPropertiesSetup implements ServletContextListener {
}
}
private File locateRuntimePropertiesFile(File vitroHomeDir,
File vitroHomeDirConfig, StartupStatus ss) {

View file

@ -160,7 +160,7 @@ public class ConfigurationPropertiesSmokeTests implements
String vivoBundle = VIVO_BUNDLE_PREFIX + language + ".properties";
String vitroBundle = VITRO_BUNDLE_PREFIX + language + ".properties";
if (!i18nNames.contains(vivoBundle) && !i18nNames.contains(vitroBundle)) {
ss.info(this, language + " was found in the value for "
ss.warning(this, language + " was found in the value for "
+ PROPERTY_LANGUAGE_SELECTABLE + " but no corresponding "
+ "language file was found.");
}

View file

@ -2,7 +2,6 @@
package edu.cornell.mannlib.vitro.webapp.config;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
import java.util.Collection;
@ -15,6 +14,8 @@ import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.ibm.icu.text.SimpleDateFormat;
/**
* Information about the provenance of this application: release, revision
* level, build date, etc.
@ -40,7 +41,7 @@ public class RevisionInfoBean {
new Date(0), Collections.singleton(LevelRevisionInfo.DUMMY_LEVEL));
/** The bean is attached to the session by this name. */
public static final String ATTRIBUTE_NAME = RevisionInfoBean.class.getName();
static final String ATTRIBUTE_NAME = RevisionInfoBean.class.getName();
// ----------------------------------------------------------------------
// static methods

View file

@ -21,6 +21,7 @@ public class Controllers {
public static final String ABOUT = "/about";
public static final String CONTACT_URL = "/comments";
public static final String TERMS_OF_USE_URL = "/termsOfUse";
public static final String SEARCH_URL = "/search";
public static final String ENTITY = "/entity";

View file

@ -57,6 +57,8 @@ public abstract class UserAccountsAddPageStrategy extends UserAccountsPage {
private static class EmailStrategy extends UserAccountsAddPageStrategy {
public static final String CREATE_PASSWORD_URL = "/accounts/createPassword";
private static final String EMAIL_TEMPLATE_WITH_PASSWORD = "userAccounts-acctCreatedEmail.ftl";
private static final String EMAIL_TEMPLATE_NO_PASSWORD = "userAccounts-acctCreatedExternalOnlyEmail.ftl";
private boolean sentEmail;
@ -98,19 +100,15 @@ public abstract class UserAccountsAddPageStrategy extends UserAccountsPage {
body.put("userAccount", page.getAddedAccount());
body.put("passwordLink", buildCreatePasswordLink());
body.put("siteName", getSiteName());
FreemarkerEmailMessage email = FreemarkerEmailFactory
.createNewMessage(vreq);
email.addRecipient(TO, page.getAddedAccount().getEmailAddress());
String subject = i18n.text("account_created_subject", getSiteName());
email.setSubject(subject);
email.setSubject(i18n.text("account_created_subject", getSiteName()));
if (page.isExternalAuthOnly()) {
body.put("subject", subject);
body.put("textMessage", i18n.text("acct_created_external_only_email_plain_text"));
body.put("htmlMessage", i18n.text("acct_created_external_only_email_html_text"));
email.setTemplate(EMAIL_TEMPLATE_NO_PASSWORD);
} else {
body.put("subject", subject);
body.put("textMessage", i18n.text("acct_created_email_plain_text"));
body.put("htmlMessage", i18n.text("acct_created_email_html_text"));
email.setTemplate(EMAIL_TEMPLATE_WITH_PASSWORD);
}
email.setBodyMap(body);
email.processTemplate();

View file

@ -56,6 +56,8 @@ 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-passwordResetPendingEmail.ftl";
public static final String RESET_PASSWORD_URL = "/accounts/resetPassword";
private boolean resetPassword;
@ -105,13 +107,11 @@ public abstract class UserAccountsEditPageStrategy extends UserAccountsPage {
body.put("userAccount", page.getUpdatedAccount());
body.put("passwordLink", buildResetPasswordLink());
body.put("siteName", getSiteName());
body.put("subject", i18n.text("password_reset_pending_email_subject"));
body.put("textMessage",i18n.text("password_reset_pending_email_plain_text"));
body.put("htmlMessage", i18n.text("password_reset_pending_email_html_text"));
FreemarkerEmailMessage email = FreemarkerEmailFactory
.createNewMessage(vreq);
email.addRecipient(TO, page.getUpdatedAccount().getEmailAddress());
email.setTemplate(EMAIL_TEMPLATE);
email.setBodyMap(body);
email.processTemplate();
email.send();

View file

@ -26,6 +26,8 @@ public class UserAccountsCreatePasswordPage extends
.getLog(UserAccountsCreatePasswordPage.class);
private static final String TEMPLATE_NAME = "userAccounts-createPassword.ftl";
private static final String EMAIL_TEMPLATE = "userAccounts-passwordCreatedEmail.ftl";
public UserAccountsCreatePasswordPage(VitroRequest vreq) {
super(vreq);
}
@ -71,11 +73,8 @@ public class UserAccountsCreatePasswordPage extends
FreemarkerEmailMessage email = FreemarkerEmailFactory
.createNewMessage(vreq);
email.addRecipient(TO, userAccount.getEmailAddress());
final String subject = i18n.text("password_created_subject", getSiteName());
email.setSubject(subject);
body.put("subject", subject);
body.put("textMessage", i18n.text("password_created_email_plain_text"));
body.put("htmlMessage", i18n.text("password_created_email_html_text"));
email.setSubject(i18n.text("password_created_subject", getSiteName()));
email.setTemplate(EMAIL_TEMPLATE);
email.setBodyMap(body);
email.processTemplate();
email.send();

View file

@ -52,6 +52,8 @@ public abstract class UserAccountsFirstTimeExternalPageStrategy extends
public static class EmailStrategy extends
UserAccountsFirstTimeExternalPageStrategy {
private static final String EMAIL_TEMPLATE = "userAccounts-firstTimeExternalEmail.ftl";
public EmailStrategy(VitroRequest vreq,
UserAccountsFirstTimeExternalPage page) {
super(vreq, page);
@ -71,11 +73,8 @@ public abstract class UserAccountsFirstTimeExternalPageStrategy extends
FreemarkerEmailMessage email = FreemarkerEmailFactory
.createNewMessage(vreq);
email.addRecipient(TO, ua.getEmailAddress());
final String subject = i18n.text("account_created_subject", getSiteName());
email.setSubject(subject);
body.put("subject", subject);
body.put("textMessage", i18n.text("first_time_external_email_plain_text"));
body.put("htmlMessage", i18n.text("first_time_external_email_html_text"));
email.setSubject(i18n.text("account_created_subject", getSiteName()));
email.setTemplate(EMAIL_TEMPLATE);
email.setBodyMap(body);
email.processTemplate();
email.send();

View file

@ -108,6 +108,8 @@ public abstract class UserAccountsMyAccountPageStrategy extends
private static final String ERROR_WRONG_PASSWORD_LENGTH = "errorPasswordIsWrongLength";
private static final String ERROR_PASSWORDS_DONT_MATCH = "errorPasswordsDontMatch";
private static final String EMAIL_TEMPLATE = "userAccounts-confirmEmailChangedEmail.ftl";
private final String originalEmail;
private String newPassword;
@ -177,11 +179,8 @@ public abstract class UserAccountsMyAccountPageStrategy extends
FreemarkerEmailMessage email = FreemarkerEmailFactory
.createNewMessage(vreq);
email.addRecipient(TO, page.getUserAccount().getEmailAddress());
final String subject = i18n.text("email_changed_subject", getSiteName());
email.setSubject(subject);
body.put("subject", subject);
body.put("textMessage", i18n.text("confirm_email_changed_email_plain_text"));
body.put("htmlMessage", i18n.text("confirm_email_changed_email_html_text"));
email.setSubject(i18n.text("email_changed_subject", getSiteName()));
email.setTemplate(EMAIL_TEMPLATE);
email.setBodyMap(body);
email.processTemplate();
email.send();

View file

@ -26,6 +26,8 @@ public class UserAccountsResetPasswordPage extends UserAccountsPasswordBasePage
private static final String TEMPLATE_NAME = "userAccounts-resetPassword.ftl";
private static final String EMAIL_TEMPLATE = "userAccounts-passwordResetCompleteEmail.ftl";
protected UserAccountsResetPasswordPage(VitroRequest vreq) {
super(vreq);
}
@ -66,16 +68,14 @@ public class UserAccountsResetPasswordPage extends UserAccountsPasswordBasePage
private void notifyUser() {
Map<String, Object> body = new HashMap<String, Object>();
FreemarkerEmailMessage email = FreemarkerEmailFactory.createNewMessage(vreq);
final String subject = i18n.text("password_changed_subject");
email.setSubject(subject);
body.put("userAccount", userAccount);
body.put("siteName", getSiteName());
body.put("subject", subject);
body.put("textMessage", i18n.text("password_reset_complete_email_plain_text"));
body.put("htmlMessage", i18n.text("password_reset_complete_email_html_text"));
FreemarkerEmailMessage email = FreemarkerEmailFactory
.createNewMessage(vreq);
email.addRecipient(TO, userAccount.getEmailAddress());
email.setSubject(i18n.text("password_changed_subject"));
email.setTemplate(EMAIL_TEMPLATE);
email.setBodyMap(body);
email.processTemplate();
email.send();

View file

@ -2,7 +2,6 @@
package edu.cornell.mannlib.vitro.webapp.controller.admin;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@ -10,6 +9,8 @@ import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import com.ibm.icu.text.SimpleDateFormat;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;

View file

@ -17,8 +17,6 @@ import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -77,8 +75,8 @@ public class SparqlQueryController extends FreemarkerHttpServlet {
private static final String[] SAMPLE_QUERY = { //
"", //
"#", //
"i18n:sparql_query_description_0", //
"i18n:sparql_query_description_1", //
"# This example query gets 20 geographic locations", //
"# and (if available) their labels", //
"#", //
"SELECT ?geoLocation ?label", //
"WHERE", //
@ -195,11 +193,9 @@ public class SparqlQueryController extends FreemarkerHttpServlet {
@Override
protected ResponseValues processRequest(VitroRequest vreq) throws Exception {
I18nBundle i18n = I18n.bundle(vreq);
Map<String, Object> bodyMap = new HashMap<>();
bodyMap.put("sampleQuery", buildSampleQuery(i18n, buildPrefixList(vreq)));
bodyMap.put("title", i18n.text("sparql_query_title"));
bodyMap.put("sampleQuery", buildSampleQuery(buildPrefixList(vreq)));
bodyMap.put("title", "SPARQL Query");
bodyMap.put("submitUrl", UrlBuilder.getUrl("admin/sparqlquery"));
return new TemplateResponseValues(TEMPLATE_NAME, bodyMap);
}
@ -226,7 +222,7 @@ public class SparqlQueryController extends FreemarkerHttpServlet {
return prefixList;
}
private String buildSampleQuery(I18nBundle i18n, List<Prefix> prefixList) {
private String buildSampleQuery(List<Prefix> prefixList) {
StringWriter sw = new StringWriter();
PrintWriter writer = new PrintWriter(sw);
@ -234,10 +230,6 @@ public class SparqlQueryController extends FreemarkerHttpServlet {
writer.println(p);
}
for (String line : SAMPLE_QUERY) {
if (line.startsWith("i18n:")) {
// Get i18n translation
line = i18n.text(line.substring("i18n:".length()));
}
writer.println(line);
}

View file

@ -8,7 +8,6 @@ import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@ -19,8 +18,6 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import static org.apache.jena.riot.web.HttpNames.paramUsingGraphURI;
import static org.apache.jena.riot.web.HttpNames.paramUsingNamedGraphURI;
import org.apache.jena.query.Dataset;
import org.apache.jena.query.ReadWrite;
import org.apache.jena.update.GraphStore;
@ -28,9 +25,6 @@ import org.apache.jena.update.GraphStoreFactory;
import org.apache.jena.update.UpdateAction;
import org.apache.jena.update.UpdateFactory;
import org.apache.jena.update.UpdateRequest;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.sparql.modify.UsingList;
import edu.cornell.mannlib.vitro.webapp.application.ApplicationUtils;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
@ -82,47 +76,26 @@ public class SparqlUpdateApiController extends VitroApiServlet {
private UpdateRequest parseUpdateString(HttpServletRequest req)
throws ParseException {
InputStream update;
String reqtype = req.getContentType();
UsingList usingList = processProtocol(req);
// Support update via both POST body and an 'update' parameter
if (reqtype.equalsIgnoreCase("application/sparql-update")) {
try {
update = req.getInputStream();
} catch (IOException e) {
log.debug("Error parsing POST body.");
throw new ParseException("Error parsing POST body.");
}
String update = req.getParameter("update");
if (StringUtils.isBlank(update)) {
log.debug("No update parameter.");
throw new ParseException("No 'update' parameter.");
}
else {
String updateString = req.getParameter("update");
if (StringUtils.isBlank(updateString)) {
log.debug("No update parameter.");
throw new ParseException("No 'update' parameter.");
}
if (!StringUtils.containsIgnoreCase(updateString, "GRAPH") && !StringUtils.containsIgnoreCase(updateString, "WITH")) {
if (log.isDebugEnabled()) {
log.debug("No GRAPH or WITH uri in '" + updateString + "'");
}
throw new ParseException("SPARQL update must specify a GRAPH ( or WITH) URI.");
}
try {
update = org.apache.commons.io.IOUtils.toInputStream(updateString, "UTF-8");
} catch (IOException e) {
log.debug("Error parsing POST body.");
throw new ParseException("Error parsing POST body.");
if (!StringUtils.containsIgnoreCase(update, "GRAPH") && !StringUtils.containsIgnoreCase(update, "WITH")) {
if (log.isDebugEnabled()) {
log.debug("No GRAPH or WITH uri in '" + update + "'");
}
throw new ParseException("SPARQL update must specify a GRAPH ( or WITH) URI.");
}
try {
return UpdateFactory.read(usingList, update);
return UpdateFactory.create(update);
} catch (Exception e) {
log.debug("Problem parsing", e);
throw new ParseException("Failed to parse SPARQL update", e);
}
}
private void executeUpdate(HttpServletRequest req, UpdateRequest parsed) {
VitroRequest vreq = new VitroRequest(req);
@ -148,35 +121,6 @@ public class SparqlUpdateApiController extends VitroApiServlet {
}
}
/*
* The method below and the 'createNode' helper were
* adapted from the Fuseki source code
*/
private UsingList processProtocol(HttpServletRequest request) {
UsingList toReturn = new UsingList();
String[] usingArgs = request.getParameterValues(paramUsingGraphURI);
String[] usingNamedArgs = request.getParameterValues(paramUsingNamedGraphURI);
if ( usingArgs == null && usingNamedArgs == null )
return toReturn;
if ( usingArgs == null )
usingArgs = new String[0];
if ( usingNamedArgs == null )
usingNamedArgs = new String[0];
// Impossible.
// if ( usingArgs.length == 0 && usingNamedArgs.length == 0 )
// return;
for ( String nodeUri : usingArgs ) {
toReturn.addUsing(createNode(nodeUri));
}
for ( String nodeUri : usingNamedArgs ) {
toReturn.addUsingNamed(createNode(nodeUri));
}
return toReturn;
}
private void do200response(HttpServletResponse resp) throws IOException {
sendShortResponse(SC_OK, "SPARQL update accepted.", resp);
}
@ -214,14 +158,4 @@ public class SparqlUpdateApiController extends VitroApiServlet {
}
}
private static Node createNode(String x) {
try {
return NodeFactory.createURI(x);
} catch (Exception ex) {
log.debug("SPARQL Update: bad IRI: "+x);
return null;
}
}
}

View file

@ -108,9 +108,7 @@ public class LoginRedirector {
throws IOException {
try {
DisplayMessage.setMessage(request, assembleWelcomeMessage());
String redirectUrl = getRedirectionUriForLoggedInUser();
log.debug("Sending redirect to path: " + redirectUrl);
response.sendRedirect(redirectUrl);
response.sendRedirect(getRedirectionUriForLoggedInUser());
} catch (IOException e) {
log.debug("Problem with re-direction", e);
response.sendRedirect(getApplicationHomePageUrl());
@ -177,13 +175,21 @@ public class LoginRedirector {
}
}
/**
* The application home page can be overridden by an attribute in the
* ServletContext. Further, it can either be an absolute URL, or it can be
* relative to the application. Weird.
*/
private String getApplicationHomePageUrl() {
String contextPath = request.getContextPath();
if (contextPath.equals("")) {
return "/";
}
else {
return contextPath;
String contextRedirect = (String) session.getServletContext()
.getAttribute("postLoginRequest");
if (contextRedirect != null) {
if (contextRedirect.indexOf(":") == -1) {
return request.getContextPath() + contextRedirect;
} else {
return contextRedirect;
}
}
return request.getContextPath();
}
}

View file

@ -43,7 +43,7 @@ public class Classes2ClassesRetryController extends BaseEditController {
action = epo.getAction();
}
VClassDao vcDao = ModelAccess.on(request).getWebappDaoFactory().getVClassDao();
VClassDao vcDao = ModelAccess.on(getServletContext()).getWebappDaoFactory().getVClassDao();
epo.setDataAccessObject(vcDao);
Classes2Classes objectForEditing = new Classes2Classes();

View file

@ -51,7 +51,8 @@ public class ClassgroupRetryController extends BaseEditController {
action = epo.getAction();
}
VClassGroupDao cgDao = ModelAccess.on(request).getWebappDaoFactory().getVClassGroupDao();
VClassGroupDao cgDao = ModelAccess.on(
getServletContext()).getWebappDaoFactory().getVClassGroupDao();
epo.setDataAccessObject(cgDao);

View file

@ -22,7 +22,6 @@ import edu.cornell.mannlib.vedit.controller.BaseEditController;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
import edu.cornell.mannlib.vitro.webapp.beans.FauxProperty;
import edu.cornell.mannlib.vitro.webapp.beans.Ontology;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
@ -177,11 +176,6 @@ public class DatapropEditController extends BaseEditController {
assertionsDpDao.getEquivalentPropertyURIs(dp.getURI()), assertionsDpDao);
sortForPickList(eqProps, vreq);
request.setAttribute("equivalentProperties", eqProps);
List<FauxProperty> fauxProps = vreq.getUnfilteredAssertionsWebappDaoFactory().getFauxPropertyDao().
getFauxPropertiesForBaseUri(dp.getURI());
sortForPickList(fauxProps, vreq);
request.setAttribute("fauxproperties", fauxProps);
ApplicationBean appBean = vreq.getAppBean();

View file

@ -50,12 +50,11 @@ public class DatapropRetryController extends BaseEditController {
//create an EditProcessObject for this and put it in the session
EditProcessObject epo = super.createEpo(request);
epo.setImplementationClass(DataProperty.class);
epo.setBeanClass(DataProperty.class);
VitroRequest vreq = new VitroRequest(request);
WebappDaoFactory wadf = ModelAccess.on(vreq).getWebappDaoFactory();
WebappDaoFactory wadf = ModelAccess.on(getServletContext()).getWebappDaoFactory();
DatatypeDao dDao = wadf.getDatatypeDao();
DataPropertyDao dpDao = wadf.getDataPropertyDao();

View file

@ -20,12 +20,9 @@ import javax.servlet.http.HttpServletResponse;
import edu.cornell.mannlib.vitro.webapp.utils.JSPPageHandler;
import org.apache.commons.collections4.map.ListOrderedMap;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.ctc.wstx.util.StringUtil;
import edu.cornell.mannlib.vedit.beans.DynamicField;
import edu.cornell.mannlib.vedit.beans.DynamicFieldRow;
import edu.cornell.mannlib.vedit.beans.EditProcessObject;
@ -253,12 +250,7 @@ public class EntityRetryController extends BaseEditController {
//TODO: UGH
//row.setId(existingValue.getId());
row.setParameterMap(parameterMap);
String value = existingValue.getData();
row.setValue(value);
String language = existingValue.getLanguage();
if (!StringUtils.isBlank(language)) {
row.setLanguage(language);
}
row.setValue(existingValue.getData());
if (dynamo.getRowList() == null)
dynamo.setRowList(new ArrayList());
dynamo.getRowList().add(row);

View file

@ -32,14 +32,12 @@ import edu.cornell.mannlib.vedit.validator.Validator;
import edu.cornell.mannlib.vedit.validator.impl.RequiredFieldValidator;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.auth.policy.bean.PropertyRestrictionListener;
import edu.cornell.mannlib.vitro.webapp.beans.Datatype;
import edu.cornell.mannlib.vitro.webapp.beans.FauxProperty;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.Property;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.edit.utils.RoleLevelOptionsSetup;
import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.FauxPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
@ -90,8 +88,6 @@ public class FauxPropertyRetryController extends BaseEditController {
}
private static class EpoPopulator {
private static final String LITERAL = "http://www.w3.org/2000/01/rdf-schema#Literal";
private static final String XML_LITERAL = "http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral";
private final VitroRequest req;
private final ServletContext ctx;
private final WebappDaoFactory wadf;
@ -102,8 +98,6 @@ public class FauxPropertyRetryController extends BaseEditController {
private FauxProperty beanForEditing;
private Property baseProperty;
private boolean isFauxDataProperty = false;
EpoPopulator(HttpServletRequest req, EditProcessObject epo) {
this.req = new VitroRequest(req);
@ -112,7 +106,7 @@ public class FauxPropertyRetryController extends BaseEditController {
this.epo = epo;
this.fpDao = ModelAccess.on(req).getWebappDaoFactory()
this.fpDao = ModelAccess.on(ctx).getWebappDaoFactory()
.getFauxPropertyDao();
}
@ -120,8 +114,6 @@ public class FauxPropertyRetryController extends BaseEditController {
void populate() {
epo.setDataAccessObject(fpDao);
epo.setAction(determineAction());
epo.setImplementationClass(FauxProperty.class);
epo.setBeanClass(FauxProperty.class);
if (epo.getUseRecycledBean()) {
beanForEditing = (FauxProperty) epo.getNewBean();
@ -133,19 +125,10 @@ public class FauxPropertyRetryController extends BaseEditController {
this.baseProperty = req.getUnfilteredWebappDaoFactory()
.getObjectPropertyDao()
.getObjectPropertyByURI(beanForEditing.getURI());
if (this.baseProperty == null) {
this.baseProperty = req.getUnfilteredWebappDaoFactory()
.getDataPropertyDao()
.getDataPropertyByURI(beanForEditing.getURI());
isFauxDataProperty = true;
}
addCheckboxValuesToTheRequest();
if (!isFauxDataProperty) {
setFieldValidators();
}
setFieldValidators();
setListeners();
setForwarders();
@ -165,7 +148,8 @@ public class FauxPropertyRetryController extends BaseEditController {
return newFauxProperty(baseUri);
}
FauxProperty bean = fpDao.getFauxPropertyByUris(domainUri, baseUri, rangeUri);
FauxProperty bean = fpDao.getFauxPropertyByUris(domainUri, baseUri,
rangeUri);
if (bean == null) {
throw new IllegalArgumentException(
"FauxProperty does not exist for <" + domainUri
@ -182,16 +166,7 @@ public class FauxPropertyRetryController extends BaseEditController {
private FauxProperty newFauxProperty(String baseUri) {
FauxProperty fp = new FauxProperty(null, baseUri, null);
ObjectPropertyDao opDao = wadf.getObjectPropertyDao();
DataPropertyDao dpDao = wadf.getDataPropertyDao();
ObjectProperty objBase = opDao.getObjectPropertyByURI(baseUri);
Property base;
if (objBase != null) {
fp.setSelectFromExisting(objBase.getSelectFromExisting());
fp.setOfferCreateNewOption(objBase.getOfferCreateNewOption());
base = objBase;
} else {
base = dpDao.getDataPropertyByURI(baseUri);
}
ObjectProperty base = opDao.getObjectPropertyByURI(baseUri);
fp.setGroupURI(base.getGroupURI());
fp.setRangeURI(base.getRangeVClassURI());
fp.setDomainURI(base.getDomainVClassURI());
@ -293,7 +268,7 @@ public class FauxPropertyRetryController extends BaseEditController {
list.addAll(FormUtils.makeVClassOptionList(wadf,
beanForEditing.getDomainURI()));
} else {
list.addAll(FormUtils.makeOptionListOfNotDisjointClasses(wadf,
list.addAll(FormUtils.makeOptionListOfSubVClasses(wadf,
baseProperty.getDomainVClassURI(),
beanForEditing.getDomainURI()));
}
@ -302,20 +277,12 @@ public class FauxPropertyRetryController extends BaseEditController {
}
private List<Option> buildRangeOptionList() {
if (isFauxDataProperty) {
return buildDataPropOptionList();
} else {
return buildObjectPropOptionList();
}
}
private List<Option> buildObjectPropOptionList() {
List<Option> list = new ArrayList<>();
if (baseProperty.getRangeVClassURI() == null) {
list.addAll(FormUtils.makeVClassOptionList(wadf,
beanForEditing.getRangeURI()));
} else {
list.addAll(FormUtils.makeOptionListOfNotDisjointClasses(wadf,
list.addAll(FormUtils.makeOptionListOfSubVClasses(wadf,
baseProperty.getRangeVClassURI(),
beanForEditing.getRangeURI()));
if (containsVCardKind(list)) {
@ -326,43 +293,6 @@ public class FauxPropertyRetryController extends BaseEditController {
return list;
}
private List<Option> buildDataPropOptionList() {
List<Option> list = new ArrayList<>();
String rangeUri = baseProperty.getRangeVClassURI();
if (rangeUri == null) {
Option option = new Option();
option.setValue("");
option.setBody("Untyped");
option.setSelected(true);
list.add(option);
} else if (rangeUri.equals(LITERAL)) {
Option option = new Option();
option.setValue(rangeUri);
option.setBody("Literal");
option.setSelected(true);
list.add(option);
} else if (rangeUri.equals(XML_LITERAL)) {
Option option = new Option();
option.setValue(rangeUri);
option.setBody("XML Literal");
option.setSelected(true);
list.add(option);
} else {
Datatype dataType = wadf.getDatatypeDao().getDatatypeByURI(rangeUri);
Option option = new Option();
if (dataType != null) {
option.setValue(dataType.getUri());
option.setBody(dataType.getName());
} else {
option.setValue(rangeUri);
option.setBody(rangeUri);
}
option.setSelected(true);
list.add(option);
}
return list;
}
private static final String VCARD_KIND_URI = "http://www.w3.org/2006/vcard/ns#Kind";
private static final String VCARD_NAMESPACE = "http://www.w3.org/2006/vcard/ns#";

View file

@ -71,7 +71,7 @@ public class NamespacePrefixOperationController extends BaseEditController {
if (request.getParameter("_cancel") == null) {
OntModel ontModel = ModelAccess.on(req).getOntModel();
OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel();
String namespaceStr = request.getParameter("namespace");
String prefixStr = request.getParameter("prefix");

View file

@ -51,7 +51,7 @@ public class PropertyGroupRetryController extends BaseEditController {
}
PropertyGroupDao pgDao = ModelAccess.on(
req).getWebappDaoFactory().getPropertyGroupDao();
getServletContext()).getWebappDaoFactory().getPropertyGroupDao();
epo.setDataAccessObject(pgDao);

View file

@ -53,7 +53,6 @@ public class PropertyRetryController extends BaseEditController {
/*for testing*/
ObjectProperty testMask = new ObjectProperty();
epo.setImplementationClass(ObjectProperty.class);
epo.setBeanClass(ObjectProperty.class);
epo.setBeanMask(testMask);
@ -65,7 +64,7 @@ public class PropertyRetryController extends BaseEditController {
action = epo.getAction();
}
ObjectPropertyDao propDao = ModelAccess.on(req).getWebappDaoFactory().getObjectPropertyDao();
ObjectPropertyDao propDao = ModelAccess.on(getServletContext()).getWebappDaoFactory().getObjectPropertyDao();
epo.setDataAccessObject(propDao);
OntologyDao ontDao = request.getUnfilteredWebappDaoFactory().getOntologyDao();

View file

@ -48,7 +48,7 @@ public class RestrictionOperationController extends BaseEditController {
String defaultLandingPage = getDefaultLandingPage(request);
try {
OntModel ontModel = ModelAccess.on(req)
OntModel ontModel = ModelAccess.on(getServletContext())
.getOntModel(TBOX_ASSERTIONS);
HashMap epoHash = null;

View file

@ -48,7 +48,7 @@ public class VclassEditController extends BaseEditController {
EditProcessObject epo = super.createEpo(request, FORCE_NEW);
request.setAttribute("epoKey", epo.getKey());
VClassDao vcwDao = ModelAccess.on(req).getWebappDaoFactory(ASSERTIONS_ONLY).getVClassDao();
VClassDao vcwDao = ModelAccess.on(getServletContext()).getWebappDaoFactory(ASSERTIONS_ONLY).getVClassDao();
VClass vcl = (VClass)vcwDao.getVClassByURI(request.getParameter("uri"));
if (vcl == null) {
@ -152,8 +152,8 @@ public class VclassEditController extends BaseEditController {
request.setAttribute("formSelect",formSelect);
// if supported, we want to show only the asserted superclasses and subclasses.
VClassDao vcDao = ModelAccess.on(req).getWebappDaoFactory(ASSERTIONS_ONLY).getVClassDao();
VClassDao displayVcDao = ModelAccess.on(req).getWebappDaoFactory().getVClassDao();
VClassDao vcDao = ModelAccess.on(getServletContext()).getWebappDaoFactory(ASSERTIONS_ONLY).getVClassDao();
VClassDao displayVcDao = ModelAccess.on(getServletContext()).getWebappDaoFactory().getVClassDao();
List<VClass> superVClasses = getVClassesForURIList(
vcDao.getSuperClassURIs(vcl.getURI(),false), displayVcDao);

View file

@ -66,10 +66,11 @@ public class VclassRetryController extends BaseEditController {
action = epo.getAction();
}
WebappDaoFactory wadf = ModelAccess.on(req).getWebappDaoFactory();
WebappDaoFactory wadf = ModelAccess.on(getServletContext()).getWebappDaoFactory();
VClassDao vcwDao = wadf.getVClassDao();
epo.setDataAccessObject(vcwDao);
VClassGroupDao cgDao = wadf.getVClassGroupDao();
OntologyDao oDao = wadf.getOntologyDao();
VClass vclassForEditing = null;

View file

@ -37,7 +37,7 @@ public class NamespacesListingController extends BaseEditController {
VitroRequest vrequest = new VitroRequest(request);
OntModel ontModel = ModelAccess.on(vrequest).getOntModel();
OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel();
ArrayList results = new ArrayList();
request.setAttribute("results",results);

View file

@ -54,7 +54,7 @@ public class RestrictionsListingController extends BaseEditController {
epo = super.createEpo(request);
OntModel ontModel = ModelAccess.on(vrequest).getOntModel();
OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel();
ObjectPropertyDao opDao = vrequest.getUnfilteredWebappDaoFactory().getObjectPropertyDao();
VClassDao vcDao = vrequest.getUnfilteredWebappDaoFactory().getVClassDao();

View file

@ -3,8 +3,6 @@
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -44,8 +42,6 @@ public class BrowseController extends FreemarkerHttpServlet {
List<VClassGroup> groups = null;
VClassGroupsForRequest vcgc = VClassGroupCache.getVClassGroups(vreq);
groups =vcgc.getGroups();
Collections.sort(groups, publicNameComparator);
// sortGroupListByPublicName(groups);
List<VClassGroupTemplateModel> vcgroups = new ArrayList<VClassGroupTemplateModel>(groups.size());
for (VClassGroup group : groups) {
vcgroups.add(new VClassGroupTemplateModel(group));
@ -54,35 +50,4 @@ public class BrowseController extends FreemarkerHttpServlet {
return new TemplateResponseValues(templateName, body);
}
public Comparator<VClassGroup> publicNameComparator = new Comparator<VClassGroup>() {
public int compare(VClassGroup s1, VClassGroup s2) {
String groupName1 = s1.getPublicName().toUpperCase();
String groupName2 = s2.getPublicName().toUpperCase();
//ascending order
return groupName1.compareTo(groupName2);
//descending order
//return groupName2.compareTo(groupName1);
}};
//
// public void sortGroupListByPublicName(List<VClassGroup> groupList) {
// groupList.sort(new Comparator<VClassGroup>() {
// public int compare(VClassGroup first, VClassGroup second) {
// if (first != null) {
// if (second != null) {
// return (first.getDisplayRank() - second.getDisplayRank());
// } else {
// log.error("error--2nd VClassGroup is null in VClassGroupDao.getGroupList().compare()");
// }
// } else {
// log.error("error--1st VClassGroup is null in VClassGroupDao.getGroupList().compare()");
// }
// return 0;
// }
// });
// }
}

View file

@ -3,11 +3,8 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletResponse;
@ -22,70 +19,68 @@ import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.QuerySolutionMap;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.ResourceFactory;
import org.apache.jena.shared.Lock;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AuthorizationRequest;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
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.TemplateResponseValues;
import static edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary.HAS_DELETE_QUERY;
import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils;
import edu.cornell.mannlib.vitro.webapp.dao.jena.event.BulkUpdateEvent;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
import edu.cornell.mannlib.vitro.webapp.rdfservice.ChangeSet;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
@WebServlet(name = "DeleteIndividualController", urlPatterns = "/deleteIndividualController")
public class DeleteIndividualController extends FreemarkerHttpServlet {
private static final String INDIVIDUAL_URI = "individualUri";
private static final long serialVersionUID = 1L;
@WebServlet(name="DeleteIndividualController",urlPatterns="/deleteIndividualController")
public class DeleteIndividualController extends FreemarkerHttpServlet{
private static final Log log = LogFactory.getLog(DeleteIndividualController.class);
private static final boolean BEGIN = true;
private static final boolean END = !BEGIN;
private static String queryForDeleteQuery = ""
+ "SELECT ?deleteQueryText WHERE { "
+ "?associatedUri <" + HAS_DELETE_QUERY + "> ?deleteQueryText ."
+ "}";
private static final String DEFAULT_DELETE_QUERY_TEXT = ""
+ "CONSTRUCT { ?individualUri ?p1 ?o1 . ?s2 ?p2 ?individualUri . } "
+ "WHERE {"
+ " { ?individualUri ?p1 ?o1 . } UNION { ?s2 ?p2 ?individualUri. } "
+ "}";
private static final boolean BEGIN = true;
private static final boolean END = !BEGIN;
private static String TYPE_QUERY_START = ""
+ "PREFIX vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#>"
+ "SELECT ?type "
+ "WHERE"
+ "{ <";
private static String TYPE_QUERY_END = "> vitro:mostSpecificType ?type ."
+ "}";
private static String queryForDeleteQuery =
"PREFIX display: <" + DisplayVocabulary.DISPLAY_NS +"> \n" +
"SELECT ?deleteQueryText WHERE { ?associatedURI display:hasDeleteQuery ?deleteQueryText }";
private static final String DEFAULT_DELETE_QUERY_TEXT = "DESCRIBE ?individualURI";
@Override
protected AuthorizationRequest requiredActions(VitroRequest vreq) {
return SimplePermission.DO_FRONT_END_EDITING.ACTION;
}
protected ResponseValues processRequest(VitroRequest vreq) {
String errorMessage = handleErrors(vreq);
if (!errorMessage.isEmpty()) {
return prepareErrorMessage(errorMessage);
}
String individualUri = vreq.getParameter(INDIVIDUAL_URI);
List<String> types = getObjectMostSpecificTypes(individualUri, vreq);
Model displayModel = vreq.getDisplayModel();
String deleteQueryText = getDeleteQueryForTypes(types, displayModel);
Model toRemove = getIndividualsToDelete(individualUri, deleteQueryText, vreq);
if (toRemove.size() > 0) {
deleteIndividuals(toRemove, vreq);
}
String individualUri = vreq.getParameter("individualUri");
String type = getObjectMostSpecificType(individualUri, vreq);
Model displayModel = vreq.getDisplayModel();
String delteQueryText = getDeleteQueryForType(type, displayModel);
byte[] toRemove = getIndividualsToDelete(individualUri, delteQueryText, vreq);
if (toRemove.length > 0) {
deleteIndividuals(toRemove,vreq);
}
String redirectUrl = getRedirectUrl(vreq);
return new RedirectResponseValues(redirectUrl, HttpServletResponse.SC_SEE_OTHER);
}
private String getRedirectUrl(VitroRequest vreq) {
String redirectUrl = vreq.getParameter("redirectUrl");
if (redirectUrl != null) {
@ -94,118 +89,113 @@ public class DeleteIndividualController extends FreemarkerHttpServlet {
return "/";
}
private TemplateResponseValues prepareErrorMessage(String errorMessage) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("errorMessage", errorMessage);
return new TemplateResponseValues("error-message.ftl", map);
}
private TemplateResponseValues prepareErrorMessage(String errorMessage) {
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("errorMessage", errorMessage);
return new TemplateResponseValues("error-message.ftl", map);
}
private String handleErrors(VitroRequest vreq) {
String uri = vreq.getParameter(INDIVIDUAL_URI);
if (uri == null) {
return "Individual uri is null. No object to delete.";
String uri = vreq.getParameter("individualUri");
if ( uri == null) {
return "Individual uri is null. No object to delete.";
}
if (uri.contains("<") || uri.contains(">")) {
return "Individual IRI shouldn't contain '<' or '>";
if (uri.contains(">")) {
return "Individual uri shouldn't contain >";
}
return "";
}
private static String getDeleteQueryForTypes(List<String> types, Model displayModel) {
private static String getDeleteQueryForType(String typeURI,Model displayModel) {
String deleteQueryText = DEFAULT_DELETE_QUERY_TEXT;
String foundType = "";
for ( String type: types) {
Query queryForTypeSpecificDeleteQuery = QueryFactory.create(queryForDeleteQuery);
QuerySolutionMap initialBindings = new QuerySolutionMap();
initialBindings.add("associatedURI", ResourceFactory.createResource(type));
displayModel.enterCriticalSection(Lock.READ);
try {
QueryExecution qexec = QueryExecutionFactory.create(queryForTypeSpecificDeleteQuery, displayModel,
initialBindings);
try {
ResultSet results = qexec.execSelect();
if (results.hasNext()) {
QuerySolution solution = results.nextSolution();
deleteQueryText = solution.get("deleteQueryText").toString();
foundType = type;
}
} finally {
qexec.close();
}
} finally {
displayModel.leaveCriticalSection();
}
if (!foundType.isEmpty()) {
break;
}
}
if (!foundType.isEmpty()) {
log.debug("For " + foundType + " found delete query \n" + deleteQueryText);
if (!deleteQueryText.contains(INDIVIDUAL_URI)){
log.error("Safety check failed. Delete query text should contain " + INDIVIDUAL_URI + ", "
+ "but it didn't. To prevent bad consequences query was rejected.");
log.error("Delete query which caused the error: \n" + deleteQueryText);
deleteQueryText = DEFAULT_DELETE_QUERY_TEXT;
}
} else {
log.debug("For most specific types: " + types.stream().collect(Collectors.joining(",")) + " no delete query was found. Using default query \n" + deleteQueryText);
}
return deleteQueryText;
Query queryForTypeSpecificDeleteQuery = QueryFactory.create(queryForDeleteQuery);
QuerySolutionMap initialBindings = new QuerySolutionMap();
initialBindings.add("associatedURI", ResourceFactory.createResource( typeURI ));
displayModel.enterCriticalSection(Lock.READ);
try{
QueryExecution qexec = QueryExecutionFactory.create(queryForTypeSpecificDeleteQuery,displayModel,initialBindings );
try{
ResultSet results = qexec.execSelect();
while (results.hasNext()) {
QuerySolution solution = results.nextSolution();
deleteQueryText = solution.get("deleteQueryText").toString();
}
}finally{ qexec.close(); }
}finally{ displayModel.leaveCriticalSection(); }
if (!deleteQueryText.equals(DEFAULT_DELETE_QUERY_TEXT)) {
log.debug("For " + typeURI + " found delete query \n" + deleteQueryText);
} else {
log.debug("For " + typeURI + " delete query not found. Using defalut query \n" + deleteQueryText);
}
return deleteQueryText;
}
private String getObjectMostSpecificType(String individualURI, VitroRequest vreq) {
String type = "";
try {
ResultSet results = QueryUtils.getLanguageNeutralQueryResults(makeTypeQuery(individualURI), vreq);
while (results.hasNext()) {
QuerySolution solution = results.nextSolution();
type = solution.get("type").toString();
log.debug(type);
}
} catch (Exception e) {
log.error("Failed to get type for individual URI " + individualURI);
log.error(e, e);
}
return type;
}
private byte[] getIndividualsToDelete(String targetIndividual, String deleteQuery,VitroRequest vreq) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
Query queryForTypeSpecificDeleteQuery = QueryFactory.create(deleteQuery);
QuerySolutionMap initialBindings = new QuerySolutionMap();
initialBindings.add("individualURI", ResourceFactory.createResource( targetIndividual ));
Model ontModel = vreq.getJenaOntModel();
QueryExecution qexec = QueryExecutionFactory.create(queryForTypeSpecificDeleteQuery,ontModel,initialBindings );
Model results = qexec.execDescribe();
results.write(out,"N3");
} catch (Exception e) {
log.error("Query raised an error \n" + deleteQuery);
log.error(e, e);
}
return out.toByteArray();
}
private List<String> getObjectMostSpecificTypes(String individualUri, VitroRequest vreq) {
List<String> types = new LinkedList<String>();
Individual individual = vreq.getWebappDaoFactory().getIndividualDao().getIndividualByURI(individualUri);
if (individual != null) {
types = individual.getMostSpecificTypeURIs();
}
if (types.isEmpty()) {
log.error("Failed to get most specific type for individual Uri " + individualUri);
}
return types;
private String makeTypeQuery(String objectURI) {
return TYPE_QUERY_START + objectURI + TYPE_QUERY_END;
}
private Model getIndividualsToDelete(String targetIndividual, String deleteQuery, VitroRequest vreq) {
try {
Query queryForTypeSpecificDeleteQuery = QueryFactory.create(deleteQuery);
QuerySolutionMap bindings = new QuerySolutionMap();
bindings.add(INDIVIDUAL_URI, ResourceFactory.createResource(targetIndividual));
Model ontModel = ModelAccess.on(vreq).getOntModelSelector().getABoxModel();
QueryExecution qexec = QueryExecutionFactory.create(queryForTypeSpecificDeleteQuery, ontModel, bindings);
Model results = qexec.execConstruct();
return results;
} catch (Exception e) {
log.error("Query raised an error \n" + deleteQuery);
log.error(e, e);
}
return ModelFactory.createDefaultModel();
}
private void deleteIndividuals(Model model, VitroRequest vreq) {
private void deleteIndividuals(byte[] toRemove, VitroRequest vreq) {
String removingString = new String(toRemove, StandardCharsets.UTF_8);
RDFService rdfService = vreq.getRDFService();
ChangeSet cs = makeChangeSet(rdfService);
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
model.write(out, "N3");
InputStream in = new ByteArrayInputStream(out.toByteArray());
cs.addRemoval(in, RDFServiceUtils.getSerializationFormatFromJenaString("N3"), ModelNames.ABOX_ASSERTIONS);
rdfService.changeSetUpdate(cs);
} catch (Exception e) {
StringWriter sw = new StringWriter();
model.write(sw, "N3");
log.error("Got " + e.getClass().getSimpleName() + " while removing\n" + sw.toString());
log.error(e,e);
throw new RuntimeException(e);
}
ChangeSet cs = makeChangeSet(rdfService);
InputStream in = new ByteArrayInputStream(toRemove);
cs.addRemoval(in, RDFServiceUtils.getSerializationFormatFromJenaString("N3"), ModelNames.ABOX_ASSERTIONS);
try {
rdfService.changeSetUpdate(cs);
} catch (RDFServiceException e) {
log.error("Got error while removing\n" + removingString);
throw new RuntimeException(e);
}
}
private ChangeSet makeChangeSet(RDFService rdfService) {
ChangeSet cs = rdfService.manufactureChangeSet();
cs.addPreChangeEvent(new BulkUpdateEvent(null, BEGIN));
cs.addPostChangeEvent(new BulkUpdateEvent(null, END));
return cs;
}
private ChangeSet makeChangeSet(RDFService rdfService) {
ChangeSet cs = rdfService.manufactureChangeSet();
cs.addPreChangeEvent(new BulkUpdateEvent(null, BEGIN));
cs.addPostChangeEvent(new BulkUpdateEvent(null, END));
return cs;
}
}

View file

@ -10,9 +10,6 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.ResourceFactory;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AuthorizationRequest;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
@ -28,8 +25,6 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUti
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.N3EditUtils;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.web.URLEncoder;
/*
* Custom deletion controller to which deletion requests from default property form are sent. May be replaced
* later with additional features in process rdf form controller or alternative location.
@ -66,14 +61,14 @@ public class DeletePropertyController extends FreemarkerHttpServlet {
private String getRedirectUrl(VitroRequest vreq) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
String subjectUri = EditConfigurationUtils.getSubjectUri(vreq);
String predicateUri = EditConfigurationUtils.getPredicateUri(vreq);
Property prop = ResourceFactory.createProperty(predicateUri);
String localName = prop.getLocalName();
int hashIndex = predicateUri.lastIndexOf("#");
String localName = predicateUri.substring(hashIndex + 1);
String redirectUrl = "/entity?uri=" + URLEncoder.encode(subjectUri);
return redirectUrl + "#" + URLEncoder.encode(localName);
}
return redirectUrl + "#" + URLEncoder.encode(localName);
}
private String handleErrors(VitroRequest vreq) {

View file

@ -1,417 +0,0 @@
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import static edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AuthorizationRequest.UNAUTHORIZED;
import static edu.cornell.mannlib.vitro.webapp.controller.freemarker.ImageUploadController.PARAMETER_UPLOADED_FILE;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.ontology.OntModel;
import org.apache.tika.Tika;
import org.apache.tika.mime.MimeType;
import org.apache.tika.mime.MimeTypeException;
import org.apache.tika.mime.MimeTypes;
import edu.cornell.mannlib.vitro.webapp.application.ApplicationUtils;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AuthorizationRequest;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.RequestedAction;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddObjectPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropObjectPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.Property;
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
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.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.filestorage.UploadedFileHelper;
import edu.cornell.mannlib.vitro.webapp.filestorage.model.FileInfo;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
import edu.cornell.mannlib.vitro.webapp.modules.fileStorage.FileStorage;
@WebServlet(name = "FileUploadController", urlPatterns = { "/uploadFile" })
public class FileUploadController extends FreemarkerHttpServlet {
private static final String REFERER_HEADER = "Referer";
private static final String TEMPLATE_VAR_FORM_ACTION = "formAction";
private static final String TEMPLATE_VAR_MAX_FILE_SIZE = "maxFileSize";
private static final String PARAM_REFERRER = "referrer";
private static final String TEMPLATE_VAR_SUPPORTED_MEDIA_TYPES = "supportedMediaTypes";
private static final String TEMPLATE_VAR_ERROR_MESSAGE = "errorMessage";
private static final String DEFAULT_FILE_NAME = "fileName";
/**
*
*/
private static final Log log = LogFactory.getLog(FileUploadController.class);
private static final long serialVersionUID = 1L;
private static final String PARAMETER_ACTION = "action";
private static final String ACTION_DELETE = "delete";
private static final String ACTION_UPLOAD = "upload";
private static final String PARAMETER_FILE_URI = "fileUri";
private static final String PARAMETER_SUBJECT_URI = "subjectUri";
private static final String CONFIG_MAX_FILE_SIZE = "fileUpload.maxFileSize";
private static final String ALLOWED_MEDIA_TYPES = "fileUpload.allowedMIMETypes";
private static final Long DEFAULT_FILE_SIZE = (long) (10 * 1024 * 1024);
private static final String PARAMETER_PREDICATE_URI = "predicateUri";
private static final String DEFAULT_TEMPLATE = "fileUpload-default.ftl";
private static Long maxFileSize = DEFAULT_FILE_SIZE;
private FileStorage fileStorage;
private Set<String> allowedMediaTypes;
@Override
public void init() throws ServletException {
super.init();
fileStorage = ApplicationUtils.instance().getFileStorage();
setMaxFileSize();
setAllowedMediaTypes();
}
@Override
protected AuthorizationRequest requiredActions(VitroRequest vreq) {
RequestedAction ra;
try {
Property predicate = new Property(getPredicateUri(vreq));
final OntModel jenaOntModel = vreq.getJenaOntModel();
final String subject = getSubjectUri(vreq);
if (isUpload(vreq)) {
ra = new AddObjectPropertyStatement(jenaOntModel, subject, predicate,RequestedAction.SOME_URI);
} else { // delete
ra = new DropObjectPropertyStatement(jenaOntModel, subject, predicate, getFileUri(vreq));
}
return ra;
} catch (Exception e) {
return UNAUTHORIZED;
}
}
private String getFileUri(VitroRequest vreq) {
return vreq.getParameter(PARAMETER_FILE_URI);
}
@Override
protected ResponseValues processRequest(VitroRequest vreq) {
try {
getReferrer(vreq);
validateRequest(vreq);
if (isUpload(vreq)) {
uploadFile(vreq);
} else if (isDelete(vreq)) {
deleteFile(vreq);
}
} catch (Exception e) {
return pageResponse(vreq, e.getMessage());
}
return new RedirectResponseValues(getNextPageUrl(vreq), HttpServletResponse.SC_SEE_OTHER);
}
private String getNextPageUrl(VitroRequest vreq) {
return getReferrer(vreq);
}
private TemplateResponseValues pageResponse(VitroRequest vreq, String error) {
TemplateResponseValues rv = new TemplateResponseValues(DEFAULT_TEMPLATE);
rv.put(PARAMETER_ACTION, vreq.getParameter(PARAMETER_ACTION));
rv.put(TEMPLATE_VAR_FORM_ACTION, formatRequestUrl(vreq));
if (!error.isEmpty()) {
rv.put(TEMPLATE_VAR_ERROR_MESSAGE, error);
}
rv.put(PARAM_REFERRER,getReferrer(vreq));
rv.put(TEMPLATE_VAR_SUPPORTED_MEDIA_TYPES, printAllowedMediaTypes());
rv.put(TEMPLATE_VAR_MAX_FILE_SIZE, maxFileSizeInMegabytes());
return rv;
}
private String formatRequestUrl(VitroRequest vreq) {
String result = vreq.getRequestURL().toString() + "?";
String query = vreq.getQueryString();
if (query != null) {
result += query;
}
String referrer = vreq.getParameter(PARAM_REFERRER);
if (referrer == null || referrer.isEmpty()) {
result += "&" + PARAM_REFERRER + "=" + getReferrer(vreq);
}
return result;
}
private Double maxFileSizeInMegabytes() {
if (maxFileSize > 0) {
return ((double) maxFileSize/1048576);
} else {
return 0.0;
}
}
private void validateRequest(VitroRequest vreq) throws FileUploadException {
I18nBundle i18nBundle = I18n.bundle(vreq);
if (isUpload(vreq)) {
validateUploadRequest(vreq,i18nBundle);
} else if (isDelete(vreq)) {
validateDeleteRequest(vreq,i18nBundle);
} else if (hasAction(vreq)) {
throw new FileUploadException(i18nBundle.text("file_upload_error_supported_actions"));
} else {
throw new FileUploadException(i18nBundle.text("file_upload_error_no_action"));
}
}
private void validateDeleteRequest(VitroRequest vreq, I18nBundle i18nBundle) throws FileUploadException {
validateSubjectUri(vreq, i18nBundle);
validatePredicateUri(vreq, i18nBundle);
validateFileUri(vreq,i18nBundle);
}
private void validateUploadRequest(VitroRequest vreq, I18nBundle i18nBundle) throws FileUploadException {
validateSubjectUri(vreq ,i18nBundle);
validatePredicateUri(vreq , i18nBundle);
validateFile(vreq, i18nBundle);
}
private void validateFile(VitroRequest vreq, I18nBundle i18nBundle) throws FileUploadException {
Map<String, List<FileItem>> map = vreq.getFiles();
if (map == null) {
throw new FileUploadException(i18nBundle.text("file_upload_error_file_not_found"));
}
List<FileItem> list = map.get(PARAMETER_UPLOADED_FILE);
if ((list == null) || list.isEmpty()) {
throw new FileUploadException(i18nBundle.text("file_upload_error_file_not_found"));
}
FileItem file = list.get(0);
if (file.getSize() == 0) {
throw new FileUploadException(i18nBundle.text("file_upload_error_file_size_is_zero"));
}
if (file.getSize() > maxFileSize) {
throw new FileUploadException(i18nBundle.text("file_upload_error_file_is_too_big", maxFileSize, file.getSize()));
}
validateMediaType(file, i18nBundle);
}
private void validateMediaType(FileItem file, I18nBundle i18nBundle) throws FileUploadException {
String mediaType = getMediaType(file);
if (mediaType.isEmpty()) {
throw new FileUploadException(i18nBundle.text("file_upload_error_file_type_not_recognized"));
}
if (!allowedMediaTypes.contains(mediaType.toLowerCase())) {
String errorMessage = i18nBundle.text("file_upload_error_media_type_not_allowed", mediaType);
log.error(errorMessage);
throw new FileUploadException(errorMessage);
}
}
private String printAllowedMediaTypes() {
StringBuilder sb = new StringBuilder();
if (allowedMediaTypes.isEmpty()) {
return sb.toString();
}
for (Iterator<String> it = allowedMediaTypes.iterator(); it.hasNext();) {
String mediaType = (String) it.next();
sb.append(mediaType);
if (it.hasNext()) {
sb.append(", ");
} else {
sb.append(".");
}
}
return sb.toString();
}
private boolean hasAction(VitroRequest vreq) {
return vreq.getParameter(PARAMETER_ACTION) != null;
}
private void deleteFile(VitroRequest vreq) {
String subjectUri = getSubjectUri(vreq);
String predicateUri = getPredicateUri(vreq);
String fileUri = getFileUri(vreq);
WebappDaoFactory webAppDaoFactory = vreq.getUnfilteredWebappDaoFactory();
UploadedFileHelper fileHelper = new UploadedFileHelper(fileStorage, webAppDaoFactory, getServletContext());
fileHelper.removeUploadedFile(subjectUri, predicateUri, fileUri);
}
private void uploadFile(VitroRequest vreq) throws FileUploadException {
String subjectUri = getSubjectUri(vreq);
String predicateUri = getPredicateUri(vreq);
FileItem file = getUploadedFile(vreq);
String uploadedFileName = getUploadedFileName(file);
String storedFileName = createStoredFileName(file);
WebappDaoFactory webAppDaoFactory = vreq.getUnfilteredWebappDaoFactory();
UploadedFileHelper fileHelper = new UploadedFileHelper(fileStorage, webAppDaoFactory, getServletContext());
FileInfo fileInfo = createFile(file, storedFileName, fileHelper);
fileHelper.attachFileToSubject(fileInfo, subjectUri, predicateUri);
fileHelper.setPublicFileName(fileInfo, uploadedFileName);
}
private FileInfo createFile(FileItem file, String storedFileName, UploadedFileHelper fileHelper)
throws FileUploadException {
FileInfo fileInfo = null;
try {
fileInfo = fileHelper.createFile(storedFileName, getMediaType(file), file.getInputStream());
} catch (Exception e) {
log.error(e.getLocalizedMessage());
throw new FileUploadException(e.getLocalizedMessage());
}
return fileInfo;
}
private String createStoredFileName(FileItem file) {
String mediaType = getMediaType(file);
int length = 64;
boolean useLetters = true;
boolean useNumbers = true;
String storedFileName = RandomStringUtils.random(length, useLetters, useNumbers) + getExtension(mediaType);
return storedFileName;
}
private String getExtension(String mediaType) {
String extension = "";
MimeTypes types = MimeTypes.getDefaultMimeTypes();
try {
MimeType mimeType = types.forName(mediaType);
extension = mimeType.getExtension();
} catch (MimeTypeException e) {
log.error(e.getLocalizedMessage());
}
return extension;
}
private String getUploadedFileName(FileItem file) {
String fileName = file.getName();
if (fileName == null) {
return DEFAULT_FILE_NAME;
} else {
return FilenameUtils.getName(fileName);
}
}
private String getMediaType(FileItem file) {
Tika tika = new Tika();
InputStream is;
String mediaType = "";
try {
is = file.getInputStream();
mediaType = tika.detect(is);
} catch (IOException e) {
log.error(e.getLocalizedMessage());
}
return mediaType;
}
private void validateFileUri(VitroRequest vreq, I18nBundle i18nBundle) throws FileUploadException {
String fileUri = getFileUri(vreq);
validateUriNotEmpty(fileUri, i18nBundle.text("file_upload_file"), i18nBundle);
validateIndividual(vreq, fileUri, i18nBundle);
}
private void validateSubjectUri(VitroRequest vreq, I18nBundle i18nBundle) throws FileUploadException {
String subjectUri = getSubjectUri(vreq);
validateUriNotEmpty(subjectUri, i18nBundle.text("file_upload_subject"), i18nBundle);
validateIndividual(vreq, subjectUri, i18nBundle);
}
private void validatePredicateUri(VitroRequest vreq, I18nBundle i18nBundle) throws FileUploadException {
String predicateUri = getPredicateUri(vreq);
validateUriNotEmpty(predicateUri, i18nBundle.text("file_upload_predicate"), i18nBundle);
validateIndividual(vreq, predicateUri, i18nBundle);
}
private void validateIndividual(VitroRequest vreq, String name, I18nBundle i18nBundle) throws FileUploadException {
Individual subject = vreq.getUnfilteredWebappDaoFactory().getIndividualDao()
.getIndividualByURI(name);
if (subject == null) {
throw new FileUploadException(i18nBundle.text("file_upload_error_uri_not_exists", name));
}
}
private void validateUriNotEmpty(String predicateUri, String name, I18nBundle i18nBundle) throws FileUploadException {
if (predicateUri == null || predicateUri.trim().isEmpty()) {
throw new FileUploadException(i18nBundle.text("file_upload_error_uri_not_given", name));
}
}
private String getPredicateUri(VitroRequest vreq) {
return vreq.getParameter(PARAMETER_PREDICATE_URI);
}
private String getSubjectUri(VitroRequest vreq) {
return vreq.getParameter(PARAMETER_SUBJECT_URI);
}
private FileItem getUploadedFile(VitroRequest vreq) {
return vreq.getFiles().get(PARAMETER_UPLOADED_FILE).get(0);
}
private boolean isUpload(VitroRequest vreq) {
String action = vreq.getParameter(PARAMETER_ACTION);
return ACTION_UPLOAD.equals(action);
}
private boolean isDelete(VitroRequest vreq) {
String action = vreq.getParameter(PARAMETER_ACTION);
return ACTION_DELETE.equals(action);
}
private void setAllowedMediaTypes() {
ConfigurationProperties config = ConfigurationProperties.getBean(getServletContext());
String allowedTypes = config.getProperty(ALLOWED_MEDIA_TYPES, "");
if (allowedTypes.isEmpty()) {
allowedMediaTypes = new HashSet<String>();
} else {
allowedMediaTypes = new HashSet<String>(Arrays.asList(allowedTypes.toLowerCase().trim().split("\\s*,\\s*")));
}
}
private String getReferrer(VitroRequest vreq) {
String referrer = vreq.getParameter(PARAM_REFERRER);
if (referrer == null) {
referrer = vreq.getHeader(REFERER_HEADER);
}
if (referrer == null) {
referrer = "/";
}
return referrer;
}
private void setMaxFileSize() {
ConfigurationProperties config = ConfigurationProperties.getBean(getServletContext());
String configFileSize = config.getProperty(CONFIG_MAX_FILE_SIZE, DEFAULT_FILE_SIZE.toString());
try {
maxFileSize = Long.parseLong(configFileSize);
} catch (NumberFormatException e) {
log.error("maxFileSize parsing failed");
log.error(e);
}
}
static class FileUploadException extends Exception {
private static final long serialVersionUID = 1L;
private final Object[] parameters;
FileUploadException(String message, Object... parameters) {
super(message);
this.parameters = parameters;
}
public String formatMessage(HttpServletRequest req) {
return I18n.text(req, getMessage(), parameters);
}
}
}

View file

@ -8,7 +8,6 @@ import static javax.mail.Message.RecipientType.TO;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
@ -18,6 +17,7 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import edu.cornell.mannlib.vitro.webapp.dao.jena.MenuDaoJena;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -41,8 +41,6 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.Tem
import edu.cornell.mannlib.vitro.webapp.email.FreemarkerEmailFactory;
import edu.cornell.mannlib.vitro.webapp.email.FreemarkerEmailMessage;
import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.Tags;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.User;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu.MainMenu;
@ -69,6 +67,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
// error templates
ERROR_DISPLAY("error-display.ftl"),
ERROR_EMAIL("error-email.ftl"),
ERROR_MESSAGE("error-message.ftl"),
STANDARD_ERROR("error-standard.ftl"),
TITLED_ERROR_MESSAGE("error-titled.ftl"),
@ -94,8 +93,6 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
throws IOException, ServletException {
super.doGet(request,response);
//UQAM-Optimization set for UTF-8
response.setCharacterEncoding("UTF-8");
VitroRequest vreq = new VitroRequest(request);
ResponseValues responseValues = null;
@ -106,8 +103,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
if (!isAuthorizedToDisplayPage(request, response, requiredActions(vreq))) {
return;
}
responseValues = processRequest(vreq);
responseValues = processRequest(vreq);
doResponse(vreq, response, responseValues);
} catch (Throwable e) {
@ -162,8 +159,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
}
adminErrorData.put("cause", cause);
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
adminErrorData.put("datetime", dateformat.format(new Date()));
adminErrorData.put("datetime", new Date());
templateMap.put("errorOnHomePage", this instanceof HomePageController);
@ -177,11 +173,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
} else if (FreemarkerEmailFactory.isConfigured(vreq)) {
FreemarkerEmailMessage email = FreemarkerEmailFactory.createNewMessage(vreq);
email.addRecipient(TO, email.getReplyToAddress());
I18nBundle i18n = I18n.bundle(vreq);
addSiteName(vreq, adminErrorData);
adminErrorData.put("subject", i18n.text("application_error_email_subject"));
adminErrorData.put("textMessage", i18n.text("application_error_email_plain_text"));
adminErrorData.put("htmlMessage", i18n.text("application_error_email_html_text"));
email.setTemplate(Template.ERROR_EMAIL.toString());
email.setBodyMap(adminErrorData);
email.processTemplate();
sentEmail = email.send();
@ -199,16 +191,6 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
}
}
private void addSiteName(VitroRequest vreq, Map<String, Object> adminErrorData) {
try {
ApplicationBean appBean = vreq.getAppBean();
String appName = appBean.getApplicationName();
adminErrorData.put("siteName", appName);
} catch (Exception e) {
log.error(e,e);
}
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
@ -274,7 +256,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
protected void doTemplate(VitroRequest vreq, HttpServletResponse response,
ResponseValues values) throws TemplateProcessingException {
Map<String, Object> templateDataModel = new HashMap<String, Object>();
Map<String, Object> templateDataModel = new HashMap<String, Object>();
templateDataModel.putAll(getPageTemplateValues(vreq));
// Add the values that we got from the subcontroller processRequest() method, and merge to the template.
@ -294,15 +276,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
// is specified in the main page template.
bodyString = "";
}
templateDataModel.put("body", bodyString);
String lang = vreq.getLocale().getLanguage();
if (!vreq.getLocale().getCountry().isEmpty()) {
lang += "-" + vreq.getLocale().getCountry();
}
templateDataModel.put("country", lang);
// Tell the template and any directives it uses that we're processing a page template.
templateDataModel.put("templateType", PAGE_TEMPLATE_TYPE);
@ -487,7 +462,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
protected MainMenu getDisplayModelMenu(VitroRequest vreq){
String url = vreq.getRequestURI().substring(vreq.getContextPath().length());
return vreq.getWebappDaoFactory().getMenuDao().getMainMenu(url);
return vreq.getWebappDaoFactory().getMenuDao().getMainMenu(vreq, url);
}
// NIHVIVO-3307: we need this here instead of FreemarkerConfiguration.java so that updates to

View file

@ -6,11 +6,9 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.annotation.WebServlet;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individuallist.ListedIndividualBuilder;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -18,7 +16,6 @@ import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ExceptionResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
@ -30,7 +27,8 @@ import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchEngineExcepti
import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchQuery;
import edu.cornell.mannlib.vitro.webapp.utils.searchengine.SearchQueryUtils;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individuallist.ListedIndividual;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individuallist.ListedIndividualBuilder;
import javax.servlet.annotation.WebServlet;
/**
* Generates a list of individuals for display in a template
@ -45,7 +43,6 @@ public class IndividualListController extends FreemarkerHttpServlet {
private static final int MAX_PAGES = 40; // must be even
private static final String TEMPLATE_DEFAULT = "individualList.ftl";
private static final String LANGUAGE_FILTER_PROPERTY = "RDFService.languageFilter";
@Override
protected ResponseValues processRequest(VitroRequest vreq) {
@ -155,12 +152,12 @@ public class IndividualListController extends FreemarkerHttpServlet {
return SearchQueryUtils.getPageParameter(request);
}
public static IndividualListResults getResultsForVClass(String vclassURI,
int page, String alpha, VitroRequest vreq)
public static IndividualListResults getResultsForVClass(String vclassURI, int page, String alpha, VitroRequest vreq)
throws SearchException{
try{
List<String> classUris = Collections.singletonList(vclassURI);
return buildAndExecuteVClassQuery(classUris, page, INDIVIDUALS_PER_PAGE, alpha, vreq);
List<String> classUris = Collections.singletonList(vclassURI);
IndividualListQueryResults results = buildAndExecuteVClassQuery(classUris, alpha, page, INDIVIDUALS_PER_PAGE, vreq.getWebappDaoFactory().getIndividualDao());
return getResultsForVClassQuery(results, page, INDIVIDUALS_PER_PAGE, alpha, vreq);
} catch (SearchEngineException e) {
String msg = "An error occurred retrieving results for vclass query";
log.error(msg, e);
@ -172,27 +169,16 @@ public class IndividualListController extends FreemarkerHttpServlet {
}
}
public static IndividualListResults getResultsForVClassIntersections(
List<String> classUris, int page, int pageSize, String alpha, VitroRequest vreq) {
public static IndividualListResults getResultsForVClassIntersections(List<String> vclassURIs, int page, int pageSize, String alpha, VitroRequest vreq) {
try{
return buildAndExecuteVClassQuery(classUris, page, pageSize, alpha, vreq);
IndividualListQueryResults results = buildAndExecuteVClassQuery(vclassURIs, alpha, page, pageSize, vreq.getWebappDaoFactory().getIndividualDao());
return getResultsForVClassQuery(results, page, pageSize, alpha, vreq);
} catch(Throwable th) {
log.error("Error retrieving individuals corresponding to intersection multiple classes." + classUris.toString(), th);
log.error("Error retrieving individuals corresponding to intersection multiple classes." + vclassURIs.toString(), th);
return IndividualListResults.EMPTY;
}
}
private static IndividualListResults buildAndExecuteVClassQuery(List<String> classUris, int page, int pageSize,
String alpha, VitroRequest vreq) throws SearchEngineException {
ConfigurationProperties props = ConfigurationProperties.getBean(vreq);
boolean languageFilter = Boolean.valueOf(props.getProperty(LANGUAGE_FILTER_PROPERTY, "false"));
IndividualListQueryResults results = buildAndExecuteVClassQuery(classUris, alpha,
((languageFilter) ? vreq.getLocale() : null), page, pageSize,
vreq.getWebappDaoFactory().getIndividualDao());
IndividualListResults indListResults = getResultsForVClassQuery(results, page, pageSize, alpha, vreq);
return indListResults;
}
public static IndividualListResults getRandomResultsForVClass(String vclassURI, int page, int pageSize, VitroRequest vreq) {
try{
List<String> classUris = Collections.singletonList(vclassURI);
@ -215,10 +201,9 @@ public class IndividualListController extends FreemarkerHttpServlet {
private static IndividualListQueryResults buildAndExecuteVClassQuery(
List<String> vclassURIs, String alpha, Locale locale, int page,
int pageSize, IndividualDao indDao)
List<String> vclassURIs, String alpha, int page, int pageSize, IndividualDao indDao)
throws SearchEngineException {
SearchQuery query = SearchQueryUtils.getQuery(vclassURIs, alpha, locale, page, pageSize);
SearchQuery query = SearchQueryUtils.getQuery(vclassURIs, alpha, page, pageSize);
IndividualListQueryResults results = IndividualListQueryResults.runQuery(query, indDao);
log.debug("Executed search query for " + vclassURIs);
if (results.getIndividuals().isEmpty()) {
@ -265,7 +250,8 @@ public class IndividualListController extends FreemarkerHttpServlet {
}else if ( requiredPages > MAX_PAGES && selectedPage > requiredPages - MAX_PAGES ){
//the selected page is in the end of the list
int startPage = requiredPages - MAX_PAGES;
for(int page = startPage; page <= requiredPages; page++ ){
double max = Math.ceil(size/pageSize);
for(int page = startPage; page <= max; page++ ){
records.add( new PageRecord( "page=" + page, Integer.toString(page), Integer.toString(page), selectedPage == page ) );
}
}else{

View file

@ -8,40 +8,39 @@ import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AuthorizationRequest;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
import edu.cornell.mannlib.vitro.webapp.beans.FauxProperty;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.Property;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.FauxPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao;
import javax.servlet.annotation.WebServlet;
@WebServlet(name = "ListFauxPropertiesController", urlPatterns = { "/listFauxProperties" })
@WebServlet(name = "ListFauxPropertiesController", urlPatterns = {"/listFauxProperties"} )
public class ListFauxPropertiesController extends FreemarkerHttpServlet {
private static final Log log = LogFactory.getLog(ListFauxPropertiesController.class.getName());
private static final Log log = LogFactory.getLog(ListFauxPropertiesController.class.getName());
private static final String TEMPLATE_NAME = "siteAdmin-fauxPropertiesList.ftl";
private String notFoundMessage = "";
private ObjectPropertyDao opDao = null;
private PropertyGroupDao pgDao = null;
private FauxPropertyDao fpDao = null;
private String notFoundMessage = "";
@Override
protected AuthorizationRequest requiredActions(VitroRequest vreq) {
return SimplePermission.EDIT_ONTOLOGY.ACTION;
}
protected AuthorizationRequest requiredActions(VitroRequest vreq) {
return SimplePermission.EDIT_ONTOLOGY.ACTION;
}
@Override
protected ResponseValues processRequest(VitroRequest vreq) {
@ -51,303 +50,176 @@ public class ListFauxPropertiesController extends FreemarkerHttpServlet {
String displayOption = "";
if (vreq.getParameter("displayOption") != null) {
if ( vreq.getParameter("displayOption") != null ) {
displayOption = vreq.getParameter("displayOption");
} else {
}
else {
displayOption = "listing";
}
body.put("displayOption", displayOption);
if (displayOption.equals("listing")) {
if ( displayOption.equals("listing") ) {
body.put("pageTitle", "Faux Property Listing");
} else {
}
else {
body.put("pageTitle", "Faux Properties by Base Property");
}
List<ObjectProperty> objectProps = getOPDao(vreq).getRootObjectProperties();
List<DataProperty> dataProps = getDPDao(vreq).getRootDataProperties();
Map<String, Object> allFauxProps = new TreeMap<String, Object>();
// get the faux depending on the display option
if (displayOption.equals("listing")) {
allFauxProps.putAll(getFauxPropertyList(objectProps, vreq));
allFauxProps.putAll(getFauxDataPropertyList(dataProps, vreq));
} else {
allFauxProps.putAll(getFauxByBaseList(objectProps, vreq));
allFauxProps.putAll(getFauxDataPropsByBaseList(dataProps, vreq));
opDao = vreq.getUnfilteredAssertionsWebappDaoFactory().getObjectPropertyDao();
fpDao = vreq.getUnfilteredAssertionsWebappDaoFactory().getFauxPropertyDao();
pgDao = vreq.getUnfilteredAssertionsWebappDaoFactory().getPropertyGroupDao();
List<ObjectProperty> objectProps = null;
objectProps = opDao.getRootObjectProperties();
Map<String, Object> allFauxProps = new TreeMap<String, Object>();
// get the faux depending on the display option
if ( displayOption.equals("listing") ) {
allFauxProps = getFauxPropertyList(objectProps);
}
else {
allFauxProps = getFauxByBaseList(objectProps);
}
log.debug(allFauxProps.toString());
log.debug(allFauxProps.toString());
if (notFoundMessage.length() == 0) {
body.put("message", notFoundMessage);
} else {
body.put("fauxProps", allFauxProps);
}
if ( notFoundMessage.length() == 0 ) {
body.put("message", notFoundMessage);
}
else {
body.put("fauxProps", allFauxProps);
}
} catch (Throwable t) {
log.error(t, t);
t.printStackTrace();
}
return new TemplateResponseValues(TEMPLATE_NAME, body);
}
private PropertyGroupDao getPGDao(VitroRequest vreq) {
return vreq.getUnfilteredAssertionsWebappDaoFactory().getPropertyGroupDao();
}
private FauxPropertyDao getFPDao(VitroRequest vreq) {
return vreq.getUnfilteredAssertionsWebappDaoFactory().getFauxPropertyDao();
}
private DataPropertyDao getDPDao(VitroRequest vreq) {
return vreq.getUnfilteredAssertionsWebappDaoFactory().getDataPropertyDao();
}
private ObjectPropertyDao getOPDao(VitroRequest vreq) {
return vreq.getUnfilteredAssertionsWebappDaoFactory().getObjectPropertyDao();
}
private TreeMap<String, Object> getFauxPropertyList(List<ObjectProperty> objectProps, VitroRequest vreq) {
List<FauxProperty> fauxProps = null;
TreeMap<String, Object> theFauxProps = new TreeMap<String, Object>();
if (objectProps != null) {
private TreeMap<String, Object> getFauxPropertyList(List<ObjectProperty> objectProps) {
List<FauxProperty> fauxProps = null;
TreeMap<String, Object> theFauxProps = new TreeMap<String, Object>();
if ( objectProps != null ) {
Iterator<ObjectProperty> opIt = objectProps.iterator();
if (!opIt.hasNext()) {
if ( !opIt.hasNext()) {
notFoundMessage = "No object properties found.";
} else {
}
else {
while (opIt.hasNext()) {
ObjectProperty op = opIt.next();
String baseURI = op.getURI();
fauxProps = getFPDao(vreq).getFauxPropertiesForBaseUri(baseURI);
if (fauxProps != null) {
Iterator<FauxProperty> fpIt = fauxProps.iterator();
if (!fpIt.hasNext()) {
notFoundMessage = "No faux properties found.";
} else {
while (fpIt.hasNext()) {
// No point in getting these unless we have a
// faux property
String baseLabel = getBaseLabel(op, false);
// get the info we need from the faux property
FauxProperty fp = fpIt.next();
String fauxLabel = fp.getDisplayName();
String rangeLabel = fp.getRangeLabel();
String rangeURI = fp.getRangeURI();
String domainLabel = fp.getDomainLabel();
String domainURI = fp.getDomainURI();
String groupURI = fp.getGroupURI();
// FauxProperty only gets groupURI but we want
// the label
PropertyGroup pGroup = getPGDao(vreq).getGroupByURI(groupURI);
String groupLabel = (pGroup == null) ? "unspecified" : pGroup.getName();
// store all the strings in a hash with the faux
// property label as the key
Map<String, Object> tmpHash = new HashMap<String, Object>();
tmpHash.put("base", baseLabel);
tmpHash.put("baseURI", baseURI);
tmpHash.put("group", groupLabel);
tmpHash.put("range", rangeLabel);
tmpHash.put("rangeURI", rangeURI);
tmpHash.put("domain", domainLabel);
tmpHash.put("domainURI", domainURI);
tmpHash.put("editUrl", "propertyEdit");
// add the faux and its details to the treemap
theFauxProps.put(fauxLabel + "@@" + domainLabel, tmpHash);
}
}
}
}
String baseURI = op.getURI();
fauxProps = fpDao.getFauxPropertiesForBaseUri(baseURI);
if ( fauxProps != null ) {
Iterator<FauxProperty> fpIt = fauxProps.iterator();
if ( !fpIt.hasNext()) {
notFoundMessage = "No faux properties found.";
}
else {
while (fpIt.hasNext()) {
// No point in getting these unless we have a faux property
String baseLabel = getDisplayLabel(op) == null ? "(no name)" : getDisplayLabel(op);
String baseLocalName = op.getLocalNameWithPrefix();
baseLabel = baseLabel.substring(0,baseLabel.indexOf("("));
baseLabel += "(" + baseLocalName + ")";
// get the info we need from the faux property
FauxProperty fp = fpIt.next();
String fauxLabel = fp.getDisplayName();
String rangeLabel = fp.getRangeLabel();
String rangeURI = fp.getRangeURI();
String domainLabel = fp.getDomainLabel();
String domainURI = fp.getDomainURI();
String groupURI = fp.getGroupURI();
// FauxProperty only gets groupURI but we want the label
PropertyGroup pGroup = pgDao.getGroupByURI(groupURI);
String groupLabel = ( pGroup == null ) ? "unspecified" : pGroup.getName();
// store all the strings in a hash with the faux property label as the key
Map<String, Object> tmpHash = new HashMap<String, Object>();
tmpHash.put("base", baseLabel);
tmpHash.put("baseURI", baseURI);
tmpHash.put("group", groupLabel);
tmpHash.put("range", rangeLabel);
tmpHash.put("rangeURI", rangeURI);
tmpHash.put("domain", domainLabel);
tmpHash.put("domainURI", domainURI);
// add the faux and its details to the treemap
theFauxProps.put(fauxLabel + "@@" + domainLabel, tmpHash);
}
}
}
}
}
}
return theFauxProps;
}
}
private TreeMap<String, Object> getFauxByBaseList(List<ObjectProperty> objectProps, VitroRequest vreq) {
List<FauxProperty> fauxProps = null;
TreeMap<String, Object> fauxByBaseProps = new TreeMap<String, Object>();
if (objectProps != null) {
private TreeMap<String, Object> getFauxByBaseList(List<ObjectProperty> objectProps) {
List<FauxProperty> fauxProps = null;
TreeMap<String, Object> fauxByBaseProps = new TreeMap<String, Object>();
if ( objectProps != null ) {
Iterator<ObjectProperty> opIt = objectProps.iterator();
if (!opIt.hasNext()) {
if ( !opIt.hasNext()) {
notFoundMessage = "No object properties found.";
} else {
}
else {
while (opIt.hasNext()) {
TreeMap<String, Object> fauxForGivenBase = new TreeMap<String, Object>();
TreeMap<String, Object> fauxForGivenBase = new TreeMap<String, Object>();
ObjectProperty op = opIt.next();
String baseURI = op.getURI();
fauxProps = getFPDao(vreq).getFauxPropertiesForBaseUri(baseURI);
String baseURI = op.getURI();
fauxProps = fpDao.getFauxPropertiesForBaseUri(baseURI);
if (fauxProps != null) {
Iterator<FauxProperty> fpIt = fauxProps.iterator();
if (!fpIt.hasNext()) {
notFoundMessage = "No faux properties found.";
} else {
String baseLabel = getBaseLabel(op, true);
while (fpIt.hasNext()) {
// get the info we need from the faux property
FauxProperty fp = fpIt.next();
String fauxLabel = fp.getDisplayName();
String rangeLabel = fp.getRangeLabel();
String rangeURI = fp.getRangeURI();
String domainLabel = fp.getDomainLabel();
String domainURI = fp.getDomainURI();
String groupURI = fp.getGroupURI();
// FauxProperty only gets groupURI but we want
// the label
PropertyGroup pGroup = getPGDao(vreq).getGroupByURI(groupURI);
String groupLabel = (pGroup == null) ? "unspecified" : pGroup.getName();
// store all the strings in a hash with the faux
// property label as the key
Map<String, Object> tmpHash = new HashMap<String, Object>();
tmpHash.put("baseURI", baseURI);
tmpHash.put("group", groupLabel);
tmpHash.put("range", rangeLabel);
tmpHash.put("rangeURI", rangeURI);
tmpHash.put("domain", domainLabel);
tmpHash.put("domainURI", domainURI);
// add the faux and its details to the treemap
fauxForGivenBase.put(fauxLabel + "@@" + domainLabel, tmpHash);
fauxForGivenBase.put("editUrl", "propertyEdit");
}
fauxByBaseProps.put(baseLabel, fauxForGivenBase);
}
}
}
if ( fauxProps != null ) {
Iterator<FauxProperty> fpIt = fauxProps.iterator();
if ( !fpIt.hasNext()) {
notFoundMessage = "No faux properties found.";
}
else {
String baseLabel = getDisplayLabel(op) == null ? "(no name)" : getDisplayLabel(op);
String baseLocalName = op.getLocalNameWithPrefix();
baseLabel = baseLabel.substring(0,baseLabel.indexOf("("));
baseLabel += "(" + baseLocalName + ")" + "|" + baseURI;
while (fpIt.hasNext()) {
// get the info we need from the faux property
FauxProperty fp = fpIt.next();
String fauxLabel = fp.getDisplayName();
String rangeLabel = fp.getRangeLabel();
String rangeURI = fp.getRangeURI();
String domainLabel = fp.getDomainLabel();
String domainURI = fp.getDomainURI();
String groupURI = fp.getGroupURI();
// FauxProperty only gets groupURI but we want the label
PropertyGroup pGroup = pgDao.getGroupByURI(groupURI);
String groupLabel = ( pGroup == null ) ? "unspecified" : pGroup.getName();
// store all the strings in a hash with the faux property label as the key
Map<String, Object> tmpHash = new HashMap<String, Object>();
tmpHash.put("baseURI", baseURI);
tmpHash.put("group", groupLabel);
tmpHash.put("range", rangeLabel);
tmpHash.put("rangeURI", rangeURI);
tmpHash.put("domain", domainLabel);
tmpHash.put("domainURI", domainURI);
// add the faux and its details to the treemap
fauxForGivenBase.put(fauxLabel + "@@" + domainLabel, tmpHash);
}
fauxByBaseProps.put(baseLabel, fauxForGivenBase);
}
}
}
}
}
return fauxByBaseProps;
}
}
private TreeMap<String, Object> getFauxDataPropertyList(List<DataProperty> dataProps, VitroRequest vreq) {
List<FauxProperty> fauxProps = null;
TreeMap<String, Object> theFauxProps = new TreeMap<String, Object>();
if (dataProps != null) {
Iterator<DataProperty> opIt = dataProps.iterator();
if (!opIt.hasNext()) {
notFoundMessage = "No data properties found.";
} else {
while (opIt.hasNext()) {
DataProperty dp = opIt.next();
String baseURI = dp.getURI();
fauxProps = getFPDao(vreq).getFauxPropertiesForBaseUri(baseURI);
if (fauxProps != null) {
Iterator<FauxProperty> fpIt = fauxProps.iterator();
if (!fpIt.hasNext()) {
notFoundMessage = "No faux properties found.";
} else {
while (fpIt.hasNext()) {
// No point in getting these unless we have a
// faux property
String baseLabel = getBaseLabel(dp, false);
// get the info we need from the faux property
FauxProperty fp = fpIt.next();
String fauxLabel = fp.getDisplayName();
String rangeLabel = fp.getRangeLabel();
String rangeURI = fp.getRangeURI();
String domainLabel = fp.getDomainLabel();
String domainURI = fp.getDomainURI();
String groupURI = fp.getGroupURI();
// FauxProperty only gets groupURI but we want
// the label
PropertyGroup pGroup = getPGDao(vreq).getGroupByURI(groupURI);
String groupLabel = (pGroup == null) ? "unspecified" : pGroup.getName();
// store all the strings in a hash with the faux
// property label as the key
Map<String, Object> tmpHash = new HashMap<String, Object>();
tmpHash.put("base", baseLabel);
tmpHash.put("baseURI", baseURI);
tmpHash.put("group", groupLabel);
tmpHash.put("range", rangeLabel);
tmpHash.put("rangeURI", rangeURI);
tmpHash.put("domain", domainLabel);
tmpHash.put("domainURI", domainURI);
tmpHash.put("editUrl", "datapropEdit");
// add the faux and its details to the treemap
theFauxProps.put(fauxLabel + "@@" + domainLabel, tmpHash);
}
}
}
}
}
}
return theFauxProps;
}
private TreeMap<String, Object> getFauxDataPropsByBaseList(List<DataProperty> dataProps, VitroRequest vreq) {
List<FauxProperty> fauxProps = null;
TreeMap<String, Object> fauxByBaseProps = new TreeMap<String, Object>();
if (dataProps != null) {
Iterator<DataProperty> opIt = dataProps.iterator();
if (!opIt.hasNext()) {
notFoundMessage = "No data properties found.";
} else {
while (opIt.hasNext()) {
TreeMap<String, Object> fauxForGivenBase = new TreeMap<String, Object>();
DataProperty dp = opIt.next();
String baseURI = dp.getURI();
fauxProps = getFPDao(vreq).getFauxPropertiesForBaseUri(baseURI);
if (fauxProps != null) {
Iterator<FauxProperty> fpIt = fauxProps.iterator();
if (!fpIt.hasNext()) {
notFoundMessage = "No faux properties found.";
} else {
String baseLabel = getBaseLabel(dp, true);
while (fpIt.hasNext()) {
// get the info we need from the faux property
FauxProperty fp = fpIt.next();
String fauxLabel = fp.getDisplayName();
String rangeLabel = fp.getRangeLabel();
String rangeURI = fp.getRangeURI();
String domainLabel = fp.getDomainLabel();
String domainURI = fp.getDomainURI();
String groupURI = fp.getGroupURI();
// FauxProperty only gets groupURI but we want
// the label
PropertyGroup pGroup = getPGDao(vreq).getGroupByURI(groupURI);
String groupLabel = (pGroup == null) ? "unspecified" : pGroup.getName();
// store all the strings in a hash with the faux
// property label as the key
Map<String, Object> tmpHash = new HashMap<String, Object>();
tmpHash.put("baseURI", baseURI);
tmpHash.put("group", groupLabel);
tmpHash.put("range", rangeLabel);
tmpHash.put("rangeURI", rangeURI);
tmpHash.put("domain", domainLabel);
tmpHash.put("domainURI", domainURI);
// add the faux and its details to the treemap
fauxForGivenBase.put(fauxLabel + "@@" + domainLabel, tmpHash);
fauxForGivenBase.put("editUrl", "datapropEdit");
}
fauxByBaseProps.put(baseLabel, fauxForGivenBase);
}
}
}
}
}
return fauxByBaseProps;
}
private String getBaseLabel(Property property, boolean addUri) {
String baseLabel = property.getPickListName();
if (StringUtils.isEmpty(baseLabel)) {
baseLabel = property.getLocalName();
}
if (StringUtils.isEmpty(baseLabel)) {
baseLabel = "[property]";
}
String baseLocalName = property.getLocalNameWithPrefix();
int indexOf = baseLabel.indexOf("(");
if (indexOf > 0) {
baseLabel = baseLabel.substring(0, indexOf);
}
baseLabel += "(" + baseLocalName + ")";
if (addUri) {
baseLabel += "|" + property.getURI();
}
return baseLabel;
/*
* should never be null
*/
public static String getDisplayLabel(ObjectProperty op) {
String displayLabel = op.getPickListName();
displayLabel = (displayLabel != null && displayLabel.length() > 0)
? displayLabel
: op.getLocalName();
return (displayLabel != null) ? displayLabel : "[object property]" ;
}
}

View file

@ -42,7 +42,7 @@ public class TemplateProcessingHelper {
try {
Environment env = template.createProcessingEnvironment(map, writer);
// Define a setup template to be included by every page template
String templateType = (String) map.get("templateType");
if (FreemarkerHttpServlet.PAGE_TEMPLATE_TYPE.equals(templateType)) {

View file

@ -0,0 +1,49 @@
/* $This file is distributed under the terms of the license in LICENSE$ */
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import javax.servlet.annotation.WebServlet;
@WebServlet(name = "TermsOfUseController", urlPatterns = {"/termsOfUse"} )
public class TermsOfUseController extends FreemarkerHttpServlet {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(TermsOfUseController.class);
private static final String TEMPLATE_DEFAULT = "termsOfUse.ftl";
@Override
protected ResponseValues processRequest(VitroRequest vreq) {
Map<String, Object> map = new HashMap<String, Object>();
Map<String, String> termsOfUse = new HashMap<String, String>();
ApplicationBean appBean = vreq.getAppBean();
termsOfUse.put("siteName", appBean.getApplicationName());
String siteHost = appBean.getCopyrightAnchor();
if (siteHost == null) {
siteHost = "the hosting institution";
}
termsOfUse.put("siteHost", siteHost);
map.put("termsOfUse", termsOfUse);
return new TemplateResponseValues(TEMPLATE_DEFAULT, map);
}
@Override
protected String getTitle(String siteName, VitroRequest vreq) {
return siteName + " Terms of Use";
}
}

View file

@ -37,7 +37,7 @@ public class UrlBuilder {
LOGIN("/login"),
LOGOUT("/logout"),
OBJECT_PROPERTY_EDIT("/propertyEdit"),
EXTENDED_SEARCH("/extendedsearch"),
CUSTOMSEARCH("/customsearch"),
SEARCH("/search"),
SITE_ADMIN("/siteAdmin"),
TERMS_OF_USE("/termsOfUse"),

View file

@ -11,29 +11,28 @@ import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.LocaleUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Literal;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ExceptionResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils;
import edu.cornell.mannlib.vitro.webapp.i18n.selection.SelectedLocale;
import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringUtils;
/*Servlet to view all labels in various languages for individual*/
@ -48,13 +47,12 @@ public class ViewLabelsServlet extends FreemarkerHttpServlet{
String subjectUri = vreq.getParameter("subjectUri");
body.put("subjectUri", subjectUri);
try {
//the labels already added by the user
ArrayList<Literal> existingLabels = this.getExistingLabels(subjectUri, vreq);
//Get all language codes/labels used in the list of existing labels
List<HashMap<String, String>> locales = this.getLocales(vreq, existingLabels);
//Get all language codes/labels in the system, and this list is sorted by language name
List<HashMap<String, String>> locales = this.getLocales(vreq);
//Get code to label hashmap - we use this to get the language name for the language code returned in the rdf literal
HashMap<String, String> localeCodeToNameMap = this.getFullCodeToLanguageNameMap(locales);
//the labels already added by the user
ArrayList<Literal> existingLabels = this.getExistingLabels(subjectUri, vreq);
//existing labels keyed by language name and each of the list of labels is sorted by language name
HashMap<String, List<LabelInformation>> existingLabelsByLanguageName = this.getLabelsSortedByLanguageName(existingLabels, localeCodeToNameMap, vreq, subjectUri);
//Get available locales for the drop down for adding a new label, also sorted by language name
@ -139,26 +137,20 @@ public class ViewLabelsServlet extends FreemarkerHttpServlet{
doGet(request, response);
}
//get locales present in list of literals
public List<HashMap<String, String>> getLocales(VitroRequest vreq,
List<Literal> existingLiterals) {
Set<Locale> locales = new HashSet<Locale>();
for(Literal literal : existingLiterals) {
String language = literal.getLanguage();
if(!StringUtils.isEmpty(language)) {
locales.add(LanguageFilteringUtils.languageToLocale(language));
}
}
if (locales.isEmpty()) {
//get locales
public List<HashMap<String, String>> getLocales(VitroRequest vreq) {
List<Locale> selectables = SelectedLocale.getSelectableLocales(vreq);
if (selectables.isEmpty()) {
return Collections.emptyList();
}
List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
Locale currentLocale = SelectedLocale.getCurrentLocale(vreq);
for (Locale locale : locales) {
for (Locale locale : selectables) {
try {
list.add(buildLocaleMap(locale, currentLocale));
} catch (FileNotFoundException e) {
log.warn("Can't show locale '" + locale + "': " + e);
log.warn("Can't show the Locale selector for '" + locale
+ "': " + e);
}
}
@ -170,7 +162,7 @@ public class ViewLabelsServlet extends FreemarkerHttpServlet{
Locale currentLocale) throws FileNotFoundException {
HashMap<String, String> map = new HashMap<String, String>();
//Replacing the underscore with a hyphen because that is what is represented in the actual literals
map.put("code", locale.toLanguageTag().replace("_", "-"));
map.put("code", locale.toString().replace("_", "-"));
map.put("label", locale.getDisplayName(currentLocale));
return map;
}
@ -196,8 +188,8 @@ public class ViewLabelsServlet extends FreemarkerHttpServlet{
ArrayList<Literal> labels = new ArrayList<Literal>();
try {
// Show only labels with current language filtering
ResultSet results = QueryUtils.getQueryResults(queryStr, vreq);
//We want to get the labels for all the languages, not just the display language
ResultSet results = QueryUtils.getLanguageNeutralQueryResults(queryStr, vreq);
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
Literal nodeLiteral = soln.get("label").asLiteral();

View file

@ -338,7 +338,7 @@ public class JSONReconcileServlet extends VitroHttpServlet {
}
resultJson.put("type", typesJsonArr);
resultJson.put("match", false);
resultJson.put("match", "false");
resultJsonArr.add(resultJson);
} catch (Exception e) {

View file

@ -6,13 +6,14 @@ import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.jena.rdf.model.RDFNode;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.IndividualTemplateModelBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
@ -35,7 +36,6 @@ import edu.cornell.mannlib.vitro.webapp.i18n.selection.SelectedLocale;
import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.ExecuteDataRetrieval;
import edu.cornell.mannlib.vitro.webapp.web.beanswrappers.ReadOnlyBeansWrapper;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.IndividualTemplateModel;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.IndividualTemplateModelBuilder;
import edu.ucsf.vitro.opensocial.OpenSocialManager;
import freemarker.ext.beans.BeansWrapper;
import freemarker.template.TemplateModel;
@ -94,7 +94,6 @@ class IndividualResponseBuilder {
body.put("relatedSubject", getRelatedSubject());
body.put("namespaces", namespaces);
body.put("temporalVisualizationEnabled", getTemporalVisualizationFlag());
body.put("mapOfScienceVisualizationEnabled", getMapOfScienceVisualizationFlag());
body.put("profilePageTypesEnabled", getprofilePageTypesFlag());
body.put("verbosePropertySwitch", getVerbosePropertyValues());
@ -124,10 +123,8 @@ class IndividualResponseBuilder {
* into the data model: no real data can be modified.
*/
// body.put("individual", wrap(itm, BeansWrapper.EXPOSE_SAFE));
LabelAndLanguageCount labelAndLanguageCount = getLabelAndLanguageCount(
itm.getUri(), vreq);
body.put("labelCount", labelAndLanguageCount.getLabelCount());
body.put("languageCount", labelAndLanguageCount.getLanguageCount());
body.put("labelCount", getLabelCount(itm.getUri(), vreq));
body.put("languageCount", getLanguagesRepresentedCount(itm.getUri(), vreq));
//We also need to know the number of available locales
body.put("localesCount", SelectedLocale.getSelectableLocales(vreq).size());
body.put("profileType", getProfileType(itm.getUri(), vreq));
@ -196,12 +193,6 @@ class IndividualResponseBuilder {
return "enabled".equals(property);
}
private boolean getMapOfScienceVisualizationFlag() {
String property = ConfigurationProperties.getBean(vreq).getProperty(
"visualization.mapOfScience");
return "enabled".equals(property);
}
private boolean getprofilePageTypesFlag() {
String property = ConfigurationProperties.getBean(vreq).getProperty(
"multiViews.profilePageTypes");
@ -291,103 +282,61 @@ class IndividualResponseBuilder {
return map;
}
private static String LABEL_QUERY = ""
private static String LABEL_COUNT_QUERY = ""
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n"
+ "SELECT ( str(COUNT(?label)) AS ?labelCount ) WHERE { \n"
+ " ?subject rdfs:label ?label \n"
+ " FILTER isLiteral(?label) \n"
+ "}" ;
private static String DISTINCT_LANGUAGE_QUERY = ""
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n"
+ "SELECT ?label WHERE { \n"
+ "SELECT ( str(COUNT(DISTINCT lang(?label))) AS ?languageCount ) WHERE { \n"
+ " ?subject rdfs:label ?label \n"
+ " FILTER isLiteral(?label) \n"
+ "}" ;
// Queries that were previously used for counts via RDFService that didn't
// filter results by language. With language filtering, aggregate
// functions like COUNT() cannot be used.
// private static String LABEL_COUNT_QUERY = ""
// + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n"
// + "SELECT ( str(COUNT(?label)) AS ?labelCount ) WHERE { \n"
// + " ?subject rdfs:label ?label \n"
// + " FILTER isLiteral(?label) \n"
// + "}" ;
// private static String DISTINCT_LANGUAGE_QUERY = ""
// + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n"
// + "SELECT ( str(COUNT(DISTINCT lang(?label))) AS ?languageCount ) WHERE { \n"
// + " ?subject rdfs:label ?label \n"
// + " FILTER isLiteral(?label) \n"
// + "}" ;
private static LabelAndLanguageCount getLabelAndLanguageCount(
String subjectUri, VitroRequest vreq) {
// 1.12.0 Now filtering to only the labels for the current locale so as
// to be consistent with other editing forms. Because the language
// filter can only act on a result set containing actual literals,
// we can't do the counting with a COUNT() in the query itself. So
// we will now use the LABEL_QUERY instead of LABEL_COUNT_QUERY and
// count the rows and the number of distinct languages represented.
Set<String> distinctLanguages = new HashSet<String>();
String queryStr = QueryUtils.subUriForQueryVar(LABEL_QUERY, "subject", subjectUri);
private static Integer getLabelCount(String subjectUri, VitroRequest vreq) {
String queryStr = QueryUtils.subUriForQueryVar(LABEL_COUNT_QUERY, "subject", subjectUri);
log.debug("queryStr = " + queryStr);
int labelCount = 0;
try {
ResultSet results = QueryUtils.getQueryResults(queryStr, vreq);
while(results.hasNext()) {
QuerySolution qsoln = results.next();
labelCount++;
String lang = qsoln.getLiteral("label").getLanguage();
if(lang == null) {
lang = "";
int theCount = 0;
try {
//ResultSet results = QueryUtils.getQueryResults(queryStr, vreq);
//Get query results across all languages in order for template to show manage labels link correctly
ResultSet results = QueryUtils.getLanguageNeutralQueryResults(queryStr, vreq);
if (results.hasNext()) {
QuerySolution soln = results.nextSolution();
RDFNode labelCount = soln.get("labelCount");
if (labelCount != null && labelCount.isLiteral()) {
theCount = labelCount.asLiteral().getInt();
}
distinctLanguages.add(lang);
}
} catch (Exception e) {
log.error(e, e);
}
return new LabelAndLanguageCount(labelCount, distinctLanguages.size());
}
private static class LabelAndLanguageCount {
private Integer labelCount;
private Integer languageCount;
public LabelAndLanguageCount(Integer labelCount, Integer languageCount) {
this.labelCount = labelCount;
this.languageCount = languageCount;
}
public Integer getLabelCount() {
return this.labelCount;
}
public Integer getLanguageCount() {
return this.languageCount;
}
return theCount;
}
//what is the number of languages represented across the labels
// This version not compatible with language-filtering RDF services
// private static Integer getLanguagesRepresentedCount(String subjectUri, VitroRequest vreq) {
// String queryStr = QueryUtils.subUriForQueryVar(DISTINCT_LANGUAGE_QUERY, "subject", subjectUri);
// log.debug("queryStr = " + queryStr);
// int theCount = 0;
// try {
//
// ResultSet results = QueryUtils.getLanguageNeutralQueryResults(queryStr, vreq);
// if (results.hasNext()) {
// QuerySolution soln = results.nextSolution();
// RDFNode languageCount = soln.get("languageCount");
// if (languageCount != null && languageCount.isLiteral()) {
// theCount = languageCount.asLiteral().getInt();
// log.info("Language count is " + theCount);
// }
// }
// } catch (Exception e) {
// log.error(e, e);
// }
// log.info("Returning language count " + theCount);
// return theCount;
// }
private static Integer getLanguagesRepresentedCount(String subjectUri, VitroRequest vreq) {
String queryStr = QueryUtils.subUriForQueryVar(DISTINCT_LANGUAGE_QUERY, "subject", subjectUri);
log.debug("queryStr = " + queryStr);
int theCount = 0;
try {
ResultSet results = QueryUtils.getLanguageNeutralQueryResults(queryStr, vreq);
if (results.hasNext()) {
QuerySolution soln = results.nextSolution();
RDFNode languageCount = soln.get("languageCount");
if (languageCount != null && languageCount.isLiteral()) {
theCount = languageCount.asLiteral().getInt();
}
}
} catch (Exception e) {
log.error(e, e);
}
return theCount;
}
private static String PROFILE_TYPE_QUERY = ""
+ "PREFIX display: <http://vitro.mannlib.cornell.edu/ontologies/display/1.1#> \n"

View file

@ -17,7 +17,6 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -35,7 +34,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import edu.cornell.mannlib.vitro.webapp.utils.JSPPageHandler;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -292,16 +290,13 @@ public class JenaIngestController extends BaseEditController {
private void processOutputModelRequest(VitroRequest vreq,
HttpServletResponse response) {
String modelNameStr = vreq.getParameter("modelName");
DateTimeFormatter timeStampPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss");
String fileName = FilenameUtils.getName(modelNameStr) + "-" + timeStampPattern.format(java.time.LocalDateTime.now());
Model model = getModel(modelNameStr,vreq);
JenaOutputUtils.setNameSpacePrefixes(model,vreq.getWebappDaoFactory());
model.enterCriticalSection(Lock.READ);
try {
OutputStream out = response.getOutputStream();
response.setContentType("application/x-turtle");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".ttl");
//out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n".getBytes());
model.write(out, "TTL");
out.flush();
out.close();

View file

@ -4,7 +4,6 @@ package edu.cornell.mannlib.vitro.webapp.controller.json;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import com.fasterxml.jackson.databind.node.ArrayNode;
@ -16,7 +15,6 @@ import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao;
import edu.cornell.mannlib.vitro.webapp.i18n.selection.SelectedLocale;
import edu.cornell.mannlib.vitro.webapp.services.shortview.ShortViewService;
import edu.cornell.mannlib.vitro.webapp.services.shortview.ShortViewService.ShortViewContext;
import edu.cornell.mannlib.vitro.webapp.services.shortview.ShortViewServiceSetup;
@ -75,11 +73,7 @@ public class GetRandomSearchIndividualsByVClass extends GetSearchIndividualsByVC
modelMap.put("individual",
IndividualTemplateModelBuilder.build(individual, vreq));
modelMap.put("vclass", vclassName);
String langCtx = vreq.getLocale().getLanguage(); //UQAM-Linguistic-Management build the linguistic context
if (!vreq.getLocale().getCountry().isEmpty()) {
langCtx += "-" + vreq.getLocale().getCountry();
}
modelMap.put("langCtx", langCtx); // UQAM-Linguistic-Management add the linguistic context to map
ShortViewService svs = ShortViewServiceSetup.getService(ctx);
return svs.renderShortView(individual, ShortViewContext.BROWSE,
modelMap, vreq);

View file

@ -53,8 +53,6 @@ public class DisplayVocabulary {
//specific case for internal class, value is true or false
public static final String RESTRICT_RESULTS_BY_INTERNAL = NS + "restrictResultsByInternalClass";
public static final String HAS_DELETE_QUERY = NS + "hasDeleteQuery";
/* Data Properties */
public static final DatatypeProperty URL_MAPPING = m_model.createDatatypeProperty(NS + "urlMapping");

View file

@ -234,9 +234,6 @@ public class VitroVocabulary {
public static final String IND_MAIN_IMAGE = VITRO_PUBLIC + "mainImage";
public static final String IND_IMAGE = VITRO_PUBLIC + "image";
public static final String STORED_FILE = VITRO_PUBLIC + "storedFile";
public static final String PUBLIC_FILENAME = VITRO_PUBLIC + "publicFilename";
// =============== Date Time with Precision vocabulary ===============
private static final String DATETIME_NS = "http://vivoweb.org/ontology/core#";

View file

@ -5,8 +5,6 @@ package edu.cornell.mannlib.vitro.webapp.dao;
import java.util.List;
import java.util.Set;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
public interface WebappDaoFactory {
/**
@ -134,6 +132,4 @@ public interface WebappDaoFactory {
public MenuDao getMenuDao();
public I18nBundle getI18nBundle();
}

View file

@ -5,25 +5,21 @@ package edu.cornell.mannlib.vitro.webapp.dao;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyDao.FullPropertyKey;
import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringUtils;
public class WebappDaoFactoryConfig {
private List<String> preferredLanguages;
private List<Locale> preferredLocales;
private String defaultNamespace;
private Set<String> nonUserNamespaces;
private boolean isUnderlyingStoreReasoned = false;
public Map<FullPropertyKey, String> customListViewConfigFileMap;
public WebappDaoFactoryConfig() {
preferredLanguages = Arrays.asList("en-US", "en", "EN");
preferredLocales = LanguageFilteringUtils.languagesToLocales(preferredLanguages);
preferredLanguages = Arrays.asList("en-US", "en", "EN");
defaultNamespace = "http://vitro.mannlib.cornell.edu/ns/default#";
nonUserNamespaces = new HashSet<String>();
nonUserNamespaces.add(VitroVocabulary.vitroURI);
@ -37,14 +33,6 @@ public class WebappDaoFactoryConfig {
this.preferredLanguages = pl;
}
public List<Locale> getPreferredLocales() {
return this.preferredLocales;
}
public void setPreferredLocales(List<Locale> pl) {
this.preferredLocales = pl;
}
public String getDefaultNamespace() {
return defaultNamespace;
}

View file

@ -17,7 +17,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.InsertException;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
public class DataPropertyDaoFiltering extends BaseFiltering implements DataPropertyDao{
class DataPropertyDaoFiltering extends BaseFiltering implements DataPropertyDao{
final DataPropertyDao innerDataPropertyDao;
final VitroFilters filters;

View file

@ -18,7 +18,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyStatementDao;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
public class DataPropertyStatementDaoFiltering extends BaseFiltering implements DataPropertyStatementDao{
class DataPropertyStatementDaoFiltering extends BaseFiltering implements DataPropertyStatementDao{
final DataPropertyStatementDao innerDataPropertyStatementDao;
final VitroFilters filters;

View file

@ -26,34 +26,47 @@ public class FauxPropertyDaoFiltering extends BaseFiltering implements FauxPrope
@Override
public List<FauxProperty> getFauxPropertiesForBaseUri(String uri) {
return innerFauxPropertyDao.getFauxPropertiesForBaseUri(uri);
// TODO Auto-generated method stub
throw new RuntimeException(
"FauxPropertyDao.getFauxPropertiesForBaseUri() not implemented.");
}
@Override
public FauxProperty getFauxPropertyFromContextUri(String contextUri) {
return innerFauxPropertyDao.getFauxPropertyFromContextUri(contextUri);
// TODO Auto-generated method stub
throw new RuntimeException(
"FauxPropertyDaoFiltering.getFauxPropertyFromConfigContextUri() not implemented.");
}
@Override
public FauxProperty getFauxPropertyByUris(String domainUri, String baseUri,
String rangeUri) {
return innerFauxPropertyDao.getFauxPropertyByUris(domainUri, baseUri,
rangeUri);
// TODO Auto-generated method stub
throw new RuntimeException(
"FauxPropertyDaoFiltering.getFauxPropertyByUris() not implemented.");
}
@Override
public void updateFauxProperty(FauxProperty fp) {
innerFauxPropertyDao.updateFauxProperty(fp);
// TODO Auto-generated method stub
throw new RuntimeException("FauxPropertyDaoFiltering.updateFauxProperty() not implemented.");
}
@Override
public void deleteFauxProperty(FauxProperty fp) {
innerFauxPropertyDao.deleteFauxProperty(fp);
// TODO Auto-generated method stub
throw new RuntimeException("FauxPropertyDao.deleteFauxProperty() not implemented.");
}
@Override
public void insertFauxProperty(FauxProperty fp) {
innerFauxPropertyDao.insertFauxProperty(fp);
// TODO Auto-generated method stub
throw new RuntimeException("FauxPropertyDao.insertFauxProperty() not implemented.");
}
}

View file

@ -20,7 +20,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
import edu.cornell.mannlib.vitro.webapp.edit.EditLiteral;
public class IndividualDaoFiltering extends BaseFiltering implements IndividualDao{
class IndividualDaoFiltering extends BaseFiltering implements IndividualDao{
IndividualDao innerIndividualDao;
VitroFilters filters;

View file

@ -17,7 +17,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.InsertException;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
public class ObjectPropertyDaoFiltering extends BaseFiltering implements ObjectPropertyDao{
class ObjectPropertyDaoFiltering extends BaseFiltering implements ObjectPropertyDao{
final ObjectPropertyDao innerObjectPropertyDao;
final VitroFilters filters;

View file

@ -16,7 +16,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatementImpl;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
public class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements ObjectPropertyStatementDao{
class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements ObjectPropertyStatementDao{
final ObjectPropertyStatementDao innerObjectPropertyStatementDao;
final VitroFilters filters;

View file

@ -24,7 +24,6 @@ import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
/**
* This wraps a WebappDaoFactory and applies filtering.
@ -68,7 +67,7 @@ public class WebappDaoFactoryFiltering implements WebappDaoFactory {
transient private PropertyGroupDao filteringPropertyGroupDao=null;
transient private PropertyInstanceDao filteringPropertyInstanceDao=null;
public WebappDaoFactoryFiltering(WebappDaoFactory innerDao, VitroFilters filters){
public WebappDaoFactoryFiltering( WebappDaoFactory innerDao, VitroFilters filters){
if( innerDao == null )
throw new Error("innerWebappDaoFactory must be non-null");
this.filters = filters;
@ -277,9 +276,4 @@ public class WebappDaoFactoryFiltering implements WebappDaoFactory {
public void close() {
innerWebappDaoFactory.close();
}
@Override
public I18nBundle getI18nBundle() {
return innerWebappDaoFactory.getI18nBundle();
}
}

View file

@ -83,21 +83,22 @@ public class ApplicationDaoJena extends JenaBaseDao implements ApplicationDao {
}
ontModel.enterCriticalSection(Lock.WRITE);
try {
updateRDFSLabel(appInd, application.getApplicationName());
updatePlainLiteralValue(
appInd, APPLICATION_ABOUTTEXT, application.getAboutText());
updatePlainLiteralValue(
appInd.setLabel(application.getApplicationName(), null);
updatePropertyStringValue(
appInd, APPLICATION_ABOUTTEXT, application.getAboutText(),
ontModel);
updatePropertyStringValue(
appInd, APPLICATION_ACKNOWLEGETEXT,
application.getAcknowledgeText());
application.getAcknowledgeText(), ontModel);
updatePropertyStringValue(
appInd, APPLICATION_CONTACTMAIL,
application.getContactMail(), ontModel);
updatePropertyStringValue(
appInd, APPLICATION_CORRECTIONMAIL,
application.getCorrectionMail(), ontModel);
updatePlainLiteralValue(
updatePropertyStringValue(
appInd, APPLICATION_COPYRIGHTANCHOR,
application.getCopyrightAnchor());
application.getCopyrightAnchor(), ontModel);
updatePropertyStringValue(
appInd, APPLICATION_COPYRIGHTURL,
application.getCopyrightURL(), ontModel);

View file

@ -24,10 +24,6 @@ public class BlankNodeFilteringGraph implements Graph {
private Graph graph;
public Graph getInnerGraph() {
return graph;
}
public BlankNodeFilteringGraph(Graph graph) {
this.graph = graph;
}

View file

@ -516,9 +516,9 @@ public class DataPropertyDaoJena extends PropertyDaoJena implements
if (dtp.getFunctional()) {
ontModel.add(jDataprop,RDF.type,OWL.FunctionalProperty);
}
updatePlainLiteralValue(jDataprop, EXAMPLE, dtp.getExample());
updatePlainLiteralValue(jDataprop, DESCRIPTION_ANNOT, dtp.getDescription());
updatePlainLiteralValue(jDataprop, PUBLIC_DESCRIPTION_ANNOT, dtp.getPublicDescription());
addPropertyStringValue(jDataprop, EXAMPLE, dtp.getExample(), ontModel);
addPropertyStringValue(jDataprop, DESCRIPTION_ANNOT, dtp.getDescription(), ontModel);
addPropertyStringValue(jDataprop, PUBLIC_DESCRIPTION_ANNOT, dtp.getPublicDescription(), ontModel);
addPropertyStringValue(jDataprop, EDITING, dtp.getEditing(), ontModel);
addPropertyNonNegativeIntValue(jDataprop, DISPLAY_RANK_ANNOT, dtp.getDisplayTier(), ontModel);
addPropertyNonNegativeIntValue(jDataprop, DISPLAY_LIMIT, dtp.getDisplayLimit(), ontModel);
@ -587,9 +587,9 @@ public class DataPropertyDaoJena extends PropertyDaoJena implements
}
}
updatePlainLiteralValue(jDataprop, EXAMPLE, dtp.getExample());
updatePlainLiteralValue(jDataprop, DESCRIPTION_ANNOT, dtp.getDescription());
updatePlainLiteralValue(jDataprop, PUBLIC_DESCRIPTION_ANNOT, dtp.getPublicDescription());
updatePropertyStringValue(jDataprop, EXAMPLE, dtp.getExample(), ontModel);
updatePropertyStringValue(jDataprop, DESCRIPTION_ANNOT, dtp.getDescription(), ontModel);
updatePropertyStringValue(jDataprop, PUBLIC_DESCRIPTION_ANNOT, dtp.getPublicDescription(), ontModel);
updatePropertyStringValue(jDataprop, EDITING, dtp.getEditing(), ontModel);
updatePropertyNonNegativeIntValue(jDataprop, DISPLAY_RANK_ANNOT, dtp.getDisplayTier(), ontModel);
updatePropertyNonNegativeIntValue(jDataprop, DISPLAY_LIMIT, dtp.getDisplayLimit(), ontModel);

View file

@ -14,7 +14,6 @@ import java.util.List;
import java.util.Random;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.ontology.ObjectProperty;
@ -153,22 +152,20 @@ public class FauxPropertyDaoJena extends JenaBaseDao implements FauxPropertyDao
Collection<String> rangeUris = getPropertyResourceURIValues(
context, QUALIFIED_BY_RANGE);
String rangeUri = null;
if (!rangeUris.isEmpty()) {
rangeUri = rangeUris.iterator().next();
if (rangeUris.isEmpty()) {
log.debug("'" + contextUri + "' has no value for '"
+ QUALIFIED_BY_RANGE + "'");
return null;
}
String rangeUri = rangeUris.iterator().next();
// domainURI is optional.
Collection<String> domainUris = getPropertyResourceURIValues(
context, QUALIFIED_BY_DOMAIN);
String domainUri = domainUris.isEmpty() ? null : domainUris
.iterator().next();
Collection<String> rootRangeUris = getPropertyResourceURIValues(context, QUALIFIED_BY_ROOT);
FauxProperty fp = new FauxProperty(domainUri, baseUri, rangeUri);
if (!rootRangeUris.isEmpty()) {
fp.setRootRangeUri(rootRangeUris.iterator().next());
}
fp.setContextUri(contextUri);
populateInstance(fp);
log.debug("Loaded FauxProperty: " + fp);
@ -217,7 +214,7 @@ public class FauxPropertyDaoJena extends JenaBaseDao implements FauxPropertyDao
addPropertyResourceValue(context, RDF.type, CONFIG_CONTEXT);
addPropertyResourceURIValue(context, CONFIG_CONTEXT_FOR,
fp.getBaseURI());
addPropertyResourceURINotEmpty(context, QUALIFIED_BY_RANGE,
addPropertyResourceURIValue(context, QUALIFIED_BY_RANGE,
fp.getRangeURI());
addPropertyResourceURINotEmpty(context, QUALIFIED_BY_DOMAIN,
fp.getDomainURI());
@ -233,9 +230,10 @@ public class FauxPropertyDaoJena extends JenaBaseDao implements FauxPropertyDao
OBJECT_PROPERTY_DISPLAY_CONFIG);
addPropertyResourceURINotEmpty(config, PROPERTY_GROUP,
fp.getGroupURI());
updatePlainLiteralValue(config, DISPLAY_NAME, fp.getDisplayName());
updatePlainLiteralValue(config, PUBLIC_DESCRIPTION_ANNOT,
fp.getPublicDescription());
addPropertyStringValue(config, DISPLAY_NAME, fp.getDisplayName(),
displayModel);
addPropertyStringValue(config, PUBLIC_DESCRIPTION_ANNOT,
fp.getPublicDescription(), displayModel);
addPropertyIntValue(config, DISPLAY_RANK_ANNOT,
fp.getDisplayTier(), displayModel);
addPropertyIntValue(config, DISPLAY_LIMIT, fp.getDisplayLimit(),
@ -330,10 +328,10 @@ public class FauxPropertyDaoJena extends JenaBaseDao implements FauxPropertyDao
.getConfigUri());
updatePropertyResourceURIValue(config, PROPERTY_GROUP,
fp.getGroupURI());
updatePlainLiteralValue(config, DISPLAY_NAME,
fp.getDisplayName());
updatePlainLiteralValue(config, PUBLIC_DESCRIPTION_ANNOT,
fp.getPublicDescription());
updatePropertyStringValue(config, DISPLAY_NAME,
fp.getDisplayName(), displayModel);
updatePropertyStringValue(config, PUBLIC_DESCRIPTION_ANNOT,
fp.getPublicDescription(), displayModel);
updatePropertyIntValue(config, DISPLAY_RANK_ANNOT,
fp.getDisplayTier(), displayModel);
updatePropertyIntValue(config, DISPLAY_LIMIT, fp.getDisplayLimit(),
@ -496,22 +494,31 @@ public class FauxPropertyDaoJena extends JenaBaseDao implements FauxPropertyDao
// ConfigContext
// ----------------------------------------------------------------------
private static String queryLocateConfigContext(boolean hasDomain, boolean hasRange) {
return "PREFIX : <http://vitro.mannlib.cornell.edu/ns/vitro/ApplicationConfiguration#> \n"
+ "SELECT DISTINCT ?context ?config \n"
+ "WHERE { \n"
+ " ?context a :ConfigContext . \n"
+ " ?context :configContextFor ?baseUri . \n"
+ ( hasDomain ? "" : " FILTER NOT EXISTS { \n " )
+ " ?context :qualifiedByDomain ?domainUri . \n"
+ ( hasDomain ? "" : "} \n" )
+ ( hasRange ? "" : " FILTER NOT EXISTS { \n " )
+ " ?context :qualifiedBy ?rangeUri . \n"
+ ( hasRange ? "" : "} \n" )
+ " ?context :hasConfiguration ?config . \n"
+ "} \n";
private static final String QUERY_LOCATE_CONFIG_CONTEXT_WITH_DOMAIN = "" //
+ "PREFIX : <http://vitro.mannlib.cornell.edu/ns/vitro/ApplicationConfiguration#> \n" //
+ "\n" //
+ "SELECT DISTINCT ?context ?config \n" //
+ "WHERE { \n" //
+ " ?context a :ConfigContext ; \n" //
+ " :configContextFor ?baseUri ; \n" //
+ " :qualifiedByDomain ?domainUri ; \n" //
+ " :qualifiedBy ?rangeUri ; \n" //
+ " :hasConfiguration ?config . \n" //
+ "} \n"; //
}
private static final String QUERY_LOCATE_CONFIG_CONTEXT_WITH_NO_DOMAIN = "" //
+ "PREFIX : <http://vitro.mannlib.cornell.edu/ns/vitro/ApplicationConfiguration#> \n" //
+ "\n" //
+ "SELECT DISTINCT ?context ?config \n" //
+ "WHERE { \n" //
+ " ?context a :ConfigContext ; \n" //
+ " :configContextFor ?baseUri ; \n" //
+ " :qualifiedBy ?rangeUri ; \n" //
+ " :hasConfiguration ?config . \n" //
+ " FILTER NOT EXISTS { \n" //
+ " ?context :qualifiedByDomain ?domainUri \n" //
+ " } \n" //
+ "} \n"; //
private static class ParserLocateConfigContext extends
ResultSetParser<Set<ConfigContext>> {
@ -550,16 +557,22 @@ public class FauxPropertyDaoJena extends JenaBaseDao implements FauxPropertyDao
private static class ConfigContext {
public static Set<ConfigContext> findByQualifiers(
LockableOntModel lockableDisplayModel, String domainUri, String baseUri, String rangeUri) {
LockableOntModel lockableDisplayModel, String domainUri,
String baseUri, String rangeUri) {
try (LockedOntModel displayModel = lockableDisplayModel.read()) {
boolean hasDomain = !StringUtils.isEmpty(domainUri) && !domainUri.equals(OWL.Thing.getURI());
boolean hasRange = !StringUtils.isEmpty(rangeUri);
QueryHolder qHolder = queryHolder(queryLocateConfigContext(hasDomain, hasRange)).bindToUri("baseUri", baseUri);
if (hasDomain) {
qHolder = qHolder.bindToUri("domainUri", domainUri);
}
if (hasRange) {
qHolder = qHolder.bindToUri("rangeUri", rangeUri);
QueryHolder qHolder;
if (domainUri == null || domainUri.trim().isEmpty()
|| domainUri.equals(OWL.Thing.getURI())) {
qHolder = queryHolder(
QUERY_LOCATE_CONFIG_CONTEXT_WITH_NO_DOMAIN)
.bindToUri("baseUri", baseUri).bindToUri(
"rangeUri", rangeUri);
} else {
qHolder = queryHolder(
QUERY_LOCATE_CONFIG_CONTEXT_WITH_DOMAIN)
.bindToUri("baseUri", baseUri)
.bindToUri("rangeUri", rangeUri)
.bindToUri("domainUri", domainUri);
}
if (log.isDebugEnabled()) {
log.debug("domainUri=" + domainUri + ", baseUri=" + baseUri

View file

@ -14,7 +14,6 @@ import java.util.Random;
import java.util.Set;
import org.apache.commons.lang3.NotImplementedException;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -287,14 +286,15 @@ public class IndividualDaoJena extends JenaBaseDao implements IndividualDao {
ontModel.getBaseModel().notifyEvent(new IndividualUpdateEvent(getWebappDaoFactory().getUserURI(),true,ent.getURI()));
org.apache.jena.ontology.Individual ind = ontModel.getIndividual(ent.getURI());
if (ind != null) {
String newLabel = ent.getName();
String oldLabel = ind.getLabel(getDefaultLanguage());
if ( newLabel != null && !newLabel.equals(oldLabel) ) {
if (oldLabel == null) {
oldLabel = "";
}
replaceOldLabelWithNewInDefaultLanguage(ontModel, ind, newLabel, oldLabel);
if (ent.getName() != null && ( (ind.getLabel(getDefaultLanguage())==null) || (ind.getLabel(getDefaultLanguage())!=null && ent.getName()!=null && !ent.getName().equals(ind.getLabel(getDefaultLanguage())) ) ) ) {
// removal of existing values done this odd way to trigger
// the change listeners
Model temp = ModelFactory.createDefaultModel();
temp.add(ontModel.listStatements(ind, RDFS.label, (RDFNode) null));
ontModel.remove(temp);
ind.setLabel(ent.getName(), getDefaultLanguage());
}
Set<String> oldTypeURIsSet = new HashSet<String>();
for (Iterator<Resource> typeIt = ind.listRDFTypes(true); typeIt.hasNext();) {
@ -347,23 +347,6 @@ public class IndividualDaoJena extends JenaBaseDao implements IndividualDao {
}
}
private void replaceOldLabelWithNewInDefaultLanguage(OntModel ontModel, org.apache.jena.ontology.Individual ind,
final String newLabel, final String oldLabel) {
Model temp = ModelFactory.createDefaultModel();
StmtIterator statements = ontModel.listStatements(ind, RDFS.label, (RDFNode) null);
while (statements.hasNext()) {
Statement statement = (Statement) statements.next();
Literal object = statement.getLiteral();
String lexicalForm = object.getLexicalForm();
String language = object.getLanguage();
if (oldLabel.equals(lexicalForm) && language.equals(getDefaultLanguage()) ) {
temp.add(statement);
}
}
ontModel.remove(temp);
ind.addLabel(newLabel, getDefaultLanguage());
}
public void markModified(Individual ind) {
markModified(ind,getOntModel());
}

View file

@ -5,8 +5,8 @@ package edu.cornell.mannlib.vitro.webapp.dao.jena;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
@ -14,14 +14,14 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.iri.IRI;
import org.apache.jena.iri.IRIFactory;
import org.apache.jena.datatypes.xsd.XSDDatatype;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.iri.IRI;
import org.apache.jena.iri.IRIFactory;
import org.apache.jena.ontology.DatatypeProperty;
import org.apache.jena.ontology.ObjectProperty;
import org.apache.jena.ontology.OntClass;
@ -39,7 +39,6 @@ import org.apache.jena.rdf.model.NodeIterator;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.ResourceFactory;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.shared.Lock;
@ -643,7 +642,7 @@ public class JenaBaseDao extends JenaBaseDaoCon {
if (existingValue == null ) {
model.add(res, prop, model.createResource(uri));
} else if (!isEqual(uri, existingValue)) {
} else if (!(existingValue.getURI()).equals(uri)) {
model.removeAll(res, prop, null);
model.add(res, prop, model.createResource(uri));
}
@ -651,15 +650,6 @@ public class JenaBaseDao extends JenaBaseDaoCon {
}
}
private boolean isEqual(String uri, Resource existingValue) {
if (existingValue.asNode().isBlank()) {
final String blankNodeId = existingValue.asNode().getBlankNodeId().toString();
return uri.endsWith(blankNodeId);
} else {
return existingValue.getURI().equals(uri);
}
}
/**
* convenience method for use with functional object properties
*/
@ -762,111 +752,22 @@ public class JenaBaseDao extends JenaBaseDaoCon {
}
}
}
/**
* Add to an OntResource an rdfs:label value with lexical form and default
* language tag. Remove any other existing values in default language.
* If lexicalForm parameter is null, remove all plain literal values of
* Property in default language.
* @param ontRes may not be null
* @param lexicalForm may be null. If null, existing values will be deleted
* but none will be added.
*/
protected void updateRDFSLabel(OntResource ontRes, String lexicalForm) {
updatePlainLiteralValue(ontRes, RDFS.label, lexicalForm);
}
/**
* Add to an OntResource an rdfs:label value with lexical form and optional
* language tag. Remove any other existing plain literal values that match
* specified language or lack language tags if no language is supplied.
* If lexicalForm parameter is null, remove all plain literal labels in
* specified language, or all existing language-less labels
* if no language is specified.
* @param ontRes may not be null
* @param lexicalForm may be null. If null, existing values will be deleted
* but none will be added.
* @param lang may be null. If null, method acts on language-less plain
* literal labels and ignores those with language tags.
*/
protected void updateRDFSLabel(OntResource ontRes, String lexicalForm, String lang) {
updatePlainLiteralValue(ontRes, RDFS.label, lexicalForm, lang);
}
/**
* Add to an OntResource a Property value with lexical form and default
* language tag. Remove any other existing values in default language.
* If lexicalForm parameter is null, remove all plain literal values of
* Property in default language.
* @param ontRes may not be null
* @param lexicalForm may be null. If null, existing values will be deleted
* but none will be added.
* convenience method for updating the RDFS label
*/
protected void updatePlainLiteralValue(OntResource ontRes, Property property,
String lexicalForm) {
updatePlainLiteralValue(ontRes, property, lexicalForm, getDefaultLanguage());
}
/**
* Add to an OntResource a Property value with lexical form and optional
* language tag. Remove any other existing plain literal values that match
* specified language or lack language tags if no language is supplied.
* If lexicalForm parameter is null, remove all plain literal values of
* Property in specified language, or all existing language-less literals
* if no language is specified.
* @param ontRes may not be null
* @param lexicalForm may be null. If null, existing values will be deleted
* but none will be added.
* @param lang may be null. If null, method acts on language-less
* plain literal values and ignores those with language tags.
*/
protected void updatePlainLiteralValue(OntResource ontRes, Property property,
String lexicalForm, String lang) {
if(ontRes == null) {
throw new IllegalArgumentException("ontRes may not be null.");
}
boolean addNew = true;
List<Statement> toRemove = new ArrayList<Statement>();
StmtIterator existingStmts = ontRes.listProperties(property);
while(existingStmts.hasNext()) {
Statement stmt = existingStmts.next();
if(stmt.getObject().isLiteral()) {
Literal lit = stmt.getObject().asLiteral();
if( (lang == null && isLanguageLessPlainLiteral(lit))
|| (lang != null && lang.equals(lit.getLanguage())) ) {
if(!lit.getLexicalForm().equals(lexicalForm)) {
toRemove.add(stmt);
} else {
// New literal already exists in the model.
// Do not add it again.
addNew = false;
}
}
}
}
if(!toRemove.isEmpty()) {
ontRes.getModel().remove(toRemove);
}
if (addNew && (lexicalForm != null)) {
if(!StringUtils.isEmpty(lang)) {
ontRes.addProperty(property, ResourceFactory.createLangLiteral(
lexicalForm, lang));
} else {
ontRes.addProperty(property, ResourceFactory.createPlainLiteral(
lexicalForm));
}
}
}
private boolean isLanguageLessPlainLiteral(Literal lit) {
// In RDF 1.1 all the language-less literals get datatype xsd:string.
// The null datatype check is here just in case this gets run on an older
// version of Jena. rdf:PlainLiteral is also a datatype, but doesn't
// (yet) seem to be used by Jena.
return StringUtils.isEmpty(lit.getLanguage())
&& ((lit.getDatatype() == null)
|| XSDDatatype.XSDstring.equals(lit.getDatatype()) ||
(RDF.getURI() + "PlainLiteral").equals(lit.getDatatypeURI()));
protected void updateRDFSLabel(OntResource ontRes, String label) {
if (label != null && label.length() > 0) {
String existingValue = ontRes.getLabel(getDefaultLanguage());
if (existingValue == null || !existingValue.equals(label)) {
ontRes.setLabel(label, getDefaultLanguage());
}
} else {
ontRes.removeAll(RDFS.label);
}
}
private Literal getLabel(String lang, List<RDFNode>labelList) {
@ -879,13 +780,6 @@ public class JenaBaseDao extends JenaBaseDaoCon {
}
if ((lang != null) && (lang.equals(labelLanguage))) {
return labelLit;
} else
/*
* UQAM-Linguistic-Management
* Check for country-part of lang (ex: 'en' for default consideration of labelLanguage in english but not encoded by 'en-US' most case of labels in vivo.owl)
*/
if ((lang != null) && (Arrays.asList(lang.split("-")).get(0).equals(labelLanguage))) {
return labelLit;
}
}
}

View file

@ -2,17 +2,15 @@
package edu.cornell.mannlib.vitro.webapp.dao.jena;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.graph.Triple;
import org.apache.jena.ontology.Individual;
import org.apache.jena.ontology.OntClass;
import org.apache.jena.ontology.OntModel;
@ -23,16 +21,12 @@ import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.ResourceFactory;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.shared.Lock;
import org.apache.jena.vocabulary.OWL;
import org.apache.jena.vocabulary.RDF;
@ -45,8 +39,6 @@ import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig;
public class JenaModelUtils {
public static final String BNODE_ROOT_QUERY =
"SELECT DISTINCT ?s WHERE { ?s ?p ?o OPTIONAL { ?ss ?pp ?s } FILTER (!isBlank(?s) || !bound(?ss)) }";
private static final Log log = LogFactory.getLog(JenaModelUtils.class.getName());
private static final Set<String> nonIndividualTypeURIs ;
@ -406,190 +398,5 @@ public class JenaModelUtils {
return aboxModel;
}
/**
* Remove statements from a model by separating statements
* containing blank nodes from those that have no blank nodes.
* The blank node statements are removed by treating blank nodes as variables and
* constructing the matching subgraphs for deletion.
* The other statements are removed normally.
* @param toRemove containing statements to be removed
* @param removeFrom from which statements should be removed
*/
public static void removeWithBlankNodesAsVariables(Model toRemove, Model removeFrom) {
List<Statement> blankNodeStatements = new ArrayList<Statement>();
List<Statement> nonBlankNodeStatements = new ArrayList<Statement>();
StmtIterator stmtIt = toRemove.listStatements();
while (stmtIt.hasNext()) {
Statement stmt = stmtIt.nextStatement();
if (stmt.getSubject().isAnon() || stmt.getObject().isAnon()) {
blankNodeStatements.add(stmt);
} else {
nonBlankNodeStatements.add(stmt);
}
}
if(!blankNodeStatements.isEmpty()) {
Model blankNodeModel = ModelFactory.createDefaultModel();
blankNodeModel.add(blankNodeStatements);
removeBlankNodesUsingSparqlConstruct(blankNodeModel, removeFrom);
}
if(!nonBlankNodeStatements.isEmpty()) {
try {
removeFrom.enterCriticalSection(Lock.WRITE);
removeFrom.remove(nonBlankNodeStatements);
} finally {
removeFrom.leaveCriticalSection();
}
}
}
private static void removeBlankNodesUsingSparqlConstruct(Model blankNodeModel,
Model removeFrom) {
log.debug("blank node model size " + blankNodeModel.size());
if (blankNodeModel.size() == 1) {
log.debug("Deleting single triple with blank node: " + blankNodeModel);
log.debug("This could result in the deletion of multiple triples"
+ " if multiple blank nodes match the same triple pattern.");
}
Query rootFinderQuery = QueryFactory.create(BNODE_ROOT_QUERY);
QueryExecution qe = QueryExecutionFactory.create(rootFinderQuery, blankNodeModel);
try {
ResultSet rs = qe.execSelect();
while (rs.hasNext()) {
QuerySolution qs = rs.next();
Resource s = qs.getResource("s");
String treeFinder = makeDescribe(s);
Query treeFinderQuery = QueryFactory.create(treeFinder);
QueryExecution qee = QueryExecutionFactory.create(treeFinderQuery, blankNodeModel);
try {
Model tree = qee.execDescribe();
JenaModelUtils.removeUsingSparqlConstruct(tree, removeFrom);
} finally {
qee.close();
}
}
} finally {
qe.close();
}
}
private static String makeDescribe(Resource s) {
StringBuilder query = new StringBuilder("DESCRIBE <") ;
if (s.isAnon()) {
query.append("_:").append(s.getId().toString());
} else {
query.append(s.getURI());
}
query.append(">");
return query.toString();
}
private static final boolean WHERE_CLAUSE = true;
/**
* Remove statements from a model by first constructing
* the statements to be removed with a SPARQL query that treats
* each blank node ID as a variable.
* This allows matching blank node structures to be removed even though
* the internal blank node IDs are different.
* @param toRemove containing statements to be removed
* @param removeFrom from which statements should be removed
*/
public static void removeUsingSparqlConstruct(Model toRemove, Model removeFrom) {
if(toRemove.isEmpty()) {
return;
}
List<Statement> stmts = toRemove.listStatements().toList();
stmts = sort(stmts);
StringBuffer queryBuff = new StringBuffer();
queryBuff.append("CONSTRUCT { \n");
addStatementPatterns(stmts, queryBuff, !WHERE_CLAUSE);
queryBuff.append("} WHERE { \n");
addStatementPatterns(stmts, queryBuff, WHERE_CLAUSE);
queryBuff.append("} \n");
String queryStr = queryBuff.toString();
log.debug(queryBuff.toString());
Query construct = QueryFactory.create(queryStr);
QueryExecution qe = QueryExecutionFactory.create(construct, removeFrom);
try {
Model constructedRemovals = qe.execConstruct();
try {
removeFrom.enterCriticalSection(Lock.WRITE);
removeFrom.remove(constructedRemovals);
} finally {
removeFrom.leaveCriticalSection();
}
} finally {
qe.close();
}
}
private static List<Statement> sort(List<Statement> stmts) {
List<Statement> output = new ArrayList<Statement>();
int originalSize = stmts.size();
if(originalSize == 1) {
return stmts;
}
List <Statement> remaining = stmts;
ConcurrentLinkedQueue<Resource> subjQueue = new ConcurrentLinkedQueue<Resource>();
for(Statement stmt : remaining) {
if(stmt.getSubject().isURIResource()) {
subjQueue.add(stmt.getSubject());
break;
}
}
if (subjQueue.isEmpty()) {
log.warn("No named subject in statement patterns");
return stmts;
}
while(remaining.size() > 0) {
if(subjQueue.isEmpty()) {
subjQueue.add(remaining.get(0).getSubject());
}
while(!subjQueue.isEmpty()) {
Resource subj = subjQueue.poll();
List<Statement> temp = new ArrayList<Statement>();
for (Statement stmt : remaining) {
if(stmt.getSubject().equals(subj)) {
output.add(stmt);
if (stmt.getObject().isResource()) {
subjQueue.add((Resource) stmt.getObject());
}
} else {
temp.add(stmt);
}
}
remaining = temp;
}
}
if(output.size() != originalSize) {
throw new RuntimeException("original list size was " + originalSize +
" but sorted size is " + output.size());
}
return output;
}
private static void addStatementPatterns(List<Statement> stmts,
StringBuffer patternBuff, boolean whereClause) {
for(Statement stmt : stmts) {
Triple t = stmt.asTriple();
patternBuff.append(SparqlGraph.sparqlNodeDelete(t.getSubject(), null));
patternBuff.append(" ");
patternBuff.append(SparqlGraph.sparqlNodeDelete(t.getPredicate(), null));
patternBuff.append(" ");
patternBuff.append(SparqlGraph.sparqlNodeDelete(t.getObject(), null));
patternBuff.append(" .\n");
if (whereClause) {
if (t.getSubject().isBlank()) {
patternBuff.append(" FILTER(isBlank(").append(
SparqlGraph.sparqlNodeDelete(t.getSubject(), null)).append(")) \n");
}
if (t.getObject().isBlank()) {
patternBuff.append(" FILTER(isBlank(").append(
SparqlGraph.sparqlNodeDelete(t.getObject(), null)).append(")) \n");
}
}
}
}
}

View file

@ -72,7 +72,6 @@ public class MenuDaoJena extends JenaBaseDao implements MenuDao {
return getMenu( getOntModelSelector().getDisplayModel(), url );
}
@Override
public MainMenu getMainMenu( ServletRequest req, String url ) {
OntModel displayModel = LanguageFilteringUtils.wrapOntModelInALanguageFilter(getOntModelSelector().getDisplayModel(), req );
return getMenu(displayModel, url) ;

View file

@ -714,14 +714,14 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp
}
}
updatePlainLiteralValue(p, EXAMPLE_ANNOT, prop.getExample());
updatePlainLiteralValue(p, DESCRIPTION_ANNOT, prop.getDescription());
updatePlainLiteralValue(p, PUBLIC_DESCRIPTION_ANNOT, prop.getPublicDescription());
updatePropertyStringValue(p,EXAMPLE_ANNOT,prop.getExample(),getOntModel());
updatePropertyStringValue(p,DESCRIPTION_ANNOT,prop.getDescription(),getOntModel());
updatePropertyStringValue(p,PUBLIC_DESCRIPTION_ANNOT,prop.getPublicDescription(),getOntModel());
updatePropertyNonNegativeIntegerValue(p,DISPLAY_LIMIT,prop.getDomainDisplayLimitInteger(),getOntModel());
updatePropertyStringValue(p,PROPERTY_ENTITYSORTDIRECTION,prop.getDomainEntitySortDirection(),getOntModel());
if (inv != null) {
updatePlainLiteralValue(inv, EXAMPLE_ANNOT, prop.getExample());
updatePlainLiteralValue(inv, DESCRIPTION_ANNOT, prop.getDescription());
updatePropertyStringValue(inv,EXAMPLE_ANNOT,prop.getExample(),getOntModel());
updatePropertyStringValue(inv,DESCRIPTION_ANNOT,prop.getDescription(),getOntModel());
updatePropertyNonNegativeIntegerValue(inv,DISPLAY_LIMIT,prop.getRangeDisplayLimitInteger(),getOntModel());
updatePropertyStringValue(inv,PROPERTY_ENTITYSORTDIRECTION,prop.getRangeEntitySortDirection(),getOntModel());
}

View file

@ -813,9 +813,7 @@ public class PropertyDaoJena extends JenaBaseDao implements PropertyDao {
List<ObjectProperty> stragglers = getAdditionalFauxSubpropertiesForVClasses(
vclasses, propInsts);
for (ObjectProperty op : stragglers) {
if (op != null) {
propInsts.add(makePropInst(op));
}
propInsts.add(makePropInst(op));
}
return propInsts;

View file

@ -31,7 +31,6 @@ import edu.cornell.mannlib.vitro.webapp.dao.InsertException;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig;
public class PropertyGroupDaoJena extends JenaBaseDao implements PropertyGroupDao {
@ -143,7 +142,7 @@ public class PropertyGroupDaoJena extends JenaBaseDao implements PropertyGroupDa
edu.cornell.mannlib.vitro.webapp.beans.Individual groupInd =
new IndividualImpl(); // We should make a factory for these
groupInd.setNamespace(DEFAULT_NAMESPACE + "vitroPropertyGroup");
groupInd.setNamespace(DEFAULT_NAMESPACE+"vitroPropertyGroup");
groupInd.setName(group.getName());
groupInd.setVClassURI(PROPERTYGROUP.getURI());
groupInd.setURI(group.getURI());
@ -157,12 +156,8 @@ public class PropertyGroupDaoJena extends JenaBaseDao implements PropertyGroupDa
WebappDaoFactory wadfForURIGeneration = null;
try {
// Ensure that the temporary WebappDaoFactory has the same
// preferred languages as the main one for this DAO.
WebappDaoFactoryConfig wadfConfig = new WebappDaoFactoryConfig();
wadfConfig.setPreferredLanguages(getWebappDaoFactory().getPreferredLanguages());
wadfForURIGeneration = new WebappDaoFactoryJena(new SimpleOntModelSelector(
unionForURIGeneration), wadfConfig, null);
wadfForURIGeneration = new WebappDaoFactoryJena(
unionForURIGeneration);
groupURI = wadfForURIGeneration
.getIndividualDao().insertNewIndividual(groupInd);
} catch (InsertException ie) {
@ -188,9 +183,11 @@ public class PropertyGroupDaoJena extends JenaBaseDao implements PropertyGroupDa
if (group.getPublicDescription() != null
&& group.getPublicDescription().length()>0) {
try {
updatePlainLiteralValue(groupJenaInd, PUBLIC_DESCRIPTION_ANNOT,
group.getPublicDescription(), getDefaultLanguage());
} catch (Exception ex) {
groupJenaInd.addProperty(
PUBLIC_DESCRIPTION_ANNOT,
group.getPublicDescription(),
XSDDatatype.XSDstring);
} catch (Exception ex) {
log.error(
"error setting public description for "
+ groupInd.getURI());
@ -228,13 +225,15 @@ public class PropertyGroupDaoJena extends JenaBaseDao implements PropertyGroupDa
try {
Individual groupInd = ontModel.getIndividual(group.getURI());
try {
updateRDFSLabel(groupInd, group.getName(), getDefaultLanguage());
groupInd.setLabel(group.getName(), getDefaultLanguage());
} catch (Exception e) {
log.error("error updating name for "+groupInd.getURI());
}
try {
updatePlainLiteralValue(groupInd, PUBLIC_DESCRIPTION_ANNOT,
group.getPublicDescription(), getDefaultLanguage());
groupInd.removeAll(PUBLIC_DESCRIPTION_ANNOT);
if (group.getPublicDescription()!=null && group.getPublicDescription().length()>0) {
groupInd.addProperty(PUBLIC_DESCRIPTION_ANNOT, group.getPublicDescription(), XSDDatatype.XSDstring);
}
} catch (Exception e) {
log.error("Error updating public description for "+groupInd.getURI());
}

View file

@ -289,15 +289,10 @@ public class RDFServiceGraph implements GraphWithPerform {
literalBuff.append("\"");
pyString(literalBuff, node.getLiteralLexicalForm());
literalBuff.append("\"");
/*
* UQAM-Bug-Correction
* reversing the condition tests.
* It is important to prioritize the language typology test in order to exploit the linguistic context in testing the type of data
*/
if (!StringUtils.isEmpty(node.getLiteralLanguage())) {
literalBuff.append("@").append(node.getLiteralLanguage());
} else if (node.getLiteralDatatypeURI() != null) {
if (node.getLiteralDatatypeURI() != null) {
literalBuff.append("^^<").append(node.getLiteralDatatypeURI()).append(">");
} else if (!StringUtils.isEmpty(node.getLiteralLanguage())) {
literalBuff.append("@").append(node.getLiteralLanguage());
}
return literalBuff.toString();
} else {

View file

@ -2,7 +2,6 @@
package edu.cornell.mannlib.vitro.webapp.dao.jena;
import java.text.Collator;
import java.util.Set;
import java.util.TreeSet;
@ -18,6 +17,7 @@ import org.apache.jena.shared.CannotCreateException;
import org.apache.jena.shared.DoesNotExistException;
import org.apache.jena.util.iterator.ExtendedIterator;
import org.apache.jena.util.iterator.WrappedIterator;
import com.ibm.icu.text.Collator;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
@ -103,7 +103,7 @@ public class RDFServiceModelMaker implements ModelMaker {
@Override
public void removeModel(String name) {
Model m = getModel(name);
m.removeAll();
m.removeAll(null, null, null);
}
@Override

View file

@ -232,10 +232,10 @@ public class SparqlGraph implements GraphWithPerform {
literalBuff.append("\"");
pyString(literalBuff, node.getLiteralLexicalForm());
literalBuff.append("\"");
if (!StringUtils.isEmpty(node.getLiteralLanguage())) {
literalBuff.append("@").append(node.getLiteralLanguage());
} else if (node.getLiteralDatatypeURI() != null) {
if (node.getLiteralDatatypeURI() != null) {
literalBuff.append("^^<").append(node.getLiteralDatatypeURI()).append(">");
} else if (!StringUtils.isEmpty(node.getLiteralLanguage())) {
literalBuff.append("@").append(node.getLiteralLanguage());
}
return literalBuff.toString();
} else {

View file

@ -2,8 +2,6 @@
package edu.cornell.mannlib.vitro.webapp.dao.jena;
import static java.lang.String.format;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
@ -62,18 +60,15 @@ import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
import edu.cornell.mannlib.vitro.webapp.web.URLEncoder;
public class VClassDaoJena extends JenaBaseDao implements VClassDao {
protected static final Log log = LogFactory.getLog(VClassDaoJena.class);
private final I18nBundle i18n;
private boolean isUnderlyingStoreReasoned = false;
public VClassDaoJena(WebappDaoFactoryJena wadf, boolean isUnderlyingStoreReasoned) {
super(wadf);
this.i18n = wadf.getI18nBundle();
this.isUnderlyingStoreReasoned = isUnderlyingStoreReasoned;
}
@ -96,19 +91,17 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao {
Restriction rest = cls.asRestriction();
OntProperty onProperty = rest.getOnProperty();
StringBuilder labelStr = new StringBuilder();
labelStr.append(format("%s ", i18n.text("restriction_on")))
.append(getLabelOrId(onProperty))
.append(": ");
labelStr.append("restriction on ").append(getLabelOrId(onProperty)).append(": ");
if (rest.isAllValuesFromRestriction() || rest.isSomeValuesFromRestriction()) {
Resource fillerRes = null;
if (rest.isAllValuesFromRestriction()) {
AllValuesFromRestriction avfRest = rest.asAllValuesFromRestriction();
fillerRes = avfRest.getAllValuesFrom();
labelStr.append(format("%s ", i18n.text("all_values_from")));
labelStr.append("all values from ");
} else {
SomeValuesFromRestriction svfRest = rest.asSomeValuesFromRestriction();
fillerRes = svfRest.getSomeValuesFrom();
labelStr.append(format("%s ", i18n.text("some_values_from")));
labelStr.append("some values from ");
}
if (fillerRes.canAs(OntClass.class)) {
OntClass avf = fillerRes.as(OntClass.class);
@ -122,7 +115,7 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao {
}
} else if (rest.isHasValueRestriction()) {
HasValueRestriction hvRest = rest.asHasValueRestriction();
labelStr.append(format("%s ", i18n.text("has_value")));
labelStr.append("has value ");
RDFNode fillerNode = hvRest.getHasValue();
try {
if (fillerNode.isResource()) {
@ -135,22 +128,22 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao {
}
} else if (rest.isMinCardinalityRestriction()) {
MinCardinalityRestriction mcRest = rest.asMinCardinalityRestriction();
labelStr.append(format("%s ", i18n.text("minimum_cardinality")));
labelStr.append("minimum cardinality ");
labelStr.append(mcRest.getMinCardinality());
} else if (rest.isMaxCardinalityRestriction()) {
MaxCardinalityRestriction mcRest = rest.asMaxCardinalityRestriction();
labelStr.append(format("%s ", i18n.text("maximum_cardinality")));
labelStr.append("maximum cardinality ");
labelStr.append(mcRest.getMaxCardinality());
} else if (rest.isCardinalityRestriction()) {
CardinalityRestriction cRest = rest.asCardinalityRestriction();
labelStr.append(format("%s ", i18n.text("cardinality")));
labelStr.append("cardinality ");
labelStr.append(cRest.getCardinality());
}
return labelStr.toString();
} else if (isBooleanClassExpression(cls)) {
StringBuilder labelStr = new StringBuilder("(");
if (cls.isComplementClass()) {
labelStr.append(format("%s ", i18n.text("not")));
labelStr.append("not ");
ComplementClass ccls = cls.as(ComplementClass.class);
labelStr.append(getLabelForClass(ccls.getOperand(), withPrefix, forPickList));
} else if (cls.isIntersectionClass()) {
@ -160,7 +153,7 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao {
OntClass operand = operandIt.next();
labelStr.append(getLabelForClass(operand, withPrefix, forPickList));
if (operandIt.hasNext()) {
labelStr.append(format(" %s ", i18n.text("and")));
labelStr.append(" and ");
}
}
} else if (cls.isUnionClass()) {
@ -170,7 +163,7 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao {
OntClass operand = operandIt.next();
labelStr.append(getLabelForClass(operand, withPrefix, forPickList));
if (operandIt.hasNext()) {
labelStr.append(format(" %s ", i18n.text("or")));
labelStr.append(" or ");
}
}
}
@ -264,7 +257,6 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao {
} catch (ProfileException pe) {
// Current language profile does not support disjointWith axioms.
// We'd prefer to return an empty list instead of throwing an exception.
log.error(pe, pe);
} finally {
getOntModel().leaveCriticalSection();
}
@ -960,9 +952,9 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao {
} catch (Exception e) {
log.error("error linking class "+cls.getURI()+" to class group");
}
updatePlainLiteralValue(ontCls, SHORTDEF, cls.getShortDef());
updatePlainLiteralValue(ontCls, EXAMPLE_ANNOT, cls.getExample());
updatePlainLiteralValue(ontCls, DESCRIPTION_ANNOT, cls.getDescription());
addPropertyStringValue(ontCls,SHORTDEF,cls.getShortDef(),ontModel);
addPropertyStringValue(ontCls,EXAMPLE_ANNOT,cls.getExample(),ontModel);
addPropertyStringValue(ontCls,DESCRIPTION_ANNOT,cls.getDescription(),ontModel);
addPropertyIntValue(ontCls,DISPLAY_LIMIT,cls.getDisplayLimit(),ontModel);
addPropertyIntValue(ontCls,DISPLAY_RANK_ANNOT,cls.getDisplayRank(),ontModel);
@ -1019,9 +1011,9 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao {
if (ontCls != null) {
updateRDFSLabel(ontCls, cls.getName());
updatePropertyResourceURIValue(ontCls,IN_CLASSGROUP,cls.getGroupURI(),ontModel);
updatePlainLiteralValue(ontCls, SHORTDEF, cls.getShortDef());
updatePlainLiteralValue(ontCls, EXAMPLE_ANNOT, cls.getExample());
updatePlainLiteralValue(ontCls, DESCRIPTION_ANNOT, cls.getDescription());
updatePropertyStringValue(ontCls,SHORTDEF,cls.getShortDef(),ontModel);
updatePropertyStringValue(ontCls,EXAMPLE_ANNOT,cls.getExample(),ontModel);
updatePropertyStringValue(ontCls,DESCRIPTION_ANNOT,cls.getDescription(),ontModel);
updatePropertyNonNegativeIntValue(ontCls,DISPLAY_LIMIT,cls.getDisplayLimit(),ontModel);
updatePropertyNonNegativeIntValue(ontCls,DISPLAY_RANK_ANNOT,cls.getDisplayRank(),ontModel);
updatePropertyFloatValue(ontCls, SEARCH_BOOST_ANNOT, cls.getSearchBoost(), ontModel);

View file

@ -5,12 +5,14 @@ package edu.cornell.mannlib.vitro.webapp.dao.jena;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.ListIterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.datatypes.xsd.XSDDatatype;
import org.apache.jena.ontology.Individual;
import org.apache.jena.ontology.OntModel;
@ -28,7 +30,6 @@ import edu.cornell.mannlib.vitro.webapp.dao.InsertException;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig;
public class VClassGroupDaoJena extends JenaBaseDao implements VClassGroupDao {
@ -190,9 +191,9 @@ public class VClassGroupDaoJena extends JenaBaseDao implements VClassGroupDao {
edu.cornell.mannlib.vitro.webapp.beans.Individual groupInd =
new IndividualImpl(); // We should make a factory for these
groupInd.setURI(vcg.getURI());
groupInd.setNamespace(DEFAULT_NAMESPACE + "vitroClassGroup");
groupInd.setVClassURI(CLASSGROUP.getURI());
groupInd.setNamespace(DEFAULT_NAMESPACE+"vitroClassGroup");
groupInd.setName(vcg.getPublicName());
groupInd.setVClassURI(CLASSGROUP.getURI());
String groupURI = null;
@ -203,12 +204,8 @@ public class VClassGroupDaoJena extends JenaBaseDao implements VClassGroupDao {
WebappDaoFactory wadfForURIGeneration = null;
try {
// Ensure that the temporary WebappDaoFactory has the same
// preferred languages as the main one for this DAO.
WebappDaoFactoryConfig wadfConfig = new WebappDaoFactoryConfig();
wadfConfig.setPreferredLanguages(getWebappDaoFactory().getPreferredLanguages());
wadfForURIGeneration = new WebappDaoFactoryJena(new SimpleOntModelSelector(
unionForURIGeneration), wadfConfig, null);
wadfForURIGeneration = new WebappDaoFactoryJena(
unionForURIGeneration);
groupURI = wadfForURIGeneration
.getIndividualDao().insertNewIndividual(groupInd);
} catch (InsertException ie) {
@ -279,7 +276,7 @@ public class VClassGroupDaoJena extends JenaBaseDao implements VClassGroupDao {
try {
Individual groupInd = ontModel.getIndividual(vcg.getURI());
try {
updateRDFSLabel(groupInd, vcg.getPublicName(), getDefaultLanguage());
groupInd.setLabel(vcg.getPublicName(), getDefaultLanguage());
} catch (Exception e) {
log.error("error updating name for "+groupInd.getURI());
}

View file

@ -50,8 +50,6 @@ import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.model.RDFServiceModel;
@ -613,10 +611,5 @@ public class WebappDaoFactoryJena implements WebappDaoFactory {
}
}
@Override
public I18nBundle getI18nBundle() {
// return context based bundle for preferred locales
return I18n.bundle(config.getPreferredLocales());
}
}

View file

@ -132,11 +132,6 @@ public class EditLiteral implements Literal {
throw new UnsupportedOperationException();
}
@Override
public boolean isStmtResource() {
throw new UnsupportedOperationException();
}
public Literal inModel(Model model) {
throw new UnsupportedOperationException();
}

View file

@ -4,6 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.edit.listener.impl;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.logging.Log;
@ -22,8 +23,7 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.BasicValidationVTwo;
public class IndividualDataPropertyStatementProcessor implements ChangeListener {
private static final String LANGUAGE = "language";
private static final Log log = LogFactory.getLog(IndividualDataPropertyStatementProcessor.class.getName());
private static final Log log = LogFactory.getLog(IndividualDataPropertyStatementProcessor.class.getName());
public void doInserted(Object newObj, EditProcessObject epo) {
processDataprops(epo);
@ -54,9 +54,6 @@ public class IndividualDataPropertyStatementProcessor implements ChangeListener
try {
Map beanParamMap = FormUtils.beanParamMapFromString(keyArg[3]);
String dataPropertyURI = (String) beanParamMap.get("DatatypePropertyURI");
if (beanParamMap.containsKey(LANGUAGE)) {
dataPropertyStmt.setLanguage((String) beanParamMap.get(LANGUAGE));
}
if (!deletedDataPropertyURIs.contains(dataPropertyURI)) {
deletedDataPropertyURIs.add(dataPropertyURI);
dataPropertyStatementDao.deleteDataPropertyStatementsForIndividualByDataProperty(((Individual) epo.getNewBean()).getURI(), dataPropertyURI);

View file

@ -24,25 +24,15 @@ import edu.cornell.mannlib.vitro.webapp.beans.Datatype;
import edu.cornell.mannlib.vitro.webapp.dao.jena.DatatypeDaoJena;
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
public class BasicValidationVTwo {
public final static String REQUIRED_FIELD_EMPTY_MSG = "required_field_empty_msg";
public final static String DATA_NOT_PAST_MSG = "data_not_past_msg";
public final static String INVALID_DATE_FORM_MSG = "invalid_date_form_msg";
public final static String FILE_MUST_BE_ENTERED_MSG = "file_must_be_entered_msg";
public final static String INVALID_URL_MSG = "invalid_url_msg";
private I18nBundle i18n;
Map<String, List<String>> varsToValidations;
EditConfigurationVTwo editConfig;
public BasicValidationVTwo(EditConfigurationVTwo editConfig, I18nBundle i18n){
public BasicValidationVTwo(EditConfigurationVTwo editConfig, MultiValueEditSubmission editSub){
this.editConfig = editConfig;
this.i18n = i18n;
Map<String,List<String>> validatorsForFields = new HashMap<String,List<String>>();
for(String fieldName: editConfig.getFields().keySet()){
FieldVTwo field = editConfig.getField(fieldName);
@ -52,9 +42,8 @@ public class BasicValidationVTwo {
checkValidations();
}
public BasicValidationVTwo(Map<String, List<String>> varsToValidations, I18nBundle i18n){
public BasicValidationVTwo(Map<String, List<String>> varsToValidations){
this.varsToValidations = varsToValidations;
this.i18n = i18n;
checkValidations();
}
@ -105,7 +94,7 @@ public class BasicValidationVTwo {
//If no literals and this field was required, this is an error message
//and can return
if((literals == null || literals.size() == 0) && isRequiredField) {
errors.put(name, i18n.text(REQUIRED_FIELD_EMPTY_MSG));
errors.put(name, REQUIRED_FIELD_EMPTY_MSG);
break;
}
//Loop through literals if literals exist
@ -124,7 +113,7 @@ public class BasicValidationVTwo {
// incorrectly generate errors.
if (isEmpty(value)) {
if (isRequiredField) {
errors.put(name, i18n.text(REQUIRED_FIELD_EMPTY_MSG));
errors.put(name, REQUIRED_FIELD_EMPTY_MSG);
}
break;
}
@ -165,11 +154,11 @@ public class BasicValidationVTwo {
private String validate(String validationType, List<FileItem> fileItems) {
if( "nonempty".equalsIgnoreCase(validationType)){
if( fileItems == null || fileItems.size() == 0 ){
return i18n.text(FILE_MUST_BE_ENTERED_MSG);
return "a file must be entered for this field.";
}else{
FileItem fileItem = fileItems.get(0);
if( fileItem == null || fileItem.getName() == null || fileItem.getName().length() < 1 || fileItem.getSize() < 0){
return i18n.text(FILE_MUST_BE_ENTERED_MSG);
return "a file must be entered for this field.";
}
}
}
@ -185,14 +174,14 @@ public class BasicValidationVTwo {
// This case may be needed for validation of other field types.
if( "nonempty".equalsIgnoreCase(validationType)){
if( isEmpty(value) )
return i18n.text(REQUIRED_FIELD_EMPTY_MSG);
return REQUIRED_FIELD_EMPTY_MSG;
}
// Format validation
else if("isDate".equalsIgnoreCase(validationType)){
if( isDate( value))
return SUCCESS;
else
return i18n.text(INVALID_DATE_FORM_MSG);
return "must be in valid date format mm/dd/yyyy.";
}
else if( validationType.indexOf("datatype:") == 0 ) {
String datatypeURI = validationType.substring(9);
@ -205,7 +194,7 @@ public class BasicValidationVTwo {
} else if ("httpUrl".equalsIgnoreCase(validationType)){
//check if it has http or https, we could do more but for now this is all.
if(! value.startsWith("http://") && ! value.startsWith("https://") ){
return i18n.text(INVALID_URL_MSG);
return "This URL must start with http:// or https://";
}else{
return SUCCESS;
}
@ -227,7 +216,7 @@ public class BasicValidationVTwo {
dayParamStr = value.substring(monthDash + 1, value.length());
inputC.set(Integer.parseInt(yearParamStr), Integer.parseInt(monthParamStr) - 1, Integer.parseInt(dayParamStr));
if(inputC.before(c)) {
return i18n.text(DATA_NOT_PAST_MSG);
return this.DATE_NOT_PAST_MSG;
//Returning null makes the error message "field is empty" display instead
//return null;
} else {
@ -289,9 +278,14 @@ public class BasicValidationVTwo {
return (value == null || value.trim().length() == 0);
}
private static Pattern urlRX = Pattern.compile("(([a-zA-Z][0-9a-zA-Z+\\-\\.]*:)/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?");
/** we use null to indicate success */
public final static String SUCCESS = null;
public final static String REQUIRED_FIELD_EMPTY_MSG = "This field must not be empty.";
public final static String DATE_NOT_PAST_MSG = "Please enter a future target date for publication (past dates are invalid).";
//public final static String MIN_FIELDS_NOT_POPULATED = "Please enter values for at least ";
//public final static String FORM_ERROR_FIELD_ID = "formannotationerrors";
/** regex for strings like "12/31/2004" */

View file

@ -28,7 +28,6 @@ import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
import freemarker.template.Configuration;
public class EditConfigurationUtils {
@ -67,19 +66,17 @@ public class EditConfigurationUtils {
}
public static VClass getRangeVClass(VitroRequest vreq) {
// This needs a WebappDaoFactory with no filtering/RDFService
// funny business because it needs to be able to retrieve anonymous union
// classes by their "pseudo-bnode URIs".
// Someday we'll need to figure out a different way of doing this.
WebappDaoFactory ctxDaoFact = ModelAccess.on(
vreq.getSession().getServletContext()).getWebappDaoFactory();
return ctxDaoFact.getVClassDao().getVClassByURI(getRangeUri(vreq));
}
public static VClass getLangAwardRangeVClass(VitroRequest vreq) {
// UQAM-Linguistic-Management
WebappDaoFactory vreqDaoFact = ModelAccess.on(vreq).getWebappDaoFactory(
LanguageOption.LANGUAGE_AWARE);
return vreqDaoFact.getVClassDao().getVClassByURI(getRangeUri(vreq));
}
//get individual
public static Individual getSubjectIndividual(VitroRequest vreq) {
Individual subject = null;
String subjectUri = getSubjectUri(vreq);
@ -129,24 +126,12 @@ public class EditConfigurationUtils {
public static ObjectProperty getObjectPropertyForPredicate(VitroRequest vreq,
String predicateUri, String domainUri, String rangeUri) {
// WebappDaoFactory wdf = vreq.getWebappDaoFactory();
// UQAM-Linguistic-Management Use linguistic context
WebappDaoFactory wdf = ModelAccess.on(vreq).getWebappDaoFactory(LanguageOption.LANGUAGE_AWARE);
WebappDaoFactory wdf = vreq.getWebappDaoFactory();
ObjectProperty objectProp = wdf.getObjectPropertyDao().getObjectPropertyByURIs(
predicateUri, domainUri, rangeUri);
return objectProp;
}
// UQAM Use linguistic context
public static ObjectProperty getObjectPropertyForPredicateLangAware(VitroRequest vreq,
String predicateUri, String domainUri, String rangeUri) {
// WebappDaoFactory wdf = vreq.getWebappDaoFactory();
// UQAM Use linguistic context
WebappDaoFactory wdf = ModelAccess.on(vreq).getWebappDaoFactory(LanguageOption.LANGUAGE_AWARE);
ObjectProperty objectProp = wdf.getObjectPropertyDao().getObjectPropertyByURIs(
predicateUri, domainUri, rangeUri);
return objectProp;
}
public static DataProperty getDataPropertyForPredicate(VitroRequest vreq, String predicateUri) {
WebappDaoFactory wdf = vreq.getWebappDaoFactory();
//TODO: Check reason for employing unfiltered webapp dao factory and note if using a different version
@ -224,7 +209,6 @@ public class EditConfigurationUtils {
return (op != null && dp == null);
}
private static boolean isVitroLabel(String predicateUri) {
return predicateUri.equals(VitroVocabulary.LABEL);
}

View file

@ -366,8 +366,6 @@ public class EditN3GeneratorVTwo {
{
sbuff.append("@") ;
sbuff.append(lang) ;
// added by UQAM to exit at this point without adding datatype
return sbuff.toString() ;
}
// Format the datatype

View file

@ -10,57 +10,45 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.ResourceFactory;
import org.apache.jena.vocabulary.XSD;
import org.apache.jena.vocabulary.RDF;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.edit.EditLiteral;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
public class MultiValueEditSubmission {
private static final String LABEL = "label";
String editKey;
private Map<String,List<Literal>> literalsFromForm ;
private Map<String,List<String>> urisFromForm ;
private Map<String,String> validationErrors;
private BasicValidationVTwo basicValidation;
private Map<String, List<FileItem>> filesFromForm;
private static Model literalCreationModel;
private String entityToReturnTo;
private VitroRequest _vreq;
private static final String TIME_URI = XSD.time.getURI();
static{
literalCreationModel = ModelFactory.createDefaultModel();
}
/*
* UQAM
* replace
* public MultiValueEditSubmission(Map<String,String[]> queryParameters, EditConfigurationVTwo editConfig)
* by this new signature
* This affect PostEditCleanupController and ProcessRdfFormController classes.
* This replacement is justified by the fact that we need a linguistic context in this class.
*/
public MultiValueEditSubmission(VitroRequest vreq, EditConfigurationVTwo editConfig){
// UQAM add this both lines
_vreq = vreq;
Map<String,String[]> queryParameters = vreq.getParameterMap();
public MultiValueEditSubmission(Map<String,String[]> queryParameters, EditConfigurationVTwo editConfig){
if( editConfig == null )
throw new Error("EditSubmission needs an EditConfiguration");
this.editKey = editConfig.getEditKey();
@ -104,12 +92,11 @@ public class MultiValueEditSubmission {
processEditElementFields(editConfig,queryParameters);
//Incorporating basic validation
//Validate URIS
this.basicValidation = new BasicValidationVTwo(editConfig, I18n.bundle(vreq));
this.basicValidation = new BasicValidationVTwo(editConfig, this);
Map<String,String> errors = basicValidation.validateUris( urisFromForm );
//Validate literals and add errors to the list of existing errors
errors.putAll(basicValidation.validateLiterals( literalsFromForm ));
// UQAM Add empty contition
if( errors != null && !errors.isEmpty()) {
if( errors != null ) {
validationErrors.putAll( errors);
}
@ -154,8 +141,9 @@ public class MultiValueEditSubmission {
}
}
}
/* maybe this could be static */
public Literal createLiteral_ORIG(String value, String datatypeUri, String lang) {
public Literal createLiteral(String value, String datatypeUri, String lang) {
if( datatypeUri != null ){
if( "http://www.w3.org/2001/XMLSchema:anyURI".equals(datatypeUri) ){
try {
@ -171,21 +159,12 @@ public class MultiValueEditSubmission {
return ResourceFactory.createPlainLiteral(value);
}
/* maybe this could be static */
public Literal createLiteral(String value, String datatypeUri, String lang) {
if( datatypeUri != null && !datatypeUri.isEmpty() ){
if( XSD.anyURI.getURI().equals(datatypeUri) ){
return literalCreationModel.createTypedLiteral( value, datatypeUri);
} else if ( RDF.dtLangString.getURI().equals(datatypeUri) ){
if( StringUtils.isNotEmpty(lang) ) {
return ResourceFactory.createLangLiteral(value, lang);
}
}
return literalCreationModel.createTypedLiteral(value, datatypeUri);
} else if( lang != null && lang.length() > 0 )
return ResourceFactory.createLangLiteral(value, lang);
return ResourceFactory.createPlainLiteral(value);
}
private static final String DATE_TIME_URI = XSD.dateTime.getURI();
private static final String DATE_URI = XSD.date.getURI();
private static final String TIME_URI = XSD.time.getURI();
private static DateTimeFormatter dformater = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:00");
private static DateTimeFormatter dateFormater = DateTimeFormat.forPattern("yyyy-MM-dd");
public Map<String,String> getValidationErrors(){
return validationErrors;
@ -285,47 +264,12 @@ public class MultiValueEditSubmission {
for(String value:valueList) {
value = N3EditUtils.stripInvalidXMLChars(value);
//Add to array of literals corresponding to this variable
/* UQAM OLD
if (!StringUtils.isEmpty(value)) {
literalsArray.add(createLiteral(
value,
field.getRangeDatatypeUri(),
field.getRangeLang()));
}
*/
/*
* UQAM Replaced by this to take the linguistic context into consideration.
*/
if (!StringUtils.isEmpty(value)) {
String rangeLang = field.getRangeLang(); //UQAM Default value
try {
if (_vreq != null ) {
// only if the request comes from the rdfsLabelGenerator the language should be used
Boolean getLabelLanguage = false;
if (!StringUtils.isBlank(editConfig.formUrl) && editConfig.formUrl.contains("RDFSLabelGenerator")) {
getLabelLanguage = true;
}
// if the language is set in the given Literal, this language-tag should be used and remain the same
// for example when you edit an label with an langauge-tag (no matter which language is selected globally)
if (getLabelLanguage && isLangSetInFirstLiteral(editConfig) )
{
rangeLang = editConfig.getLiteralsInScope().get(LABEL).get(0).getLanguage();
} else { // if the literal has no langauge-tag, use the language which is globally selected
rangeLang = _vreq.getLocale().getLanguage();
if (!_vreq.getLocale().getCountry().isEmpty()) {
rangeLang += "-" + _vreq.getLocale().getCountry();
}
}
}
} catch (Exception e) {
log.error(e,e);
}
literalsArray.add(createLiteral(
value,
field.getRangeDatatypeUri(),
rangeLang));
}
}
literalsFromForm.put(var, literalsArray);
@ -333,26 +277,6 @@ public class MultiValueEditSubmission {
log.debug("could not find value for parameter " + var );
}
}
private boolean isLangSetInFirstLiteral(EditConfigurationVTwo editConfig) {
Map<String, List<Literal>> literalsInScope = editConfig.getLiteralsInScope();
if (!literalsInScope.containsKey(LABEL)) {
return false;
}
List<Literal> labelLiterals = literalsInScope.get(LABEL);
if (labelLiterals == null) {
return false;
}
if (labelLiterals.size() == 0) {
return false;
}
Literal literal = labelLiterals.get(0);
if (literal == null){
return false;
}
return StringUtils.isNotEmpty(literal.getLanguage());
}
//Add literal to form
//Add uri to form
public void addUriToForm(EditConfigurationVTwo editConfig, String var, String[] valuesArray) {

View file

@ -9,24 +9,15 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.datatypes.xsd.XSDDatatype;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.ResourceFactory;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.shared.Lock;
import org.apache.jena.vocabulary.RDF;
import org.apache.jena.vocabulary.XSD;
import org.apache.commons.lang3.StringUtils;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.InsertException;
@ -50,8 +41,6 @@ public class ProcessRdfForm {
private EditN3GeneratorVTwo populator;
private Map<String,String> urisForNewResources = null;
private static final String langStringDatatypeUri = RDF.dtLangString.getURI();
// private VitroRequest _vreq;
/**
* Construct the ProcessRdfForm object.
*/
@ -87,9 +76,9 @@ public class ProcessRdfForm {
AdditionsAndRetractions changes;
if( configuration.isUpdate() ){
changes = editExistingStatements(configuration, submission, vreq); //UQAM vreq for getting linguistic context
changes = editExistingStatements(configuration, submission);
} else {
changes = createNewStatements(configuration, submission, vreq ); //UQAM vreq for getting linguistic context
changes = createNewStatements(configuration, submission );
}
changes = getMinimalChanges(changes);
@ -110,15 +99,12 @@ public class ProcessRdfForm {
* any optional N3 is to originally configure the
* configuration.setN3Optional() to be empty.
*
* UQAM add vreq for linguistic context managing
*
* @throws Exception May throw an exception if the required N3
* does not parse.
*
*/
private AdditionsAndRetractions createNewStatements(
EditConfigurationVTwo configuration,
MultiValueEditSubmission submission, VitroRequest vreq) throws Exception {
MultiValueEditSubmission submission) throws Exception {
log.debug("in createNewStatements()" );
//getN3Required and getN3Optional will return copies of the
@ -127,10 +113,10 @@ public class ProcessRdfForm {
List<String> optionalN3 = configuration.getN3Optional();
/* substitute in the form values and existing values */
subInValuesToN3( configuration, submission, requiredN3, optionalN3, null , null, vreq);
subInValuesToN3( configuration, submission, requiredN3, optionalN3, null , null);
/* parse N3 to RDF Models, No retractions since all of the statements are new. */
return parseN3ToChange(requiredN3, optionalN3, null, null, vreq, null);
return parseN3ToChange(requiredN3, optionalN3, null, null);
}
/* for a list of N3 strings, substitute in the subject, predicate and object URIs
@ -154,12 +140,10 @@ public class ProcessRdfForm {
* retractions are mutually diff'ed before statements are added to or
* removed from the model. The explicit change check can cause problems in
* more complex setups, like the automatic form building in DataStaR.
* @param vreq For getting linguistic context
*/
protected AdditionsAndRetractions editExistingStatements(
EditConfigurationVTwo editConfig,
MultiValueEditSubmission submission, VitroRequest vreq) throws Exception {
MultiValueEditSubmission submission) throws Exception {
log.debug("editing an existing resource: " + editConfig.getObject() );
@ -172,18 +156,18 @@ public class ProcessRdfForm {
subInValuesToN3(editConfig, submission,
N3RequiredAssert, N3OptionalAssert,
N3RequiredRetract, N3OptionalRetract, vreq);
N3RequiredRetract, N3OptionalRetract);
return parseN3ToChange(
N3RequiredAssert,N3OptionalAssert,
N3RequiredRetract, N3OptionalRetract, vreq, editConfig);
N3RequiredRetract, N3OptionalRetract);
}
@SuppressWarnings("unchecked")
protected void subInValuesToN3(
EditConfigurationVTwo editConfig, MultiValueEditSubmission submission,
List<String> requiredAsserts, List<String> optionalAsserts,
List<String> requiredRetracts, List<String> optionalRetracts, VitroRequest vreq ) throws InsertException{
List<String> requiredRetracts, List<String> optionalRetracts ) throws InsertException{
//need to substitute into the return to URL becase it may need new resource URIs
List<String> URLToReturnTo = Arrays.asList(submission.getEntityToReturnTo());
@ -200,41 +184,7 @@ public class ProcessRdfForm {
//Retractions does NOT get values from form.
/* ******** Form submission Literals *********** */
/*
* UQAM Set all literals in the linguistic context
*/
Map<String, List<Literal>> literalsFromForm = submission.getLiteralsFromForm();
Set<String> keys = literalsFromForm.keySet();
for (String aKey : keys) {
List<Literal> literalFromForm = literalsFromForm.get(aKey);
List<Literal> newLiteralFromForm = new ArrayList<>();
for (Literal aLiteral : literalFromForm) {
if (aLiteral != null) {
String aLiteratDT = aLiteral.getDatatype().getURI();
Literal newLiteral = null;
String aText = aLiteral.getLexicalForm();
/*
* do it only if aLiteral are xstring datatype
*/
if (RDF.dtLangString.getURI().equals(aLiteratDT) && !aLiteral.getLanguage().isEmpty()) {
newLiteral = aLiteral;
}
else if ( RDF.dtLangString.getURI().equals(aLiteratDT)) {
String lang = vreq.getLocale().getLanguage();
if (!vreq.getLocale().getCountry().isEmpty()) {
lang += "-" + vreq.getLocale().getCountry();
}
newLiteral = ResourceFactory.createLangLiteral(aText, lang);
} else {
newLiteral = ResourceFactory.createTypedLiteral(aText, aLiteral.getDatatype());
}
newLiteralFromForm.add(newLiteral);
}
}
literalsFromForm.replace(aKey, newLiteralFromForm);
}
substituteInMultiLiterals( literalsFromForm, requiredAsserts, optionalAsserts, URLToReturnTo);
substituteInMultiLiterals( submission.getLiteralsFromForm(), requiredAsserts, optionalAsserts, URLToReturnTo);
logSubstitue( "Added form Literals", requiredAsserts, optionalAsserts, requiredRetracts, optionalRetracts);
//Retractions does NOT get values from form.
@ -304,107 +254,20 @@ public class ProcessRdfForm {
protected AdditionsAndRetractions parseN3ToChange(
List<String> requiredAdds, List<String> optionalAdds,
List<String> requiredDels, List<String> optionalDels, VitroRequest vreq, EditConfigurationVTwo editConfig) throws Exception{
List<String> requiredDels, List<String> optionalDels) throws Exception{
List<Model> adds = parseN3ToRDF(requiredAdds, REQUIRED);
adds.addAll( parseN3ToRDF(optionalAdds, OPTIONAL));
List<Model> retracts = new ArrayList<Model>();
if( requiredDels != null && optionalDels != null ){
String lingCxt=null;
//UQAM Taking into account the linguistic context in retract
try {
// only if the request comes from the rdfsLabelGenerator the language should be used
Boolean getLabelLanguage = false;
if (!StringUtils.isBlank(editConfig.formUrl) && editConfig.formUrl.contains("RDFSLabelGenerator")) {
getLabelLanguage = true;
}
// if the language is set in the given Literal, this language-tag should be used and remain the same
// for example when you edit an label with an langauge-tag (no matter which language is selected globally)
if (editConfig != null && !StringUtils.isBlank(editConfig.getLiteralsInScope().get("label").get(0).getLanguage()) && getLabelLanguage) {
lingCxt = editConfig.getLiteralsInScope().get("label").get(0).getLanguage();
} else { // if the literal has no langauge-tag, use the language which is globally selected
lingCxt = vreq.getLocale().getLanguage();
if (!vreq.getLocale().getCountry().isEmpty()) {
lingCxt += "-" + vreq.getLocale().getCountry();
}
}
} catch (Exception e) {
}
retracts.addAll( parseN3ToRDF(requiredDels, REQUIRED, lingCxt) );
retracts.addAll( parseN3ToRDF(optionalDels, OPTIONAL, lingCxt) );
retracts.addAll( parseN3ToRDF(requiredDels, REQUIRED) );
retracts.addAll( parseN3ToRDF(optionalDels, OPTIONAL) );
}
return new AdditionsAndRetractions(adds,retracts);
}
/**
* Parse the n3Strings to a List of RDF Model objects.
*
* @param n3Strings N3 Strings to parse
* @param parseType if OPTIONAL, then don't throw exceptions on errors
* @param linguisticContext For Literals, Making parse only if the literal linguisticContext are same than linguisticContext parameter //UQAM
* If REQUIRED, then throw exceptions on errors.
* @throws Exception
*/
protected static List<Model> parseN3ToRDF(
List<String> n3Strings, N3ParseType parseType, String linguisticContext ) throws Exception {
// Use non-linguistic version of this method if no linguisticContext is provided
if (linguisticContext == null) {
return parseN3ToRDF(n3Strings, parseType);
}
List<String> errorMessages = new ArrayList<String>();
List<Model> rdfModels = new ArrayList<Model>();
for(String n3 : n3Strings){
try{
Model model = ModelFactory.createDefaultModel();
StringReader reader = new StringReader(n3);
model.read(reader, "", "N3");
List<Statement> stmts = model.listStatements().toList();
for (Iterator iterator = stmts.iterator(); iterator.hasNext();) {
Statement stmt = (Statement) iterator.next();
Resource subj = stmt.getSubject();
Property pred = stmt.getPredicate();
RDFNode obj = stmt.getObject();
if (obj.isLiteral()) {
Literal lit = obj.asLiteral();
String lang = lit.getLanguage();
if (langStringDatatypeUri.equals(lit.getDatatypeURI()) &&
! linguisticContext.equals(lang)) {
//UQAM Remove if linguisticContext != lang of the Literal
model.remove(subj, pred, obj);
}
}
}
rdfModels.add( model );
}catch(Throwable t){
errorMessages.add(t.getMessage() + "\nN3: \n" + n3 + "\n");
}
}
StringBuilder errors = new StringBuilder();
for( String errorMsg : errorMessages){
errors.append(errorMsg).append('\n');
}
if( !errorMessages.isEmpty() ){
if( REQUIRED.equals(parseType) ){
throw new Exception("Errors processing required N3. The EditConfiguration should " +
"be setup so that if a submission passes validation, there will not be errors " +
"in the required N3.\n" + errors );
}else if( OPTIONAL.equals(parseType) ){
log.debug("Some Optional N3 did not parse, if a optional N3 does not parse it " +
"will be ignored. This allows optional parts of a form submission to " +
"remain unfilled out and then the optional N3 does not get values subsituted in from" +
"the form submission values. It may also be the case that there are unintentional " +
"syntax errors the optional N3." );
log.debug(errors.toString());
}
}
return rdfModels;
}
/**
* Parse the n3Strings to a List of RDF Model objects.
*
@ -616,4 +479,4 @@ public class ProcessRdfForm {
private static Log log = LogFactory.getLog(ProcessRdfForm.class);
}
}

View file

@ -35,19 +35,6 @@ import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
public class RdfLiteralHash {
private static final Log log = LogFactory.getLog(RdfLiteralHash.class.getName());
private static final String integerPattern =
"^http://www.w3.org/2001/XMLSchema#int$" + "|" +
"^http://www.w3.org/2001/XMLSchema#long$" + "|" +
"^http://www.w3.org/2001/XMLSchema#short$" + "|" +
"^http://www.w3.org/2001/XMLSchema#unsignedByte$" + "|" +
"^http://www.w3.org/2001/XMLSchema#unsignedShort$" + "|" +
"^http://www.w3.org/2001/XMLSchema#unsignedInt$" + "|" +
"^http://www.w3.org/2001/XMLSchema#unsignedLong$" + "|" +
"^http://www.w3.org/2001/XMLSchema#nonPositiveInteger$" + "|" +
"^http://www.w3.org/2001/XMLSchema#nonNegativeInteger$" + "|" +
"^http://www.w3.org/2001/XMLSchema#positiveInteger$" + "|" +
"^http://www.w3.org/2001/XMLSchema#negativeInteger$";
/**
* Make a hash based on individual, property, literal and (lang or datatype).
@ -68,11 +55,6 @@ public class RdfLiteralHash {
}else{
if( stmt.getDatatypeURI() != null && stmt.getDatatypeURI().trim().length() > 0){
langOrDatatype = stmt.getDatatypeURI();
// TDB has a bug: if given a literal of type xsd:nonNegativeInteger, it
// stores a literal of type xsd:integer.
// Replace integer types the same way it is done in RDFServiceTDB
// TODO: remove workaround when bug is resolved
langOrDatatype = replaceIntegers(langOrDatatype);
}
}
@ -81,12 +63,7 @@ public class RdfLiteralHash {
log.debug("got hash " + hashMe.hashCode() + " for String '" + hashMe + "'");
return hashMe.hashCode();
}
private static String replaceIntegers(String predicate) {
predicate = predicate.replaceAll(integerPattern, "http://www.w3.org/2001/XMLSchema#integer");
return predicate;
}
/**
* @param stmt Data statement

View file

@ -7,7 +7,6 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -41,8 +40,7 @@ public class ChildVClassesOptions implements FieldOptions {
public Map<String, String> getOptions(
EditConfigurationVTwo editConfig,
String fieldName,
WebappDaoFactory wDaoFact,
I18nBundle i18n) throws Exception{
WebappDaoFactory wDaoFact) throws Exception{
// now create an empty HashMap to populate and return
HashMap <String,String> optionsMap = new LinkedHashMap<String,String>();

View file

@ -1,6 +1,6 @@
/* $This file is distributed under the terms of the license in LICENSE$ */
package edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
@ -15,7 +15,6 @@ import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo;
import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle;
public class ChildVClassesWithParent implements FieldOptions {
@ -38,27 +37,27 @@ public class ChildVClassesWithParent implements FieldOptions {
return this;
}
@Override
public Map<String, String> getOptions(
EditConfigurationVTwo editConfig,
String fieldName,
WebappDaoFactory wDaoFact,
I18nBundle i18n) throws Exception {
WebappDaoFactory wDaoFact) throws Exception {
HashMap <String,String> optionsMap = new LinkedHashMap<String,String>();
// first test to see whether there's a default "leave blank" value specified with the literal options
if ( ! StringUtils.isEmpty( defaultOptionLabel ) ){
optionsMap.put(LEFT_BLANK, defaultOptionLabel);
}
optionsMap.put(classUri, "Other");
VClassDao vclassDao = wDaoFact.getVClassDao();
VClass rdfClass = vclassDao.getVClassByURI(classUri);
if (rdfClass != null && !OWL.Nothing.getURI().equals(classUri)) {
optionsMap.put(classUri, rdfClass.getName().trim());
}
List<String> subClassList = vclassDao.getAllSubClassURIs(classUri);
if (subClassList != null && subClassList.size() > 0) {
for (String subClassUri : subClassList) {
rdfClass = vclassDao.getVClassByURI(subClassUri);
if (rdfClass != null && !OWL.Nothing.getURI().equals(subClassUri)) {
optionsMap.put(subClassUri, rdfClass.getName().trim());
VClass subClass = vclassDao.getVClassByURI(subClassUri);
if (subClass != null && !OWL.Nothing.getURI().equals(subClassUri)) {
optionsMap.put(subClassUri, subClass.getName().trim());
}
}
}
@ -68,5 +67,5 @@ public class ChildVClassesWithParent implements FieldOptions {
public Comparator<String[]> getCustomComparator() {
return null;
}
}

Some files were not shown because too many files have changed in this diff Show more