Archive for January 2009
JavaMail: send message copying it to Sent Items folder
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();
}
}
Read file line by line with Java 5
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();
}
}
AXIS2 + JIBX web service client step by step
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());