Création d'une classe de plug-in de validation d'élément

Un plug-in de validation d'élément permet de valider un élément TemplatedDocument avant qu'il ne soit validé dans le référentiel. Il est appelé dans le cadre de l'étape de validation d'élément standard. Par exemple, pour les sauvegardes effectuées dans l'interface de création l'API publique ou l'API REST.

Les utilisations possibles de ce point d'extension sont les suivantes :
  • Validation des relations entre zones
  • Validation de zones personnalisées complexes
  • Validation du flux de travaux pour un élément en fonction du type et de l'emplacement dans le référentiel

Création de la classe de plug-in de validation d'élément

  1. Créez une classe Java qui implémente l'interface com.ibm.workplace.wcm.api.ItemValidationPlugin. Cette classe peut implémenter les méthodes suivantes :
    • DocumentId<? extends AbstractAuthoringTemplate>[]validationScope()
    • ItemValidationResult validate(ItemContext context)
    Remarque : La méthode de validation renvoie un élément ItemValidationResult qui signale les erreurs à afficher pour l'utilisateur en cours.
  2. Dans la méthode de validation vous pouvez modifier n'importe quelle zone de l'élément. Lorsque tous les plug-ins de validation sont démarrés, la validation d'objet et de modèle standard est effectuée. Pour plus d'informations, voir la documentation Java sur Web Content Manager.
    Par exemple:
    package com.sample;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Locale;
    
    import com.ibm.portal.ListModel;
    import com.ibm.portal.Localized;
    import com.ibm.portal.ModelException;
    import com.ibm.workplace.wcm.api.AbstractAuthoringTemplate;
    import com.ibm.workplace.wcm.api.AuthoringTemplate;
    import com.ibm.workplace.wcm.api.Content;
    import com.ibm.workplace.wcm.api.Document;
    import com.ibm.workplace.wcm.api.DocumentId;
    import com.ibm.workplace.wcm.api.DocumentLibrary;
    import com.ibm.workplace.wcm.api.DocumentTypes;
    import com.ibm.workplace.wcm.api.RichTextComponent;
    import com.ibm.workplace.wcm.api.WCM_API;
    import com.ibm.workplace.wcm.api.Workspace;
    import com.ibm.workplace.wcm.api.exceptions.ComponentNotFoundException;
    import com.ibm.workplace.wcm.api.exceptions.OperationFailedException;
    import com.ibm.workplace.wcm.api.exceptions.ServiceNotAvailableException;
    import com.ibm.workplace.wcm.api.extensions.validation.ItemContext;
    import com.ibm.workplace.wcm.api.ItemValidationPlugin;
    import com.ibm.workplace.wcm.api.extensions.validation.ItemValidationResult;
    
    /**
     * A simple item validation plug-in
     */
    public class SampleItemValidator implements ItemValidationPlugin
    {
               
       /**
        * A simple list model holding locales.
        */
       protected static class SimpleLocaleListModel<K> implements ListModel<Locale>
       {
          /** the list of locales of this list model */
          final List<Locale> m_localeList = new ArrayList<Locale>();
    
          /**
           * Constructs this simple list model holding the given locales.
           * 
           * @param locales
           *           the locales of this list model. May be <code>null</code>.
           */
          public SimpleLocaleListModel(final Locale[] p_locales)
          {
             if (p_locales != null)
             {
                for (int i = 0; i < p_locales.length; ++i)
                {
                   m_localeList.add(p_locales[i]);
                }
             }
          }
    
          /*
           * (non-Javadoc) 
           * @see com.ibm.portal.ListModel#iterator()
           */
          @Override
          public Iterator<Locale> iterator() throws ModelException
          {
             return m_localeList.iterator();
          }
       }
    
       /** a list model that only contains the English language locale */
       private static final ListModel<Locale> ENGLISH_ONLY = new SimpleLocaleListModel<Locale>(new Locale[]{Locale.ENGLISH});
    
       /*
        * (non-Javadoc)
        * 
        * @see com.ibm.portal.Localized#getDescription(java.util.Locale)
        */
       @Override
       public String getDescription(final Locale p_locale)
       {
          return "This is a simple item validation plugin.";
       }
    
       /*
        * (non-Javadoc)
        * @see com.ibm.portal.Localized#getLocales()
        */
       @Override
       public ListModel<Locale> getLocales()
       {
          return ENGLISH_ONLY;
       }
    
       /*
        * (non-Javadoc)
        * @see com.ibm.portal.Localized#getTitle(java.util.Locale)
        */
       @Override
       public String getTitle(final Locale p_locale)
       {
          return "SimpleItemValidationPlugin";
       }
       
       /**
        * @see com.ibm.workplace.wcm.api.ItemValidationPlugin#validate(com.ibm.workplace.wcm.api.extensions.validation.ItemContext)
        */
       @Override
       public ItemValidationResult validate(ItemContext p_itemContext)
       {
          boolean isValidItem = true;
          String error = null;
          try
          {
             // Perform a very simple validation. Check for the Body element, and return an error if the string "BAD BAD BAD" is
             // found in the field.
             Document document = p_itemContext.document();
             if (document instanceof Content)
             {
                Content content = (Content) document;
                
                RichTextComponent body = (RichTextComponent)content.getComponent("Body");
                
                if (body == null)
                {
                   error = "Item validation failed: Content has no body element";
                   isValidItem = false;
                }
                else
                {
                   if (body.getRichText().contains("BAD BAD BAD"))
                   {
                      error = "Item validation failed: BAD BAD BAD message found in Body field.";
                      isValidItem = false;
                   }
                }
             }
          }
          catch (IllegalStateException e)
          {
             throw e;
          }
          catch (ComponentNotFoundException e)
          {
             error = "Item validation failed: Content has no body element";
             isValidItem = false;
          }
             
          final boolean isValidResponse = isValidItem;
          final String errorMessageResponse = error;     
          
          /**
           * @see com.ibm.workplace.wcm.api.extensions.validation.ItemValidationResult
           * 
           * A very simple ItemValidationResult that only returns errors. 
           */
          return new ItemValidationResult()
          {         
             @Override
             public Localized[] errorMessages()
             {
                return new Localized[]{
                   new Localized()
                   {             
                      public String getTitle(Locale locale)
                      {
                         return errorMessageResponse;
                      }               
                      
                      public ListModel<Locale> getLocales()
                      {
                         return ENGLISH_ONLY;
                      }
                                     
                      public String getDescription(Locale locale)
                      {
                         return null;
                      }
                   }
                };
             }
             
             @Override
             public boolean isValid()
             {
                return isValidResponse;
             }
    
             @Override
             public Localized[] infoMessages()
             {
                return null;
             }
             
             @Override
             public Localized[] warningMessages()
             {
                return null;
             }
             
             @Override
             public Localized[] successMessages()
             {
                return null;
             }
          };
       }
    
       /**
        * @see com.ibm.workplace.wcm.api.ItemValidationPlugin#validationScope()
        */
       public DocumentId<? extends AbstractAuthoringTemplate>[] validationScope()
       {
          try
          {
             // Find the Article authoring template in the sample out of the box library.
             Workspace workspace = WCM_API.getRepository().getSystemWorkspace();
             DocumentLibrary docLib = workspace.getDocumentLibrary("Web Content");
             workspace.setCurrentDocumentLibrary(docLib);
             DocumentId<AuthoringTemplate> templateId = workspace.findByName(DocumentTypes.AuthoringTemplate, "Article").next();
             
             
             
             // This plug-in will be invoked whenever a content item based on this template is saved.
             return new DocumentId[]{templateId};
          }
          catch (ServiceNotAvailableException e)
          {
             e.printStackTrace();
          }
          catch (OperationFailedException e)
          {
             e.printStackTrace();
          }
          return null;
       }
    
       @Override
       public boolean isShownInAuthoringUI()
       {
          return false;
       }
    }
    
    

