31 Mayıs 2016 Salı

JAX-WS SOAPMessage Arayüzü

Giriş
Şu satırı dahil ederiz.
import javax.xml.soap.SOAPMessage;
constructor
Şöyle yaparız.
SOAPConnectionFactory connectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection connection = connectionFactory.createConnection();
SOAPMessage response = connection.call(soapMessage, endpoint);
setProperty metodu
Şöyle yaparız.
soapMessage.setProperty(SOAPMessage.WRITE_XML_DECLARATION, Boolean.TRUE);
writeTo metodu
Şöyle yaparız.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
response.writeTo(baos);

25 Mayıs 2016 Çarşamba

CharArrayReader Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.io.CharArrayReader;
constructor
Şöyle yaparız.
char[] buf = ...;
CharArrayReader reader = new CharArrayReader(buf);
Bu sınıfı şöyle sarmalamak daha iyi.
char[] buf = ...;
BufferedReader br = new BufferedReader(new CharArrayReader(buf));

ThreadGroup Sınıfı

constructor
Şöyle yaparız.
ThreadGroup tg = Thread.currentThread().getThreadGroup()
Şöyle yaparız.
ThreadGroup parent = new ThreadGroup("mygroup");
activeGroupCount metodu
Şöyle yaparız.
ThreadGroup[] t = new ThreadGroup[tg.activeGroupCount()];
enumerate metodu
Şöyle yaparız.
ThreadGroup[] t = new ThreadGroup[tg.activeGroupCount()];
tg.enumerate(t);
isDaemon metodu
Şöyle yaparız.
tg.isDaemon()
getName metodu
Şöyle yaparız.
tg.getName()
setDaemon metodu
Açıklaması şöyle
A daemon thread group is automatically destroyed when its last thread is stopped or its last thread group is destroyed.

11 Mayıs 2016 Çarşamba

KeyManagerFactory Sınıfı

constructor
Şöyle yaparız.
KeyManagerFactory kmf =
    KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm() );
init metodu
Şöyle yaparız.
KeyStore ks = ...;
kmf.init( ks, certPasswd.toCharArray() );



TimerTask Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.TimerTask;
Şöyle yaparız.
class MyTimerTask extends TimerTask {
  @Override
  public void run() {...}

}



HttpsURLConnection Sınıfı

constructor
Şöyle yaparız.
URL url = new URL(...);
HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
getDefaultHostNameVerifier metodu
Hangi alan adlarına güvenildiğini bulmak için şöyle yaparız.
// Open SSLSocket directly to gmail.com
SocketFactory sf = SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket("gmail.com", 443);
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
SSLSession s = socket.getSession();

// Verify that the certicate hostname is for mail.google.com
// This is due to lack of SNI support in the current SSLSocket.
if (!hv.verify("mail.google.com", s)) {
    throw new SSLHandshakeException("Expected mail.google.com, "
                                    "found " + s.getPeerPrincipal());
}

// At this point SSLSocket performed certificate verificaiton and
// we have performed hostname verification, so it is safe to proceed.

// ... use socket ...
socket.close();
getInputStream metodu
Şöyle yaparız.
InputStream ins = con.getInputStream();
setDefaultHostNameVerifier metodu
Şöyle yaparız.
HostnameVerifier allHostsValid = new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
};

HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
setDefaultSSLSocketFactory metodu
SSLContext sınıfı belirtiriz. Şöyle yaparız.
SSLContext sc = ...;
...
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());





9 Mayıs 2016 Pazartesi

ConvolveOp Sınıfı

Constructor - EDGE_NO_OP
Açıklaması şöyle
Pixels at the edge of the source image are copied to the corresponding pixels in the destination without modification.
Kenarlar hariç geri kalan alanı bulanıklaştırmak için şöyle yaparız.
int size = ...;
float[] data = new float[size * size];
//Fill data

Kernel kernel = new Kernel(size, size, data);
ConvolveOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
Constructor - EDGE_ZERO_FILL
Bulanıklaştırılan kısımın etrafındaki kenarları siyaha boyar.

filter metodu
Şöyle yaparız.
//tbi is BufferedImage
BufferedImage i = op.filter(tbi, null);

5 Mayıs 2016 Perşembe

StaX ile Okuma

Giriş
StaX yani Streaming API for XML iki çeşit API sunuyor. Üst seviye (Iterator gibi) ve alt seviye (Cursor gibi).

XMLInputFactory Sınıfı
XMLInputFactory Sınıfı yazısına taşıdım.

XMLEventReader Arayüzü
XMLEventReader Arayüzü yazısına taşıdım.

XMLStreamReader Arayüzü
XMLStreamReader Arayüzü yazısına taşıdım.

XMLEvent Arayüzü
XMLEvent Arayüzü

Java 8 Functional Kullanımı

