Zabawa refleksją cz. 1: wyciąganie randomowych fieldów, Java 8 Style

Ostatnio tworzyłem szkielet aplikacji bazodanowej, którą wymagała sporej ilości mockowych danych służących do testów. Załużmy, że chcemy sobie coś potestować i potrzebujemy randowe Stringi reprezentujące różne rodzaje danych, przykładowo Modele samochodów, laptopów, imiona, nazwiska itp. Można by stworzyć listy tych danych – każdą osobno i wyciągać z nich randowe Stringi – a można troszkę bardziej się pomęczyć i później mieć już z górki :) Zakładam, że danę będą wciąż się zmieniały i będą też dochodziły nowe typy, więc łatwa edycja i dodawanie kolejnych typów musi być łatwe, szybki i przyjemne. Plan jest taki – wstawiamy sobie pola oznaczone jako private static final do jednek klasy, w tej samej klasie tworzymy enum, który deklaruje typ (samochód, laptop) i … to wszystko. Później tworzymy jedną metodę, która wyciąga nam radomową wartość reprezentującą typ zdefiniowany w eunumie. Podchodząc interfejsowo chcemy mieć dokładnie taką metodę:

public String getRandomValue (Type type);

Nasze typu są zdefiniowane w jednej klasie, na dodatek prywatne, żeby niepotrzebnie nbie były widoczne w całej aplikacji. Dodatkowo posłużymy się lambdami i Streap api. Brzmi ciekawie ? Do roboty :)

Continue reading

Kompilacja Klasy ze Stringa w trakcie runtime’u ? Dlaczego nie!

Java to język, który bazuje na kompilowanych klasach, czyli plikach typu .class, które zawierają kod bajtowy. Proces zawsze wygląda tak samo – najpierw kompilacja, później runtime (JVM). A co, gdybyśmy w trakcie runtie’u kompilowali kolejne klasy ? A co jeśli te klasy zawierają dodatkowo zależności (.jar)? Jest to jak najbardziej wykonalne! Załużmy, że mamy taką klasę – w postaci Stringa – i chcemy ją skompilować:

package pl.javaprogramming.test;

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class MyTest
{
    @Test
    public void multiplicationOfZeroIntegersShouldReturnZero() {

        assertEquals(\"10 x 0 must be 0\", 0, 10 * 0);
}
}

W Javie dosłownie wszystko jest obiektem: konstuktory są obiektami, metody klas są obiektami, nawet metody statyczne są obiektami obiektu class danej klasy! Nie dziwi więc, że obiektem jest również kompilator. Jak od razu widać ta klasa zawiera zależność w postaci pakietu org.junit. Załużmy, że pakiet ten nie został zaimportowany do projektu, więc kompilator nie wie co to org.junit.Assert.assertEquals ani org.junit.Test. Co więc musimy zrobić ? Pakiet musimy pobrać (https://github.com/junit-team/junit/wiki/Download-and-Install) i umieścić w wybranym przez siebie folderze. Następnie bierzemy się do dzieła :)
Continue reading

Nauka podstaw JavaScript

Sytuacja mnie zmusiła (zupełnie przypadkowo) do nauki języka JavaScript jako dodatkowego języka używanego przy nowym projekcie :) W najbliższym czasie postaram się opublikować porównanie obydwu języków. Moje wstępne wnioski są podstawą do stworzenia programu, który sprawdza, czy podany kod to JavaScript :)


public abstract class JavaScriptDetector {

    public boolean isItJavaScript(String code) {

        if (this.makesSense(code)) {
            return false; // nope, it must be Java
        } else {
            return true; // makes no sense ? it's JavaScript fore sure!
        }

    }

    abstract boolean makesSense(String code); // implement however you want ...
}

Java 8 Date: utrwalanie nowej daty w bazie danych za pomocą JPA.

Wraz z nową wersją Javy 8 pojawiło się zupełnie nowe, lepsze Date-Time API. Twórcy Javy tworząc nowe obiekty reprezentujące czas wyzbyli się wszytkich problemów i niedogodności związanych z klasą Date poprzednich edycji Javy. Jak się jednak zachowa JPA przy próbie utrwalenia nowej daty ? Przewidywalnie – dane utrwalą się jako dane binarne (czyli jak zwykły obiekt), bowiem JPA nie rozpoznaje nowych obiektów LocalDate, czy też LocalDateTime etc i nie konwertuje ich do formatu, który przyjmuje baza danych. Jak rozwiązać ten problem ?

Continue reading

BigDecimal i “auto rounding mode”

