cancel
Showing results for 
Search instead for 
Did you mean: 

[Résolu] Custom Wizard

lamba
Champ on-the-rise
Champ on-the-rise
Bonjour,

J'ai créé une nouvelle action avec un wizard personnalisé, les étapes étant:
- définir le wizard dans web-client-config-custom.xml

<config>
      <wizards>
      <!– Definition of the create rule wizard
         <wizard name="custompublish" managed-bean="PublishActionWizard"
                 title-id="publish_action_title" description-id="publish_action_desc"
                 icon="/images/icons/new_rule_large.gif">
            <step name="conditions" title-id="conditions" description="">
               <page path="/jsp/rules/conditions.jsp"
                     title-id="create_rule_step1_title"
                     description=""
                     instruction-id="default_instruction" />
            </step>
            <step name="actions" title-id="actions" description="">
               <page path="/jsp/actions/extension/publish.jsp"
                     title-id="create_rule_step2_title"
                     description=""
                     instruction-id="default_instruction" />
            </step>
            <step name="details" title-id="details" description="">
               <page path="/jsp/rules/details.jsp"
                     title-id="create_rule_step3_title"
                     description=""
                     instruction-id="default_instruction" />
            </step>
            <step name="summary" title-id="summary" description-id="summary_step_description">
               <page path="/jsp/wizard/summary.jsp"
                     title-id="summary"
                     description-id="summary_desc"
                     instruction-id="create_rule_finish_instruction" />
            </step>
         </wizard>–>
     </wizards>
   </config>

- définir son bean dans faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
                              "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>

   <managed-bean>
      <managed-bean-name>PublishActionWizard</managed-bean-name>
      <managed-bean-class>com.custom.alfresco.action.wizard.PublishActionWizard</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
      <managed-property>
         <property-name>nodeService</property-name>
         <value>#{NodeService}</value>
      </managed-property>
      <managed-property>
         <property-name>searchService</property-name>
         <value>#{SearchService}</value>
      </managed-property>
      <managed-property>
         <property-name>navigator</property-name>
         <value>#{NavigationBean}</value>
      </managed-property>
      <managed-property>
         <property-name>browseBean</property-name>
         <value>#{BrowseBean}</value>
      </managed-property>
      <managed-property>
         <property-name>actionService</property-name>
         <value>#{ActionService}</value>
      </managed-property>
      <managed-property>
         <property-name>dictionaryService</property-name>
         <value>#{DictionaryService}</value>
      </managed-property>
      <managed-property>
         <property-name>mimetypeService</property-name>
         <value>#{MimetypeService}</value>
      </managed-property>
      <managed-property>
         <property-name>personService</property-name>
         <value>#{PersonService}</value>
      </managed-property>
      <managed-property>
         <property-name>authorityService</property-name>
         <value>#{AuthorityService}</value>
      </managed-property>
   </managed-bean>
  
</faces-config>

- Créer la classe bean


public abstract class PublishActionWizard extends BaseActionWizard {
   protected List<SelectItem> listFilters;
   protected String filter;
     
   protected List<SelectItem> listFolders;
   protected String folder;
        
// ——————————————————————————
   // Wizard implementation
  
   @Override
   public void init(Map<String, String> parameters){
      super.init(parameters);
   }
   // ——————————————————————————
   // Bean Getters and Setters
 
   public String getFilter() {
         return filter;
   }
   
   public void setFilter(String filter) {
      this.filter = filter;
   }
   
   public String getFolder() {
      return folder;
   }
   
   public void setFolder(String folder) {
      this.folder = folder;
   }

   public List<SelectItem> getFilters(){
      …
     
      return this.listFilters;
   }
      
   public List<SelectItem> getFolders(){
      …
      
      return this.listFolders;
   }
}

