/**
* Copyright 2008-2016 Qualogy Solutions B.V.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.qualogy.qafe.presentation.handler.executors;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import com.qualogy.qafe.bind.commons.type.Parameter;
import com.qualogy.qafe.bind.commons.type.Reference;
import com.qualogy.qafe.bind.core.application.ApplicationContext;
import com.qualogy.qafe.bind.presentation.event.Event;
import com.qualogy.qafe.bind.presentation.event.EventItem;
import com.qualogy.qafe.bind.presentation.event.function.BuiltInFunction;
import com.qualogy.qafe.bind.presentation.event.function.LocalStore;
import com.qualogy.qafe.core.datastore.ApplicationLocalStore;
import com.qualogy.qafe.core.datastore.DataIdentifier;
import com.qualogy.qafe.core.datastore.DataStore;
import com.qualogy.qafe.core.framework.presentation.EventData;
import com.qualogy.qafe.presentation.EventHandlerImpl;
import com.qualogy.qafe.presentation.handler.ExecuteEventItem;
@Deprecated
public class LocalStoreExecute extends AbstractEventItemExecute implements ExecuteEventItem {
public final static Logger logger = Logger.getLogger(LocalStoreExecute.class.getName());
// CHECKSTYLE.OFF: CyclomaticComplexity
public boolean execute(EventItem eventItem, ApplicationContext context, Event event, EventData eventData, Collection<BuiltInFunction> listToExecute, EventHandlerImpl eventHandler, DataIdentifier dataId) {
LocalStore origStore = (LocalStore) eventItem;
Parameter origParam = origStore.getParameter();
if (origParam == null)
throw new IllegalArgumentException("At least one of the parameter fields is mandatory");
// do not change the object from the applicationmapping.
// Make a copy instead, filled in with the correct data
LocalStore copyStore = new LocalStore();
Parameter copyParam = null;
try {
copyParam = (Parameter) origParam.clone();
copyStore.setParameter(copyParam);
} catch (CloneNotSupportedException e) {
throw new RuntimeException("Cloneable interface on Parameter has changed", e);
}
copyStore.setTarget(origStore.getTarget());
copyStore.setAction(origStore.getAction());
copyStore.setField(origStore.getField());
// Before the method getValue() gets executed, the placeholders, if any, should be resolved (storing in the pipe),
// because placeholders can refer to an input variable (component) which is not accessible when further processing
if (copyParam.getPlaceHolders() != null) {
resolveParameters(context, dataId, copyParam.getPlaceHolders().iterator(), eventData);
}
copyStore.setDataObject(getValue(context, dataId, copyParam, eventData));
listToExecute.add(copyStore);
String identifier = null;
if (Reference.SOURCE_APP_LOCAL_STORE_ID.equalsIgnoreCase(copyStore.getTarget())) {
// target = "user"
identifier = generateLocalStoreId(eventData.getWindowSession(), context, eventData.getWindowId());
} else if (Reference.SOURCE_APP_GLOBAL_STORE_ID.equalsIgnoreCase(copyStore.getTarget())) {
// target = "global"
identifier = generateGlocalStoreId(eventData.getWindowSession(), context);
}
if (copyStore.getAction() == null || copyStore.getAction().length() == 0 || LocalStore.ACTION_SET.equals(copyStore.getAction())) {
if (Reference.SOURCE_DATASTORE_ID.equalsIgnoreCase(copyStore.getTarget())) {
DataStore.store(dataId, copyStore.getParameter().getName(), copyStore.getDataObject());
} else {
ApplicationLocalStore.getInstance().store(identifier, copyStore.getParameter().getName(), copyStore.getDataObject());
}
} else if (LocalStore.ACTION_ADD.equals(copyStore.getAction())) {
Object o = null;
if (Reference.SOURCE_DATASTORE_ID.equalsIgnoreCase(copyStore.getTarget())) {
if (DataStore.findValue(dataId, copyStore.getParameter().getName()) == null) {
DataStore.store(dataId, copyStore.getParameter().getName(), new ArrayList());
}
o = DataStore.getValue(dataId, copyStore.getParameter().getName());
} else {
if (!ApplicationLocalStore.getInstance().contains(identifier, copyStore.getParameter().getName())) {
ApplicationLocalStore.getInstance().store(identifier, copyStore.getParameter().getName(), new ArrayList());
}
o = ApplicationLocalStore.getInstance().retrieve(identifier, copyStore.getParameter().getName());
}
if (o instanceof List) {
if (copyStore.getDataObject() != null) {
((List) o).add(copyStore.getDataObject());
}
}
} else if (LocalStore.ACTION_DELETE.equals(copyStore.getAction())) {
if (copyStore.getDataObject() != null) {
Object o = null;
if (Reference.SOURCE_DATASTORE_ID.equalsIgnoreCase(copyStore.getTarget())) {
o = DataStore.getValue(dataId, copyStore.getParameter().getName());
} else {
o = ApplicationLocalStore.getInstance().retrieve(identifier, copyStore.getParameter().getName());
}
if (copyStore.getDataObject() != null) {
if (o instanceof List) {
Iterator itr = ((List) o).iterator();
List<Integer> matches = new ArrayList<Integer>();
int index = 0;
while (itr.hasNext()) {
Object itrObject = itr.next();
if (itrObject instanceof Map) {
Object fieldData = ((Map) itrObject).get(copyStore.getField());
if (fieldData!=null){
if (copyStore.getDataObject().toString().equals(fieldData.toString())) {
matches.add(index);
}
}
} else {
if (copyStore.getDataObject().toString().equals(itrObject.toString())){
matches.add(index);
}
}
index++;
}
for (Integer integer : matches) {
((List) o).remove(integer);
}
}
}
}
}
logger.fine("LocalStore after <store>\n"+ApplicationLocalStore.getInstance().toLogString(identifier));
logger.fine("DataStore after <store>\n"+DataStore.toLogString(dataId));
return false;
}
// CHECKSTYLE.ON: CyclomaticComplexity
}