Programming and So

Tips and tricks in Java

Archive for January 2009

JavaMail: send message copying it to Sent Items folder

without comments


import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.Flags.Flag;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
public final class MailIMAP {
 
  // Email server properties
  private static String host = "mailserver.com";
  private static String user = "user";
  private static String pass = "pass";
 
  // IMAP properties
  private static String imapProtocol = "imap";
  // Unfortunately there is no way to know sent folder name using Java code,
  // so it must be specified as a property
  private static String folderName = "Sent Items";
 
  // Message accounts
  private static String fromAccount = "someone@mailserver.com";
  private static String toAccount = "anotherone@mailserver.com";
 
  /**
   *  User/password authenticator
   */
  private static class MailAuthenticator extends Authenticator {
    public PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication(user, pass);
      }
  }
 
  /**
   * Send mail and copy it to "Sent Items" folder
   * @param args
   * @throws Exception
   */
  public static void main(String [] args) throws Exception {
 
    // Java Mail properties
    Properties props = System.getProperties();
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.auth", "true");
   
    // Mail session authentified
    Session session = Session.getInstance(props, new MailAuthenticator());
   
    // Send message
    Message message = new MimeMessage(session);
    message.setSubject("Test");
    message.setFrom(new InternetAddress(fromAccount));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(toAccount));
    message.setText("Body text");
    Transport.send(message);
   
    // Copy message to "Sent Items" folder as read
    Store store = session.getStore(imapProtocol);
    store.connect(host, user, pass);
    Folder folder = store.getFolder(folderName);
    folder.open(Folder.READ_WRITE);
    message.setFlag(Flag.SEEN, true);
    folder.appendMessages(new Message[] {message});
    store.close();
   
  }
 
}

Written by angelborroy

January 21, 2009 at 12:58 pm

Posted in java

Tagged with ,

Read file line by line with Java 5

with 2 comments


import java.io.FileInputStream;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.Scanner;

public class ReadFileByLines {
 
  public static void main(String... args) throws Exception {
   
    FileChannel fc = new FileInputStream("/usr/foo.txt").getChannel();
   
    MappedByteBuffer byteBuffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
    Charset charset = Charset.forName("ISO-8859-1");
    CharsetDecoder decoder = charset.newDecoder();
    CharBuffer charBuffer = decoder.decode(byteBuffer);
   
    // Read file line by line
    Scanner sc = new Scanner(charBuffer).useDelimiter("\n");
   
    while (sc.hasNext()) {
        String line = sc.next();     
        System.out.println(line);
    }
    fc.close();

  }

}

Written by angelborroy

January 19, 2009 at 11:50 am

Posted in java

AXIS2 + JIBX web service client step by step

without comments

Below a low level tutorial on generating web services clients based on AXIS2 and JIBX marshalling. In real world, many of this tasks can be automatized using some tool like ANT or MAVEN.

0. Required tools

1. Initial resources

  • XSD file for JIBX
  • WSDL file for AXIS2

 
service.xsd

< ?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:ts="http://foo.bar.com"
        targetNamespace="http://foo.bar.com"
        elementFormDefault="qualified" attributeFormDefault="qualified">
  <element name="fooRequest">
    <complextype>
      <sequence>
        <element name="requestHeader">
          <complextype>
            <sequence>
              <element name="type" type="string"/>
              <element name="version" type="string"/>
            </sequence>
          </complextype>
        </element>
        <element name="requestData">
          <complextype>
            <sequence>
              <element name="idObject" type="int"/>
            </sequence>
          </complextype>
        </element>
      </sequence>
    </complextype>
  </element>
  <element name="fooResponse">
    <complextype>
      <sequence>
        <element name="responseHeader">
          <complextype>
            <sequence>
              <element name="type" type="string"/>
              <element name="version" type="string"/>
              <element name="responseCode" type="string"/>
              <element name="responseDesc" type="string"/>
            </sequence>
          </complextype>
        </element>
        <element name="responseData" minOccurs="0">
          <complextype>
            <sequence>
              <element name="name" type="string"/>
              <element name="attributes" type="string"/>
            </sequence>
          </complextype>
        </element>
      </sequence>
    </complextype>
  </element>
</schema>

service.wsdl