- Créer l'action qui lance le wizard
   + Creer le Handler et l'Executor
   + Ajouter le Handler dans le web-client-config-custom.xml  (sous la condition "Action Wizards")
   + Créer la page jsp
   

     …
      <tr><td colspan="2" class="paddingRow"></td></tr>
                                 <tr>
                                    <td><nobr><h:outputText value="#{customMsg.filters}:"/></nobr></td>
                                    <td width="95%">
                                       <h:inputText value="#{WizardManager.bean.actionProperties.filters}" size="50" maxlength="1024" />
                              <h:selectOneMenu value="#{WizardManager.bean.actionProperties.filters}">
                                 <f:selectItems value="#{WizardManager.bean.listFilters}" />
                              </h:selectOneMenu>
                                    </td>
                                 </tr>
                                
                                 <tr>
                                    <td><nobr><h:outputText value="#{customMsg.folders}:"/></nobr></td>
                                    <td width="95%">
                                       <h:inputText value="#{WizardManager.bean.actionProperties.folders}" size="50" maxlength="1024" />
                              <h:selectOneMenu value="#{WizardManager.bean.actionProperties.folders}">
                                 <f:selectItems value="#{WizardManager.bean.listFolders}" />
                              </h:selectOneMenu>
                                    </td>
                                 </tr>
                                                   
                                 <tr><td class="paddingRow"></td></tr>
     …
   

Mais voilà ce qu'il me retourne comme erreur:

javax.faces.FacesException: javax.faces.el.PropertyNotFoundException: Bean: org.alfresco.web.bean.actions.RunActionWizard, property: listFilters
caused by:
org.apache.jasper.JasperException: javax.faces.el.PropertyNotFoundException: Bean: org.alfresco.web.bean.actions.RunActionWizard, property: listFilters
caused by:
javax.faces.el.PropertyNotFoundException: Bean: org.alfresco.web.bean.actions.RunActionWizard, property: listFilters



Que pourra être le problème?


Merci d'avance.
9 REPLIES 9

rivarola
Champ on-the-rise
Champ on-the-rise
Dans le JSP il y a :
value="#{WizardManager.bean.listFilters}"

Alors que dans le bean il n'y a pas de méthode getListFilters();

lamba
Champ on-the-rise
Champ on-the-rise
Merci philippe,

J'ai remplacé "listFilters" et "listFilters" par "filters" et "folders", mais je remarque que le problème persiste encore !
Je pense que le problème est lié à la configuration du "web-client-config-custom.xml" ou bien du "faces-config-custom.xml" ?!

En fait, j'ai essayé de chercher dans les sources Alfresco là ou le bean "BaseActionWizard" est définit/configuré, mais j'ai pas trouvé!


Merci.

lamba
Champ on-the-rise
Champ on-the-rise
Bonjour,

J'ai trouvé que le problème vient du bean "PublishActionWizard" qui initialise les listes "filters" et "folders",
Ce bean n'est pas reconnu !

à votre avis qu'est ce que j'ai manqué ?

Merci pour votre aide.

lamba
Champ on-the-rise
Champ on-the-rise
Bonjour,

Je vais essayer de mieux expliquer.

Je veux lancer une action en passant pas un Wizard. Ce dernier doit contenir des listes déroulantes remplies à l'aide d'un bean.
Pour cela, j'ai créé une action dans le fichier web-client-config-custom.xml.

<alfresco-config>
   
   <config evaluator="string-compare" condition="Action Wizards">
         <action-handlers>
            <handler name="publish" class="com.custom.alfresco.action.publish.PublishActionHandler" />
      </action-handlers>
   </config>
   
   <config>
      <actions>
         <action id="publish">
            <label>Publish Content</label>
       <image>/images/extension/custom.png</image>
            <action>wizard:publishWizard</action>
            <action-listener>#{BrowseBean.setupSpaceAction}</action-listener>
            <params>
               <param name="id">#{actionContext.id}</param>
            </params>
         </action>
         <action-group id="space_details_actions">
            <action idref="publish" />
         </action-group>
      </actions>
   </config>
  
   <config>
      <wizards>
         <!– Definition of the publish action wizard–>
         <wizard name="publishWizard" managed-bean="PublishActionWizard"
            title-id="publish_action_title" description-id="publish_action_desc"
         icon="/images/icons/new_rule_large.gif">
            <step name="publish" title-id="publish_action_title" description-id="publish_action_desc">
          <page path="/jsp/actions/extension/publish.jsp"
                  title-id="run_action_step1_title"
                  description-id=""
                  instruction-id="default_instruction"/>
            </step>
         </wizard>
      </wizards>
   </config>   
  
</alfresco-config>


à ce niveau l'action est bien affichée dans le menu des actions (sur la vue détaillée d'un espace et dans la liste des actions dans le    "Run Action Wizard").

j'ai créé la page jsp sous "/jsp/actions/extension" :