Giriş
Java 8 ile eklenen java.util.stream sınıfları ile functional programming yapılabilir. Bu sınıflar .Net'teki Linq sınıflarını andırıyorlar.

Functional Paketi
Java 8 Stream sınıflarını kullanabilmek için java.util.function paketi altındaki yapıları anlamak gerekir. Sebebini anlamadığım bir şekilde Java 8 her arity için bir isim kullanıyor.

Bu yapılardan önemli olanları şunlar.

Consumer : 1 parametre alır, void döner
Supplier : void alır , 1 sonuç döner
Predicate : 1 parametre alır, bool döner
Function  : 1 parametre alır ,1 sonuç döner


Şimdi bu kavramlara bakalım.

1. Consumer
Şu sınıflar var
BiConsumer

2. Supplier
Java 8 Supplier yazısına taşıdım.

3. Predicate
Java 8 Predicate yazısına taşıdım

4. Function
Şu sınıflar var

Annotationlar
@FunctionalInterface Anotasyonu yazısına taşıdım.

Ayrıca bir interface artık default olarak işaretli metodlar da sunabiliyor. Yani şöyle yapabiliyoruz.
public interface Drive {
  int getNumWheels();

  default int driveMiles(){
    return 10;
  }

  static int getColorID(){
    eturn 0;
  }
}
Eksikler
1. void alıp, void dönen Procedure gibi bir isimlendirmeyi unutmuşlar:)

2. Predicate + Function birlikte kullanımı - Yani Predicated Türevler
Function içinde bir Predicate olsun isteyelim. Eğer true ise bir sonuç, false ise başka bir sonuç dönelim. Yani şunu istiyoruz. Ama tabii Function içine Predicate vermek mümkün değil.
Predicate<Customer> IS_LEGACY_CUSTOMER = c -> c.getJoinedDate().isBefore(LocalDate.now()
  .minusYears(5));

Function<Customer, Integer> BONUS_POINTS_CALC = c -> {
  if(IS_LEGACY_CUSTOMER.test(c)) {
    return c.getDollarsSpent() * 4;
  } else {
    return c.getDollarsSpent() * 2;
  }
};
Örnek
Şöyle yaparız
public interface PredicatedFunction<T, R> extends Function<T, R> {

  static <T, R> Function<T, R> of(Function<? super T, ? extends R> f1, 
                                  Function<? super T, ? extends R> f2,
    Predicate<? super T> p) {
      return (T t) -> {
        if (p.test(t)) {
          return f1.apply(t);
        }
        return f2.apply(t);
      };
  }
}

