/**
* 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;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.qualogy.qafe.bind.business.action.BusinessAction;
import com.qualogy.qafe.bind.commons.type.Parameter;
import com.qualogy.qafe.bind.core.application.ApplicationContext;
import com.qualogy.qafe.bind.presentation.event.function.BuiltInFunction;
import com.qualogy.qafe.core.datastore.DataIdentifier;
import com.qualogy.qafe.core.datastore.DataStore;
import com.qualogy.qafe.core.errorhandling.ExternalException;
import com.qualogy.qafe.presentation.BusinessActionItemDataObject;
import com.qualogy.qafe.presentation.builtins.BuiltinConvertor;
import com.qualogy.qafe.presentation.builtins.BuiltinConvertorImpl;
import com.qualogy.qafe.presentation.handler.executors.EventItemExecuteHelper;
/**
*
* Handler for Business Action Event Items
*
*/
public class BusinessActionRefHandler {
public final Map<String, Object> execute(final BusinessActionItemDataObject businessActionItemDataObject,
final ApplicationContext context, final DataIdentifier dataId) throws ExternalException {
final BusinessAction businessAction =
context.getApplicationMapping().getBusinessTier()
.getBusinessAction(businessActionItemDataObject.getBusinessActionId());
Map<String, Object> outputValues = new HashMap<String, Object>();
try {
final String sessionId = businessActionItemDataObject.getSessionId();
final String windowId = businessActionItemDataObject.getWindowId();
storeValues(businessActionItemDataObject.getInputValues(), dataId, windowId, sessionId);
storeValues(businessActionItemDataObject.getInternalVariables(), dataId, windowId, sessionId);
context.getBusinessManager().manage(context, dataId, businessAction);
outputValues = collectOutputValues(businessActionItemDataObject, dataId);
} catch (final ExternalException e) {
throw e;
}
return outputValues;
}
private Map<String, Object> collectOutputValues(final BusinessActionItemDataObject businessActionItemDataObject,
final DataIdentifier dataId) {
Map<String, Object> outputValues = new HashMap<String, Object>();
Map<String, String> outputVariables = businessActionItemDataObject.getOutputVariables();
for(String outName : outputVariables.keySet()) {
String outReference = outputVariables.get(outName);
Object value = DataStore.getValue(dataId, outReference);
outputValues.put(outName, value);
}
// For sending the updated internal variables back to the client-side
collectInternalVariables(dataId, outputValues);
collectBuiltInsFromBackend(dataId, outputValues);
return outputValues;
}
private void collectInternalVariables(final DataIdentifier dataId,
Map<String, Object> outputValues) {
for (String keyword : DataStore.KEY_WORDS) {
Object value = DataStore.findValue(dataId, keyword);
if (value != null) {
outputValues.put(keyword, value);
}
}
}
private void collectBuiltInsFromBackend(DataIdentifier dataId, Map<String, Object> outputValues) {
Object builtInList = DataStore.findValue(dataId, DataStore.KEY_WORD_QAFE_BUILT_IN_LIST);
if (builtInList == null || !(builtInList instanceof String)) {
return;
}
BuiltinConvertor builtInConverter = new BuiltinConvertorImpl();
List<BuiltInFunction> builtIns = builtInConverter.convert((String) builtInList);
if (builtIns == null) {
return;
}
outputValues.put(DataStore.KEY_WORD_QAFE_BUILT_IN_LIST, builtIns);
}
private void storeValues(final Map<String, Object> values, final DataIdentifier dataId
, final String windowId, final String sessionId) {
if (values == null) {
return;
}
for (String key : values.keySet()) {
Object value = values.get(key);
if (EventItemExecuteHelper.isLookupData(value)) {
Parameter parameter = new Parameter();
parameter.setName(key);
value = EventItemExecuteHelper.resolveLookupData(dataId, windowId, sessionId, parameter, value);
}
DataStore.store(dataId, key, value);
}
}
}