]> git.uio.no Git - cristin-ws.git/blame - 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
CommitLineData
96c73c7f 1package no.cristin.ws;
2
3import java.sql.Connection;
4import java.sql.PreparedStatement;
5import java.sql.ResultSet;
6import java.sql.SQLException;
7import java.util.ArrayList;
96c73c7f 8import java.util.Hashtable;
9import java.util.List;
96c73c7f 10
d4906076 11import javax.servlet.http.HttpServletRequest;
96c73c7f 12import javax.ws.rs.GET;
13import javax.ws.rs.Path;
14import javax.ws.rs.QueryParam;
d4906076 15import javax.ws.rs.core.Context;
96c73c7f 16import javax.ws.rs.core.HttpHeaders;
17import javax.ws.rs.core.MediaType;
18import javax.ws.rs.core.Response;
19import javax.ws.rs.core.Response.Status;
20
96c73c7f 21import org.jboss.resteasy.annotations.cache.Cache;
22import org.json.JSONException;
23import org.slf4j.Logger;
24import org.slf4j.LoggerFactory;
25
26/**
27 * Person RPC-tjeneste.
28 */
29@Path("/finnForsker")
30public class FinnForskerId {
31
32 private static final Logger log = LoggerFactory.getLogger(FinnForskerId.class.toString());
d4906076 33 @Context private HttpServletRequest servletRequest;
96c73c7f 34
8416831e 35 // NB! hardkoding av cristin-url som kjem til å forandre seg!
36 private static final String presURL = "http://www.cristin.no/as/WebObjects/cristin.woa/wa/personVis?type=PERSON&pnr=";
37
96c73c7f 38 /**
39 * Returnerer liste av personer som har matchende navn og institusjon.
40 *
41 * @param navn Forskerens navn
42 * @param institusjon Forskerens institusjon
43 * @param format
44 * "html", "xml" eller "json" for å angi output format
45 * @return liste over forskere som matcher input
46 */
47 @GET
48 @Cache(maxAge = 0)
49 public Response finnForsker(
50 @QueryParam("navn") String navn,
51 @QueryParam("inst") String institusjon,
52 @QueryParam("format") String format) throws JSONException {
53 log.info("finnForsker " + navn + ":" + institusjon + ":" + format);
d4906076 54
96c73c7f 55 List<String> errors = new ArrayList<String>();
8416831e 56
96c73c7f 57 if (format == null) format = "xml";
58 MediaType outputFormat = MediaType.APPLICATION_XML_TYPE;
59 switch (format) {
60 case "json":
61 outputFormat = MediaType.APPLICATION_JSON_TYPE;
62 break;
63 case "html":
64 outputFormat = MediaType.TEXT_HTML_TYPE;
65 break;
8416831e 66 default:
67 outputFormat = MediaType.APPLICATION_XML_TYPE;
96c73c7f 68 }
69
66c51c53 70 if (navn == null) {
71 return Response.status(Status.BAD_REQUEST).entity("navn er null").build();
96c73c7f 72 }
66c51c53 73
74 String sql = "select p.personlopenr as lopenr, p.presentasjonslopenr as presnr, p.fornavn ||' '|| p.etternavn as navn, "
96c73c7f 75 + "case when p.bilde is not null then 'J' else 'N' end as bilde, "
8416831e 76 + "i.institusjonsakronym as akronym, "
77 + "i.institusjonsnavn_bokmal as instnavnb, i.institusjonsnavn_nynorsk as instnavnn, i.institusjonsnavn_engelsk as instnavne, "
78 + "s.stednavn_bokmal as stednavnb, s.stednavn_nynorsk as stednavnn, s.stednavn_engelsk as stednavne "
96c73c7f 79 + "from frida.person p "
80 + "left outer join frida.ansettelse a on a.personlopenr = p.personlopenr "
81 + "left outer join frida.sted s on s.institusjonsnr = a.institusjonsnr and s.avdnr = a.avdnr and "
82 + " s.undavdnr = a.undavdnr and s.gruppenr = a.gruppenr "
66c51c53 83 + "left outer join frida.institusjon i on i.institusjonsnr = a.institusjonsnr "
84 + " where regexp_like(p.fornavn||' '||p.etternavn, ?, 'i') ";
85
96c73c7f 86 List<String> parameters = new ArrayList<String>();
96c73c7f 87
66c51c53 88 // legg til where for navn
89 parameters.add(lagRegexp(navn.trim().toLowerCase()));
90
91 if (institusjon != null) {
92 sql += "and ( ";
93 institusjon = institusjon.trim().toLowerCase();
94 if (institusjon.indexOf(' ') == -1) {
95 sql += "lower (i.institusjonsakronym) = ? or ";
96 parameters.add(institusjon);
97 }
98 sql += "regexp_like(i.institusjonsnavn_bokmal||' '||i.institusjonsnavn_nynorsk||' '||i.institusjonsnavn_engelsk, ?,'i')) ";
99 parameters.add(lagRegexp(institusjon));
100 }
101
96c73c7f 102
103 Forskere forskere = new Forskere();
8416831e 104 try (
96c73c7f 105 Connection conn = Database.getConnection();
106 PreparedStatement stmt = conn.prepareStatement(sql);
8416831e 107 ) {
108
96c73c7f 109 int index = 1;
110 for (int idx = 1; idx <= parameters.size(); idx++) {
111 log.info("finnForsker legger til param " + idx + ": " + parameters.get(idx - 1));
112 stmt.setString(idx, parameters.get(idx - 1));
113 }
114 log.info("finnForsker " + sql + ", parametre: " + index);
115 ResultSet rs = stmt.executeQuery();
116 int results = 0;
8416831e 117 final String bildeURL = servletRequest.getRequestURL().substring(0,servletRequest.getRequestURL().indexOf("finnFo"));
96c73c7f 118 while (rs.next()) {
119 forskere.leggTilEllerOppdater(
8416831e 120 rs.getInt("lopenr"),
121 rs.getInt("presnr") == 0 ? null: presURL + rs.getInt("presnr"),
96c73c7f 122 rs.getString("navn"),
8416831e 123 "N".equals(rs.getString("bilde")) ? null : bildeURL,
124 rs.getString("akronym"),
125 rs.getString("instnavnb"),
126 rs.getString("instnavnn"),
127 rs.getString("instnavne"),
96c73c7f 128 rs.getString("stednavnb"),
129 rs.getString("stednavnn"),
130 rs.getString("stednavne")
131 );
132 }
133
134 } catch (SQLException e) {
135 log.error("finnForsker error",e);
136 }
137
138
139
140 return Response
141 .status(200)
8416831e 142 .entity(forskere.format(outputFormat))
96c73c7f 143 .header(HttpHeaders.CONTENT_TYPE, outputFormat+"; charset=UTF-8")
144 .build();
145
146
147 }
148
66c51c53 149 private String lagRegexp(String navn) {
150 log.info("lagRegexp "+ navn);
151 StringBuilder sb = new StringBuilder();
152 String[] split = navn.split(" ");
153 sb.append("^(.+ )*");
154 sb.append(split[0]);
155 for (int i = 1; i < split.length; i++) {
156 sb.append(" (.+[[:space:]])*");
157 sb.append(split[i]);
8416831e 158 }
66c51c53 159 sb.append("( .+)*$");
160 log.info("lagRegexp "+ sb.toString());
161 return sb.toString();
8416831e 162 }
163
164 private static final String escapeXML(String input) {
165 return input.replace("&", "&amp;");
166 }
96c73c7f 167
168 final private class Forskere {
169 Hashtable<Integer,Forsker> forskere = new Hashtable<Integer,Forsker>();
8416831e 170 Object format(MediaType outputFormat) throws JSONException {
96c73c7f 171 StringBuilder sb = new StringBuilder(4000);
172 sb.append("<forskere>");
173 for (Forsker f: forskere.values()) {
174 f.toXml(sb);
175 }
176 sb.append("</forskere>");
8416831e 177 if (outputFormat.equals(MediaType.APPLICATION_JSON_TYPE)) {
66c51c53 178
8416831e 179 String json = org.json.XML.toJSONObject(sb.toString()).toString();
180 return json;
181 }
96c73c7f 182 return sb.toString();
183 }
8416831e 184 public void leggTilEllerOppdater(int lopenr, String presentasjonsURL, String navn,
185 String bildeURL, String akronym,
186 String instavnBokmål, String instavnNynorsk, String instavnEngelsk,
187 String stednavnBokmål, String stednavnNynorsk, String stednavnEngelsk) {
188 Sted s = akronym == null ? null : new Sted(akronym, instavnBokmål, instavnNynorsk, instavnEngelsk, stednavnBokmål, stednavnNynorsk, stednavnEngelsk);
96c73c7f 189 if (forskere.containsKey(lopenr)) {
190 if (s != null) forskere.get(lopenr).tilhorigheter.add(s);
191 } else {
8416831e 192 Forsker f = new Forsker(lopenr, presentasjonsURL, navn, bildeURL);
96c73c7f 193 if (s != null) f.tilhorigheter.add(s);
194 forskere.put(lopenr, f);
195 }
196
197 }
198
199 }
200
201 final static private class Forsker {
8416831e 202 private int lopenr;
203 private String presentasjonsURL;
96c73c7f 204 private String navn;
d4906076 205 private String bildeURL;
96c73c7f 206 private List<Sted> tilhorigheter = new ArrayList<Sted>();
207
8416831e 208 public Forsker (int lopenr, String presentasjonsURL, String navn, String bildeURL) {
96c73c7f 209 this.lopenr = lopenr;
8416831e 210 this.presentasjonsURL = presentasjonsURL;
96c73c7f 211 this.navn = navn;
d4906076 212 this.bildeURL = bildeURL;
96c73c7f 213 }
214
215 public void toXml(StringBuilder sb) {
216 sb.append("<forsker ");
217 sb.append("id=\"");
218 sb.append(lopenr);
219 sb.append("\" navn=\"");
220 sb.append(navn);
221 sb.append("\" ");
8416831e 222 if (presentasjonsURL != null) {
223 sb.append("presentasjon=\"");
224 sb.append(escapeXML(presentasjonsURL));
225 sb.append(lopenr);
226 sb.append("\" ");
227 }
d4906076
LH
228 if (bildeURL != null) {
229 sb.append("bilde=\"");
230 sb.append(bildeURL);
231 sb.append("hentPersonBilde?lopenr=");
96c73c7f 232 sb.append(lopenr);
233 sb.append("\"");
234 }
235 sb.append(">");
236 for (Sted s: tilhorigheter) {
237 s.toXml(sb);
238 }
239 sb.append("</forsker>");
240 }
241
242 }
243 final static private class Sted {
244 private String akronym;
8416831e 245 private String instnavnBokmål;
246 private String instnavnNynorsk;
247 private String instnavnEngelsk;
248 private String stednavnBokmål;
249 private String stednavnNynorsk;
250 private String stednavnEngelsk;
96c73c7f 251
8416831e 252 public Sted(String akronym, String instnavnBokmål, String instnavnNynorsk, String instnavnEngelsk,
253 String navnBokmål, String navnNynorsk, String navnEngelsk) {
96c73c7f 254 this.akronym = akronym;
8416831e 255 this.instnavnBokmål = instnavnBokmål;
256 this.instnavnNynorsk = instnavnNynorsk;
257 this.instnavnEngelsk = instnavnEngelsk;
258 this.stednavnBokmål = navnBokmål;
259 this.stednavnNynorsk = navnNynorsk;
260 this.stednavnEngelsk = navnEngelsk;
96c73c7f 261 }
262
263 public void toXml(StringBuilder sb) {
264 sb.append("<sted akronym=\"");
8416831e 265 sb.append(escapeXML(akronym));
266 sb.append("\" ");
267 sb.append("instnavnb=\"");
268 sb.append(escapeXML(instnavnBokmål));
269 sb.append("\" ");
270 if (instnavnNynorsk != null) sb.append(" instnavnn=\"" + escapeXML(instnavnNynorsk) + "\" ");
271 if (instnavnEngelsk != null) sb.append(" instnavne=\"" + escapeXML(instnavnEngelsk) + "\" ");
272 sb.append("stednavnb=\"");
273 sb.append(escapeXML(stednavnBokmål));
d4906076 274 sb.append("\" ");
8416831e 275 if (stednavnNynorsk != null) sb.append(" stednavnn=\"" + escapeXML(stednavnNynorsk) + "\" ");
276 if (stednavnEngelsk != null) sb.append(" stednavne=\"" + escapeXML(stednavnEngelsk) + "\" ");
96c73c7f 277
d4906076 278 sb.append("/>");
96c73c7f 279 }
280 }
281
282}
283