Как сделать вызовы confluence2 через XWikiXmlRpcClient?

Использование версии этого кода. (Код изменен, чтобы использовать страницы, относящиеся к моей настройке слияния, за исключением того, что он идентичен этому):

import java.net.MalformedURLException;
import org.apache.xmlrpc.XmlRpcException;
import org.codehaus.swizzle.confluence.Page;
import org.xwiki.xmlrpc.XWikiXmlRpcClient;


public class UpdatePage {

   public static void main(String[] args) throws MalformedURLException, XmlRpcException {

   //URL of the xwiki instance
   String url = "http://localhost:8080/xwiki/xmlrpc/confluence";

   //Replace user & pass with desired xwiki username & password
   String user = "Admin";
    String pass = "admin";


    XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url);
   try {

       //Perform Login & Authentication
       rpc.login(user, pass);

       //Create a Page object to hold our Document information
       Page page = new Page();
       //Fetch the required page. In our example, the page is in Space "demo code"
       //and the Page is "Update Page"
       page=rpc.getPage("demo code.Update Page");
       //Fetch the content of the page & store it in a string for temporary storage
       //This is the present content of the Page
       String presentContent=page.getContent();
       //Create a string that will hold the new content that is to be added to the Page
       String newContent="\\\\Some new content added";
       //Set the content of the page as: present content + new content
       //However, this page is not yet stored to XWiki. It only resides in your application
       page.setContent(presentContent+newContent);
       //Finally, store the "updated" Page to XWiki
       rpc.storePage(page);

       //Just to make sure everything saved all right, fetch the content again for the Page
       System.out.println(page.getContent());

   } catch (XmlRpcException e) {
        System.out.println("invalid username/password was specified or communication problem or ");
        System.out.println(e);
   } finally {
        rpc.logout();
   }
   }
}

взято с http://extensions.xwiki.org/xwiki/bin/view/Extension/XML-RPC+Integration+Java+Examples

Когда он пытается получить эту страницу из Confluence:

page=rpc.getPage("demo code.Update Page");

Я получаю эту ошибку при использовании кода выше:

   org.apache.xmlrpc.XmlRpcException: java.lang.Exception:   com.atlassian.confluence.rpc.RemoteException: You must supply a valid number as the page ID.

Затем, если я получу идентификатор страницы со страницы и использую это:

page = rpc.getPage("39201714");

Я получаю это исключение:

org.apache.xmlrpc.XmlRpcException: java.lang.Exception:   com.atlassian.confluence.rpc.RemoteException: Unsupported operation: Wiki formatted content can no longer be retrieved from this API. Please use the version 2 API. The version 2 WSDL is available at: http://confluence:8080/rpc/soap-axis/confluenceservice-v2?wsdl. XML-RPC requests should prefixed with "confluence2.".

Нужно ли менять URL-адрес слияния для доступа к API-интерфейсу confluence2? Не знаю, как изменить то, что использует XWikiXmlRpcClient.


person eeijlar    schedule 10.11.2015    source источник


Ответы (2)


Исходная версия страницы, похоже, в формате вики. Можете ли вы удалить его, чтобы он был пуст?

Я думаю, что ошибка связана с тем, что вы пытаетесь получить страницу в неподдерживаемом формате.

Также убедитесь, что у вас есть правильный wsdl для confluence2 (поскольку вы использовали версию 1 раньше)

person Somaiah Kumbera    schedule 10.11.2015
comment
Страница уже пуста. Также убедитесь, что у вас есть правильный wsdl для confluence2 (поскольку вы использовали версию 1 раньше) — значит ли это, что я изменил URL-адрес, используемый для подключения к confluence? - person eeijlar; 10.11.2015
comment
Нет, это должно быть нормально, но я думаю, вам нужно скачать файл wsdl по ссылке в сообщении об ошибке confluence:8080/rpc/soap-axis/confluenceservice-v2?wsdl и повторно сгенерируйте код Java. - person Somaiah Kumbera; 10.11.2015
comment
Кроме того, когда вы вызываете API, вам нужно специально вызывать версию v2, поэтому вы должны вызывать rpc.confluence2.getPage() вместо rpc.getPage(). - person Somaiah Kumbera; 10.11.2015
comment
В объекте rpc нет метода confluence2. Объект строится следующим образом: XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(CONFLUENCE_URI); - person eeijlar; 10.11.2015

Если вы посмотрите на исходный код XWikiXmlRpcClient, конструктор покажет, что он использует confluence1:

    /**
 * Constructor.
 * 
 * @param endpoint The endpoint for the XMLRPC servlet.
 * @throws MalformedURLException
 */
public XWikiXmlRpcClient(String endpoint) throws MalformedURLException
{
    this(endpoint, "confluence1");
}

Это вызывает внутренний конструктор, использующий confluence1 в качестве обработчика RPC.

Однако у класса есть два конструктора, поэтому должна быть возможность вызывать одно и то же непосредственно из-за пределов класса:

 XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(CONFLUENCE_URI, "confluence2");

Позже, когда он вызывает rpc, confluence2 (this.rpcHandler) добавляется к строке:

    private synchronized Object invokeRpc(String methodName, Object... args) throws XmlRpcException
{
    return this.xmlRpcClient.execute(String.format("%s.%s", this.rpcHandler, methodName), args);
}

Вам нужно использовать обе версии объекта confluence1 и confluence2 для обновления страницы:

 XWikiXmlRpcClient rpcConfluence1 = new    XWikiXmlRpcClient(CONFLUENCE_URI);
    XWikiXmlRpcClient rpcConfluence2 = new XWikiXmlRpcClient(CONFLUENCE_URI, "confluence2");
    try {
        rpcConfluence1.login(USER_NAME, PASSWORD);
        rpcConfluence2.login(USER_NAME, PASSWORD);
        Page page = new Page();     
        page = rpcConfluence2.getPage(PAGEID);

        List<String> lines = Files.readAllLines(Paths.get("summary.markup"), Charset.defaultCharset());
        StringBuilder b = new StringBuilder();
        for(int i=0; i < lines.size(); i++) {
                b.append(String.format("%s%s", lines.get(i), "\r\n"));
        }              
        page.setContent(b.toString());

        rpcConfluence1.storePage(page);
        } catch (XmlRpcException e) {
            e.printStackTrace();
        }



}
person eeijlar    schedule 11.11.2015