/*
Copyright 2006 OCLC Online Computer Library Center, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
* SRWTestDatabase.java
*
* Created on August 5, 2003, 4:17 PM
*/
package ORG.oclc.os.SRW;
import gov.loc.www.zing.srw.ScanRequestType;
import gov.loc.www.zing.srw.SearchRetrieveRequestType;
import gov.loc.www.zing.srw.TermType;
import gov.loc.www.zing.srw.TermTypeWhereInList;
import java.io.BufferedReader;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Properties;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.apache.axis.types.NonNegativeInteger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.z3950.zing.cql.CQLNode;
import org.z3950.zing.cql.CQLParser;
import org.z3950.zing.cql.CQLTermNode;
/**
*
* @author levan
*/
public class SRWFileSystemDatabase extends SRWDatabase {
static Log log=LogFactory.getLog(SRWFileSystemDatabase.class);
DirFilter filter=null;
File directory=null;
private String author, contact, description, restrictions, title;
private ArrayList<String> filenames=null;
String schemaID, schemaLocation, schemaName;
@Override
public void addRenderer(String schemaName, String schemaID, Properties props)
throws InstantiationException {
}
@Override
public String getDatabaseInfo() {
StringBuilder sb=new StringBuilder();
sb.append(" <databaseInfo>\n");
if(title!=null)
sb.append(" <title>").append(title).append("</title>\n");
if(description!=null)
sb.append(" <description>").append(description).append("</description>\n");
if(author!=null)
sb.append(" <author>").append(author).append("</author>\n");
if(contact!=null)
sb.append(" <contact>").append(contact).append("</contact>\n");
if(restrictions!=null)
sb.append(" <restrictions>").append(restrictions).append("</restrictions>\n");
sb.append(" </databaseInfo>\n");
return sb.toString();
}
public String getExtraResponseData(QueryResult result,
SearchRetrieveRequestType request) {
return null;
}
private void getFilenames() {
File[] files;
if(filter!=null)
files=directory.listFiles(filter);
else
files=directory.listFiles();
filenames=new ArrayList<String>();
for(File f : files) {
filenames.add(f.getName());
}
Collections.sort(filenames);
}
public String getIndexInfo() {
StringBuilder sb=new StringBuilder();
sb.append(" <indexInfo>\n")
.append(" <set identifier=\"info:srw/oai-context-set/1/oai-v1.0\"")
.append(" name=\"oai\"/>\n")
.append(" <index>\n")
.append(" <title>identifier</title>\n")
.append(" <map>\n")
.append(" <name set=\"oai\">identifier</name>\n")
.append(" </map>\n")
.append(" </index>\n")
.append(" <index>\n")
.append(" <title>datestamp</title>\n")
.append(" <map>\n")
.append(" <name set=\"oai\">datestamp</name>\n")
.append(" </map>\n")
.append(" </index>\n")
.append(" </indexInfo>\n");
return sb.toString();
}
@Override
public int getMaximumRecords() {
return maximumRecords;
}
@Override
public int getNumberOfRecords() {
return defaultNumRecs;
}
public QueryResult getQueryResult(String queryStr,
SearchRetrieveRequestType request) {
BasicQueryResult result=new BasicQueryResult();
CQLNode query;
try {
query=parser.parse(queryStr);
}
catch(Exception e) {
result.addDiagnostic(SRWDiagnostic.QuerySyntaxError, queryStr);
return result;
}
if(!(query instanceof CQLTermNode)) {
result.addDiagnostic(SRWDiagnostic.UnsupportedBooleanOperator, null);
}
CQLTermNode term=(CQLTermNode) query;
String index;
index=term.getIndex();
if(index.equals("oai.identifier") || index.equals("identifier")) {
int filenameOffset=Collections.binarySearch(filenames, term.getTerm());
if(filenameOffset>=0) {
result.setNumberOfRecords(1);
try {
byte[] b;
InputStream recStream=Utilities.openInputStream(filenames.get(filenameOffset), dbHome, null);
BufferedReader br=new BufferedReader(new InputStreamReader(recStream, "UTF-8"));
String line;
StringBuilder rec, recs[]=new StringBuilder[1];
rec = recs[0] = new StringBuilder();
while((line=br.readLine())!=null)
rec.append(line);
result.setRecords(recs);
} catch (IOException ex) {
log.error(ex, ex);
result.addDiagnostic(SRWDiagnostic.GeneralSystemError, ex.getMessage());
}
}
}
else {
result.addDiagnostic(SRWDiagnostic.UnsupportedIndex, index);
return result;
}
result.setQuery(queryStr);
return result;
}
@Override
public String getSchemaID(String schemaName) {
return schemaID;
}
@Override
public String getSchemaInfo() {
StringBuilder sb=new StringBuilder();
sb.append(" <schemaInfo>\n")
.append(" <schema identifier=\"").append(schemaID).append("\"\n")
.append(" location=\"").append(schemaLocation).append("\"\n")
.append(" sort=\"false\" retrieve=\"true\" name=\"").append(schemaName).append("\">\n")
.append(" <title>RDF</title>\n")
.append(" </schema>\n")
.append(" </schemaInfo>\n");
return sb.toString();
}
public TermList getTermList(CQLTermNode term, int position, int maxTerms, ScanRequestType request) {
String index=term.getIndex();
TermList termList=new TermList();
TermType tt=null;
ArrayList<String> terms;
ArrayList<TermType> tts=new ArrayList<TermType>();
if(index.equals("oai.identifier") || index.equals("identifier"))
terms=filenames;
else {
termList.addDiagnostic(SRWDiagnostic.UnsupportedIndex, index);
return termList;
}
for(String t:terms) {
if(tts.isEmpty())
tts.add(tt=new TermType(t, new NonNegativeInteger("1"), t, TermTypeWhereInList.first, null));
else if(t.equals(tt.getValue())) {
tt.setNumberOfRecords(new NonNegativeInteger(Integer.toString(tt.getNumberOfRecords().intValue()+1)));
}
else
tts.add(tt=new TermType(t, new NonNegativeInteger("1"), t, TermTypeWhereInList.inner, null));
}
if(tts.size()==1)
tt.setWhereInList(TermTypeWhereInList.only);
else
tt.setWhereInList(TermTypeWhereInList.last);
termList.setTerms(tts.toArray(new TermType[0]));
return termList;
}
@Override
public boolean hasaConfigurationFile() {
return true;
}
public void init(String dbname, String srwHome, String dbHome,
String dbPropertiesFileName, Properties dbProperties, HttpServletRequest request) {
log.debug("entering SRWFileSystemDatabase.init, dbname="+dbname);
super.initDB(dbname, srwHome, dbHome, dbPropertiesFileName, dbProperties);
String filterstr=dbProperties.getProperty("SRWFileSystemDatabase.filenameFilter");
if(filterstr!=null)
filter=new DirFilter(filterstr);
author=dbProperties.getProperty("SRWFileSystemDatabase.author");
contact=dbProperties.getProperty("SRWFileSystemDatabase.contact");
description=dbProperties.getProperty("SRWFileSystemDatabase.description");
restrictions=dbProperties.getProperty("SRWFileSystemDatabase.restrictions");
title=dbProperties.getProperty("SRWFileSystemDatabase.title");
schemaName=dbProperties.getProperty("SRWFileSystemDatabase.schemaName");
schemaID=dbProperties.getProperty("SRWFileSystemDatabase.schemaID");
schemaLocation=dbProperties.getProperty("SRWFileSystemDatabase.schemaLocation");
directory=new File(dbHome);
parser=new CQLParser(CQLParser.V1POINT1);
getFilenames();
log.debug("leaving SRWFileSystemDatabase.init");
return;
}
public boolean supportsSort() {
return false;
}
}
class DirFilter implements FilenameFilter {
private Pattern pattern;
public DirFilter(String regex) {
pattern = Pattern.compile(regex);
}
public boolean accept(File dir, String name) {
// Strip path information, search for regex:
return pattern.matcher(new File(name).getName()).matches();
}
} ///:~