import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
-import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
-import no.cristin.ws.exception.NotFoundException;
-import no.cristin.ws.exception.TooManyException;
-
import org.jboss.resteasy.annotations.cache.Cache;
import org.json.JSONException;
import org.slf4j.Logger;
private static final Logger log = LoggerFactory.getLogger(FinnForskerId.class.toString());
@Context private HttpServletRequest servletRequest;
+ // NB! hardkoding av cristin-url som kjem til å forandre seg!
+ private static final String presURL = "http://www.cristin.no/as/WebObjects/cristin.woa/wa/personVis?type=PERSON&pnr=";
+
/**
* Returnerer liste av personer som har matchende navn og institusjon.
*
@QueryParam("format") String format) throws JSONException {
log.info("finnForsker " + navn + ":" + institusjon + ":" + format);
-
List<String> errors = new ArrayList<String>();
+
if (format == null) format = "xml";
MediaType outputFormat = MediaType.APPLICATION_XML_TYPE;
switch (format) {
case "html":
outputFormat = MediaType.TEXT_HTML_TYPE;
break;
+ default:
+ outputFormat = MediaType.APPLICATION_XML_TYPE;
}
-
- if (format == null)
- format = "xml";
- else
- format = format.toLowerCase();
-
- if (navn == null || institusjon == null) {
- return Response.status(Status.BAD_REQUEST).entity("niks,nei").build();
+ if (navn == null) {
+ return Response.status(Status.BAD_REQUEST).entity("navn er null").build();
}
- // TODO = eksakt case hvis mix?
- navn = navn.trim().toLowerCase();
- institusjon = institusjon.trim().toLowerCase();
-
- String sql = "select p.personlopenr as lopenr, p.fornavn ||' '|| p.etternavn as navn, "
+
+ String sql = "select p.personlopenr as lopenr, p.presentasjonslopenr as presnr, p.fornavn ||' '|| p.etternavn as navn, "
+ "case when p.bilde is not null then 'J' else 'N' end as bilde, "
- + "s.stedakronym, s.stednavn_bokmal as stednavnb, s.stednavn_nynorsk as stednavnn, s.stednavn_engelsk as stednavne "
+ + "i.institusjonsakronym as akronym, "
+ + "i.institusjonsnavn_bokmal as instnavnb, i.institusjonsnavn_nynorsk as instnavnn, i.institusjonsnavn_engelsk as instnavne, "
+ + "s.stednavn_bokmal as stednavnb, s.stednavn_nynorsk as stednavnn, s.stednavn_engelsk as stednavne "
+ "from frida.person p "
+ "left outer join frida.ansettelse a on a.personlopenr = p.personlopenr "
+ "left outer join frida.sted s on s.institusjonsnr = a.institusjonsnr and s.avdnr = a.avdnr and "
+ " s.undavdnr = a.undavdnr and s.gruppenr = a.gruppenr "
- + " where p.fodselsdato is not null and p.personnr is not null and ";
+ + "left outer join frida.institusjon i on i.institusjonsnr = a.institusjonsnr "
+ + " where regexp_like(p.fornavn||' '||p.etternavn, ?, 'i') ";
+
List<String> parameters = new ArrayList<String>();
- String[] splitnavn = navn.split(" ");
- for (int i = 0; i < splitnavn.length; i++) {
- if (splitnavn[i].isEmpty()) continue;
-
- parameters.add("%" + splitnavn[i].toLowerCase() + "%");
- if (i < splitnavn.length - 1)
- sql += "lower(p.fornavn||' '||p.etternavn) like ? and ";
- else
- sql += "lower(p.fornavn||' '||p.etternavn) like ? ";
- }
- // FIXME legg til fornuftig institusjonssjekk
-// for (String s: institusjon.split(" ")) {
-// if (!s.isEmpty()) {
-// parameter.add("%" + s.toLowerCase() + "%");
-// sql += "(lower(s.stedakronym) like ? or ";
-// }
-// }
+ // legg til where for navn
+ parameters.add(lagRegexp(navn.trim().toLowerCase()));
+
+ if (institusjon != null) {
+ sql += "and ( ";
+ institusjon = institusjon.trim().toLowerCase();
+ if (institusjon.indexOf(' ') == -1) {
+ sql += "lower (i.institusjonsakronym) = ? or ";
+ parameters.add(institusjon);
+ }
+ sql += "regexp_like(i.institusjonsnavn_bokmal||' '||i.institusjonsnavn_nynorsk||' '||i.institusjonsnavn_engelsk, ?,'i')) ";
+ parameters.add(lagRegexp(institusjon));
+ }
- Forskere forskere = new Forskere();
- try
- {
+ Forskere forskere = new Forskere();
+ try (
Connection conn = Database.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
+ ) {
+
int index = 1;
for (int idx = 1; idx <= parameters.size(); idx++) {
log.info("finnForsker legger til param " + idx + ": " + parameters.get(idx - 1));
log.info("finnForsker " + sql + ", parametre: " + index);
ResultSet rs = stmt.executeQuery();
int results = 0;
- String bildeURL = servletRequest.getRequestURL().substring(0,servletRequest.getRequestURL().indexOf("finnFo"));
+ final String bildeURL = servletRequest.getRequestURL().substring(0,servletRequest.getRequestURL().indexOf("finnFo"));
while (rs.next()) {
forskere.leggTilEllerOppdater(
- new Integer(rs.getInt("lopenr")),
+ rs.getInt("lopenr"),
+ rs.getInt("presnr") == 0 ? null: presURL + rs.getInt("presnr"),
rs.getString("navn"),
- "J".equals(rs.getString("bilde")) ? bildeURL : null,
- rs.getString("stedakronym"),
+ "N".equals(rs.getString("bilde")) ? null : bildeURL,
+ rs.getString("akronym"),
+ rs.getString("instnavnb"),
+ rs.getString("instnavnn"),
+ rs.getString("instnavne"),
rs.getString("stednavnb"),
rs.getString("stednavnn"),
rs.getString("stednavne")
return Response
.status(200)
- .entity(forskere.format())
+ .entity(forskere.format(outputFormat))
.header(HttpHeaders.CONTENT_TYPE, outputFormat+"; charset=UTF-8")
.build();
}
+ private String lagRegexp(String navn) {
+ log.info("lagRegexp "+ navn);
+ StringBuilder sb = new StringBuilder();
+ String[] split = navn.split(" ");
+ sb.append("^(.+ )*");
+ sb.append(split[0]);
+ for (int i = 1; i < split.length; i++) {
+ sb.append(" (.+[[:space:]])*");
+ sb.append(split[i]);
+ }
+ sb.append("( .+)*$");
+ log.info("lagRegexp "+ sb.toString());
+ return sb.toString();
+ }
+
+ private static final String escapeXML(String input) {
+ return input.replace("&", "&");
+ }
final private class Forskere {
Hashtable<Integer,Forsker> forskere = new Hashtable<Integer,Forsker>();
- Object format() throws JSONException {
+ Object format(MediaType outputFormat) throws JSONException {
StringBuilder sb = new StringBuilder(4000);
sb.append("<forskere>");
for (Forsker f: forskere.values()) {
f.toXml(sb);
}
sb.append("</forskere>");
+ if (outputFormat.equals(MediaType.APPLICATION_JSON_TYPE)) {
+
+ String json = org.json.XML.toJSONObject(sb.toString()).toString();
+ return json;
+ }
return sb.toString();
}
- public void leggTilEllerOppdater(Integer lopenr, String navn,
- String bildeURL, String akronym, String stednavnBokmål,
- String stednavnNynorsk, String stednavnEngelsk) {
- Sted s = akronym == null ? null : new Sted(akronym, stednavnBokmål, stednavnNynorsk, stednavnEngelsk);
+ public void leggTilEllerOppdater(int lopenr, String presentasjonsURL, String navn,
+ String bildeURL, String akronym,
+ String instavnBokmål, String instavnNynorsk, String instavnEngelsk,
+ String stednavnBokmål, String stednavnNynorsk, String stednavnEngelsk) {
+ Sted s = akronym == null ? null : new Sted(akronym, instavnBokmål, instavnNynorsk, instavnEngelsk, stednavnBokmål, stednavnNynorsk, stednavnEngelsk);
if (forskere.containsKey(lopenr)) {
if (s != null) forskere.get(lopenr).tilhorigheter.add(s);
} else {
- Forsker f = new Forsker(lopenr, navn, bildeURL);
+ Forsker f = new Forsker(lopenr, presentasjonsURL, navn, bildeURL);
if (s != null) f.tilhorigheter.add(s);
forskere.put(lopenr, f);
}
}
final static private class Forsker {
- private Integer lopenr;
+ private int lopenr;
+ private String presentasjonsURL;
private String navn;
private String bildeURL;
private List<Sted> tilhorigheter = new ArrayList<Sted>();
- public Forsker (Integer lopenr, String navn, String bildeURL) {
+ public Forsker (int lopenr, String presentasjonsURL, String navn, String bildeURL) {
this.lopenr = lopenr;
+ this.presentasjonsURL = presentasjonsURL;
this.navn = navn;
this.bildeURL = bildeURL;
}
sb.append("\" navn=\"");
sb.append(navn);
sb.append("\" ");
+ if (presentasjonsURL != null) {
+ sb.append("presentasjon=\"");
+ sb.append(escapeXML(presentasjonsURL));
+ sb.append(lopenr);
+ sb.append("\" ");
+ }
if (bildeURL != null) {
sb.append("bilde=\"");
sb.append(bildeURL);
}
final static private class Sted {
private String akronym;
- private String navnBokmål;
- private String navnNynorsk;
- private String navnEngelsk;
+ private String instnavnBokmål;
+ private String instnavnNynorsk;
+ private String instnavnEngelsk;
+ private String stednavnBokmål;
+ private String stednavnNynorsk;
+ private String stednavnEngelsk;
- public Sted(String akronym, String navnBokmål, String navnNynorsk, String navnEngelsk) {
+ public Sted(String akronym, String instnavnBokmål, String instnavnNynorsk, String instnavnEngelsk,
+ String navnBokmål, String navnNynorsk, String navnEngelsk) {
this.akronym = akronym;
- this.navnBokmål = navnBokmål;
- this.navnNynorsk = navnNynorsk;
- this.navnEngelsk = navnEngelsk;
+ this.instnavnBokmål = instnavnBokmål;
+ this.instnavnNynorsk = instnavnNynorsk;
+ this.instnavnEngelsk = instnavnEngelsk;
+ this.stednavnBokmål = navnBokmål;
+ this.stednavnNynorsk = navnNynorsk;
+ this.stednavnEngelsk = navnEngelsk;
}
public void toXml(StringBuilder sb) {
sb.append("<sted akronym=\"");
- sb.append(akronym);
- sb.append("\" navnb=\"");
- sb.append(navnBokmål);
+ sb.append(escapeXML(akronym));
+ sb.append("\" ");
+ sb.append("instnavnb=\"");
+ sb.append(escapeXML(instnavnBokmål));
+ sb.append("\" ");
+ if (instnavnNynorsk != null) sb.append(" instnavnn=\"" + escapeXML(instnavnNynorsk) + "\" ");
+ if (instnavnEngelsk != null) sb.append(" instnavne=\"" + escapeXML(instnavnEngelsk) + "\" ");
+ sb.append("stednavnb=\"");
+ sb.append(escapeXML(stednavnBokmål));
sb.append("\" ");
- if (navnNynorsk != null) sb.append(" navnn=\"" + navnNynorsk + "\" ");
- if (navnEngelsk != null) sb.append(" navne=\"" + navnEngelsk + "\" ");
+ if (stednavnNynorsk != null) sb.append(" stednavnn=\"" + escapeXML(stednavnNynorsk) + "\" ");
+ if (stednavnEngelsk != null) sb.append(" stednavne=\"" + escapeXML(stednavnEngelsk) + "\" ");
sb.append("/>");
}