30 Ekim 2017 Pazartesi

JDBC DataSource Arayüzü - DriverManager Yerine Bunu Kullanmak Lazım

Giriş
Şu satırı dahil ederiz.
import javax.sql.DataSource;
JDBC Driver Connection URL String yazısına bakılabilir.

Bu sınıf DriverManager  ile aynı işi görür. Açıklaması şöyle
The DataSource interface is implemented by a driver vendor. There are three types of implementations:
Basic implementation -- produces a standard Connection object
Connection pooling implementation -- produces a Connection object that will automatically participate in connection pooling. This implementation works with a middle-tier connection pooling manager.
Distributed transaction implementation -- produces a Connection object that may be used for distributed transactions and almost always participates in connection pooling. This implementation works with a middle-tier transaction manager and almost always with a connection pooling manager.
constructor - JNDI
Uygulama sunucusunu kullanarak şöyle yaparız.
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDB");
Şöyle yaparız.
DataSource ds = (DataSource) new InitialContext().lookup("jdbc/myDS");
constructor - C3P0
C3P0 yazısına taşıdım.

constructor - Apache DBCP
Apache DBCP yazısına taşıdım.

constructor - MySql
MysqlDataSource Sınıfı yazısına taşıdım.

constructor - Oracle
OracleDataSource Sınıfı yazısına taşıdım.

constructor - Oracle Universal Connection Pool
Oracle Universal Connection Pool yazısına taşıdım. Bu sınıfı OracleDataSource Sınıfına tercih etmek lazım. 

constructor - postgresql
PGSimpleDataSource Sınıfı yazısına taşıdım.

constructor - tomcat
Tomcat JDBC Connection Pool yazısına  taşıdım.

getConnection metodu
Örnek
Şöyle yaparız.
Connection con = dataSource.getConnection();
Örnek
Şöyle yaparız.
try (Connection connnection = dataSource.getConnection()) {
  // use the connection
  connection.commit();
}



27 Ekim 2017 Cuma

Forward Reference

Giriş
Değişkenlerin henüz tanımlanmadan "this." şeklinde kullanılabilmesidir.

Örnek
Şu kod derlenmez.
class Foo {
  int a = b; //error
  int b;
}
Şöyle yaparız.
class Foo {
  int a = this.b; // no error. why ?
  int b;
}

25 Ekim 2017 Çarşamba

Swing JSplitPane Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.swing.JSplitPane;
JTabbedPaneJScrollPane, JSplitPane genel maksatlı container sınıflardır.

constructor - int
Panleller yanyana olsun istersek şöyle yaparız.
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);

24 Ekim 2017 Salı

Desktop Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.awt.Desktop;
browse metodu
Kurulu tarayıcı uygulamayı açmak için şöyle yaparız.
URI uri = new URI("http://www.google.com");
Desktop desktop = null;
if (Desktop.isDesktopSupported()) {
  desktop = Desktop.getDesktop();
}

if (desktop != null)
  desktop.browse(uri);
getDesktop metodu
Şöyle yaparız.
Desktop desktop = Desktop.getDesktop();
isDesktopSupported metodu
Şöyle yaparız.

if (Desktop.isDesktopSupported()) {...}
isSupported metodu
Şöyle yaparız.
desktop.isSupported(Desktop.Action.MAIL) {...}
mail metodu
Kurulu e-posta uygulamasını açıp mail göndermek için şöyle yaparız. Uygulamaya to, subject gibi bilgileri de geçebiliriz.
Desktop desktop;
if (Desktop.isDesktopSupported() 
    && (desktop = Desktop.getDesktop()).isSupported(Desktop.Action.MAIL)) {
  URI mailto = new URI("mailto:john@example.com?subject=Hello%20World");
  desktop.mail(mailto);
} else {
  throw new RuntimeException("desktop doesn't support mailto;");
}
open metodu
Şöyle yaparız.
try {
  Desktop.getDesktop().open(new File("C:\\test.bat"));
} catch (IOException ex) {
  ...
}



instanceof Anahtar Kelimesi ve Pattern Matching

Giriş
instanceof anahtar kelimesi biraz evrilerek artık pattern matching için de kullanılabiliyor

