moravianlibrary / kramerius

GNU General Public License v3.0
1 stars 1 forks source link

API generování PDF #8

Closed leiblix closed 8 years ago

leiblix commented 9 years ago

Endpoint v API, přes které půjde vygenerovat PDF.

Parametrem je seznam uuid, v případě jiného modelu než page, se přihodí i potomci

leiblix commented 9 years ago

Toto už v Krameriu je, jenom se to zřejmě zapomnělo zdokumentovat.

https://github.com/ceskaexpedice/kramerius/blob/master/rest/src/main/java/cz/incad/kramerius/rest/api/k5/client/pdf/PDFResource.java

honza-rychtar commented 9 years ago

Muzes to prosim trochu popsat. Koukal jsem na to nepodarilo se mi stahnout pdf pres napr. http://kramerius.mzk.cz/search/api/v5.0/pdf/parent?pid=uuid:530719f5-ee95-4449-8ce7-12b0f4cadb22&numer=2

leiblix commented 9 years ago

Promiň, myslel jsem, že to bude fungovat o něco líp, já to neimplementoval. Dokumentace k tomu není, vidím taky jenom tento kód. Popíš ti to později, dnes už stíhám akorát přiložit stacktrace

V 27, 2015 2:51:42 ODP. cz.incad.kramerius.rest.api.k5.client.pdf.PDFResource parent
SEVERE: null
java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:454)
    at java.lang.Integer.parseInt(Integer.java:527)
    at cz.incad.kramerius.rest.api.k5.client.pdf.PDFResource.parent(PDFResource.java:195)
    at sun.reflect.GeneratedMethodAccessor1122.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
    at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178)
    at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62)
    at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
    at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at cz.incad.Kramerius.CORSFilter.doFilter(CORSFilter.java:32)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at cz.incad.Kramerius.security.basicauth.AuthFilter.basicAuth(AuthFilter.java:125)
    at cz.incad.Kramerius.security.basicauth.AuthFilter.doFilter(AuthFilter.java:86)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:589)
    at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:394)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291)
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
    at java.lang.Thread.run(Thread.java:744)
honza-rychtar commented 9 years ago

Ok,

chyba v tom stacktracu by mela nastat jen pokud nevyplnim parametr number. Pokud ho vyplnim, tak bude chyba jinde.

Kazdopadne takto to spadlo na pekne veci: if (number == null || number.trim().equals("")) number = "" + (Integer.parseInt(number) - 1);

Kdyz je number null, tak ho pojdme parsovat jako integer :) Hold Java neni Javascript :)

leiblix commented 9 years ago

Heh :)

Jinak už vidím proč ten tvůj odkaz nefunguje, máš tam překlep /s/numer/number/

http://kramerius.mzk.cz/search/api/v5.0/pdf/parent?pid=uuid:530719f5-ee95-4449-8ce7-12b0f4cadb22&number=2 funguje :-)

honza-rychtar commented 9 years ago

Jej :) Super, diky.

Vola se tam checkNumber(String number) z https://github.com/ceskaexpedice/kramerius/blob/master/rest/src/main/java/cz/incad/kramerius/rest/api/k5/client/pdf/AbstractPDFResource.java

Kontroluje se, ze number nepresahlo limit, ktery si predpokladam nastavuje admin kazdeho Krameria sam. Zjistim nejak tento limit? Pokud jeden Kramerius ma limt 100 a jiny Kramerius limit 200. Tak jak to mam v klientovi omezit? Mohl by byt dotaz na ty properties - nevim co tam je, citlive informace by se posilat nemely, ale tyhle konfiguracni hodnoty, ktere by se mely promitnout do UI by mely byt pres API dostupne.

Mozna by taky bylo dobre opravit tu podivnost tady: https://github.com/ceskaexpedice/kramerius/blob/master/rest/src/main/java/cz/incad/kramerius/rest/api/k5/client/pdf/PDFResource.java#L195

A misto toho (pokud neni vyplneny parametr number) vygenerovat pdf pro cely dokument. V klientovi budu vzdy number zadavat (pocet stranek znam a chci to mit pod kontrolou), ale opravit by se to mohlo.

leiblix commented 9 years ago

V Incad klientovi obchází API a naplní si patřičný skript v šabloně zde https://github.com/moravianlibrary/kramerius/blob/master/client/src/main/webapp/WEB-INF/html_header.vm

Samozřejmě to má být v API....takto toho klienta nejde plně implementovat

Mohl by byt dotaz na ty properties - nevim co tam je, citlive informace by se posilat nemely, ale tyhle konfiguracni hodnoty, ktere by se mely promitnout do UI by mely byt pres API dostupne.

v 90 % to citlivé hodnoty jsou, buď to jsou hesla, nebo různé cesty a jiná interní nastavení. Myslím, že nebude vadit, že těch pár zajímavých konfiguračních direktiv přidáme do #11

honza-rychtar commented 9 years ago

Nakonec pouzivam tu druhou metodu pro generovani PDF ii) api/v5.0/pdf/selection?pids=PID_ARRAY protoze potrebuju mit moznost vybrat stranky OD - DO nebo vygenerovat PDF pro jednu konkretni stranku. Nevyhoda je, ze musim explicitne vyjmenovat vsechny stranky v pids parametru a url tak muze byt moc dlouhe, u 150 stranek (pids parametr v url ma delku 150*48-1=7199) uz to haze: 413 (Request Entity Too Large)

i) api/v5.0/pdf/parent?pid=PARENT_PID&number=N dovoluje vygenerovat jen prvnich N stranek. Chtelo by to u teto metody pridat parametr offset: api/v5.0/pdf/parent?pid=PARENT_PID&number=N&offset=O pro vygenerovani N po sobe jdoucich stranek pocinaje strankou O Je tam sice parametr firstPageType, ale ten resi neco jineho.

V tuhle chvili neni napriklad mozne z 500 strankoveho dokumentu vygenerovat PDF se strankami 100 - 300 Dalsi moznosti by bylo volani ii) pres POST a nepredavat tak pids array v url

Uzivateli nabizim 3 moznosti u generovani PDF - treti moznost bych za stavajicich podminek musel omezit na maximalni rozsah 100 stran. Pokud by se to vyzadovalo, tak bych jeste pridal 4. moznost, kdy si uzivatel vybere stranky libovolne. snimek obrazovky porizeny 2015-05-30 13 06 59