<% PanelGenerator.generatePanelStart(out, request.getContextPath(), "white", "white"); %>
                              <table cellpadding="2" cellspacing="2" border="0" width="100%">
                                 <tr>
                                    <td colspan="2" class="mainSubTitle"><h:outputText value="#{msg.set_action_values}" /></td>
                                 </tr>
                                 <tr><td colspan="2" class="paddingRow"></td></tr>
                                 <tr>
                                    <td><nobr><h:outputText value="#{customMsg.filters}:"/></nobr></td>
                                    <td width="95%">
                                       <h:inputText value="#{WizardManager.bean.actionProperties.filter}" size="50" maxlength="1024" />
                                       <h:selectOneMenu value="#{WizardManager.bean.actionProperties.filter}">
                    <f:selectItems value="#{PublishActionWizard.filters}" />
               </h:selectOneMenu>
                                    </td>
                                 </tr>
                                
                                 <tr>
                                    <td><nobr><h:outputText value="#{customMsg.folders}:"/></nobr></td>
                                    <td width="95%">
                                       <h:selectOneMenu value="#{WizardManager.bean.actionProperties.folder}">
                  <f:selectItems value="#{PublishActionWizard.folders}" />
               </h:selectOneMenu>
                                    </td>
                                 </tr>
                                
                                 <tr>
                           <td colspan="2"><h:outputText value="#{customMsg.want_index_content}"/></td>
                         </tr>
                         <tr>
                           <td colspan="2">
                           <table cellpadding="2" cellspacing="2" border="0">
                              <tr>
                                 <td valign="top">
                                    <h:selectOneRadio id="index" value="#{WizardManager.bean.actionProperties.index}"
                                     >
                                       <f:selectItem itemValue="yes" itemLabel="#{msg.yes}" />
                                       <f:selectItem itemValue="no" itemLabel="#{msg.no}" />
                                    </h:selectOneRadio>
                                 </td>
                              </tr>
                           </table>
                           </td>
                         </tr>
                        
                                 <tr><td class="paddingRow"></td></tr>
                              </table>


J'ai créé le Handler et l'Executor
J'ai ajouté le Handler au "web-client-config-custom.xml" (sous la condition "Action Wizards") et j'ai définit  l'Executor dans le service-context.xml

J'ai créé le bean du wizard


public abstract class PublishActionWizard extends RunActionWizard
{
   private static final long serialVersionUID = 5925759221710403043L;
   private static final Log logger = LogFactory.getLog(PublishActionWizard.class);
   
   protected List<SelectItem> filters;
   protected String filter;
     
   protected List<SelectItem> folders;
   protected String folder;
  
   protected boolean index;
  
// ——————————————————————————
   // Wizard implementation
  
   /*public void init(Map<String, String> parameters){
      super.init(parameters);
      logger.debug("Finish Constructor …");
   }*/
  
   @Override
   protected String finishImpl(FacesContext context, String outcome) throws Exception{
      logger.debug("finishImpl(FacesContext " + context + ",outcome " + outcome + ") called");
     
      super.finishImpl(context, outcome);
           
      return outcome;
   }
  
   // ——————————————————————————
   // Bean Getters and Setters
 
   public String getFilter() {
         logger.debug("getFilter() called");
         return filter;
   }
   
   public void setFilter(String filter) {
      logger.debug("setFilter( Filter " + filter + ") called");
      this.filter = filter;
   }
   
   public String getFolder() {
      logger.debug("getFolder() called");
      return folder;
   }
   
   public void setFolder(String folder) {
      logger.debug("setFolder(Folder " + folder + ") called");
      this.folder = folder;
   }
   
   public boolean isIndex() {
      logger.debug("isIndex() called");
      return index;
   }

   public void setIndex(boolean index) {
      logger.debug("setIndex(index " + index + ") called");
      this.index = index;
   }

   public List<SelectItem> getFilters(){
      …
                return this.filters;
   }
      
   public List<SelectItem> getFolders(){
      …
      return this.folders;
   }
   
   …
}

