22 Haziran 2017 Perşembe

JAX-RS @Produces Anotasyonu

Giriş
Bu anotasyon rest çağrısının ne tipten cevap vereceğini belirtir. Bu anotasyonu kullanırken Java'da tanımlı olan sabitler kullanılabilir veya metin olarak ta kullanılabilir. Metin olarak kullanım pek akıllıca değil çünkü yazım hatası olabiliyor.

Şu kod yanlış
@Produces("appplication/json")
Şöyle yaparız.
@Produces("application/json")

Duration Sınıfı

Giriş
Period'dan farklı olarak artık yıl, yaz saati gibi şeyleri hesaba katmaz. LocalTime gibi 23:59:59 sınıfı yoktur. Daha uzun süreleri de saklayabilir. LocalTime ile arasındaki en önemli farklı açıklayan cümle şöyle
LocalDateTime is a Temporal and these represent a point in time, not a duration.

Although "1:30:00" can be interpreted as a point and as a duration, the semantics are different.
* As a point in time: "Half past one in the morning"
* As a duration: "An hour and a half"

One reason this is important is that "25:30:02" is a valid duration, but not a valid time-of-day.

between metodu
Örnek 1
Şöyle yaparız.
Temporal startInclusive = ...;
Temporal endExclusive = ...;
Duration duration = Duration.between(startInclusive, endExclusive);
Örnek 2
Elimizde iki Instant olsun.
Instant start = ...;
Instant stop = ...;
Şöyle yaparız.
Duration d = Duration.between (start,stop);
getSeconds metodu
Şöyle yaparız.
int seconds = duration.getSeconds();
minus metodu
Şöyle yaparız.
Duration diff = duration.minus(duration2);
of metodu
Şöyle yaparız.
ChronoUnit unit = ...;
Duration duration = Duration.of(1, unit).toNanos();
ofHours metodu
Şöyle yaparız.
Duration compared = Duration.ofHours(8);
parse metodu
Format P ile başlar. T time başladığını gösterir. h saati gösterir.
Örnek
Şu girdi yanlış olduğu için parse edilemez.
"PT10HMS";
Doğru girdi şöyle olmalı
"PT10H0M0S";
Örnek
Şöyle yaparız.
Duration duration = Duration.parse("PT8h");//8 saat
Örnek
Şöyle yaparız.
//convert first to a valid Duration representation
String durationStr = input.replaceAll("(\\d+):(\\d+):(\\d+)", "PT$1H$2M$3S");
Duration duration = Duration.parse(durationStr);
int seconds = duration.getSeconds();
plus metodu
Şöyle yaparız.
Duration duration = ...;
Duration duration2 = duration.plus(Duration.ofMinutes(30));
plusMinutes metodu
Şöyle yaparız.
String[] parts = durationAsString.split(":");
Duration duration = Duration
    .ofHours(1)
    .plusMinutes(2)
    .plusSeconds(3);
toNanos metodu
Şöyle yaparız.
Duration duration = ...;
long conversion = duration.toNanos();



RequestDispatcher Sınıfı

constructor
Örnek
jsp dosyasına yönlendirmek için şöyle yaparız.
public class Register extends HttpServlet { 
  public void doGet(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
     
    RequestDispatcher rd = request.getRequestDispatcher("Display.jsp");
    ...
  }
}
Örnek
Bir başka servlet'e yönlendirmek için şöyle yaparız.
request.getRequestDispatcher("WelcomeServlet").forward(request, response);

forward metodu
Şöyle yaparız.
HttpServletRequest request = ...;
HttpServletResponse response = ...;

request.getRequestDispatcher("/jsp/index.jsp").forward(request, response);

21 Haziran 2017 Çarşamba

IdentityHashMap Sınıfı

Giriş
Map arayüzünü gerçekleştirir. Açıklaması şöyle
This class implements the Map interface with a hash table, using reference-equality in place of object-equality when comparing keys (and values).
Key nesneleri bulmak için "identity" kullanılır. k1.equals (k2) yerine reference equality yani k1 == k2 yöntemini kullanır

