hand-merging revision 6005 into trunk to get around PROPFIND error

This commit is contained in:
bjl23 2010-10-01 18:45:42 +00:00
parent 183ce8eb33
commit 4adba03c2a
5 changed files with 174 additions and 81 deletions

View file

@ -41,7 +41,10 @@ import edu.cornell.mannlib.vitro.webapp.beans.Portal;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao;
import edu.cornell.mannlib.vitro.webapp.filestorage.model.FileInfo;
import edu.cornell.mannlib.vitro.webapp.filestorage.FileModelHelper;
import edu.cornell.mannlib.vitro.webapp.filestorage.FileServingHelper;
import edu.cornell.mannlib.vitro.webapp.filestorage.backend.FileStorage;
import edu.cornell.mannlib.vitro.webapp.filestorage.backend.FileStorageSetup;
import edu.cornell.mannlib.vitro.webapp.search.beans.VitroQuery;
import edu.cornell.mannlib.vitro.webapp.search.beans.VitroQueryWrapper;
import edu.cornell.mannlib.vitro.webapp.utils.NamespaceMapper;
@ -99,7 +102,7 @@ public class EntityController extends VitroHttpServlet {
}
// If this is an uploaded file, redirect to its "alias URL".
String aliasUrl = getAliasUrlForBytestreamIndividual(req, indiv);
String aliasUrl = getAliasUrlForBytestreamIndividual(indiv);
if (aliasUrl != null) {
res.sendRedirect(req.getContextPath() + aliasUrl);
return;
@ -175,9 +178,9 @@ public class EntityController extends VitroHttpServlet {
}
}
}
} else {
log.error("Entity " + indiv.getURI() + " with vclass URI " +
indiv.getVClassURI() + ", no vclass with that URI exists");
} else if (indiv.getVClassURI() != null) {
log.debug("Individual " + indiv.getURI() + " with class URI " +
indiv.getVClassURI() + ": no class found with that URI");
}
if (customView!=null) {
// insert test for whether a css files of the same name exists, and populate the customCss string for use when construction the header
@ -224,16 +227,10 @@ public class EntityController extends VitroHttpServlet {
css += customCss;
}
if( indiv.getURI().startsWith( vreq.getWebappDaoFactory().getDefaultNamespace() )){
vreq.setAttribute("entityLinkedDataURL", indiv.getURI() + "/" + indiv.getLocalName() + ".rdf");
}
// generate link to RDF representation for semantic web clients like Piggy Bank
// BJL 2008-07-16: I'm temporarily commenting this out because I forgot we need to make sure it filters out the hidden properties
// generate url for this entity
// String individualToRDF = "http://"+vreq.getServerName()+":"+vreq.getServerPort()+vreq.getContextPath()+"/entity?home=1&uri="+forURL(entity.getURI())+"&view=rdf.rdf";
//css += "<link rel='alternate' type='application/rdf+xml' title='"+entity.getName()+"' href='"+individualToRDF+"' />";
if( indiv.getURI().startsWith( vreq.getWebappDaoFactory().getDefaultNamespace() )){
String entityLinkedDataURL = indiv.getURI() + "/" + indiv.getLocalName() + ".rdf";
vreq.setAttribute("entityLinkedDataURL", entityLinkedDataURL);
}
vreq.setAttribute("css",css);
vreq.setAttribute("scripts", "/templates/entity/entity_inject_head.jsp");
@ -273,14 +270,21 @@ public class EntityController extends VitroHttpServlet {
newModel.write( res.getOutputStream(), format );
}
private void doRedirect(HttpServletRequest req, HttpServletResponse res,
String redirectURL) {
// It seems like there must be a better way to do this
String hn = req.getHeader("Host");
res.setHeader("Location", res.encodeURL( "http://" + hn + req.getContextPath() + redirectURL ));
res.setStatus(res.SC_SEE_OTHER);
}
private void doRedirect(HttpServletRequest req, HttpServletResponse res,
String redirectURL) {
//It seems like there must be a more standard way to do a redirect in tomcat.
String hn = req.getHeader("Host");
if (req.isSecure()) {
res.setHeader("Location", res.encodeURL("https://" + hn
+ req.getContextPath() + redirectURL));
log.info("doRedirect by using HTTPS");
} else {
res.setHeader("Location", res.encodeURL("http://" + hn
+ req.getContextPath() + redirectURL));
log.info("doRedirect by using HTTP");
}
res.setStatus(res.SC_SEE_OTHER);
}
private static Pattern LINKED_DATA_URL = Pattern.compile("^/individual/([^/]*)$");
private static Pattern NS_PREFIX_URL = Pattern.compile("^/individual/([^/]*)/([^/]*)$");
@ -488,16 +492,39 @@ public class EntityController extends VitroHttpServlet {
* If this entity represents a File Bytestream, get its alias URL so we can
* properly serve the file contents.
*/
private String getAliasUrlForBytestreamIndividual(HttpServletRequest req, Individual entity)
private String getAliasUrlForBytestreamIndividual(Individual entity)
throws IOException {
FileInfo fileInfo = FileInfo.instanceFromBytestreamUri(new VitroRequest(
req).getWebappDaoFactory(), entity.getURI());
if (fileInfo == null) {
log.trace("Entity '" + entity.getURI() + "' is not a bytestream.");
if (!FileModelHelper.isFileBytestream(entity)) {
log.debug("Entity at '" + entity.getURI()
+ "' is not recognized as a FileByteStream.");
return null;
}
FileStorage fs = (FileStorage) getServletContext().getAttribute(
FileStorageSetup.ATTRIBUTE_NAME);
if (fs == null) {
log.error("Servlet context does not contain file storage at '"
+ FileStorageSetup.ATTRIBUTE_NAME + "'");
return null;
}
String filename = fs.getFilename(entity.getURI());
if (filename == null) {
log.error("Entity at '" + entity.getURI()
+ "' is recognized as a FileByteStream, "
+ "but the file system does not recognize it.");
return null;
}
String url = FileServingHelper.getBytestreamAliasUrl(entity.getURI(),
filename);
if (url.equals(entity.getURI())) {
log.error("Entity at '" + entity.getURI()
+ "' is recognized as a FileByteStream, "
+ "but can't be translated to an alias URL.");
return null;
}
String url = fileInfo.getBytestreamAliasUrl();
log.debug("Alias URL for '" + entity.getURI() + "' is '" + url + "'");
return url;
}

View file

@ -79,6 +79,7 @@ import edu.cornell.mannlib.vitro.webapp.utils.Csv2Rdf;
import edu.cornell.mannlib.vitro.webapp.utils.jena.JenaIngestUtils;
import edu.cornell.mannlib.vitro.webapp.utils.jena.JenaIngestWorkflowProcessor;
import edu.cornell.mannlib.vitro.webapp.utils.jena.WorkflowOntology;
import edu.cornell.mannlib.vitro.webapp.beans.Ontology;
import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao;
@ -420,10 +421,10 @@ public class JenaIngestController extends BaseEditController {
if(modelName!=null){
Model m = maker.getModel(modelName);
ArrayList namespaceList = new ArrayList();
ResIterator resItr = m.listResourcesWithProperty((Property)null);
ResIterator resItr = m.listResourcesWithProperty((Property)null);
if(resItr!=null){
while(resItr.hasNext()){
while(resItr.hasNext()){
String namespace = resItr.nextResource().getNameSpace();
if(!namespaceList.contains(namespace)){
namespaceList.add(namespace);
@ -442,7 +443,6 @@ public class JenaIngestController extends BaseEditController {
}
else if(oldModel!=null){
doPermanentURI(oldModel,newModel,oldNamespace,newNamespace,dNamespace,maker,vreq);
request.setAttribute("title","Ingest Menu");
request.setAttribute("bodyJsp",INGEST_MENU_JSP);
}
@ -736,10 +736,8 @@ public class JenaIngestController extends BaseEditController {
VitroJenaSDBModelMaker vjmm = new VitroJenaSDBModelMaker(store);
vreq.getSession().setAttribute("vitroJenaModelMaker",vjmm);
} else {
DBConnection dbConn = new DBConnection(jdbcUrl,username,password,dbType);
System.out.println("Connecting to DB at "+jdbcUrl);
ModelMaker mMaker = ModelFactory.createModelRDBMaker(dbConn);
VitroJenaModelMaker vjmm = new VitroJenaModelMaker(mMaker);
VitroJenaModelMaker vjmm = new VitroJenaModelMaker(jdbcUrl, username, password, dbType);
vreq.getSession().setAttribute("vitroJenaModelMaker",vjmm);
}
}
@ -1052,8 +1050,6 @@ public class JenaIngestController extends BaseEditController {
}
}
private String getUnusedURI(String newNamespace,WebappDaoFactory wdf){
String uri = null;
String errMsg = null;

View file

@ -2,21 +2,32 @@
package edu.cornell.mannlib.vitro.webapp.dao.jena;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.db.DBConnection;
import com.hp.hpl.jena.graph.Graph;
import com.hp.hpl.jena.graph.GraphMaker;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.ModelMaker;
import com.hp.hpl.jena.rdf.model.ModelReader;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.util.iterator.NiceIterator;
import com.hp.hpl.jena.util.iterator.WrappedIterator;
import edu.cornell.mannlib.vitro.webapp.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase;
/**
* This is a bit of a nutty idea but we'll see if it works. This can wrap an RDBModelMaker and return a memory model
@ -30,43 +41,54 @@ import com.hp.hpl.jena.util.iterator.ExtendedIterator;
public class VitroJenaModelMaker implements ModelMaker {
private static final Log log = LogFactory.getLog(VitroJenaModelMaker.class);
private ModelMaker innerModelMaker = null;
private HashMap<String,Model> modelCache = null;
private static final String DEFAULT_DRIVER = "com.mysql.jdbc.Driver";
private String jdbcUrl;
private String username;
private String password;
private String dbTypeStr;
private BasicDataSource dataSource;
private HashMap<String,Model> modelCache;
private HttpServletRequest request = null;
public VitroJenaModelMaker(ModelMaker mm) {
this.innerModelMaker = mm;
public VitroJenaModelMaker(String jdbcUrl, String username, String password, String dbTypeStr) {
this.jdbcUrl = jdbcUrl;
this.username = username;
this.password = password;
this.dbTypeStr = dbTypeStr;
String driverName = ConfigurationProperties
.getProperty("VitroConnection.DataSource.driver");
// This property is no longer used?
// We'll change it all around in 1.2 anyway.
if(driverName == null) {
driverName = DEFAULT_DRIVER;
}
this.dataSource = JenaDataSourceSetupBase.makeBasicDataSource(
driverName,
jdbcUrl, username, password);
modelCache = new HashMap<String,Model>();
}
public VitroJenaModelMaker(ModelMaker mm, HttpServletRequest request) {
this.innerModelMaker = mm;
if (mm instanceof VitroJenaModelMaker) {
log.debug("Using cache from inner model maker ");
this.modelCache = ((VitroJenaModelMaker)mm).getCache();
} else {
log.debug("Creating new cache");
this.modelCache = new HashMap<String,Model>();
}
this.request = request;
}
public ModelMaker getInnerModelMaker() {
return this.innerModelMaker;
}
// public VitroJenaModelMaker(ModelMaker mm, HttpServletRequest request) {
// this.innerModelMaker = mm;
// if (mm instanceof VitroJenaModelMaker) {
// log.debug("Using cache from inner model maker ");
// this.modelCache = ((VitroJenaModelMaker)mm).getCache();
// } else {
// log.debug("Creating new cache");
// this.modelCache = new HashMap<String,Model>();
// }
// this.request = request;
// }
//
// public ModelMaker getInnerModelMaker() {
// return this.innerModelMaker;
// }
protected HashMap<String,Model> getCache() {
return this.modelCache;
}
private Model copyModelIntoMem(Model underlyingModel) {
Model memModel = ModelFactory.createDefaultModel();
memModel.add(underlyingModel);
memModel.register(new ModelSynchronizer(underlyingModel));
return memModel;
}
public void close() {
// TODO Auto-generated method stub
// So, in theory, this should close database connections and drop references
@ -81,7 +103,7 @@ public class VitroJenaModelMaker implements ModelMaker {
log.debug("Returning "+arg0+" ("+cachedModel.hashCode()+") from cache");
return cachedModel;
} else {
Model newModel = copyModelIntoMem(innerModelMaker.createModel(arg0));
Model newModel = makeDBModel(arg0);
modelCache.put(arg0,newModel);
log.debug("Returning "+arg0+" ("+newModel.hashCode()+") from cache");
return newModel;
@ -95,22 +117,42 @@ public class VitroJenaModelMaker implements ModelMaker {
if (cachedModel != null) {
return cachedModel;
} else {
Model newModel = copyModelIntoMem(innerModelMaker.createModel(arg0,arg1));
Model newModel = makeDBModel(arg0);
modelCache.put(arg0,newModel);
return newModel;
}
}
public GraphMaker getGraphMaker() {
return innerModelMaker.getGraphMaker();
throw new UnsupportedOperationException(this.getClass().getName() +
" does not support getGraphMaker()");
}
public boolean hasModel(String arg0) {
return innerModelMaker.hasModel(arg0);
DBConnection conn = new DBConnection(jdbcUrl, username, password, dbTypeStr);
try {
return ModelFactory.createModelRDBMaker(conn).hasModel(arg0);
} finally {
try {
conn.close();
} catch (SQLException sqle) {
throw new RuntimeException(sqle);
}
}
}
public ExtendedIterator listModels() {
return innerModelMaker.listModels();
DBConnection conn = new DBConnection(jdbcUrl, username, password, dbTypeStr);
try {
List<String> modelList = ModelFactory.createModelRDBMaker(conn).listModels().toList();
return WrappedIterator.create(modelList.iterator());
} finally {
try {
conn.close();
} catch (SQLException sqle) {
throw new RuntimeException(sqle);
}
}
}
public Model openModel(String arg0, boolean arg1) {
@ -120,7 +162,7 @@ public class VitroJenaModelMaker implements ModelMaker {
if (cachedModel != null) {
return cachedModel;
} else {
Model newModel = copyModelIntoMem(innerModelMaker.openModel(arg0,arg1));
Model newModel = makeDBModel(arg0);
modelCache.put(arg0,newModel);
return newModel;
}
@ -132,7 +174,16 @@ public class VitroJenaModelMaker implements ModelMaker {
m.close();
modelCache.remove(arg0);
}
innerModelMaker.removeModel(arg0);
DBConnection conn = new DBConnection(jdbcUrl, username, password, dbTypeStr);
try {
ModelFactory.createModelRDBMaker(conn).removeModel(arg0);
} finally {
try {
conn.close();
} catch (SQLException sqle) {
throw new RuntimeException(sqle);
}
}
}
@ -160,13 +211,14 @@ public class VitroJenaModelMaker implements ModelMaker {
}
public Model createDefaultModel() {
return innerModelMaker.createDefaultModel();
throw new UnsupportedOperationException(this.getClass().getName() +
" does not support createDefaultModel()");
}
public Model createFreshModel() {
return innerModelMaker.createFreshModel();
}
throw new UnsupportedOperationException(this.getClass().getName() +
" does not support createFreshModel()"); }
@Deprecated
public Model createModel() {
@ -188,7 +240,7 @@ public class VitroJenaModelMaker implements ModelMaker {
if (cachedModel != null) {
return cachedModel;
} else {
Model newModel = copyModelIntoMem(innerModelMaker.openModel(arg0));
Model newModel = makeDBModel(arg0);
modelCache.put(arg0,newModel);
return newModel;
}
@ -202,7 +254,7 @@ public class VitroJenaModelMaker implements ModelMaker {
if (cachedModel != null) {
return cachedModel;
} else {
Model newModel = copyModelIntoMem(innerModelMaker.openModelIfPresent(arg0));
Model newModel = makeDBModel(arg0);
modelCache.put(arg0,newModel);
return newModel;
}
@ -216,7 +268,7 @@ public class VitroJenaModelMaker implements ModelMaker {
if (cachedModel != null) {
return cachedModel;
} else {
Model newModel = copyModelIntoMem(innerModelMaker.getModel(arg0));
Model newModel = makeDBModel(arg0);
modelCache.put(arg0,newModel);
return newModel;
}
@ -230,7 +282,7 @@ public class VitroJenaModelMaker implements ModelMaker {
if (cachedModel != null) {
return cachedModel;
} else {
Model newModel = copyModelIntoMem(innerModelMaker.getModel(arg0));
Model newModel = makeDBModel(arg0);
modelCache.put(arg0,newModel);
return newModel;
}
@ -273,5 +325,22 @@ public class VitroJenaModelMaker implements ModelMaker {
}
return null;
}
private OntModel makeDBModel(String jenaDbModelName) {
OntModel memCache = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
RDBGraphGenerator gen = new RDBGraphGenerator(dataSource, dbTypeStr, jenaDbModelName);
Graph g = gen.generateGraph();
Model m = ModelFactory.createModelForGraph(g);
memCache.add(m);
memCache.register(new MemToRDBModelSynchronizer(gen));
m.close();
try {
gen.getConnection().close();
} catch (SQLException e) {
log.warn("Unable to close connection for graph", e);
}
// This next piece is so that we return a fresh model object each time so we don't get cross-contamination of extra listeners, etc.
return ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, ModelFactory.createUnion(memCache, ModelFactory.createDefaultModel()));
}
}

View file

@ -19,10 +19,11 @@ import com.hp.hpl.jena.rdf.model.Resource;
import edu.cornell.mannlib.vitro.webapp.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaBaseDaoCon;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDBGraphGenerator;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RegeneratingGraph;
public class JenaDataSourceSetupBase {
public class JenaDataSourceSetupBase extends JenaBaseDaoCon {
private static final Log log = LogFactory.getLog(JenaDataSourceSetupBase.class);
protected final static int DEFAULT_MAXWAIT = 10000, // ms

View file

@ -33,8 +33,8 @@ public class VitroJenaModelMakerSetup implements ServletContextListener {
String password = ConfigurationProperties.getProperty("VitroConnection.DataSource.password");
DBConnection dbConn = new DBConnection(jdbcUrl, username, password, DB_TYPE);
ModelMaker mMaker = ModelFactory.createModelRDBMaker(dbConn);
VitroJenaModelMaker vjmm = new VitroJenaModelMaker(mMaker);
;
VitroJenaModelMaker vjmm = new VitroJenaModelMaker(jdbcUrl, username, password, DB_TYPE);
arg0.getServletContext().setAttribute("vitroJenaModelMaker", vjmm);
log.debug("VitroJenaModelMaker set up");
} catch (Throwable t) {