Maybe you can publish this snippet on extensions.xwiki.org .

Thanks,
Marius

On Mar 27, 2014 8:56 PM, "DeHaynes" <[email protected]> wrote:
>
> This code will take the text from a field on the form and set the form
title
> to the text.  It will also rename the document to the specified text.
> Finally it will redirect the XWiki to the newly named document.  This all
> happens when the user saves the document.
>
> I have commented a large part of the code for myself and anyone else
trying
> to understand.
>
> {{groovy}}
> import org.xwiki.observation.*
> import org.xwiki.observation.event.*
> import org.xwiki.bridge.event.*
> import org.xwiki.context.*
> import com.xpn.xwiki.web.*
> import com.xpn.xwiki.*
> import org.apache.velocity.VelocityContext;
>
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletRequestWrapper;
>
> // The main purpose of this class is to allow us to change/add the
> 'xredirect' parameter on the request.  Because we are renaming the
document
> //  in the ProcessDocumentRenamer, if we don't redirect the browser to the
> new document name, they will get a message saying the document they
> //  just saved doesn't exist or has been deleted.
> // This class wraps the HttpServletRequest class from the context.  The
> reason we do this is so we can access the contents of the request.
> //  There is a property('xredirect') that we want to change to point at
our
> renamed document.
> // This also implements XWikiRequest interface.  The reason we do this is
> because this interface is how we access the 'xredirect' parameter.
> public class RequestWrapper extends HttpServletRequestWrapper implements
> XWikiRequest
> {
>     // Used to hold the parameters.
>     private HashMap params = new HashMap();
>
>     // The class constructor.  It takes the HttpServletRequest, object
that
> it is going to wrap, as an input parameter.
>     public RequestWrapper(HttpServletRequest request)
>     {
>         // I do not know what super does?  Do anybody else know?
>         super(request);
>     }
>
>     // Gets parameters from the class.
>     public String getParameter(String name)
>     {
>         // if we added one, return that one
>         if ( params.get( name ) != null )
>         {
>             return params.get( name );
>         }
>
>         // otherwise return what's in the original request.
>         HttpServletRequest req = (HttpServletRequest) super.getRequest();
>
>         return req.getParameter( name );
>     }
>
>     // Method to add parameters to a class.  We will use this when we add
> 'xredirect'.
>     public void addParameter( String name, String value )
>     {
>         params.put( name, value );
>     }
>
>     // This is needed to meet the XWikiRequest interface requirements.
> Since the request is already an XWikiRequest, I just
>     //  box it and pass the parameter through as the return value.
>     public String get(String name)
>     {
>         return ((XWikiRequest)this).get(name);
>     }
>
>     // This is needed to meet the XWikiRequest interface requirements.
> Since the request is already an XWikiRequest, I just
>     //  box it and pass the parameter through as the return value.
>     public javax.servlet.http.Cookie getCookie(String cookieName)
>     {
>         return ((XWikiRequest)this).getCookie(cookieName);
>     }
>
>     // This is needed to meet the XWikiRequest interface requirements.
> Since the request is already an XWikiRequest, I just
>     //  box it and pass it as the return value.
>     public javax.servlet.http.HttpServletRequest getHttpServletRequest()
>     {
>         return ((javax.servlet.http.HttpServletRequest)this);
>     }
> }
>
> // The main purpose of this class is to rename and re-title a document of
> type "DocumentationTemplates.ProcessClass" to the title
> //  specified by the user in the "processName" field within the document.
> This class is a listener that waits for the
> //  "DocumentCreateEvent" or "DocumentUpdateEvents" for the
> "DocumentationTemplates.ProcessClass".  It then checks to see if the
> //  current document name matches the "processName" field.  If it doesn't,
> it will rename and re-title the document to what is
> //  specified in the "processName" field.  It will then use the
> "RequestWrapper" to direct the user's browser to the new document URL.
> class ProcessDocumentRenamer implements EventListener
> {
>     // The "ProcessDocumentRenamer" constructor.  The "xwiki" and
"context"
> input parameters are required, but we do not need them, so
>     //  nothing is done with them.
>     ProcessDocumentRenamer(xwiki, context)
>     {
>     }
>
>     // Required to implement the "EventListener" interface.  It provides
the
> name of the listener to the system.
>     String getName()
>     {
>         // The unique name of this event listener
>         return "ProcessDocumentRenamer"
>     }
>
>     // Required to implement the "EventListener" interface.  It provides
the
> events that the listener will respond to.
>     List<Event> getEvents()
>     {
>         // The list of events this listener listens to
>         return Arrays.asList(new DocumentCreatedEvent(), new
> DocumentUpdatedEvent())
>     }
>
>     // Called by the Observation Manager when an event matches the list of
> events returned by getEvents().
>     void onEvent(Event event, Object source, Object data)
>     {
>         // Defines the type of object we should be looked for.
>         def myObject =
> source.getObject("DocumentationTemplates.ProcessClass");
>
>         // If the page has an object of the specified class, we get the
> object.
>         if (myObject != null)
>         {
>             // Get the title that the user specified for the document and
> store it in the variable "NewDocumentName".
>             //  We will later use to update the title and name of the
> document.
>             def NewDocumentName = myObject.get("processName").value
>
>             // Check if the document name is different than the one the
user
> specified.
>             if (source.getName() != NewDocumentName)
>             {
>                 // Build the new name for the document in the format of
> "SpaceName.PageName".
>                 def FullDocumentName = source.getSpaceName() + "." +
> NewDocumentName;
>
>                 // Set the document title to the new name.
>                 source.setTitle(NewDocumentName)
>
>                 // Force the storage to keep the same version number, so
> that this looks like a single save event
>                 source.setMetaDataDirty(false);
>                 source.setContentDirty(false);
>
>                 // Get the current context.  It is needed to rename the
> document.
>                 def crtContext =
>
Utils.getComponent(Execution.class).getContext().getProperty('xwikicontext')
>
>                 // Rename the document
>                 source.rename(FullDocumentName, crtContext);
>
>                 // Create an instance of the RequestWrapper class and give
> it the request from the current context.
>                 def RedirectRequest = new
> RequestWrapper(crtContext.getRequest());
>
>                 // Get the URL for the document (which has already been
> renamed, so it points to the new location) and
>                 //  store it in the RedirectRequest.
>                 RedirectRequest.addParameter('xredirect',
> source.getURL('view', crtContext));
>
>                 // Store the modified request back in the context.
>                 crtContext.setRequest(RedirectRequest);
>             }
>         }
>     }
> }
>
> // Register against the Observation Manager
> def observation = Utils.getComponent(ObservationManager.class)
> observation.removeListener("ProcessDocumentRenamer")
> def listener = new ProcessDocumentRenamer(xwiki, xcontext)
> observation.addListener(listener)
> {{/groovy}}
>
>
>
>
>
>
> --
> View this message in context:
http://xwiki.475771.n2.nabble.com/Looking-for-help-with-groovy-tp7589782p7589851.html
> Sent from the XWiki- Dev mailing list archive at Nabble.com.
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to