Как использовать интерфейс SOAP для TrackStudio

Как получить классы из WSDL

wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Acl?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Attachment?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Bookmark?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Category?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Constants?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Export?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Filter?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Find?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Index?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/MailImport?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Message?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Prstatus?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Registration?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Report?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/SCM?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Step?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Task?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Template?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Udf?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/User?wsdl
wsimport -d bin -s src http://localhost:8800/TrackStudio/services/Workflow?wsdl

Либо использовать ant task:

<property name="temp.dir" value="./temp"/>
<property name="lib.dir" value="./lib"/>
<property name="classpath.dir" value="${lib.dir}/commons-discovery.jar:
                                         ${lib.dir}/commons-logging-1.1.1.jar:
                                         ${lib.dir}/jaxrpc.jar:
                                         ${lib.dir}/log4j-1.2.15.jar:
                                         ${lib.dir}/opencsv-1.8.jar:
                                         ${lib.dir}/xerces-2.6.2.jar:
                                         ${lib.dir}/webservices-rt.jar:
                                         ${lib.dir}/webservices-tools.jar:
                                         ${lib.dir}/saaj.jar"/>
<property name="soapURL" value="http://localhost:8800/TrackStudio/services"/>
    <target name="ts-client">
        <delete dir="${temp.dir}"/>
        <mkdir dir="${temp.dir}"/>
        <mkdir dir="${temp.dir}/compiled"/>
        <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport">
            <classpath path="${classpath.dir}"/>
        </taskdef>
        <wsimport wsdl="${soapURL}/Acl?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Attachment?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Bookmark?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Category?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Constants?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Export?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Filter?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Find?wsdl" destdir="${temp.dir}/compiled"  keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Index?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/MailImport?wsdl" destdir="${temp.dir}/compiled"  keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Message?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Prstatus?wsdl" destdir="${temp.dir}/compiled"  keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Registration?wsdl" destdir="${temp.dir}/compiled"  keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Report?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/SCM?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Step?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Task?wsdl" destdir="${temp.dir}/compiled"  keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Template?wsdl" destdir="${temp.dir}/compiled"  keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Udf?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/User?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <wsimport wsdl="${soapURL}/Workflow?wsdl" destdir="${temp.dir}/compiled" keep="true" extension="true"/>
        <jar basedir="${temp.dir}/compiled" jarfile="${lib.dir}/ts-soapclient.jar"/>
        <delete dir="${temp.dir}"/>
    </target>

После того, как вы получите классы, можно приступать к написанию своего SOAP-клиента. В SOAP вы можете оперировать сервисами или контейнерами. Сервисы нужны для выполнения различных функций, в контейнерах, соответственно, переносятся данные.
Сервис для манипулирования задачами можно получить, например, так:

public static final String url = "http://localhost:8800/TrackStudio/services/";
public Task getTaskService(url) throws MalformedURLException {
        TaskService service = new TaskService(new URL(url + Task.class.getSimpleName() + "?wsdl"), 
        new QName("http://task.service.soap.trackstudio.com/", "TaskService"));
        return service.getTaskPort();
    }

url, разумеется, нужно подставить свой.
Теперь чтобы, например, создать задачу, нужно выполнить метод createTask сервиса TaskService:

public String createTask(@WebParam(name = "sessionId") String sessionId, 
    @WebParam(name = "categoryId") String categoryId, @WebParam(name = "shortname") String shortname, 
    @WebParam(name = "name") String name, @WebParam(name = "description") String description,
    @WebParam(name = "budget") long budget, @WebParam(name = "deadline") long deadline, 
    @WebParam(name = "priorityId") String priorityId, @WebParam(name = "parentId") String parentId,
    @WebParam(name = "handlerUserId") String handlerUserId, 
    @WebParam(name = "handlerGroupId") String handlerGroupId, 
    @WebParam(name = "udfNames") String[] udfNames, 
    @WebParam(name = "udfValues") String[] udfValues) throws Exception;

В примере ниже мы будем получать список задач, у которых определенное дополнительное поле (UDF) равно заданному значению (скачать исходный код)

package soap.client;
import com.trackstudio.soap.service.task.*;
import com.trackstudio.soap.service.udf.Udf;
import com.trackstudio.soap.service.udf.UdfService;
import com.trackstudio.soap.service.user.User;
import com.trackstudio.soap.service.user.UserService;

import javax.xml.namespace.QName;
import java.lang.Exception;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class Client {
    public static void main(String[] args) throws Exception {
        String url = "http://localhost:8080/services/", login = "root",
 password = "root", taskId = "1";
        String sessionId = getSessionId(url, login, password);
        Task task = task(url);
        Udf udf = udf(url);
        TaskFvalueBean taskFvalueBean = new TaskFvalueBean();
        taskFvalueBean.setSubtask("1");
        taskFvalueBean.setUdf("UDFff8080812ceeeb53012ceeec55cf0002->_eq_test;");
        TaskSliderBean sliderBean = task.getTaskList(sessionId, taskId, taskFvalueBean, true, 20, 
new ArrayList<String>());
        for (TaskBean bean : sliderBean.getTasks()) {
            List<com.trackstudio.soap.service.udf.UdfValueBean> udfs = 
udf.getUdfValues(sessionId, bean.getId());
            System.out.print(bean.getName() + ":\t\t");
            for (com.trackstudio.soap.service.udf.UdfValueBean valueBean : udfs) {
                System.out.print(valueBean.getName() +"->"+valueBean.getValue()+
 ", ");
            }
            System.out.println();
        }
    }

    private static String getSessionId(String url, String login, String password) throws Exception {
        UserService service = new UserService(new URL(url + User.class.getSimpleName() +
 "?wsdl"), new QName("http://user.service.soap.trackstudio.com/", 
"UserService"));
        User user = service.getUserPort();
        return user.authenticate(login, password);
    }

    private static Task task(String url) throws Exception {
        TaskService service = new TaskService(new URL(url + Task.class.getSimpleName() + 
"?wsdl"), new QName("http://task.service.soap.trackstudio.com/", 
"TaskService"));
        return service.getTaskPort();
    }

    private static Udf udf(String url) throws Exception {
        UdfService service = new UdfService(new URL(url + Udf.class.getSimpleName() +
 "?wsdl"), new QName("http://udf.service.soap.trackstudio.com/", 
"UdfService"));
        return service.getUdfPort();
    }
}
AttachmentSize
Client.java2.34 KB