preload
Mrz 02

Due to the fact I got in touch with maven2 and I think that maven2 is very helpful will give a short introduction. Bigger projects normally have a more complex configuration but I will start from the scratch.

Maven will create a kind of project sceleton with the following command

1
mvn archetype:create -DgroupId=info.sobek.testapp -DartifactId=testapp

If you work with e.g. eclipse, you can create the project files for eclipse:

1
mvn eclipse:eclipse

Now you can import it into eclipse with “import into existing workspace” option of eclipse.

Maven will normally copy the created so called “artifacts” into your local maven repository. Normally located under your home dir and then .m2

When you program depends on several jars and these dependencies are defined in the pom.xml, then maven will copy the jars in their specific version into the local maven repository. This is very helpful because you can simply build your project with another newer or older version of your dependent jar-file.

How to create multi-module projects will be explained in another episode.

Tagged with:
Dez 18

You would like to know the spellout word from an integer? Use the ICU library from IBM.

1
2
3
4
import com.ibm.icu.text.RuleBasedNumberFormat;
// ...
int num = 100198
System.out.println(new RuleBasedNumberFormat(Locale.US, RuleBasedNumberFormat.SPELLOUT).format(number));

The result is: one hundred thousand, one hundred and ninety-eight
You can get the spellout of the number in other languages. Check Locale.GERMANY instead of Locale.US and you have: hunderttausendhundertachtundneunzig

Tagged with:
Dez 17

I just stumbled upon an article about the java.awt.robot from java while reading java stuff. When you would like to fill textboxes or to click buttons etc. on an swing or awt window automatically you can use the java.awt.robot class.

Check this example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
package desktopapplication1;
 
import java.awt.AWTException;
import java.awt.event.KeyEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.awt.Point;
import java.awt.event.InputEvent;
import org.jdesktop.application.FrameView;
 
public class Robot implements Runnable {
 
    private FrameView frameview;
 
    public Robot(FrameView frameview) {
        this.frameview = frameview;
    }
 
