/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.ext.script.groovy;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.rest.ObjectFactory;
import org.exoplatform.services.rest.ext.groovy.ResourceId;
import org.exoplatform.services.rest.resource.AbstractResourceDescriptor;
import javax.jcr.Node;
import javax.jcr.Session;
import javax.jcr.observation.Event;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;
/**
* @author <a href="mailto:andrew00x@gmail.com">Andrey Parfonov</a>
* @version $Id: GroovyScript2RestUpdateListener.java 34445 2009-07-24 07:51:18Z
* dkatayev $
*/
public class GroovyScript2RestUpdateListener implements EventListener
{
/** Logger. */
private static final Log LOG = ExoLogger.getLogger("exo.jcr.component.ext.GroovyScript2RestUpdateListener");
/** Repository name. */
private final ManageableRepository repository;
/** Workspace name. */
private final String workspaceName;
/** See {@link GroovyScript2RestLoader}. */
private final GroovyScript2RestLoader groovyScript2RestLoader;
/**
* @param repository repository
* @param workspace workspace name
* @param groovyScript2RestLoader See {@link GroovyScript2RestLoader}
*/
public GroovyScript2RestUpdateListener(ManageableRepository repository, String workspace,
GroovyScript2RestLoader groovyScript2RestLoader)
{
this.repository = repository;
this.workspaceName = workspace;
this.groovyScript2RestLoader = groovyScript2RestLoader;
}
/**
* {@inheritDoc}
*/
public void onEvent(EventIterator eventIterator)
{
// waiting for Event.PROPERTY_ADDED, Event.PROPERTY_REMOVED,
// Event.PROPERTY_CHANGED
Session session = null;
try
{
while (eventIterator.hasNext())
{
Event event = eventIterator.nextEvent();
String path = event.getPath();
if (path.endsWith("/jcr:data"))
{
// jcr:data removed 'exo:groovyResourceContainer' then unbind resource
if (event.getType() == Event.PROPERTY_REMOVED)
{
unloadScript(path.substring(0, path.lastIndexOf('/')));
}
else if (event.getType() == Event.PROPERTY_ADDED || event.getType() == Event.PROPERTY_CHANGED)
{
if (session == null)
{
session = repository.getSystemSession(workspaceName);
}
Node node = session.getItem(path).getParent();
if (node.getProperty("exo:autoload").getBoolean())
loadScript(node);
}
}
}
}
catch (Exception e)
{
LOG.error("Process event failed. ", e);
}
finally
{
if (session != null)
{
session.logout();
}
}
}
/**
* Load script form supplied node.
*
* @param node JCR node
* @throws Exception if any error occurs
*/
private void loadScript(Node node) throws Exception
{
ResourceId key = new NodeScriptKey(repository.getConfiguration().getName(), workspaceName, node);
ObjectFactory<AbstractResourceDescriptor> resource =
groovyScript2RestLoader.groovyPublisher.unpublishResource(key);
if (resource != null)
{
groovyScript2RestLoader.groovyPublisher.publishPerRequest(node.getProperty("jcr:data").getStream(), key,
resource.getObjectModel().getProperties());
}
else
{
groovyScript2RestLoader.groovyPublisher.publishPerRequest(node.getProperty("jcr:data").getStream(), key, null);
}
}
/**
* Unload script.
*
* @param path unified JCR node path
* @throws Exception if any error occurs
*/
private void unloadScript(String path) throws Exception
{
ResourceId key = new NodeScriptKey(repository.getConfiguration().getName(), workspaceName, path);
groovyScript2RestLoader.groovyPublisher.unpublishResource(key);
}
}