/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.script.wfs;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.script.ScriptEngine;
import net.opengis.wfs.PropertyType;
import net.opengis.wfs.TransactionResponseType;
import net.opengis.wfs.TransactionType;
import net.opengis.wfs.UpdateElementType;
import org.geoserver.platform.resource.Resource;
import org.geoserver.script.ScriptFileWatcher;
import org.geoserver.script.ScriptManager;
import org.geoserver.wfs.TransactionEvent;
import org.geoserver.wfs.WFSException;
import org.geoserver.wfs.request.TransactionRequest;
import org.geoserver.wfs.request.TransactionResponse;
import org.geoserver.wfs.request.Update;
import org.geotools.util.logging.Logging;
public class ScriptTxDelegate {
static Logger LOGGER = Logging.getLogger(ScriptTxDelegate.class);
WfsTxHook hook;
ScriptFileWatcher fw;
public ScriptTxDelegate(Resource script, ScriptManager scriptMgr) {
this.hook = scriptMgr.lookupWfsTxHook(script);
this.fw = new ScriptFileWatcher(script, scriptMgr);
}
@Deprecated
public ScriptTxDelegate(File script, ScriptManager scriptMgr) {
this.hook = scriptMgr.lookupWfsTxHook(script);
this.fw = new ScriptFileWatcher(script, scriptMgr);
}
public TransactionType beforeTransaction(TransactionType request) throws WFSException {
try {
Map context = request.getExtendedProperties();
hook.handleBefore(fw.read(), TransactionRequest.adapt(request), context);
}
catch(WFSException e) {
throw e;
}
catch(Exception e) {
LOGGER.log(Level.WARNING, "Error occured in pre transaction hook", e);
}
return request;
}
public void preInsert(TransactionEvent event) throws WFSException {
TransactionRequest request = TransactionRequest.adapt(event.getRequest());
Map context = request.getExtendedProperties();
try {
hook.handlePreInsert(fw.read(), event.getAffectedFeatures(), request, context);
} catch (WFSException e) {
throw e;
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Error occured in pre insert hook", e);
}
}
public void postInsert(TransactionEvent event) throws WFSException {
TransactionRequest request = TransactionRequest.adapt(event.getRequest());
Map context = request.getExtendedProperties();
try {
hook.handlePostInsert(fw.read(), event.getAffectedFeatures(), request, context);
} catch (WFSException e) {
throw e;
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Error occured in post insert hook", e);
}
}
public void preUpdate(TransactionEvent event) throws WFSException {
TransactionRequest request = TransactionRequest.adapt(event.getRequest());
Map<String,Object> props = updateProperties(event);
Map context = request.getExtendedProperties();
try {
hook.handlePreUpdate(fw.read(), event.getAffectedFeatures(), props, request, context);
} catch (WFSException e) {
throw e;
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Error occured in pre update hook", e);
}
}
public void postUpdate(TransactionEvent event) throws WFSException {
TransactionRequest request = TransactionRequest.adapt(event.getRequest());
Map<String,Object> props = updateProperties(event);
Map context = request.getExtendedProperties();
try {
hook.handlePostUpdate(fw.read(), event.getAffectedFeatures(), props, request, context);
} catch (WFSException e) {
throw e;
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Error occured in post update hook", e);
}
}
public void preDelete(TransactionEvent event) throws WFSException {
TransactionRequest request = TransactionRequest.adapt(event.getRequest());
Map context = request.getExtendedProperties();
try {
hook.handlePreDelete(fw.read(), event.getAffectedFeatures(), request, context);
} catch (WFSException e) {
throw e;
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Error occured in pre delete hook", e);
}
}
public void beforeCommit(TransactionType request) throws WFSException {
try {
Map context = request.getExtendedProperties();
hook.handlePreCommit(fw.read(), TransactionRequest.adapt(request), context);
}
catch(WFSException e) {
throw e;
}
catch(Exception e) {
LOGGER.log(Level.WARNING, "Error occured in pre commit hook", e);
}
}
public void afterTransaction(TransactionType request, TransactionResponseType result, boolean committed) {
try {
Map context = request.getExtendedProperties();
ScriptEngine eng = fw.read();
TransactionRequest txReq = TransactionRequest.adapt(request);
TransactionResponse txRes = TransactionResponse.adapt(result);
if (committed) {
hook.handlePostCommit(eng, txReq, txRes, context);
}
else {
hook.handleAbort(eng, txReq, txRes, context);
}
}
catch(Exception e) {
LOGGER.log(Level.WARNING, "Error occured in post commit hook", e);
}
}
Map<String, Object> updateProperties(TransactionEvent event) {
//get the map of properties changed
UpdateElementType update = (UpdateElementType) event.getSource();
Map<String,Object> props = new HashMap();
for (PropertyType p : (List<PropertyType>)update.getProperty()) {
props.put(p.getName().getLocalPart(), p.getValue());
}
return props;
}
}