    public void run() {
        try {
            initRobot();
        } catch (AWTException ex) {
            Logger.getLogger(Robot.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
 
        private void initRobot() throws AWTException {
        // create a robot to feed in GUI events
 
        java.awt.Robot rob = new java.awt.Robot();
 
        // enter some keystrokes
 
        int keyinput[] = {
            KeyEvent.VK_T,
            KeyEvent.VK_E,
            KeyEvent.VK_S,
            KeyEvent.VK_T,
            KeyEvent.VK_I,
            KeyEvent.VK_N,
            KeyEvent.VK_G
        };
        rob.delay(1000);
        rob.keyPress(KeyEvent.VK_SHIFT);
 
        ((DesktopApplication1View)this.frameview).getjTextField1().requestFocus();
        for (int i = 0; i < keyinput.length; i++) {
            rob.keyPress(keyinput[i]);
            rob.delay(1000);
        }
        rob.keyRelease(KeyEvent.VK_SHIFT);
        rob.keyPress(KeyEvent.VK_ENTER);
 
        // move cursor to exit button
 
        Point p = ((DesktopApplication1View)this.frameview).getjButton1().getLocationOnScreen();
        rob.mouseMove(p.x + 5, p.y + 5);
        rob.delay(2000);
 
        // press and release left mouse button
 
        rob.mousePress(InputEvent.BUTTON1_MASK);
        rob.delay(2000);
        rob.mouseRelease(InputEvent.BUTTON1_MASK);
 
    }
 
}

I started the class in a separate thread, the example from sun, where I took most parts of the code uses ActionListener to update the textfield.

Now you have to start the thread with:

1
2
       Thread t = new Thread(new desktopapplication1.Robot(this));
       t.start();

Check the example from sun – http://java.sun.com/developer/TechTips/2000/tt0711.html

Tagged with:
Dez 14

To send simple mails im Java, e.g. without header modifications or attachment you can use apache commons library.

Download it at http://commons.apache.org/ and add the jar to your project.

1
2
3
4
5
6
7
8
9
SimpleEmail email = new SimpleEmail();
email.setHostName("host.test.com");
email.setFrom("from@test.com", "testfromname");
email.addTo("to@test.com", "testtoname");
email.addBcc("bcc@test.com", "testbccname");
email.setSubject("testsubject");
email.setMsg("testmessage");
email.setAuthentication("username", "pass");
email.send();

Check simple email-class documentation for further configuration as smtp-port etc.

Tagged with:
Dez 09

Normally you can create stub classes from a wsdl-file via console by calling wsdl2java. To generate stub classes from wsdl with netbeans you have to add to the build.xml file the following code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<path id="axis.classpath">
   <fileset dir="/usr/local/axis/lib/">
      <include name="**/*.jar" />
    </fileset>
</path>
 
<taskdef resource="axis-tasks.properties" classpathref="axis.classpath" />
 
<target name="Generate From WSDL">
    <axis-wsdl2java
    output="src/"
    testcase="false"
    verbose="true"
    serverside="false"
    url="http://url.to-webservice.com/?wsdl">
    <mapping namespace="http://axis.apache.org/ns/interop"
    package="wsdltester" />
    <mapping namespace="http://www.namespace.de/types/"
    package="wsdltester.stubs" />
    <mapping namespace="http://www.namespace.de/services/"
    package="wsdltester.service" />
 
    </axis-wsdl2java>
</target>

Note that you have to modify several settings like the namespaces and the url to the web service on line 15! Do not just copy the code.

Tagged with:
Dez 01

Imagine you have java code like the following:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
   if (o.isShipped) //order is shipped --> archive
                {
                    //archived 21 days after delivery
                    Calendar cal = new GregorianCalendar();
                    cal.add(Calendar.DAY_OF_MONTH,DAYS_TO_ARCHIVE_AFTER_SHIPPING);
                    try {
                       ...
                        }
                    } catch (Exception ex) {
                        ...
                    }
                } else if (o.isCancelled == true || o.isClosed == true) {
                    //cancelled more than 7 days ago
                    ...
                                } else {
                                   ...
                                }
                            }
                        }
                    } catch (Exception ex) {
                        ...
                    }
                    try {
                        if (o.isClosedAt.getTimeInMillis() <= cal.getTimeInMillis()) {
 
                           ...
 
                                } else {
                                    ...
                                }
                            }
                        }
                    } catch (Exception ex) {
                        ...
                    }
                } else if (o.isReadyForShipping && o.isDispatched) {
                 ...
                }

Isn’t it extreme hard to read and to understand? Martin Fowlers Book “Refactoring” shows how to handle that. Replace all these nested if…else with if-guards. It could lool like this:

1
2
3
4
if (order.isShipped && !isCancelled && !isClosed) archiveOrder();
if (!order.isShipped && order.isCancelled && order.isCancelledAt.getTimeInMillis() <= cal.getTimeInMillis()) moveReservationOnCancel();
if (!order.isShipped && order.isClosed && order.isClosedAt.getTimeInMillis() <= cal.getTimeInMillis()) moveReservationOnClosing(); 
...

What did we do here? We renamed the order object o into order, and put the actions into separate methods. To improve readability a bit more we can create a method for the boolean checks. See the next example:

1
2
3
4
5
6
7
8
9
10
11
12
13
if (isOrderShipped(order)) archiveOrder();
if (isOrderCanceled(order)) moveReservationOnCancel();
if (isOrderClosed(order)) moveReservationOnClosing(); 
...
private boolean isOrderShipped(OrderDetails order) {
        return order.isShipped && !order.isCancelled && !order.isClosed;
}
private boolean isOrderCancelled(OrderDetails order) {
        return !order.isShipped && order.isCancelled && order.isCancelledAt.getTimeInMillis() <= cal.getTimeInMillis();
}
private boolean isOrderClosed(OrderDetails order) {
        return !order.isShipped && order.isClosed && order.isClosedAt.getTimeInMillis() <= cal.getTimeInMillis();
}

Pretty readable isn’t it? You just need a few seconds to understand what is going on here. You have the main flow right in sight. When it is needed to go deeper into the code you can pick any method you like to inspect.

Tagged with: