]> git.uio.no Git - cristin-ws.git/blobdiff - src/main/java/no/cristin/ws/FinnForskerId.java
korrekt søk, men dessverre for treigt
[cristin-ws.git] / src / main / java / no / cristin / ws / FinnForskerId.java
index 2426ae1e6f9322ba554ea21a15b41189d33e667f..05b946de2a5be07ff7d0940bc02f4a7a1e4c5060 100644 (file)
@@ -5,10 +5,8 @@ import java.sql.PreparedStatement;
 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;
@@ -20,9 +18,6 @@ import javax.ws.rs.core.MediaType;
 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;
@@ -37,6 +32,9 @@ public class FinnForskerId {
        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.
         * 
@@ -54,8 +52,8 @@ public class FinnForskerId {
                        @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) {
@@ -65,55 +63,49 @@ public class FinnForskerId {
             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));
@@ -122,13 +114,17 @@ public class FinnForskerId {
             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")
@@ -143,33 +139,57 @@ public class FinnForskerId {
         
         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("&", "&amp;");
+    }
 
     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);
             }
@@ -179,13 +199,15 @@ public class FinnForskerId {
     }
        
        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;
            }
@@ -197,6 +219,12 @@ public class FinnForskerId {
             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);
@@ -214,25 +242,38 @@ public class FinnForskerId {
        }
        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("/>");
         }