Création d'un fichier plugin.xml

Un fichier plugin.xml est requis, que le déploiement soit effectué via un fichier WAR, EAR ou JAR. Si vous effectuez un déploiement via une application dans un fichier WAR ou EAR, ajoutez le fichier plugin.xml au dossier WEB-INF de l'application. Lorsque vous utilisez un fichier JAR, vous devez inclure le fichier plugin.xml à la racine de ce fichier JAR.
<?xml version="1.0" encoding="UTF-8"?>
<plugin id="Test" name="Simple Item Validation Plug-in" version="1.0.0" provider-name="IBM">
<extension point="com.ibm.workplace.wcm.api.ItemValidationPlugin" id="SimpleItemValidationPlugin">
<provider class="com.sample.SampleItemValidator"/>
</extension>
</plugin>
  • Chaque plug-in est représenté par une balise <extension></extension> unique.
  • La valeur de l'attribut de point doit être com.ibm.workplace.wcm.api.ItemValidationPlugin.
  • Entrez l'ID de votre choix.
  • Indiquez la classe de fournisseur associée à votre plug-in.
Naming conventions :
Si vous créez une nouvelle application de plug-in associée aux mêmes nom et ID qu'un plug-in existant, le nouveau plug-in risque de remplacer le premier. Lorsque vous créez des applications de plug-in, vérifiez que les éléments suivants sont uniques sur votre système :
  • L'ID plug-in, le nom de plug-in et l'ID extension du fichier plugin.xml.
  • Le nom de classe qualifié complet et le chemin de toutes les classes dans l'application.
  • le chemin d'accès aux fichiers de l'application.