Moi,
tuli ongelma toimittjan kanssa USA:ta joka toimittaa Intialaisia koodreita eli ne väärinymmärisi mikä on tilaus ja antoi tarjouksen että 3 koodaria pitää resursoida (Front-end, Back-end, AI/ML-asiantuntia) ja nämä paiskisivat kokopäivätyötä 2 kk putkeen hintaan 25 € / tunti ja koko projeksi maksaisi 23000 € yhteensä.
Eli nyt parantelin tilausta mikä se on! Se siis ei ole koko sovelluken toiminnallisuuden saamista kuntoon vaan yhden koodirivin tomimaan saaminen, joka on kiinni vain pom.xml-tiedoston asetuksista eikä muusta.
package fi.i4ware.dark; import com.atlassian.activeobjects.external.ActiveObjects; import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper; import org.apache.struts2.dispatcher.multipart.MultiPartRequest; import org.apache.struts2.dispatcher.multipart.UploadedFile; import com.atlassian.xwork.FileUploadUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.MultipartConfig; import java.io.File; import java.io.IOException; import java.util.List; // Annotate the servlet with @MultipartConfig to handle file uploads @MultipartConfig( location = "/tmp", // Temporary directory to store uploaded files fileSizeThreshold = 5 * 1024 * 1024, // 5 MB maxFileSize = 10 * 1024 * 1024, // 10 MB maxRequestSize = 20 * 1024 * 1024 // 20 MB ) public class CaptureUploadServlet extends HttpServlet { private static final Logger logger = LogManager.getLogger(CaptureUploadServlet.class); private static final String UPLOAD_DIRECTORY = "/tmp"; private final ActiveObjects ao; public CaptureUploadServlet(ActiveObjects ao) { this.ao = ao; } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); if (request instanceof MultiPartRequestWrapper) { // THE ORDER IS ONLY TO GET THIS LINE OF SOURCE CODE TO WORK IN THE ATLASIAN CONFLUENCE 8.6.0 API ENVIRONMENT: https://docs.atlassian.com/ConfluenceServer/javadoc/8.6.0/ MultiPartRequestWrapper multiPartRequestWrapper = FileUploadUtils.unwrapMultiPartRequest(request); logger.info("Processing upload successfully"); // WHEN LINE ABOVE IS WORKING, THEN THIS PROJECT IS COMPLETE IN YOUR SIDE AND EXPERT FULL STACK DEVELOPET AND SOFTWARE ARCHITECT MATTI KIVIHAR AT I4WARE SOFTWARE CAN CONTINUE THE WORK, THANK YOU! // AND YOUR HELP IS APPRECIATED, THANK YOU! AND HAVE A NICE DAY! YOUR SKILLS-SET IS NOT NEEDED ANYMORE, THANK YOU! // ISSUE: ONLY IN pom.xml: <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.26</version> </dependency> // ISSUE: LINE 39: import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper; NOT WORKING IN ATLASIAN CONFLUENCE 8.6.0 API ENVIRONMENT BY MISSING JAR FILE // (<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.26</version> </dependency>) IN IMPORT PACKAGES IN pom.xml DEPENDENCIES } else { logger.error("Error processing upload"); return; } } }
Miten vielä parantaisin tilausta jotta varmasti menee jakeluun?
Paljonko maksat avusta? Laitetaanko 120e/h?
Varmaan homman avain on se, että tilaus on edes selvästi määritelty. Nythän oman selityksesi mukaan et ole varsinaisesti edes tilaamassa lähdekoodia vaan tukea projektin asetuksiin tai kirjaston asennukseen tms.
Voi hyvin olla kannattavampaa palkata joku suomalainen kuten jlaire tai Grez tekemään nämä asetukset kovalla tuntihinnalla, vrt. että ulkomainen firma käyttää hieman kömpelöllä englannilla kirjoitetun epäselvän tilauksen selvittelyyn niin monta tuntia työaikaa, että tarjoushinta tulee kattamaan useita tunteja hallinnollista työtä, vaikka intialaiselta koodarilta menisi esim. 30 min itse asiaan. Siis olettaen, että käsityksesi ongelman laajuudesta on jotenkin kohdallaan.
Metabolix kirjoitti:
(14.07.2024 10:23:05): Varmaan homman avain on se, että tilaus...
Jaa.. ei ne Intialaiset et ymmärtäneet Suomen aksetilla sanottuja numeroita kunnolla kuten Twelve eli 12 (tämän ne ymmärsivät numeroksi 20).
Olen jo itse selvittänyt ettei Struts 2 ole edes asentunut koko projektiin ja jos laitta scopen pom.xml tiedstossa compile niin koko jar paketin asennus Conflunece 8.9.1 ei onnistu.
Ja suuret ongelmat alkoivat kun asensin tähän koko projektiin Pusher HTTP -systeemin. Koko projetki piti ensin kääntää GrallVM JDK:lla että sun.tools.jar saatin aseneetua paikalliseen Maven 3 repoon ja tämän jälkeen Oracle JDK 17:ta eli virallisella eikä OpenJDK:lla. Ja piti tuntikaupalla laittaa asetuksia pom.xml-tiedoston sahaded-maven plugariin.
https://mvnrepository.com/artifact/com.pusher/
Tuntihinata 120 € + AVL 24 % on hävä hinta.
Tilaajaa on varmasti mahdotonta miellyttää mitenkään, jos on niin harhainen, että kertoo itselleen kyseen olevan vain "yhden rivin korjaamisesta", vaikka yllä olevasta koodista näkee selkeästi ongelman laadun.
Struts-core 2.5.26 on neljä vuotta vanha päivitys peräti kahdeksan(++) vuotta vanhalle julkaisulle. (Versio 2.5 on julkaistu alun perin vuonna 2016. Struts 2.0 on vuoden 2006 peruja...)
Uusin versio on 6.4, joten tuo vanhempi versio on varmasti epäyhteensopiva modernin softan kanssa ja siitä nämä ongelmat johtuvat.
Kirjaston päivittäminen voi vaatia reilusti työtunteja, kun kaikki vanha paska pitää kirjoittaa uusiksi. Pahimmassa tapauksessa se tarkoittaa myös ap:n oman koodin refaktorointia.
Minua hävettäisi edes pyytää työtarjousta "yhden rivin korjaamiseksi", kun sokea apinakin näkee jo tuosta yllä olevasta snippetistä, että kyse on jostain ihan muusta.
muuskanuikku kirjoitti:
(14.07.2024 12:24:24): Tilaajaa on varmasti mahdotonta miellyttää...
Ei aliarvioda muita kiitos. Ongalma voi olla, että Confluence API sisältää jotain sellaista ettei homma toimi. Confleunce API:ssa on omat kirjasot jo valmiiksi ja se on Atlassian Pty Ltd:n tekemä ja siinä on mm. estetty monien 3. osapuolen kirjastojen tomiminen kokokaan tietoturvasyistä, jne.
Minä olen tehnyt ja koodaillut Confluence/Jira-plugareita jo vuodesta 2004 eli vuodesta kun Atlassian on perusstetu.
Niin ja projektin Sturuts 2 on 6.4.
walkout_ kirjoitti:
(14.07.2024 12:31:23): ”– –” Ei aliarvioda muita kiitos. Ongalma voi olla...
Kyllä, todennäköisesti vika ei ole suoraan Apache Strutsissa vaan jossain Strutsin ja Confluencen yhteidessä riippuvuudessa. Struts haluaa jonkin muinaisen version kolmannen osapuolen kirjastosta ja Confluence jotain uudempaa.
Se ei muuta mitenkään ongelman luonnetta. Struts on pakko päivittää ja kaikki yhteensopivuusongelmat ja päivityksestä seuraavat regressiot korjattava.
walkout_ kirjoitti:
Niin ja projektin Sturuts 2 on 6.4.
Minä en ole javakoodari niin en tiedä, että mikä tämä pom.xml on ja mihin kirjastoon se liittyy. Siellä on kuitenkin selkeästi speksattu versio 2.5.26, ja siitä nämä ongelmat johtuvat. Ratkaisu on päivittää tämä kyseinen vanhentunut komponentti.
muuskanuikku kirjoitti:
(14.07.2024 12:36:07): ”– –” Minä en ole javakoodari niin en tiedä, että...
pom.xml on vain koko projektin asetustiedosto jossa määritellään siihen kaiki lähdekoodin kääntämiseen liittyvät asetukset kuten mikä Java JDK -versio, API-kirjastot, jne.
Niin ja olen lukenut keskusteluita Atlassian Developer Communitystä, että monilla on sama ongelma ettei tämä toimi lainkaan React 18 -käyttöliittymän tekemien tiedostouploadien kanssa. Eli tulee vierheilmoitus 400 Bad Request - This is not MultiPartRequest.
No ni.. ratkaisu löytyi Googlettamalla: https://community.atlassian.com/t5/Confluence-questions/Upload-attachment-using-REST-API/qaq-p/458998#M77680
Eli ei koodata omaa Java-koodia hommaan vaan käytetään REST:iä ja muokataan muutama rivi React 18 -frontissa.
Nyt ainakin todistin ettei hommaan tarvita 3 koodari paiskimaan vain parissa 2 kk putkeen kokopäivätyötä jolloin työtunteja kertyisi 3x160 kpl per kk.
walkout_ kirjoitti:
(15.07.2024 00:59:20): No ni.. ratkaisu löytyi Googlettamalla: ...
Tuon mukaanhan ratkaisu on pikemminkin se, ettei käytetä "REST:iä" (eli oletettavasti itse kyhättyjä JSON-palleroita) vaan aivan tavallista standardia HTTP-pyyntöä ja liitetiedostoa, jolloin data kulkee JSON-palleron sijaan lomakedatana.
"REST" ei tarkoita mitään muuta kuin että backendin endpointeilla on tietynlainen url ja että käytetään eri HTTP-metodeja (GET/POST/PUT/DELETE/PATCH) tarkoituksen mukaisesti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.