Function<Customer, Integer> BONUS_POINTS_CALC = PredicatedFunction.of(
  c -> c.getDollarsSpent() * 4, // if true
  c -> c.getDollarsSpent() * 2, // if false
  c -> c.getJoinedDate().isBefore(LocalDate.now().minusYears(5));
Şöyle yaparız
public interface PredicatedUnaryOperator<T> extends UnaryOperator<T> {

  static <T> UnaryOperator<T> of(UnaryOperator<T> f, Predicate<? super T> p) {
    UnaryOperator<T> identity = UnaryOperator.identity();
    return (T t) -> {
      if (p.test(t)) {
        return f.apply(t);
      }
      return identity.apply(t);
    };
  }
}
Şöyle yaparız
public interface PredicatedConsumer<T> extends Consumer<T> {
  static <T> Consumer<T> of(Consumer<? super T> c, Predicate<? super T> p) {
    return (T t) -> {
      if (p.test(t)) {
        c.accept(t);
      }
    };
  }
}

Consumer<Message> NEW_MESSAGE_PROCESSOR = PredicatedConsumer.of(
  m -> processMessage(m) ,
  m -> m.getOriginationTime().isBefore(LocalDateTime.now().minusMinutes(5)));






4 Mayıs 2016 Çarşamba

XPath

XPath Sınıfı
Şu satırı dahil ederiz.
import javax.xml.xpath.*;
constructor
XPathFactory ile yaratılır. Şöyle yaparız.
XPath xpath = XPathFactory.newInstance().newXPath();
compile metodu
Sonra çalıştırılmak üzer bir XPathExpression nesnesi döner. Şöyle yaparız.
xPath.compile("/soap:Fault/faultcode/text()[1]")
evaluate metodu - Document
Şöyle yaparız.
Document doc = ...;
XPath xPath = XPathFactory.newInstance().newXPath();
String faultCode = xPath.compile("/soap:Fault/faultcode/text()[1]").evaluate(doc);
evaluate metodu - InputSource
InputSource nesnesini kullanarak bir data model oluşturur. Daha sonra verilen ifadeyi çalıştırıp bir sonuç döner. Sonuç Node listesi , tek bir Node veya string olabilir.
Node listesi için şöyle yaparız.
InputStream is = ...;
InputSource inputSrc = new InputSource(is);

XPath xpath = XPathFactory.newInstance().newXPath();

String expression = ... ;
NodeList nodes = (NodeList) xpath.evaluate(expression, 
                                           inputSrc, XPathConstants.NODESET);
Tek bir Node için şöyle yaparız.
Node node = (Node) xpath.evaluate(expression,
                                  inputSrc,
                                  XPathConstants.NODE);
String için şöyle yaparız. Örneğin bir attribute çekmek isteyelim.
String platformTag = (String) xpath.evaluate(expression,
                                             inputSrc, XPathConstants.STRING);
setNamespaceContext metodu
Expression içinde namespace kullanmadan sorgu yapabilmemizi sağlar. Şöyle yaparız.

NamespaceContext nsContext = new NamespaceContext() {
    @Override
    public Iterator getPrefixes(String namespaceURI) {
        return null;
    }
    @Override
    public String getPrefix(String namespaceURI) {
        return "soap";
    }
    @Override
    public String getNamespaceURI(String prefix) {
        return "http://schemas.xmlsoap.org/soap/envelope/";
    }
};
xPath.setNamespaceContext(nsContext);
Expression Örnekleri
1. Attribute
@ işareti ile düğümlerin belli attribute'lara sahip olması, olmaması gibi çeşitli seçimler yapılabilir.

1. Bilinen bir attribute değerine göre düğümü bulup başka bir attribute değerini çekmek için ifade şöyle yazılır.
//Platform[@PlatformNo=47280]/@PlatformTag
XML şöyledir.
<Platform PlatformTag="2980" PlatformNo="47280" Name="AGHS" 
       BearingToRoad="2.6606268e+002" RoadName="Avonside Dr">
  <Position Lat="-4.352447905000000e+001" Long="1.726611665000000e+002"/>
</Platform>

2. Belli bir attribute değerine sahip düğümü bulmak için şöyle bir ifade yazılır.
"/message[@from]"
XML şöyledir.
<message to="-105608156545@chat.facebook.com/Smack" 
    from="-105465454665906545@chat.facebook.com" 
    type="chat">
  <body>sai</body>
  <thread>NNLWF1</thread>
  <active xmlns="http://jabber.org/protocol/chatstates" />
</message>

2. Mutlak Yol (/A/B)
Belirtilen mutlak yoldaki düğümleri bulur. Elimizde şöyle bir XML olsun
<message to="-105608156545@chat.facebook.com/Smack" 
from="-105465454665906545@chat.facebook.com" 
type="chat">
<body>sai</body>
<thread>NNLWF1</thread>
<active xmlns="http://jabber.org/protocol/chatstates" />
</message>
Mutlak yolu kulllanarak bir düğüm şöyle bulunur. Örnekte XPathExpression.evaluate() metodu kullanılıyor.
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expression = xPath.compile("/message/body");
node = (Node)expression.evaluate(document,XPathConstants.NODE);
System.out.println("Body: " + node.getTextContent());
Bir başka örneğe bakalım. Elimizde şöyle bir XML olsun
<test>
    <nodeA>
           <nodeB>key</nodeB>
           <nodeC>value1</nodeC>
    </nodeA>
    <nodeA>
           <nodeB>key</nodeB>
           <nodeC>value2</nodeC>
    </nodeA>
</test>
Bu XML'den NodeC taglerinin metinlerine erişmek istersek şöyle yaparız. Örnekte XPath.evaluate() metodu kullanılıyor. XPath'te text() testi düğümün metin içerip içermediğini kontrol eder.
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "/test/nodeA/nodeC/text()";
InputSource inputSource = new InputSource("sample.xml");
NodeList nodes = (NodeList) xpath.evaluate(expression, inputSource, 
                                           XPathConstants.NODESET);
for(int i = 0; i < nodes.getLength(); i++) {
    concatenated.append(nodes.item(i).getTextContent());
}

Attribute Seçimi
@ işareti ile düğümlerin belli attribute'lara sahip olması, olmaması gibi çeşitli seçimler yapılabilir.
Elimizde yine aynı XML olsun
<message to="-105608156545@chat.facebook.com/Smack" 
from="-105465454665906545@chat.facebook.com" 
type="chat">
<body>sai</body>
<thread>NNLWF1</thread>
<active xmlns="http://jabber.org/protocol/chatstates" />
</message>
from attribute alanına sahip message tag'lerini seçmek için aşağıdaki gibi yaparız.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new File("Test.xml"));

XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expression = xPath.compile("/message[@from]");
Node node = (Node)expression.evaluate(document, XPathConstants.NODE);
System.out.print(node.getAttributes().getNamedItem("from").getNodeValue());
Daha basit bir örnek şöyle
XPath xPath = XPathFactory.newInstance().newXPath();
Node node = (Node) xPath.evaluate(
                    "/HDB/Resident[@Name='Batman ']/Preference", dDoc,
                    XPathConstants.NODE);