/** * 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.ws.businessaction.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.qualogy.qafe.bind.business.action.BusinessAction; import com.qualogy.qafe.bind.business.action.BusinessActionItem; import com.qualogy.qafe.bind.business.action.BusinessActionRef; import com.qualogy.qafe.bind.commons.type.Parameter; import com.qualogy.qafe.bind.core.application.ApplicationContext; import com.qualogy.qafe.bind.integration.service.ServiceRef; import com.qualogy.qafe.core.application.ApplicationCluster; import com.qualogy.qafe.core.datastore.DataIdentifier; import com.qualogy.qafe.core.datastore.DataStore; import com.qualogy.qafe.core.framework.business.BusinessManager; import com.qualogy.ws.businessaction.BusinessActionExecutor; import com.qualogy.ws.exception.NotFoundException; /** * Implementation of BusinessActionExecutor. This class is used to retrieve and execute a business action. * * @author jroosing * */ public class BusinessActionExecutorImpl implements BusinessActionExecutor { protected ApplicationContext getApplicationContext(String appId) { ApplicationContext applicationContext = null; if (applicationContext == null && appId != null) { final Iterator<ApplicationContext> itrAppContext = ApplicationCluster.getInstance().iterator(); while (itrAppContext.hasNext()) { final ApplicationContext appContext = itrAppContext.next(); if (appId.equals(appContext.getId().toString())) { applicationContext = appContext; } } } return applicationContext; } @SuppressWarnings("unchecked") @Override public Map<String, Object> execute(final String appId, final String businessActionId, final Map<String, Object> inputParameters) throws NotFoundException { final BusinessAction businessAction = getBusinessAction(appId, businessActionId); // determine the names of the output parameters List<String> outputNames = generateOutputParamNames(businessAction); final Map<String, Object> output = executeBusinessAction(appId, businessAction, inputParameters, outputNames); return output; } public List<String> generateOutputParamNames(BusinessAction businessAction) { final List<String> outputNames = new ArrayList<String>(); for (BusinessActionItem item : businessAction.getBusinessActionItems()) { List<Parameter> outputParams = null; if (item instanceof BusinessActionRef) { BusinessActionRef ref = (BusinessActionRef) item; outputParams = ref.getOutput(); } else if (item instanceof ServiceRef) { ServiceRef ref = (ServiceRef) item; outputParams = ref.getOutput(); } if (outputParams == null || outputParams.isEmpty()) { break; } for (Parameter param : outputParams) { outputNames.add(param.getName()); } } return outputNames; } public BusinessAction getBusinessAction(final String appId, final String businessActionId) throws NotFoundException { final ApplicationContext appContext = getApplicationContext(appId); if (appContext == null) { throw new NotFoundException("Application with id: [" + appId + "] can not be found"); } BusinessAction businessAction = null; final List<BusinessAction> businessActions = appContext.getApplicationMapping().getBusinessTier().getBusinessActions(); for (BusinessAction ba : businessActions) { if (ba.getId().equals(businessActionId)) { businessAction = ba; break; } } if (businessAction == null) { throw new NotFoundException("Business action with id: [" + businessActionId + "] can not be found"); } return businessAction; } public Map<String, Object> executeBusinessAction(String appId, BusinessAction businessAction, Map<String, Object> input, List<String> outputNames) { if (businessAction == null) { return null; } Map<String, Object> output = null; try { DataIdentifier dataId = DataStore.register(); try { if (input != null) { Iterator<String> itrParamName = input.keySet().iterator(); while (itrParamName.hasNext()) { String paramName = itrParamName.next(); Object paramValue = input.get(paramName); DataStore.store(dataId, paramName, paramValue); } } ApplicationContext applicationContext = getApplicationContext(appId); BusinessManager businessManager = applicationContext.getBusinessManager(); businessManager.manage(applicationContext, dataId, businessAction); if (outputNames != null) { output = new HashMap<String, Object>(); for (String outputName : outputNames) { Object outputValue = DataStore.getValue(dataId, outputName); output.put(outputName, outputValue); } } } finally { DataStore.unregister(dataId); } } catch (Exception e) { e.printStackTrace(); } return output; } }