--- /dev/null
+package no.usit.fridaws;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Response;
+
+import no.usit.fridaws.exception.NotFoundException;
+import no.usit.fridaws.exception.TooManyException;
+
+import org.jboss.resteasy.annotations.cache.Cache;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <p>Arbeider for et prosjekt</p>
+ *
+ * <p>Tjenesten returnerer publikasjoner basert på finansieringskilde.</p>
+ *
+ * @author leivhe
+ * @see https://utv.uio.no/jira/browse/CRISWS-35
+ */
+@Path("/hentArbeiderForProsjekt")
+public class ProsjektArbeid {
+
+ private static final Logger log = LoggerFactory.getLogger(ProsjektArbeid.class);
+
+ /**
+ * Returnerer presentasjonene som er knyttet til et sted.
+ *
+ * @param kilde Hva er prosjektets kilde? F.eks. NFR, EU
+ * @param prosjektId Prosjektets id.
+ * @param fraAr Inkluder kun arbeider med årstall >= fraAr
+ * @param tilAr Inkluder kun arbeider med årstall <= tilAr
+ * @param sortering sorteringsangivelse, se bruker-doc.
+ * @param format "xml" eller "json" for å angi output format
+ * @return en liste med vitenskapelige arbeider
+ *
+ * @see http://localhost:8080/ws/hentArbeiderForProsjekt?kilde=NFR&prosjektnr=191195/v30&kategori=FOREDRAG&kategori=ARTIKKEL&sortering=HOVEDKAT_UNDERKAT_AAR
+ * @see http://localhost:8080/ws/hentArbeiderForProsjekt?kilde=NFR&prosjektnr=191195/v30&kategori=FOREDRAG&kategori=ARTIKKEL
+ * @see http://localhost:8080/ws/hentArbeiderForProsjekt?kilde=NFR&prosjektnr=191195/v30
+ * @see http://localhost:8080/ws/hentArbeiderForProsjekt?kilde=NFR
+ */
+ @GET
+ @Cache(maxAge = 0)
+ public Response hentProsjektarbeid(
+ @QueryParam("kilde") String kilde,
+ @QueryParam("prosjektnr") String prosjektId,
+ @QueryParam("fra") Short fraAr,
+ @QueryParam("til") Short tilAr,
+ @QueryParam("kategori") List<String> kategorier,
+ @QueryParam("format") String format,
+ @QueryParam("sortering") String sortering) {
+
+ log.info("hentProsjektarbeid kilde: "+ kilde + ", prosjektid: " + prosjektId + ", fra: " + fraAr + ", til: " + tilAr);
+
+ if (kategorier != null) {
+ for (String kategori: kategorier) {
+ log.info("hentProsjektarbeid kategori " + kategori);
+ }
+ }
+
+ if (format == null) {
+ format = "xml";
+ } else {
+ format = format.toLowerCase();
+ }
+
+ if ((kilde == null)
+ || (!format.equals("xml") && !format.equals("json"))) {
+ return Response.status(400).build();
+ }
+
+ List<Object> params = new ArrayList<Object>();
+
+ String sFields = "vx.tekst_xml";
+
+ String sql = "select "
+ + " %SFIELDS% "
+// "select va.varbeidlopenr, va.titteltekst_original, va.prosjekt, va.varbeidhovedkatkode, va.varbeidunderkatkode, va.arstall, "
+// + " vp.fornavn||' '||vp.etternavn navn, "
+// + " br.isbn, br.originaltittel, " // bok
+// + " ts.titteltekst, ts.issn, tp.sidenr_fra, tp.sidenr_til " // tidsskriftpublikasjon
+ + " from vitenskapeligarbeid va"
+ + " inner join presentasjon_varbeid pv on pv.varbeidlopenr = va.varbeidlopenr "
+ + " inner join varbeid_xml vx on vx.varbeidlopenr = va.varbeidlopenr "
+ + " inner join presentasjon_kilde pk on pk.presentasjonslopenr = pv.presentasjonslopenr "
+// + " inner join varbeid_person vp on vp.varbeidlopenr = va.varbeidlopenr "
+// + " left outer join bok_rapport br on br.varbeidlopenr = va.varbeidlopenr "
+// + " left outer join tidsskriftpublikasjon tp on tp.varbeidlopenr = va.varbeidlopenr "
+// + " left outer join tidsskrift ts on ts.tidsskriftnr = tp.tidsskriftnr"
+ + " where pk.kildekode=? ";
+ params.add(kilde);
+ // FIXME hent tittel på bok/artikkelsamling/tidsskrift
+ // ISBN
+
+ if (prosjektId != null) {
+ log.info("hentProsjektArbeid legger til prosjektkrav " + prosjektId);
+ sql+= " and va.prosjekt = ? ";
+ params.add(prosjektId);
+ } else {
+ log.info("hentProsjektArbeid legger ikke til prosjektkrav " + prosjektId);
+ }
+
+ if (fraAr != null) {
+ sql += " and pv.arstall >= ? ";
+ params.add(fraAr);
+ }
+ if (tilAr != null) {
+ sql += " and pv.arstall <= ? ";
+ params.add(tilAr);
+ }
+
+ if (kategorier != null && !kategorier.isEmpty()) {
+ StringBuilder katparams = new StringBuilder("(");
+ for (int i = 0; i < kategorier.size() - 1; i++) {
+ katparams.append("?,");
+ // vi trenger params både for hovedkategori ...
+ params.add(kategorier.get(i));
+ }
+ for (String kategori : kategorier) {
+ // ... og underkategori
+ params.add(kategori);
+ }
+ katparams.append("?)");
+ log.info("hentProsjektarbeid katparams bygd: " + katparams);
+ sql += " and (va.varbeidhovedkatkode in "+katparams +" or va.varbeidunderkatkode in " +katparams + ")";
+ }
+
+ if (sortering != null) {
+ String sortpred = lagSortering(sortering);
+ if (sortpred == null) {
+ return Response.status(400).build();
+ }
+ sql += " ORDER BY " + sortpred + " ";
+ }
+
+ try {
+ ResponseStreamer stream = new ResponseStreamer(
+ "http://frida.usit.uio.no/" + "xmlSchema/xsd/frida.xsd",
+ "forskningsresultat", sql, sFields, params, format, "");
+ return Xml.genererXML(format, stream);
+ } catch (TooManyException e) {
+ return Response.status(413).build();
+ } catch (NotFoundException e) {
+ return Response.status(404).build();
+ } catch (Exception e) {
+ return Response.status(500).build();
+ }
+ }
+ private String lagSortering(String sortering) {
+ String mapping[][] = {
+ { "HOVEDKAT_UNDERKAT_AAR", "varbeidhovedkatkode asc, varbeidunderkatkode asc, arstall desc"}
+ };
+ for (int i = 0; i < mapping.length ; i++) {
+ if (mapping[i][0].equals(sortering)) return mapping[i][1];
+ }
+ return null;
+ }
+}
--- /dev/null
+package no.usit.fridaws;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Variant;
+
+import org.jboss.resteasy.annotations.cache.Cache;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <p>Arbeider for et prosjekt</p>
+ *
+ * <p>Tjenesten returnerer publikasjoner basert på finansieringskilde.</p>
+ *
+ * @author leivhe
+ * @see https://utv.uio.no/jira/browse/CRISWS-35
+ */
+@Path("/hentArbeiderForProsjektEgenXML")
+public class ProsjektArbeidEgenXML {
+
+ private static final Logger log = LoggerFactory.getLogger(ProsjektArbeidEgenXML.class);
+
+ /**
+ * Returnerer presentasjonene som er knyttet til et sted.
+ *
+ * @param kilde Hva er prosjektets kilde? F.eks. NFR, EU
+ * @param prosjektId Prosjektets id.
+ * @param fraAr Inkluder kun arbeider med årstall >= fraAr
+ * @param tilAr Inkluder kun arbeider med årstall <= tilAr
+ * @param sortering sorteringsangivelse, se bruker-doc.
+ * @param format "xml" eller "json" for å angi output format
+ * @return en liste med vitenskapelige arbeider
+ *
+ * @see http://localhost:8080/ws/hentArbeiderForProsjekt?kilde=NFR&prosjektnr=191195/v30&kategori=FOREDRAG&kategori=ARTIKKEL&sortering=HOVEDKAT_UNDERKAT_AAR
+ * @see http://localhost:8080/ws/hentArbeiderForProsjekt?kilde=NFR&prosjektnr=191195/v30&kategori=FOREDRAG&kategori=ARTIKKEL
+ * @see http://localhost:8080/ws/hentArbeiderForProsjekt?kilde=NFR&prosjektnr=191195/v30
+ * @see http://localhost:8080/ws/hentArbeiderForProsjekt?kilde=NFR
+ */
+ @GET
+ @Cache(maxAge = 0)
+ public Response hentProsjektarbeid(
+ @QueryParam("kilde") String kilde,
+ @QueryParam("prosjektnr") String prosjektId,
+ @QueryParam("fra") Short fraAr,
+ @QueryParam("til") Short tilAr,
+ @QueryParam("kategori") List<String> kategorier,
+ @QueryParam("format") String format,
+ @QueryParam("sortering") String sortering) {
+
+ log.info("hentProsjektarbeid kilde: "+ kilde + ", prosjektid: " + prosjektId + ", fra: " + fraAr + ", til: " + tilAr);
+
+ if (kategorier != null) {
+ for (String kategori: kategorier) {
+ log.info("hentProsjektarbeid kategori " + kategori);
+ }
+ }
+
+ if (format == null) {
+ format = "xml";
+ } else {
+ format = format.toLowerCase();
+ }
+
+ if ((kilde == null)
+ || (!format.equals("xml") && !format.equals("json"))) {
+ return Response.status(400).build();
+ }
+
+ String sql = "select va.varbeidlopenr, va.titteltekst_original, va.prosjekt, va.varbeidhovedkatkode, va.varbeidunderkatkode, va.arstall, "
+ + " vp.fornavn||' '||vp.etternavn navn, "
+ + " br.isbn, br.originaltittel, " // bok
+ + " ts.titteltekst, ts.issn, tp.sidenr_fra, tp.sidenr_til " // tidsskriftpublikasjon
+ + " from vitenskapeligarbeid va"
+ + " inner join presentasjon_varbeid pv on pv.varbeidlopenr = va.varbeidlopenr "
+ + " inner join presentasjon_kilde pk on pk.presentasjonslopenr = pv.presentasjonslopenr "
+ + " inner join varbeid_person vp on vp.varbeidlopenr = va.varbeidlopenr "
+ + " left outer join bok_rapport br on br.varbeidlopenr = va.varbeidlopenr "
+ + " left outer join tidsskriftpublikasjon tp on tp.varbeidlopenr = va.varbeidlopenr "
+ + " left outer join tidsskrift ts on ts.tidsskriftnr = tp.tidsskriftnr"
+ + " where pk.kildekode=? ";
+
+ // FIXME hent tittel på bok/artikkelsamling/tidsskrift
+ // ISBN
+
+ if (prosjektId != null) {
+ log.info("hentProsjektArbeid legger til prosjektkrav " + prosjektId);
+ sql+= " and va.prosjekt = ? ";
+ } else {
+ log.info("hentProsjektArbeid legger ikke til prosjektkrav " + prosjektId);
+ }
+
+ if (fraAr != null) {
+ sql += " and pv.arstall >= ? ";
+ }
+ if (tilAr != null) {
+ sql += " and pv.arstall <= ? ";
+ }
+
+ if (kategorier != null && !kategorier.isEmpty()) {
+ StringBuilder katparams = new StringBuilder("(");
+ for (int i = 0; i < kategorier.size() - 1; i++) {
+ katparams.append("?,");
+ }
+ katparams.append("?)");
+ log.info("hentProsjektarbeid katparams bygd: " + katparams);
+ sql += " and (va.varbeidhovedkatkode in "+katparams +" or va.varbeidunderkatkode in " +katparams + ")";
+ }
+
+ if (sortering != null) {
+ String sortpred = lagSortering(sortering);
+ if (sortpred == null) {
+ return Response.status(400).build();
+ }
+ sql += " ORDER BY " + sortpred + " ";
+ }
+
+ StringBuilder output = new StringBuilder(4000);
+ MediaType outputFormat = MediaType.APPLICATION_XML_TYPE;
+ if (format.equals("json")) {
+ outputFormat = MediaType.APPLICATION_JSON_TYPE;
+ }
+ output.append("<prosjektarbeider>");
+ Connection conn = null;
+ Arbeider arbeider = new Arbeider();
+ try {
+ conn = Database.getConnection();
+ PreparedStatement stmt = conn.prepareStatement(sql);
+ log.info("hentProsjektArbeid() har conn for " + sql);
+ int index = 1;
+ stmt.setString(index++, kilde);
+ if (prosjektId != null) {
+ stmt.setString(index++, prosjektId);
+ }
+ if (fraAr != null) {
+ stmt.setShort(index++, fraAr);
+ }
+ if (tilAr != null) {
+ stmt.setShort(index++, tilAr);
+ }
+ if (kategorier != null && !kategorier.isEmpty()) {
+ for (String kategori : kategorier) { // hovedkat
+ stmt.setString(index++, kategori);
+ }
+ for (String kategori : kategorier) { // underkat
+ stmt.setString(index++, kategori);
+ }
+ }
+ log.info("hentProsjektArbeid() " + sql + ", parametre: " + index);
+ ResultSet rs = stmt.executeQuery();
+ int results = 0;
+ while (rs.next()) {
+ results++;
+
+ arbeider.leggTilEllerOppdaterArbeid(rs.getInt(1),
+ rs.getString(2),
+ rs.getString(3),
+ kilde,
+ rs.getString(4),
+ rs.getString(5),
+ rs.getInt(6),
+ rs.getString(7),
+ rs.getString(8),
+ rs.getString(9),
+ rs.getString(10),
+ rs.getString(11),
+ rs.getString(12),
+ rs.getString(13));
+ }
+ log.info("hentProsjektArbeid return count" + results + ", arbeider " + arbeider.size());
+
+ } catch (SQLException e) {
+ Database.loggFeil(e);
+ } finally {
+ try {
+ if (conn != null) conn.close();
+ } catch (SQLException e) {
+ Database.loggFeil(e);
+
+ }
+ }
+
+
+
+
+ // til slutt, begrens antall: (dette maa gjoeres sist)
+ // FEILSITUASJON - returnerer 413 uansett om det er for mange
+ // sql = "select tekst_xml from (" + sql + ") where ROWNUM <= 1001";
+
+
+ return Response
+ .status(200)
+ .entity(arbeider.toXml())
+ .variant(new Variant(outputFormat, new java.util.Locale("no_NO"), null)).build();
+
+
+ }
+
+ private String lagSortering(String sortering) {
+ String mapping[][] = {
+ { "HOVEDKAT_UNDERKAT_AAR", "varbeidhovedkatkode asc, varbeidunderkatkode asc, arstall desc"}
+ };
+ for (int i = 0; i < mapping.length ; i++) {
+ if (mapping[i][0].equals(sortering)) return mapping[i][1];
+ }
+ return null;
+ }
+
+ private static String escapeXML(String input) {
+ return input.replace("&", "&");
+ }
+
+ final private class Arbeider {
+ Hashtable<Integer,Arbeid> arbeider = new Hashtable<Integer,Arbeid>();
+ List<Integer> sortertenokler = new ArrayList<Integer>();
+ void leggTilEllerOppdaterArbeid(int arbeidnr, String prosjektId, String kilde, String tittel,
+ String hovedkat, String underkat, int arstall, String forfatter, String isbn, String bokTittel, String tidsskriftTittel, String issn, String startside, String sluttside) {
+ if (arbeider.containsKey(arbeidnr)) {
+ arbeider.get(arbeidnr).oppdater(forfatter);
+ } else {
+ Arbeid arbeid = null;
+ if (Arbeid.arbeidtype.BOK.toString().equals(hovedkat)) {
+ arbeid = new Bok(arbeidnr,prosjektId,kilde,tittel,hovedkat,underkat,arstall, isbn, bokTittel);
+ } else if (Arbeid.arbeidtype.TIDSSKRIFTPUBL.toString().equals(hovedkat)) {
+ arbeid = new TidsskriftPublikasjon(arbeidnr,prosjektId,kilde,tittel,hovedkat,underkat,arstall,tidsskriftTittel, issn, startside, sluttside);
+ } else {
+ arbeid = new Arbeid(arbeidnr,prosjektId,kilde,tittel,hovedkat,underkat,arstall);
+ }
+ arbeid.oppdater(forfatter);
+ arbeider.put(arbeidnr, arbeid);
+ sortertenokler.add(arbeidnr);
+ }
+ }
+ String toXml() {
+ StringBuilder sb = new StringBuilder(4000);
+ sb.append("<prosjektarbeider>");
+ for (Integer nokkel : sortertenokler) {
+ arbeider.get(nokkel).toXml(sb);
+ }
+ sb.append("</prosjektarbeider>");
+ return sb.toString();
+ }
+ int size() {
+ return sortertenokler.size();
+ }
+ }
+ protected static class Arbeid {
+ enum arbeidtype {
+ TIDSSKRIFTPUBL,BOK
+ }
+
+ int arbeidnr;
+ String prosjektId;
+ String kilde;
+ String tittel;
+ String hovedkat;
+ String underkat;
+ int arstall;
+ List<String> forfattere = new ArrayList<String>();
+ arbeidtype type;
+
+ Arbeid(int arbeidnr, String tittel, String prosjektId, String kilde, String hovedkat, String underkat, int arstall) {
+ log.info("Arbeid " + arbeidnr);
+ this.arbeidnr = arbeidnr;
+ this.prosjektId = prosjektId;
+ this.kilde = kilde;
+ this.tittel = tittel;
+ this.hovedkat = hovedkat;
+ this.underkat = underkat;
+ this.arstall = arstall;
+
+ if ("TIDSSKRIFTPUBL".equals(hovedkat)) {
+ type = arbeidtype.TIDSSKRIFTPUBL;
+ } else if ("BOK".equals(hovedkat)) {
+ type = arbeidtype.BOK;
+ }
+ }
+
+ void toXml(StringBuilder sb) {
+ sb.append("<arbeid>");
+ sb.append("<lopenr>" + arbeidnr+ "</lopenr>");
+ sb.append("<tittel>" + escapeXML(tittel)+ "</tittel>");
+ sb.append("<prosjektnr>" + prosjektId+ "</prosjektnr>");
+ sb.append("<kilde>" + kilde+ "</kilde>");
+ if (hovedkat != null) { sb.append("<hovedkat>" + hovedkat+ "</hovedkat>"); }
+ if (underkat != null) { sb.append("<underkat>" + underkat+ "</underkat>"); }
+ sb.append("<arstall>" + arstall+ "</arstall>");
+ if (type != null) {
+ sb.append(getArbeidsTypeXml());
+ }
+ sb.append("<forfattere>");
+ for (String forfatter : forfattere) {
+ sb.append("<forfatter>"+forfatter+"</forfatter>");
+ }
+ sb.append("</forfattere>");
+ sb.append("</arbeid>");
+ }
+
+ String getArbeidsTypeXml() {
+ return "";
+ }
+
+ void oppdater(String forfatter) {
+ log.info("oppdater " + forfatter);
+ forfattere.add(forfatter);
+ }
+ }
+ private static class Bok extends Arbeid {
+
+ String isbn;
+ private String bokTittel;
+
+ Bok(int arbeidnr, String tittel, String prosjektId, String kilde,
+ String hovedkat, String underkat, int arstall, String isbn, String bokTittel) {
+ super(arbeidnr, tittel, prosjektId, kilde, hovedkat, underkat, arstall);
+ this.isbn = isbn;
+ this.bokTittel = bokTittel;
+ }
+ @Override
+ String getArbeidsTypeXml() {
+ final StringBuilder sb = new StringBuilder("<bok>");
+ if (isbn != null) {
+ sb.append("<isbn>"+isbn+"</isbn>");
+ }
+ if (bokTittel != null) {
+ sb.append("<tittel>" + bokTittel + "</tittel>");
+ }
+ sb.append("</bok>");
+ return sb.toString();
+ }
+ }
+ private static class TidsskriftPublikasjon extends Arbeid {
+ String tidsskriftTittel;
+ String issn;
+ String startside;
+ String sluttside;
+ public TidsskriftPublikasjon(int arbeidnr, String tittel, String prosjektId, String kilde,
+ String hovedkat, String underkat, int arstall,
+ String tidsskriftTittel, String issn, String startside, String sluttside) {
+ super(arbeidnr, tittel, prosjektId, kilde, hovedkat, underkat, arstall);
+ this.issn = issn;
+ this.tidsskriftTittel = tidsskriftTittel;
+ this.startside = startside;
+ this.sluttside = sluttside;
+ }
+ @Override
+ String getArbeidsTypeXml() {
+ final StringBuilder sb = new StringBuilder("<tidsskrift>");
+ sb.append("<tittel>"+ tidsskriftTittel +"</tittel>");
+ if (issn != null) sb.append("<issn>"+ issn +"</issn>");
+ if (startside != null) sb.append("<startside>"+ startside +"</startside>");
+ if (sluttside != null) sb.append("<sluttside>"+ sluttside +"</sluttside>");
+ sb.append("</tidsskrift>");
+ return sb.toString();
+ }
+
+ }
+}