/**
* This file is part of CloudML [ http://cloudml.org ]
*
* Copyright (C) 2012 - SINTEF ICT
* Contact: Franck Chauvel <franck.chauvel@sintef.no>
*
* Module: root
*
* CloudML 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 3 of
* the License, or (at your option) any later version.
*
* CloudML 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 CloudML. If not, see
* <http://www.gnu.org/licenses/>.
*/
package org.cloudml.mrt.cmd.gen;
import com.google.common.base.Objects;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.cloudml.mrt.cmd.abstracts.Change;
import org.cloudml.mrt.cmd.abstracts.Modification;
import org.cloudml.mrt.cmd.abstracts.Property;
import org.cloudml.mrt.cmd.abstracts.XPath;
import org.eclipse.xtext.xbase.lib.ObjectExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
/**
* Remove an element from a multi-valued property
*
* For lists, you can remove by giving directly the object, or an index (int)
* For maps, only remove by index (key) is supported so far
*/
@SuppressWarnings("all")
public class Remove extends Modification {
public Remove() {
}
public Remove(final String nouse) {
}
public Remove(final Procedure1<Remove> initializer) {
initializer.apply(this);
}
public XPath parent;
public Property property;
public Object index;
public Object value;
public XPath crossRef;
@Override
protected Object _execute(final Object context, final List<Change> changes) {
Object _xblockexpression = null;
{
Object _query = null;
if (this.crossRef!=null) {
_query=this.crossRef.query(context);
}
final Object resolvedCrossRef = _query;
String _plus = (this.parent.literal + "/");
String _plus_1 = (_plus + this.property.name);
XPath _xPath = new XPath(_plus_1);
final XPath toRemovePath = _xPath;
final Object toRemoveColl = toRemovePath.query(context);
Object _elvis = null;
if (resolvedCrossRef != null) {
_elvis = resolvedCrossRef;
} else {
_elvis = ObjectExtensions.<Object>operator_elvis(resolvedCrossRef, this.value);
}
final Object toRemoveValue = _elvis;
boolean _switchResult = false;
boolean _matched = false;
if (!_matched) {
if (toRemoveColl instanceof Map) {
final Map _map = (Map)toRemoveColl;
_matched=true;
Object _remove = _map.remove(this.index);
boolean _notEquals = (!Objects.equal(_remove, null));
_switchResult = _notEquals;
}
}
if (!_matched) {
if (toRemoveColl instanceof List) {
final List _list = (List)toRemoveColl;
boolean _notEquals = (!Objects.equal(this.index, null));
if (_notEquals) {
_matched=true;
Object _convert = CloudMLCmds.convert("int", this.index, context);
int _intValue = ((Integer) _convert).intValue();
Object _remove = _list.remove(_intValue);
boolean _notEquals_1 = (!Objects.equal(_remove, null));
_switchResult = _notEquals_1;
}
}
}
if (!_matched) {
if (toRemoveColl instanceof Collection) {
final Collection _collection = (Collection)toRemoveColl;
_matched=true;
boolean _remove = _collection.remove(toRemoveValue);
_switchResult = _remove;
}
}
if (!_matched) {
_switchResult = false;
}
final boolean success = _switchResult;
if (success) {
final Procedure1<Removed> _function = new Procedure1<Removed>() {
public void apply(final Removed it) {
Object _query = Remove.this.parent.query(context);
it.parent = _query;
it.parent_repr = Remove.this.parent.literal;
it.index = Remove.this.index;
it.property = Remove.this.property.name;
it.removedValue = toRemoveValue;
String _xifexpression = null;
boolean _notEquals = (!Objects.equal(Remove.this.crossRef, null));
if (_notEquals) {
_xifexpression = Remove.this.crossRef.literal;
} else {
_xifexpression = null;
}
it.removedValue_repr = _xifexpression;
}
};
Removed _removed = new Removed(_function);
changes.add(_removed);
}
_xblockexpression = (null);
}
return _xblockexpression;
}
}