vendredi 5 février 2010

Générer ses classes java à partir de l'enterprise.wsdl de Salesforce avec Axis 2

Voici un méthode que j'avais posté il y a quelques temps sur les forum de Salesforce pour générer des classes Java à partir du fichier enterprise.wsdl et axis 2 sous windows. J'utilise wsdl2java pour générer les classes.





Ajoutez Java et Axis à votre path, par exemple:
JAVA_HOME = C:\Program Files\Java\jdk1.6.0_07
AXIS2_HOME = Q:\SalesForce\WSDL2JAVA_Generation\axis2-1.4.1-bin\axis2-1.4.1


puis, créez un répertoire pour placer vos données. Dans ce répertoire vous pouvez mettre un sous-répertoire pour placer votre WSDL. Puis lancez cette commande:

%AXIS2_HOME%/bin/wsdl2java -t -uri wsdl/enterprise.wsdl -l java -d xmlbeans -p com.salesforce.webservice -sn SforceService -o generated/Salesforce


bien entendu:
- "wsdl/enterprise.wsdl" est le chemin relatif de mon WSDL
- "com.salesforce.webservice" est le nom du package qui contiendra les classes générées
- "generated/Salesforce" est le sous-répertoire qui contiendra les classes du package

Dans mon exemple, a un sous-rpertoire Salesforce est créé dans le répertoire "generated". Il contient:
- [src] qui contient les classes générées
- [resources] qui contient les ressources nécessaires à la connexion avec Salesforce
- [test] qui contient des classes de tests

Empaquetez le contenu du répertoire resources (pas le répertoire lui-même) dans un fichier .jar.

Compilez les classes contenues dans src, et empaquetez-les dans un fichier du nom de salesforce.jar (par exemple).

Ensuite, il vous faut intégrer resources.jar, salesforce.jar et les bibliothèques Axis2 à votre classpath. Pour cela, chacun sa méthode, moi j'utilise Eclipse (pour générer salesforce.jar aussi).

Et voici mon implémentation java:

Voici le constructeur pour mon objet de session Salesforce:

public static final String PROD_SERVER = "https://www.salesforce.com/services/Soap/c/16.0";
    public static final String SANDBOX_SERVER = "https://test.salesforce.com/services/Soap/c/16.0";
    
    public Exception exception;
    
    private Login login;

    private SessionHeader sessionHeader;

    private SessionHeaderDocument sessionHeaderDocument;
    
    private String endpoint;

    private String UserName, PassWord;

    private int Progress;

    private String ProgressText;

    private String server;

    private SforceServiceStub stub;
    

    /**
     * This constructor initializes a connexion with Saleforce using user name
     * and password. 
     * 
     * @param UN
     *            Salesforce User Name
     * @param PW
     *            Salesforce User Password
     * @throws Exception
     */
    public Salesforce_session(final String UN, final char[] PW) throws Exception
    {
 
 UserName = UN;
 PassWord = String.valueOf(PW);

 
  try
  {

      setProgress(0, "Loging");
      if (UN.endsWith(".sand"))
      {
   endpoint = SANDBOX_SERVER;
      } else
      {
   endpoint = PROD_SERVER;
      }

      stub = new SforceServiceStub(endpoint);

      LoginDocument loginDocument = LoginDocument.Factory.newInstance();

      login = Login.Factory.newInstance();

      login.setUsername(UserName);

      login.setPassword(PassWord);

      loginDocument.setLogin(login);

      LoginResponseDocument loginResponseDocument = stub.login(loginDocument, null);

      LoginResponse loginResponse = loginResponseDocument.getLoginResponse();

      LoginResult loginResult = loginResponse.getResult();

      sessionHeader = SessionHeader.Factory.newInstance();

      sessionHeader.setSessionId(loginResult.getSessionId());

      sessionHeaderDocument = SessionHeaderDocument.Factory.newInstance();

      sessionHeaderDocument.setSessionHeader(sessionHeader);

      setProgress(10, "Loading service");

      fireMyEvent(new MyEvent("Loading Service..."));
      stub = new SforceServiceStub(loginResult.getServerUrl());

      Options options = stub._getServiceClient().getOptions();
      fireMyEvent(new MyEvent("Setting Gzip Compression IN..."));
      options.setProperty(HTTPConstants.MC_ACCEPT_GZIP, Boolean.TRUE);

      options.setProperty(HTTPConstants.MC_GZIP_REQUEST, Boolean.TRUE);

      fireMyEvent(new MyEvent("Connexion established"));

  } catch (AxisFault e)
  {
     exception = e;

  } catch (RemoteException e)
  {
      exception = e;
  } catch (InvalidIdFault e)
  {
      exception = e;
  } catch (UnexpectedErrorFault e)
  {
      exception = e;
  } catch (diva.salesforce.webservice.LoginFault e)
  {
      exception = e;
  } catch (ExceptionInInitializerError e)
  {
      exception = (Exception) e.getException();
  }

    

    }


ainsi que ma méthode de requètes:

