/** * Retrieves a Business Data or a List of Business Data related to the given {@link SRefBusinessDataInstance} depending on its type (single {@link Entity} * if it's a {@link SSimpleRefBusinessDataInstance} or a List<Entity> if it's a {@link SMultiRefBusinessDataInstance}. * This method will use {@link #getSimpleBusinessData(SSimpleRefBusinessDataInstance, Class)} or * {@link #getMultiBusinessData(SMultiRefBusinessDataInstance, Class)} based on the data reference type * * @param refBusinessDataInstance the business data reference * @return The {@code Entity} or {@code List<Entity>} if the business data reference is a {@code SSimpleRefBusinessDataInstance} or a * {@code SMultiRefBusinessDataInstance} respectively * @throws SBusinessDataNotFoundException * @throws SExpressionEvaluationException */ public Object getBusinessData(final SRefBusinessDataInstance refBusinessDataInstance) throws SBusinessDataNotFoundException, SExpressionEvaluationException { try { final Class<Entity> bizClass = (Class<Entity>) Thread.currentThread().getContextClassLoader().loadClass(refBusinessDataInstance.getDataClassName()); if (refBusinessDataInstance instanceof SSimpleRefBusinessDataInstance) { return getSimpleBusinessData((SSimpleRefBusinessDataInstance) refBusinessDataInstance, bizClass); } final SMultiRefBusinessDataInstance reference = (SMultiRefBusinessDataInstance) refBusinessDataInstance; return getMultiBusinessData(reference, bizClass); } catch (final ClassNotFoundException e) { throw new SExpressionEvaluationException("Unable to load class for the business data having reference '" + refBusinessDataInstance.getName() + "'", e, refBusinessDataInstance.getName()); } }
@Override public Object evaluate(final SExpression expression, final Map<String, Object> context, final Map<Integer, Object> resolvedExpressions, final ContainerState containerState) throws SExpressionEvaluationException { final String businessDataName = expression.getContent(); if (context.containsKey(businessDataName)) { return context.get(businessDataName); } final Long containerId = (Long) context.get(SExpressionContext.CONTAINER_ID_KEY); final String containerType = (String) context.get(SExpressionContext.CONTAINER_TYPE_KEY); try { final SRefBusinessDataInstance refBusinessDataInstance = refBusinessDataRetriever.getRefBusinessDataInstance(new BusinessDataContext( businessDataName, new Container(containerId, containerType))); return businessDataRetriever.getBusinessData(refBusinessDataInstance); } catch (final SBonitaReadException | SFlowNodeReadException e) { throw new SExpressionEvaluationException("Unable to retrieve business data instance with name " + businessDataName, e, businessDataName); } catch (final SBonitaException e) { setProcessInstanceId(containerId, containerType, e); throw new SExpressionEvaluationException(e, expression.getName()); } }
@Override public Object evaluate(final SExpression expression, final Map<String, Object> context, final Map<Integer, Object> resolvedExpressions, final ContainerState containerState) throws SExpressionEvaluationException { final String businessDataName = expression.getContent(); if (context.containsKey(businessDataName)) { return context.get(businessDataName); } final Long containerId = (Long) context.get(SExpressionContext.CONTAINER_ID_KEY); final String containerType = (String) context.get(SExpressionContext.CONTAINER_TYPE_KEY); try { final SRefBusinessDataInstance refBusinessDataInstance = refBusinessDataRetriever.getRefBusinessDataInstance(new BusinessDataContext( businessDataName, new Container(containerId, containerType))); return businessDataRetriever.getBusinessData(refBusinessDataInstance); } catch (final SBonitaReadException | SFlowNodeReadException e) { throw new SExpressionEvaluationException("Unable to retrieve business data instance with name " + businessDataName, e, businessDataName); } catch (final SBonitaException e) { setProcessInstanceId(containerId, containerType, e); throw new SExpressionEvaluationException(e, expression.getName()); } }
/** * Retrieves a Business Data or a List of Business Data related to the given {@link SRefBusinessDataInstance} depending on its type (single {@link Entity} * if it's a {@link SSimpleRefBusinessDataInstance} or a List<Entity> if it's a {@link SMultiRefBusinessDataInstance}. * This method will use {@link #getSimpleBusinessData(SSimpleRefBusinessDataInstance, Class)} or * {@link #getMultiBusinessData(SMultiRefBusinessDataInstance, Class)} based on the data reference type * * @param refBusinessDataInstance the business data reference * @return The {@code Entity} or {@code List<Entity>} if the business data reference is a {@code SSimpleRefBusinessDataInstance} or a * {@code SMultiRefBusinessDataInstance} respectively * @throws SBusinessDataNotFoundException * @throws SExpressionEvaluationException */ public Object getBusinessData(final SRefBusinessDataInstance refBusinessDataInstance) throws SBusinessDataNotFoundException, SExpressionEvaluationException { try { final Class<Entity> bizClass = (Class<Entity>) Thread.currentThread().getContextClassLoader().loadClass(refBusinessDataInstance.getDataClassName()); if (refBusinessDataInstance instanceof SSimpleRefBusinessDataInstance) { return getSimpleBusinessData((SSimpleRefBusinessDataInstance) refBusinessDataInstance, bizClass); } final SMultiRefBusinessDataInstance reference = (SMultiRefBusinessDataInstance) refBusinessDataInstance; return getMultiBusinessData(reference, bizClass); } catch (final ClassNotFoundException e) { throw new SExpressionEvaluationException("Unable to load class for the business data having reference '" + refBusinessDataInstance.getName() + "'", e, refBusinessDataInstance.getName()); } }