Showing posts with label Enum. Show all posts
Showing posts with label Enum. Show all posts

Sunday, September 11, 2011

Introducing Enum Support With Apache Axis2

Now you can find java Enum support with Axis2 1.7.0 version (Not yet released, you can download trunk and build it). It is a new feature to Axis2 as previous versions didn't support a java Enum as a service method parameter. But with this new feature you can use java Enum constants as a service method parameter in your service. Not only in java level it supports wsdl level too. Therefore we can use this new feature in code-first approach as well as in contract-first approach. The following example explains about how to use Enum support in code-first approach and contract-first approach in pojo service.

Deploying a Service which uses Enum in method parameter.

Here is the simple pojo service class. This service class have three methods and two enum classes Day and Status, where Day is a simple enum constant and Status has a user defined constructor which gets an int and a String as its parameters.

 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
/**
 * @author shameera
 */
public class EnumService {

    public Day testDay(Day day) {
        System.out.println(day.getDeclaringClass());
        System.out.println(day.toString());
        return day;
    }

    public Event callEvent(Event newEvent) {
        Day eventDay = newEvent.getStartingDay();
        System.out.println("Event Starting day is : " + eventDay.toString());
        return newEvent;
    }

    public Status testStatus(Status status) {
        return status;
    }

    public enum Day {
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    }

    public enum Status {
        START(0, "start"), ACTIVE(1, "active"), STOP(2, "stop");

        private final int val;
        private final String desc;

        Status(int val, String desc) {
            this.val = val;
            this.desc = desc;
        }

        public int value() {
            return this.val;
        }

        public String description() {
            return this.desc;
        }
    }
}
Methods :

1. testDay - get and return Day enum constant.

2. testStatus - get and return Status enum constant.

3. callEvent - get and return Event pojo object which use Day enum constant.

Here is the Event pojo class.
 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
/**
 * @author shameera
 */
public class Event {

    private EnumService.Day startingDay;
    private String eventDesc ;
    private String eventName;

    public EnumService.Day getStartingDay() {
        return startingDay;
    }

    public void setStartingDay(EnumService.Day startingDay) {
        this.startingDay = startingDay;
    }

    public String getEventDesc() {
        return eventDesc;
    }

    public void setEventDesc(String eventDesc) {
        this.eventDesc = eventDesc;
    }

    public String getEventName() {
        return eventName;
    }

    public void setEventName(String eventName) {
        this.eventName = eventName;
    }
}

Using these two classes and services.xml create .aar file and deploy it in Axis2. After successfully deploy it you can see it in axis2 services page.

You can see generated wsdl of EnumService service by clicking it. Here are some parts of the wsdl file of Enumservice service.
NOTE: make sure that you are using Axis2 1.7.0 if not generated wsdl for this service is not a validated wsdl.

In wsdl file you can see that for the enum constants it has a new schema generated "http://ws.apache.org/namespaces/axis2/enum" as targetNamespace.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://ws.apache.org/namespaces/axis2/enum">
    <xs:simpleType name="Status">
        <xs:restriction base="xs:string">
            <xs:enumeration value="START"/>
            <xs:enumeration value="ACTIVE"/>
            <xs:enumeration value="STOP"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="Day">
        <xs:restriction base="xs:string">
            <xs:enumeration value="MONDAY"/>
            <xs:enumeration value="TUESDAY"/>
            <xs:enumeration value="WEDNESDAY"/>
            <xs:enumeration value="THURSDAY"/>
            <xs:enumeration value="FRIDAY"/>
            <xs:enumeration value="SATURDAY"/>
            <xs:enumeration value="SUNDAY"/>
        </xs:restriction>
    </xs:simpleType>
    </xs:schema>

This is the generated schema part for testDay method
1
2
3
4
5
6
7
    <xs:element name="testDay">
    <xs:complexType>
        <xs:sequence>
            <xs:element minOccurs="0" name="day" nillable="true" type="ax21:Day"/>
        </xs:sequence>
    </xs:complexType>
    </xs:element>

This is the generated schema part for testDayResponse
1
2
3
4
5
6
7
    <xs:element name="testDayResponse">
    <xs:complexType>
        <xs:sequence>
            <xs:element minOccurs="0" name="return" nillable="true" type="ax21:Day"/>
        </xs:sequence>
    </xs:complexType>
    </xs:element>

Here is the main generated schema for this service
 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
    <xs:schema xmlns:ax24="http://axis2userguide.axis2.apache.org/xsd" xmlns:ax22="http://ws.apache.org/namespaces/axis2/enum" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://axis2userguide.axis2.apache.org">
    <xs:import namespace="http://ws.apache.org/namespaces/axis2/enum"/>
    <xs:import namespace="http://axis2userguide.axis2.apache.org/xsd"/>
    <xs:element name="testStatus">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="status" nillable="true" type="ax21:Status"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="testStatusResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="return" nillable="true" type="ax21:Status"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="testDay">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="day" nillable="true" type="ax21:Day"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="testDayResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="return" nillable="true" type="ax21:Day"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="callEvent">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="newEvent" nillable="true" type="ax23:Event"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="callEventResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="return" nillable="true" type="ax23:Event"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    </xs:schema>

Here is the generated schema for Event Pojo object.
1
2
3
4
5
6
7
8
9
    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://axis2userguide.axis2.apache.org/xsd">
    <xs:complexType name="Event">
        <xs:sequence>
            <xs:element minOccurs="0" name="eventDesc" nillable="true" type="xs:string"/>
            <xs:element minOccurs="0" name="eventName" nillable="true" type="xs:string"/>
            <xs:element minOccurs="0" name="startingDay" nillable="true" type="ax21:Day"/>
        </xs:sequence>
    </xs:complexType>
    </xs:schema>

Enum schema generation process is intelligent enough to generate only one schema type for each enum class.

You can write a schema for Enum support now which means now you can use contract-first approach too.

If you have any problem regarding enum support in Axis2 you can ask it here or Axis2-user mailing list.

Sample Text

Website counter

Categories