J'ai défini le bean du wizard dans le "faces-config-custom.xml" comme suit

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
                              "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
    <managed-bean>
      <managed-bean-name>PublishActionWizard</managed-bean-name>
      <managed-bean-class>com.custom.alfresco.action.wizard.PublishActionWizard</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
      <managed-property>
         <property-name>nodeService</property-name>
         <value>#{NodeService}</value>
      </managed-property>
      <managed-property>
         <property-name>searchService</property-name>
         <value>#{SearchService}</value>
      </managed-property>
      <managed-property>
         <property-name>navigator</property-name>
         <value>#{NavigationBean}</value>
      </managed-property>
      <managed-property>
         <property-name>browseBean</property-name>
         <value>#{BrowseBean}</value>
      </managed-property>
      <managed-property>
         <property-name>actionService</property-name>
         <value>#{ActionService}</value>
      </managed-property>
      <managed-property>
         <property-name>dictionaryService</property-name>
         <value>#{DictionaryService}</value>
      </managed-property>
      <managed-property>
         <property-name>mimetypeService</property-name>
         <value>#{MimetypeService}</value>
      </managed-property>
      <managed-property>
         <property-name>personService</property-name>
         <value>#{PersonService}</value>
      </managed-property>
      <managed-property>
         <property-name>authorityService</property-name>
         <value>#{AuthorityService}</value>
      </managed-property>
   </managed-bean>
  
</faces-config>


Mais, lorsque je lance l'action à partir de la vue détaillée, j'obtiens l'érreur suivante:

org.alfresco.error.AlfrescoRuntimeException: 08030002 Failed to start wizard as managed bean 'PublishActionWizard' has not been defined

Et lorsque je lance l'action à partir du "Run Action Wizard", j'obtiens l'erreur suivante:

javax.faces.FacesException: javax.faces.el.EvaluationException: Cannot get value for expression '#{PublishActionWizard.filters}'
caused by:
org.apache.jasper.JasperException: javax.faces.el.EvaluationException: Cannot get value for expression '#{PublishActionWizard.filters}'
caused by:
javax.faces.el.EvaluationException: Cannot get value for expression '#{PublishActionWizard.filters}'
caused by:
javax.faces.FacesException: java.lang.InstantiationException
caused by:
java.lang.InstantiationException


N.B: J'ai testé l'action avec des zone text au lieu des listes déroulantes et ça marche uniquement lorsque je lance l'action depuis "Run Action Wizard".
Mais lorsque je lance l'action depuis la vue détaillée de l'espace j'ai la même erreur que ci-dessus.

J'ai essayé aussi les recommandation du post http://forums.alfresco.com/en/viewtopic.php?f=3&t=26609 mais sans succès Smiley Sad


Coud de main SVP car je suis sur le point de perdre ce qui reste de mon cerveau  :cry:

Merci pour votre aide,

jayjayecl
Confirmed Champ
Confirmed Champ
pouvez-vous réessayer en insérant au préalable une erreur XML dans le faces-config-custom.xml ?
Cela vous permettra de vérifier qu'au démarrage de tomcat, ce fichier est bien lu.

lamba
Champ on-the-rise
Champ on-the-rise
Merci Rodel d'avoir répondre,

Voilà le résultat de quelques essais que j'ai effectué:

1. J'ai réessayé et j'ai inséré le mot "testEror" avant l'ouverture de la balise "<managed-bean>", l'erreur a été bien détectée mais lorsque j'ai exécuté mon action j'ai eu les mêmes erreurs qu'en dessus !?

2. J'ai ajouté la définition du bean dans "faces-config-beans.xml" d'Alfresco, rien n'est changé, toujours les mêmes erreurs !?

3. J'ai enlevé la déclaration de toutes les propriétés du bean, pas d'erreur détectée mais toujours les mêmes erreurs lorsque je lance l'action !?

En fait, je pense que le problème est au niveau de la JSP, car dans les logs j'ai les erreurs après l'appel du "getJSPPath()":


10:04:53,843 DEBUG [com.rsd.alfresco.action.publish.PublishActionHandler] getJSPPath() called
10:04:53,890 ERROR [org.apache.myfaces.shared_impl.util.ClassUtils]
java.lang.InstantiationException
   at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30)
   at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
   at java.lang.Class.newInstance0(Class.java:355)



Merci pour votre aide.

lamba
Champ on-the-rise
Champ on-the-rise
Avez vous besoins d'autres informations pour m'aider?
Si c'est le cas n'hésitez plus.

Merci.

jayjayecl
Confirmed Champ
Confirmed Champ
Pouvez vous modifier la jsp en plaçant :

  <f:selectItems value="#{WizardManager.bean.filters}" />

