]>
Commit | Line | Data |
---|---|---|
96c73c7f | 1 | package no.cristin.ws; |
2 | ||
3 | import java.sql.Connection; | |
4 | import java.sql.PreparedStatement; | |
5 | import java.sql.ResultSet; | |
6 | import java.sql.SQLException; | |
7 | import java.util.ArrayList; | |
96c73c7f | 8 | import java.util.Hashtable; |
9 | import java.util.List; | |
96c73c7f | 10 | |
d4906076 | 11 | import javax.servlet.http.HttpServletRequest; |
96c73c7f | 12 | import javax.ws.rs.GET; |
13 | import javax.ws.rs.Path; | |
14 | import javax.ws.rs.QueryParam; | |
d4906076 | 15 | import javax.ws.rs.core.Context; |
96c73c7f | 16 | import javax.ws.rs.core.HttpHeaders; |
17 | import javax.ws.rs.core.MediaType; | |
18 | import javax.ws.rs.core.Response; | |
19 | import javax.ws.rs.core.Response.Status; | |
20 | ||
96c73c7f | 21 | import org.jboss.resteasy.annotations.cache.Cache; |
22 | import org.json.JSONException; | |
23 | import org.slf4j.Logger; | |
24 | import org.slf4j.LoggerFactory; | |
25 | ||
26 | /** | |
27 | * Person RPC-tjeneste. | |
28 | */ | |
29 | @Path("/finnForsker") | |
30 | public 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("&", "&"); | |
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 |