Klasa BigDecimal powstała jako uzupełnienie m.in typu double, który nadaje się doskonale do precyzyjnych obliczeń, jednak nie bardzo przydaje się w aplikacjach biznesowych. Wraz z klasą BigDecimal pojawiły się dwie użyteczne funkcjonalności: scale oraz rounding mode (http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html). Spotkałem się ostatnio z dosyć nietypowym problemem, którego nie rozwiązuje klasa BigDecimal: Co w sytuacji, gdy chcemy, aby skala (liczba miejsc po przecinku) była dostosowywana automatycznie według naszego wzorca ?

Continue reading

JPA + Hibernate (provider): ORM, czyli mapujemy obiekty w relacji “OneToOne”

Zajmowaliśmy się już “ręcznym” mapowaniem obiektów przy użyciu JDBC, teraz czas na mapowanie automatyczne. Z pomocą przychodzi standard JPA (Java Persistence Api) wraz z dostawcą usługi w postaci Hibernatee. Za pomocą adnotacji w łatwy i przyjemny sposób skonfigurujemy nasze podstawowe obiekty encji, nastepnie zapełnimy je danymi i automatycznie utworzymy ich odwzorowanie w postaci tabelek w bazie danych wraz z zawartością. Kolejnym etapem będzie pobieranie wszystkich danych z bazy jako obiekty, wykonanie na nich kilku operacji i utrwalenie wyniku działań z powrotem w bazie. Ostatnim elementem będzie pobranie wybranych elementów z bazy danych z pomocą zapytania JPQL Query z JOIN-em dwóch tabelek.

Continue reading

Jak policzyć ilość wyrazów w stringu na wiele różnych sposobów

Bardzo lubię bloga poświęconego Javie, prowadzonego przez Javina Paula. Pojawił się w nim dość standardowy i podstawowy problem liczenia ilości wyrazów w stringu –> http://javarevisited.blogspot.com/2015/02/how-to-count-number-of-words-in-string.html Mozliwych rozwiązań jest wiele, lecz wszystko opiera się o jedną prostą zasadę – wyrazy w tekście zawsze oddzielone sa znakiem spacji. Ku mojemu zaskoczeniu jeden z moich “idoli” Javy popełnił w swoim rozwiązaniu spory błąd. Jak już przeczytałem artykuł postanowiłem oprócz poprawienia jego pomyłki stworzyć kilka własnych rozwiązań tego problemu.

Continue reading

File Splitter ? Zróbmy własny !

Na rynku istnieje wiele fajnych, darmowych programów do dzielenia plików. Posiadają szereg użytecznych opcji. A może by tak napisać własny ? Nasz File Splitter będzie posiadał takie cechy:

– podajemy ścieżkę do naszego pliku txt, który chcemy rozdzielić
– podajemy ścieżke do lokalizacji, gdzie zapiszemy rozdzielone pliki
– podajemy ilość plików, na jakie ma być rozdzielony plik główny

Tyle ? Tak i nie. Musimy jeszcze wziąć poprawke na dwie kwestie. Po pierwsze – jeżeli ilość wierszy w naszym pliku jest mniejsza niż ilość plików na jakie chcemy rozdzielić nasz tekst nie będzie to miało sensu. Musimy sie przed tym zabezpieczyć. Po drugie – jeżeli nasz plik główny zawiera ilość wierszy, która jest niepodzielna przez ilość plików, na które chcemy nasz plik główny rozdzielić zostanie nam reszta. Co z nią zrobić ? Postanowiłem dodac ją na końcu ostatniego rozdzielonego pliku. To chyba wszystko, zatem… do dzieła ! Opis jak zwykle w komentarzach.

Continue reading

Andy Warhol by Java

Andy WarholAndy Warhol to artysta pop-artu, który zasłynął ze swoich kolorowych serii portretów wszelakich ikon popkultury. Uważał, że są równie tandetne jak puszka zupy, czy też słynna konserwa z napisem “Spam”. Ale co to ma wspólnego z blogiem o Javie ? Postanowiłem pobawić się trochę pixelami i stworzyć własną, wirtualną kontynuację Andyego Warhola. “Dzieła” powstałe w mojej aplikaji nie dorónują pracom mistrza, jednak mają nad nim jedną przewagę – stworzenie 100 wariacji kolorystycznych zajmuje kilka sekund. Jak to działa ? Wczytujemy oryginalny obrazek jako BufferedImage. Tworzymy drugi, pusty obrazek w tym samym rozmiarze. Za pomocą pętli zczytujemy pixel po pixelu w postaci liczby integer (TYPE_INT_ARGB). “Spłaszczamy” każdy kolor (co nazwałem posteryzacją) po prostu zaokrąglając w dół jego integerową wartość liczbową, dodatkowo każdy obrazek mnożymy przez dodatkową liczbę (factor), która jest kolejnym i-tym numerem generowanego obrazku.

Zapraszam do zapoznania się z kodem oraz zachęcam do komentowania.

Continue reading