1. Klasik Kullanım
Sınıfın gerçekte hangi tip olduğunu anlamak için kullanılır.

Örnek
Elimizde şöyle bir hiyerarşi olsun
class Shape {
  ...
}
class Circle extends Shape {
  ...
}
Şöyle yaparız.
Shape shape = ...;
if (shape instanceof Circle)
{
  Circle C = (Circle)shape;
}
2. Pattern Matching
Java 14 JEP 305 ile geliyor. Java 16 ile dilin standardına dahil oldu. Yani artık derlemek için --enable-preview seçeneğini kullanmaya gerek yok.

Şimdilik sadece if statement için kullanılabiliyor. switch statement ile kullanılabilmesi Java 16'da yapılacak.

Örnek
Şöyle yaparız
if (animal instanceof Cat cat) {
    cat.meow();
} else if(animal instanceof Dog dog) {
    dog.woof();
}
Örnek - Derleme Hatası
Elimizde şöyle bir kod olsun
var a = new ArrayList<String>();
if (a instanceof List l) {
  System.out.println(l.size());
}
Bu kod şöyle bir derleme hatası verir. Çünkü değişken zaten List arayüzünü gerçekleştirmektedir.
Error: pattern type java.util.List is a subtype of expression type
java.util.ArrayList<java.lang.String>
Java 17 Pattern Matching
Örnek
Şöyle yaparız
class Shape {}
class Rectangle extends Shape {}
class Triangle extends Shape {}

void testTriangle(Shape s) {
  switch (s) {
    case Triangle t && (t.calculateArea() > 100) -> ...
    default -> ...
  }
}
Java 21 Pattern Matching
Örnek
Şöyle yaparız
// As of Java 16 record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = p.x(); int y = p.y(); System.out.println(x+y); } } // As of Java 21 static void printSum(Object obj) { if (obj instanceof Point(int x, int y)) { System.out.println(x+y); } }

SSLContext Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.net.ssl.SSLContext;
Bu sınıf https bağlantısı açmak için kullanılabilir. Şöyle yaparız.
HttpsURLConnection con = ...;
...
con.setSSLSocketFactory (sslContext.getSocketFactory()); 
constructor - apache
Şöyle yaparız.
TrustStrategy acceptingTrustStrategy = 
(X509Certificate[] chain, String authType) -> true;

SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
  .loadTrustMaterial(null, acceptingTrustStrategy)
  .build();
getInstance metodu - protocol
Şöyle yaparız.
SSLContext sc = SSLContext.getInstance("SSL");
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("SSLv3");
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("TLS");
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
getSocketFactory metodu
Bu sınıftan SSLSocketFactory alınabilir.
sslContext.getSocketFactory()
Şöyle yapabiliriz.
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
init metodu - KeyManager dizisi
SSLContext socket yaratmadan önce ilklendirilir ve tekrar ilklendirmenin bir yolu yoktur. Bir KeyManager verebiliriz. Böylece belli bir sertifikayı kullanabiliriz.
KeyManagerFactory kmf = ...;
...
sc.init(kmf.getKeyManagers(), null, null );
init metodu - TrustManager dizisi
Bir TrustManager belirtebiliriz. Böylece hangi isim alanlarına güveneceğimiz belirtiriz.
Örnek
Şöyle yapabiliriz. Sadece TrustManager belirtiriz.
sslContext.init(null, new TrustManager[] { tm }, null);
Örnek
TrustManager ve ilaveten rastgele sayı üreteci de belirtebiliriz. Şöyle yaparız
sslContext.init(null, new TrustManager[] { tm },new SecureRandom());
Şöyle yaparız.
TrustManager[] trustAllCerts = new TrustManager[] { 
  new X509TrustManager() {
    public X509Certificate[] getAcceptedIssuers() {
      X509Certificate[] myTrustedAnchors = new X509Certificate[0];  
      return myTrustedAnchors;
    }

    @Override
    public void checkClientTrusted(X509Certificate[] certs, String authType) {}

    @Override
    public void checkServerTrusted(X509Certificate[] certs, String authType) {}
  }
};

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
Örnek
Şöyle yaparız.
TrustManagerFactory tmf = ...;
sslContext.init(null, tmf.getTrustManagers(), null);