< ?xml version="1.0" encoding="UTF-8"?>
<wsdl_definitions xmlns_wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns_schema="http://foo.bar.com"
    xmlns_soap="http://schemas.xmlsoap.org/wsdl/soap/"
    targetNamespace="http://foo.bar.com">
  <wsdl_types>
    <schema xmlns="http_//www.w3.org/2001/XMLSchema"
            xmlns_ts="http://foo.bar.com"
            targetNamespace="http://foo.bar.com"
            elementFormDefault="qualified" attributeFormDefault="qualified">
      <element name="fooRequest">
        <complextype>
          <sequence>
            <element name="requestHeader">
              <complextype>
                <sequence>
                  <element name="type" type="string"/>
                  <element name="version" type="string"/>
                </sequence>
              </complextype>
            </element>
            <element name="requestData">
              <complextype>
                <sequence>
                  <element name="idObject" type="int"/>
                </sequence>
              </complextype>
            </element>
          </sequence>
        </complextype>
      </element>
      <element name="fooResponse">
        <complextype>
          <sequence>
            <element name="responseHeader">
              <complextype>
                <sequence>
                  <element name="type" type="string"/>
                  <element name="version" type="string"/>
                  <element name="responseCode" type="string"/>
                  <element name="responseDesc" type="string"/>
                </sequence>
              </complextype>
            </element>
            <element name="responseData" minOccurs="0">
              <complextype>
                <sequence>
                  <element name="name" type="string"/>
                  <element name="attributes" type="string"/>
                </sequence>
              </complextype>
            </element>
          </sequence>
        </complextype>
      </element>
    </schema>
  </wsdl_types>
  <wsdl_message name="fooRequest">
    <wsdl_part element="schema_fooRequest" name="fooRequest"/>
  </wsdl_message>
  <wsdl_message name="fooResponse">
    <wsdl_part element="schema_fooResponse" name="fooResponse"/>
  </wsdl_message>
  <wsdl_porttype name="Foo">
    <wsdl_operation name="foo">
      <wsdl_input message="schema_fooRequest" name="fooRequest"/>
      <wsdl_output message="schema_fooResponse" name="fooResponse"/>
    </wsdl_operation>
  </wsdl_porttype>
  <wsdl_binding name="FooBinding" type="schema_Foo">
    <soap_binding style="document" transport="http_//schemas.xmlsoap.org/soap/http"/>
    <wsdl_operation name="foo">
      <soap_operation soapAction=""/>
      <wsdl_input name="fooRequest">
        <soap_body use="literal"/>
      </wsdl_input>
      <wsdl_output name="fooResponse">
        <soap_body use="literal"/>
      </wsdl_output>
    </wsdl_operation>
  </wsdl_binding>
  <wsdl_service name="FooService">
    <wsdl_port binding="schema_FooBinding" name="FooPort">
      <soap_address location="http_//localhost/APP/services"/>
    </wsdl_port>
  </wsdl_service>
</wsdl_definitions>

Note. Character “:” changed by “_” for visualization purpouses in “service.wsdl”

2. Generate JIBX binding

[Previous tasks: copy service.xsd file on JIBX home directory]

Command line (JIBX home)

Input: java -jar xsd2jibx.jar service.xsd

Output: com/bar/foo/binding.xml, com/bar/foo/FooRequest.java, com/bar/foo/FooRequestRequestData.java, com/bar/foo/FooRequestRequestHeader.java, com/bar/foo/FooResponse.java, com/bar/foo/FooResponseResponseData.java, com/bar/foo/FooResponseResponseHeader.java

3. Java compiler

Command line (JIBX home)

Input: javac -sourcepath com/bar/foo/*.java

Output: com/bar/foo/FooRequest.class, com/bar/foo/FooRequestRequestData.class, com/bar/foo/FooRequestRequestHeader.class, com/bar/foo/FooResponse.class, com/bar/foo/FooResponseResponseData.class, com/bar/foo/FooResponseResponseHeader.class

4. Binding compiler

Command line (JIBX home)

Input: java -jar jibx-bind.jar com/bar/foo/binding.xml

Output: com/bar/foo/JiBX_com_bar_foo_bindingFactory.class, com/bar/foo/JiBX_com_bar_foo_bindingFooRequest_access.class, com/bar/foo/JiBX_com_bar_foo_bindingFooRequestRequestData_access.class, com/bar/foo/JiBX_com_bar_foo_bindingFooRequestRequestHeader_access.class, com/bar/foo/JiBX_com_bar_foo_bindingFooResponse_access.class, com/bar/foo/JiBX_com_bar_foo_bindingFooResponseResponseData_access.class, com/bar/foo/JiBX_com_bar_foo_bindingFooResponseResponseHeader_access.class

5. Generate AXIS2 client

[Previous tasks: copy service.wsdl file, binding.xml (generated on step 2) and "com" folder (generated on step 4) on AXIS2 home directory]

Command line (AXIS2 home)

Input: wsdl2java -uri service.wsdl -o build -ss -sd -g -d jibx -ssi -Ebindingfile binding.xml

Output: build/src/com/bar/foo/FooService.java, build/src/com/bar/foo/FooServiceCallbackHandler.java, build/src/com/bar/foo/FooServiceMessageReceiverInOut.java, build/src/com/bar/foo/FooServiceSkeleton.java, build/src/com/bar/foo/FooServiceSkeletonInterface.java, build/src/com/bar/foo/FooServiceStub.java

6. AXIS2 Client usage

[Previous tasks: config a Java project including all the resources generated by now, JIBX libraries and AXIS2 libraries.]

import com.bar.foo;

FooRequest fooRequest = new FooRequest();

FooRequestRequestHeader fooRequestHeader = new FooRequestHeader();
fooRequestHeader.setType("1");
fooRequestHeader.setVersion("1");

FooRequestRequestData fooRequestData = new FooRequestData();
fooRequestData.setIdObject(1);

fooRequest.setRequestHeader(fooRequestHeader);
fooRequest.setRequestData(fooRequestData);

FooServiceStub fooStub = new FooServiceStub();
FooResponse fooResponse = fooStub.foo(fooRequest);

System.out.println(fooResponse.getResponseData().getName());
System.out.println(fooResponse.getResponseData().getAttributes());

Written by angelborroy

January 15, 2009 at 5:52 pm

Posted in java

Tagged with , ,