et nous donner le résultat (trace d'erreur complète le cas échéant) ?

lamba
Champ on-the-rise
Champ on-the-rise
Merci Rodel,

En fait, j'ai essayé ta proposition et j'ai eu des erreurs comme avant…

Mais j'ai comme même réussi à résoudre mon pb Smiley Happy.

Voilà le code qui marche pour mon bean:
- Implémentation du bean (extends BaseWizardBean au lieu de extends RunActionWizard)
Et J'étais obligé de changer le nom du bean car même avec ce code qui marche, si j'utilise l'ancien nom "PublishActionWizard " j'obtiens des erreurs comme avant !!!? Quelqu'un a d'explication à ceci ?



public class PublishContentWizard extends BaseWizardBean
{
   private static final long serialVersionUID = 5925759221710403043L;
   private static final Log logger = LogFactory.getLog(PublishContentWizard.class);
   
   protected List<SelectItem> filters;
   protected String filter;
     
   protected List<SelectItem> folders;
   protected String folder;
        
   // ——————————————————————————
   // Wizard implementation
  
   @Override
   protected String finishImpl(FacesContext context, String outcome) throws Exception{
      logger.debug("finishImpl(FacesContext " + context + ",outcome " + outcome + ") called");

      return outcome;
   }
  
   // ——————————————————————————
   // Bean Getters and Setters
 
   public String getFilter() {
         logger.debug("getFilter() called");
         return filter;
   }
   
   public void setFilter(String filter) {
      logger.debug("setFilter( Filter " + filter + ") called");
      this.filter = filter;
   }
   
   public String getFolder() {
      logger.debug("getFolder() called");
      return folder;
   }
   
   public void setFolder(String folder) {
      logger.debug("setFolder(Folder " + folder + ") called");
      this.folder = folder;
   }
   
   public List<SelectItem> getFilters()
   {
      logger.debug("getFilters() called");
      if (this.filters == null)
      {
         this.filters = new ArrayList<SelectItem>();
        
         try {
                …
      this.filters.add(new SelectItem( filterVal));
        …   
        // make sure the list is sorted by the label
               QuickSort sorter = new QuickSort(this.filters, "label", true, IDataContainer.SORT_CASEINSENSITIVE);
               sorter.sort();
           
        } catch (Exception ex) {
                       …
        }
      }
     
      return this.filters;
   }

   public List<SelectItem> getFolders(){
      logger.debug("getFolders() called");      
      if (this.folders == null || this.folders.isEmpty())
      {
               this.folders = new ArrayList<SelectItem>();
        
         if (selectedFilter != null) {
            try {
                 …
                                        this.folders.add(new SelectItem(folderVal));
                                        …
                 // make sure the list is sorted by the label
                                    QuickSort sorter = new QuickSort(this.folders, "label", true, IDataContainer.SORT_CASEINSENSITIVE);
                             sorter.sort();
                    
                 } catch (Exception ex) {
                    …
                 }
         }
      }
      
      return this.folders;
   }
   …
}

- Déclaration dans le "faces-config-custom.xml":

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
                              "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
   <managed-bean>
      <managed-bean-name>PublishContentWizard</managed-bean-name>
      <managed-bean-class>com.rsd.alfresco.action.wizard.PublishContentWizard</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
      <managed-property>
         <property-name>nodeService</property-name>
         <value>#{NodeService}</value>
      </managed-property>
      <managed-property>
         <property-name>fileFolderService</property-name>
         <value>#{FileFolderService}</value>
      </managed-property>
      <managed-property>
         <property-name>searchService</property-name>
         <value>#{SearchService}</value>
      </managed-property>
      <managed-property>
         <property-name>navigator</property-name>
         <value>#{NavigationBean}</value>
      </managed-property>
      <managed-property>
         <property-name>browseBean</property-name>
         <value>#{BrowseBean}</value>
      </managed-property>
      <managed-property>
         <property-name>dictionaryService</property-name>
         <value>#{DictionaryService}</value>
      </managed-property>
      <managed-property>
         <property-name>namespaceService</property-name>
         <value>#{NamespaceService}</value>
      </managed-property>
   </managed-bean>
  
</faces-config>

- Rien à mettre dans le "web-client-config-custom.xml", seulement la déclaration du Handler.
- Dans la page JSP, j'utilise l'appel
<f:selectItems value="#{PublishContentWizard.filters}" />


Merci pour vos coud de main

Et Louange à Allah, Seigneur des Univers Smiley Wink