Aslında bu sınıf nadir kullanılır ve Map arayüzünü bazı yerlerde bozar. Açıklaması şöyle
This class is not a general-purpose Map implementation! While this class implements the Map interface, it intentionally violates Map's general contract, which mandates the use of the equals method when comparing objects. This class is designed for use only in the rare cases wherein reference-equality semantics are required.
constructor
Şöyle yaparız.
IdentityHashMap map = new IdentityHashMap();
put metoud
Şöyle yaparız.
map.put("A", new String("B"));
remove metodu
Key ve Value nesneleri belirtilen değerler ile aynı ise siler. Şöyle yaparız.
map.remove("A", new String("B")

20 Haziran 2017 Salı

Matcher Sınıfı

find metodu
Eşleşmeleri teker teker bulur.

Örnek
Şöyle yaparız.
String line = "XYZ Q|1|^123456<CR>";
Pattern queryRegex=Pattern.compile("Q\\|\\d\\|(.+?)<CR>");

Matcher queryMatcher=queryRegex.matcher(line);
if (queryMatcher.find()) {
    System.out.println("Group 0: " + queryMatcher.group(0));
    System.out.println("Group 1: " + queryMatcher.group(1));
}
İlk çıktı her zaman tüm eşleşmedir. İkinci sonuç ise ilk gruptur.
Group 0: Q|1|^123456<CR>
Group 1: ^123456
Bazen find metodunu döngü içinde kullanmak gerekir.
String s = "...";
Matcher m = Pattern.compile("[^,()]+|\\([^)]*\\)").matcher(s);
while (m.find())
  System.out.println(m.group());
group metodu
group (0) değerini yani tüm eşleşmeyi verir.

Örnek
$...$ arasındaki kelimeleri bulmak için şöyle yaparız.
String x = "Hey my name is $name$; I have $years$ years old," + 
           "and I love play $sport$ and I live in $country$ !";
Pattern p = Pattern.compile("\\$\\w+\\$");
Matcher m = p.matcher(x);
Map<String, Integer> map = new LinkedHashMap<>();

while(m.find()) {
  String in = m.group().substring(1,m.group().length()-1);
  map.put(in, in.length());
}
Örnek
Şöyle yaparız.
Pattern p = Pattern.compile("(?<!\\d)\\d{2}:\\d{2}(?!\\d)");
Matcher m = pattern.matcher(inputString);

if (m.find()) {
    System.err.println("Time: " + m.group());
}
group metodu - int
Belirtilen yakalama grubunu döndürür.
Örnek
Elimizde şöyle bir string olsun.
String timeStr = "10:15:34";
Şöyle yaparız.
Pattern p = Pattern.compile("(\\d+):(\\d+):(\\d+)");
Matcher m = p.matcher(timeStr);
if (m.matches()) {
  int hours = Integer.parseInt(m.group(1));
  int minutes = Integer.parseInt(m.group(2));
  int seconds = Integer.parseInt(m.group(3));
  ...
}
groupCount metodu
Tüm eşleşen grupları verir. Şöyle yaparız.
String str="asd14sd67fgh007";
Pattern pattern = Pattern.compile("\\w+([0-9]+)\\w+([0-9]+)");
Matcher matcher = pattern.matcher(str);
for(int i = 0 ; i < matcher.groupCount(); i++) {
  matcher.find();
  System.out.println(matcher.group());
}
matches metodu
Verilen string ile düzenli ifadenin tam olarak eşleşip eşleşmediğini döner. C#'taki RegEx.IsMatch metodu ile aynıdır.
String s = "...";
Pattern pattern = Pattern.compile("...");

Matcher matcher = pattern.matcher(s);
// Check if pattern matches 
if (matcher.matches()) {
  ...
}  
reset metodu
Ne işe yarar bilmiyorum. Şöyle yaparız.
Matcher matcher = ...;
matcher.reset();