Iterowanie między przedziałem czasu

Dosyć często w aplikacjach wykorzystujemy czas aby ograniczyć dane pomiędzy czasem początkowym i końcowym. W takich sytuacjach czas ma znaczenie drugorzędne. Jednak czasem zdarza się, że konkretna data ma znaczenie pierwszorzędne a to co jest przypisane do czasu jest dodatkiem. W takich sytuacjach, trzeba nieraz wykonywać operacje na kolekcjach dat.

Przy zakresie dat, gdzie zazwyczaj mamy datę początku i końca, przechodzenie po kolejnych elementach trochę się różni od zwykłych iteracji. I co mnie zdziwiło ale nie udało mi się znaleźć gotowej klasy, metody która to wykonuje. Jeśli istnieje to byłbym wdzięczny za informacje.

Ale samodzielne napisanie takiego iteratora nie jest wielkim problemem. Poniższy przykład wykorzystuje bibliotekę joda-time ale nic nie stoi na przeszkodzie aby użyć dowolnych klas odpowiadających za operacje na czasie.

import org.joda.time.*;
import java.util.*;

public class LocalDateRange implements Iterable<LocalDate>
{
    private final LocalDate start;
    private final LocalDate end;

    public LocalDateRange(LocalDate start,
                          LocalDate end)
    {
        this.start = start;
        this.end = end;
    }

    public Iterator<LocalDate> iterator()
    {
        return new LocalDateRangeIterator(start, end);
    }

    private static class LocalDateRangeIterator implements Iterator<LocalDate>
    {
        private LocalDate current;
        private final LocalDate end;

        private LocalDateRangeIterator(LocalDate start,
                                       LocalDate end)
        {
            this.current = start;
            this.end = end;
        }

        public boolean hasNext()
        {
            return current != null;
        }

        public LocalDate next()
        {
            if (current == null)
            {
                throw new NoSuchElementException();
            }
            LocalDate ret = current;
            current = current.plusDays(1);
            if (current.compareTo(end) > 0)
            {
                current = null;
            }
            return ret;
        }

        public void remove()
        {
            throw new UnsupportedOperationException();
        }
    }
}

W powyższym kodzie nie ma żadnej magii, zaimplementowanie interejsów Iterable oraz Iterator. Kod pochodzi z tej odpowiedzi.

Webservice – krótki wstęp

Do niedawna nie miałem pojęcia o webservice’ach, wiedziałem że takie coś istnieje ale jak działa to była czarna magia. Ale teraz mogę się stać ekspertem z racji tego, że w pracy jeden projekt jest prawie skończony oparty na nich (implementacja klienta) i drugi też będę robił (strona serwera).

Czym są webservicy, jak sama nazwa wskazuje są to usługi sieciowe i dzielą się jak wspomniałem wyżej na implementację po stronie klienta i po stronie serwera. Aby wygenerować webserice jest potrzebny plik wsdl. Ma on strukturę xmlową i kilka chyba obowiązkowych węzłów:

  • types
  • message
  • portType
  • binding
  • service

Aby wygenerować usługę lub klienta z wsdla moża użyć wbudowanego kreatora w eclipsie bądź skorzystać z narzędzia dostarczanego przez fundację apache w ich własnej implementacji ws Axis2 – wsdl2java. Osobiście nie polecam wizarda w eclipsie ponieważ jego działanie nie jest zbyt stabilne i trochę trzeba się namęczy. Wsdl2java i java2wsdl są prostymi konsolowymi aplikacjami o prostej składni. Również z kodu javy można wygenerować wsdl.

Zacznijmy może od usługi. Po wygenerowaniu w eclipsie usługi dostajemy kilka plików. W głównej mierze są to interfejsy, implementacje jakiś naszych typów zadeklarowanych w wsdl ale nas najbardziej będzie interesował plik z końcówką Impl od implementation. Są w nim metody naszego webservicu, które nie posiadają implementacji tylko zwracają jakieś wartości. Naszym zadaniem jest obudowanie ich i sprawienie aby wykonywały to co jest w założeniach projektu.

Strona klienta jest jeszcze prostsza. Szukamy w wygenerowanych plikach, jednego w którym nazwa zawiera słowo Locator. To się tyczy Axis 1. Tworzymy nową instancję tej klasy i poprzez tego lokatora łączymy się z ws. Pozostaje nam tylko wywołać metody z odpowiednimi parametrami chyba, że chcemy jakoś wykorzystać wartości zwracane przez te metody to wtedy tworzymy odpowiedni kod.

%d blogerów lubi to: