]> git.uio.no Git - cristin-ws.git/commitdiff
to-test CRISWS-35 to alternative implementasjoner for prosjekt-publikasjoner
authorleivhe <leivhe@2f9550fd-014c-0410-b3b6-800000000000>
Thu, 20 Sep 2012 07:40:55 +0000 (07:40 +0000)
committerleivhe <leivhe@2f9550fd-014c-0410-b3b6-800000000000>
Thu, 20 Sep 2012 07:40:55 +0000 (07:40 +0000)
git-svn-id: svn+ssh://svn.usit.uio.no/svnroot/fagpersonweb/trunk/frida-ws@4177 2f9550fd-014c-0410-b3b6-800000000000

src/no/usit/fridaws/ProsjektArbeid.java [new file with mode: 0644]
src/no/usit/fridaws/ProsjektArbeidEgenXML.java [new file with mode: 0644]

diff --git a/src/no/usit/fridaws/ProsjektArbeid.java b/src/no/usit/fridaws/ProsjektArbeid.java
new file mode 100644 (file)
index 0000000..ce2c807
--- /dev/null
@@ -0,0 +1,163 @@
+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;
+    }
+}
diff --git a/src/no/usit/fridaws/ProsjektArbeidEgenXML.java b/src/no/usit/fridaws/ProsjektArbeidEgenXML.java
new file mode 100644 (file)
index 0000000..1e19dea
--- /dev/null
@@ -0,0 +1,369 @@
+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("&", "&amp;");
+       }
+
+    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();
+        }
+
+    }
+}