/**
     * Use this method to send SOQL queries to salesforce.
     * 
     * @param querystr
     *            the SOQL query to send to salesforce.
     * @return Query Result
     * @throws RemoteException
     * @throws InvalidSObjectFault
     * @throws MalformedQueryFault
     * @throws InvalidIdFault
     * @throws InvalidFieldFault
     * @throws UnexpectedErrorFault
     * @throws InvalidQueryLocatorFault
     */
    public QueryResult Query(final String querystr) throws RemoteException, InvalidSObjectFault, MalformedQueryFault,
     InvalidIdFault, InvalidFieldFault, UnexpectedErrorFault, InvalidQueryLocatorFault
    {
 
 Query query;
 QueryDocument queryDocument;
 QueryResponseDocument queryResponseDocument;
 QueryResponse queryResponse;
 QueryResult queryResult = null;

 query = Query.Factory.newInstance();

 query.setQueryString(querystr);

 queryDocument = QueryDocument.Factory.newInstance();

 queryDocument.setQuery(query);

 queryResponseDocument = stub.query(queryDocument, sessionHeaderDocument, null, null, null);

 queryResponse = queryResponseDocument.getQueryResponse();

 queryResult = queryResponse.getResult();

 return queryResult;

    }
 


pareil pour l'insertion en base:

/**
     * Use this method to insert several {@link SObject} in salesforce.
     * 
     * @param sObjectsArray
     * @return a {@link SaveResult} array for each inserted objects
     * @throws RemoteException
     * @throws InvalidSObjectFault
     * @throws InvalidIdFault
     * @throws InvalidFieldFault
     * @throws UnexpectedErrorFault
     */
    public SaveResult[] Insert(SObject[] sObjectsArray) throws RemoteException, InvalidSObjectFault, InvalidIdFault,
     InvalidFieldFault, UnexpectedErrorFault
    {

 SaveResult[] saveResultArray = null;
 // Invoke the create call

 CreateDocument createDocument = CreateDocument.Factory.newInstance();
 Create create = createDocument.addNewCreate();

 create.setSObjectsArray(sObjectsArray);

 CreateResponseDocument createResponseDocument = stub.create(createDocument, sessionHeaderDocument, null, null,
  null, null, null, null);

 CreateResponse createResponse = createResponseDocument.getCreateResponse();
 saveResultArray = createResponse.getResultArray();

 return saveResultArray;

    }


et la mise-à-jour de champs:

/**
     * Use this method to update several {@link SObject} in salesforce.
     * 
     * @param sObjectsArray
     * @return
     * @throws RemoteException
     * @throws InvalidSObjectFault
     * @throws InvalidIdFault
     * @throws InvalidFieldFault
     * @throws UnexpectedErrorFault
     */
    public SaveResult[] Update(SObject[] sObjectsArray) throws RemoteException, InvalidSObjectFault, InvalidIdFault,
     InvalidFieldFault, UnexpectedErrorFault
    {
 
 SaveResult[] updateResultArray = null;
 // Invoke the update call

 UpdateDocument updateDocument = UpdateDocument.Factory.newInstance();
 Update update = updateDocument.addNewUpdate();

 update.setSObjectsArray(sObjectsArray);

 UpdateResponseDocument updateResponseDocument = stub.update(updateDocument, sessionHeaderDocument, null, null,
  null, null, null, null);
 UpdateResponse updateResponse = updateResponseDocument.getUpdateResponse();
 updateResultArray = updateResponse.getResultArray();

 return updateResultArray;

    }


ou la suppression de champs:
/**
     * This method take an array of object ids to delete ins salesforce. Deleted
     * object can be retrieved in the recycle bin.
     * 
     * @param sObjectsIdArray
     * @return
     * @throws RemoteException
     * @throws UnexpectedErrorFault
     */
    public DeleteResult[] Delete(String[] sObjectsIdArray) throws RemoteException, UnexpectedErrorFault
    {
 DeleteResult[] deleteResultArray = null;
 // Invoke the delete call

 DeleteDocument deleteDocument = DeleteDocument.Factory.newInstance();
 com.sforce.soap.enterprise.DeleteDocument.Delete delete = deleteDocument.addNewDelete();

 delete.setIdsArray(sObjectsIdArray);

 DeleteResponseDocument deleteResponseDocument = stub.delete(deleteDocument, sessionHeaderDocument, null, null,
  null, null, null);
 DeleteResponse deleteResponse = deleteResponseDocument.getDeleteResponse();
 deleteResultArray = deleteResponse.getResultArray();

 return deleteResultArray;

    }


Comme vous pouvez le voir, c'est un peu le même bateau pour chaque méthode.

En espérant vous avoir aidé. Mon post original sur le forum communautaire de Salesforce: http://community.salesforce.com/sforce/board/message?board.id=JAVA_development&message.id=6728#M6728 N'hésitez pas à consulter le site de Salfesforce pour plus d'informations sur les évolutions de la solution : www.salesforce.com/fr

Twitter