/* Copyright (c) 2001 - 2011 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.monitor.ows.wfs;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.geoserver.monitor.RequestData;
import org.geotools.xml.EMFUtils;
import org.opengis.feature.Feature;
import org.opengis.feature.simple.SimpleFeature;
public class TransactionHandler extends WFSRequestObjectHandler {
public TransactionHandler() {
super("net.opengis.wfs.TransactionType");
}
@Override
public void handle(Object request, RequestData data) {
super.handle(request, data);
//also determine the sub operation
FeatureMap elements = (FeatureMap) EMFUtils.get((EObject)request, "group");
if (elements == null) {
return;
}
ListIterator i = elements.valueListIterator();
int flag = 0;
while(i.hasNext()) {
Object e = i.next();
if (e.getClass().getSimpleName().startsWith("Insert")) {
flag |= 1;
}
else if (e.getClass().getSimpleName().startsWith("Update")) {
flag |= 2;
}
else if (e.getClass().getSimpleName().startsWith("Delete")) {
flag |= 4;
}
else {
flag |= 8;
}
}
StringBuffer sb = new StringBuffer();
if ((flag & 1) == 1) sb.append("I");
if ((flag & 2) == 2) sb.append("U");
if ((flag & 4) == 4) sb.append("D");
if ((flag & 8) == 8) sb.append("O");
data.setSubOperation(sb.toString());
}
@Override
public List<String> getLayers(Object request) {
FeatureMap elements = (FeatureMap) EMFUtils.get((EObject)request, "group");
if (elements == null) {
return null;
}
List<String> layers = new ArrayList();
ListIterator i = elements.valueListIterator();
while(i.hasNext()) {
Object e = i.next();
if (EMFUtils.has((EObject)e, "typeName")) {
Object typeName = EMFUtils.get((EObject)e, "typeName");
if (typeName != null) {
layers.add(toString(typeName));
}
}
else {
//this is most likely an insert, determine layers from feature collection
if (e.getClass().getSimpleName().startsWith("InsertElementType")) {
List<Feature> features = (List) EMFUtils.get((EObject)e, "feature");
Set<String> set = new LinkedHashSet();
for (Feature f : features) {
if (f instanceof SimpleFeature) {
set.add(((SimpleFeature)f).getType().getTypeName());
}
else {
set.add(f.getType().getName().toString());
}
}
layers.addAll(set);
}
}
}
return layers;
}
}