/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.dataprocess.server.kernel; import net.codjo.dataprocess.common.Log; import net.codjo.dataprocess.common.codec.ListCodec; import net.codjo.dataprocess.common.context.DataProcessContext; import net.codjo.dataprocess.common.exception.TreatmentException; import net.codjo.dataprocess.common.model.ArgModel; import net.codjo.dataprocess.common.model.ArgModelHelper; import net.codjo.dataprocess.common.util.CommonUtils; import java.sql.Connection; import java.util.ArrayList; import java.util.Comparator; import java.util.List; /** * */ class Argument { static final String PACKAGE_ARGUMENT_MODIFIER_ERROR = "PACKAGE_ARGUMENT_MODIFIER_NOT_INITIALIZED"; private ArgModel argModel; private String computedValue; Argument(ArgModel argModel) { this.argModel = argModel; computedValue = argModel.getValue(); } public String getValue() { return computedValue; } public String getName() { return argModel.getName(); } public int getPosition() { return argModel.getPosition(); } public int getType() { return argModel.getType(); } public void computeValue(Connection con, DataProcessContext context, int repositoryId, String executionListName) throws TreatmentException { if (argModel.isFunctionValue()) { processContext(con, context, repositoryId, executionListName); } else { processContext(context, repositoryId, executionListName); } } private void processContext(Connection con, DataProcessContext context, int repositoryId, String executionListName) throws TreatmentException { String className; String argModifierClass = argModel.getValue().substring(0, argModel.getValue().indexOf('(')); if (argModifierClass.indexOf('.') == -1) { String packageArgumentModifier = getPackageArgumentModifier(context); className = packageArgumentModifier + argModifierClass; } else { className = argModifierClass; } try { ArgumentModifier argumentModifier = (ArgumentModifier)Class.forName(className).newInstance(); List<String> parametersList = proceedParameters(context, repositoryId, executionListName); computedValue = argumentModifier.proceed(con, parametersList); String params = argModel.getValue().substring(argModel.getValue().indexOf('(') + 1, argModel.getValue().length() - 1); if (Log.isDebugEnabled()) { Log.debug(getClass(), String.format("R�solution des arguments: %s(%s) --> %s(%s) --> %s", className, params, className, new ListCodec().encode(parametersList), computedValue)); } } catch (InstantiationException ex) { computedValue = argModel.getValue(); String errorMessage = String.format("Probl�me d'instanciation de la classe de modification d'arguments '%s'", className); Log.error(getClass(), errorMessage, ex); throw new TreatmentException(errorMessage, ex); } catch (IllegalAccessException ex) { computedValue = argModel.getValue(); String errorMessage = String.format("Probl�me d'acc�s � la classe de modification d'arguments '%s'", className); Log.error(getClass(), errorMessage, ex); throw new TreatmentException(errorMessage, ex); } catch (ClassNotFoundException ex) { computedValue = argModel.getValue(); String errorMessage = String.format("Classe de modification d'arguments '%s' inexistante", className); Log.error(getClass(), errorMessage, ex); throw new TreatmentException(errorMessage, ex); } catch (TreatmentException ex) { computedValue = argModel.getValue(); Log.error(getClass(), String.format("Erreur dans la classe de modification d'arguments '%s'", className), ex); throw ex; } catch (Exception ex) { computedValue = argModel.getValue(); String errorMessage = String.format("Erreur lors de l'appel et/ou ex�cution de la classe de modification " + "d'arguments '%s' \nPACKAGE-ARGUMENT-MODIFIER a t-il �t� renseign� correctement " + "dans le projet qui utilise la librairie codjo-data-process ?", className); Log.error(getClass(), errorMessage, ex); throw new TreatmentException(errorMessage, ex); } } private void processContext(DataProcessContext context, int repositoryId, String executionListName) throws TreatmentException { if (argModel.isGlobalValue()) { computedValue = context.getProperty(argModel.getGlobalValue()); if (Log.isDebugEnabled()) { Log.debug(getClass(), String.format("R�solution des arguments: %s --> %s", argModel.getValue(), computedValue)); } } else if (argModel.isLocalValue()) { if (executionListName != null && repositoryId != 0) { String key = CommonUtils.localify(repositoryId, executionListName, argModel.getLocalValue()); computedValue = context.getProperty(key); if (Log.isDebugEnabled()) { Log.debug(getClass(), String.format("R�solution des arguments: %s --> %s", argModel.getValue(), computedValue)); } } else { throw new TreatmentException(impossibleResolveErrorMessage()); } } else { computedValue = argModel.getValue(); } } public List<String> getNotResolvableValue(Connection con, DataProcessContext context, int repositoryId, String executionListName) { if (argModel.isFunctionValue()) { return getNotResolvableValueWithArgumentModifier(con, context, repositoryId, executionListName); } else { return getNotResolvableValueWithoutArgumentModifier(context, executionListName, repositoryId); } } private List<String> getNotResolvableValueWithoutArgumentModifier(DataProcessContext context, String executionListName, int repositoryId) { String message = null; if (argModel.isGlobalValue()) { if (context.getProperty(argModel.getGlobalValue()) == null) { message = getNotResolvedMessage(argModel.getGlobalValue()); } } else if (argModel.isLocalValue()) { if (executionListName != null && repositoryId != 0) { String key = CommonUtils.localify(repositoryId, executionListName, argModel.getLocalValue()); if (context.getProperty(key) == null) { message = getNotResolvedMessage(argModel.getLocalValue()); } } else { message = impossibleResolveErrorMessage(); } } List<String> parametersList = new ArrayList<String>(); if (message != null) { parametersList.add(message); } return parametersList; } private List<String> getNotResolvableValueWithArgumentModifier(Connection con, DataProcessContext context, int repositoryId, String executionListName) { String packageArgumentModifier = getPackageArgumentModifier(context); String treatmentArgModifierClassName = argModel.getValue().substring(0, argModel.getValue().indexOf('(')); List<String> paramNotResolvableAndError = getNotResolvableParameters(context, repositoryId, executionListName); String className; if (treatmentArgModifierClassName.indexOf('.') == -1) { className = packageArgumentModifier + treatmentArgModifierClassName; } else { className = treatmentArgModifierClassName; } try { ArgumentModifier argumentModifier = (ArgumentModifier)Class.forName(className).newInstance(); if (paramNotResolvableAndError.isEmpty()) { List<String> parametersList = proceedParameters(context, repositoryId, executionListName); argumentModifier.proceed(con, parametersList); } } catch (InstantiationException ex) { paramNotResolvableAndError.add( String.format("Probl�me d'instanciation de la classe de modification d'arguments '%s'", className)); } catch (IllegalAccessException ex) { paramNotResolvableAndError.add( String.format("Probl�me d'acc�s � la classe de modification d'arguments '%s'", className)); } catch (ClassNotFoundException ex) { paramNotResolvableAndError.add(String.format( "Classe de modification d'arguments '%s' inexistante.", className)); } catch (TreatmentException ex) { paramNotResolvableAndError.add(String.format( "Erreur dans la classe de modification d'arguments '%s' : %s", className, ex.getLocalizedMessage())); } catch (Exception ex) { paramNotResolvableAndError.add( String.format( "Erreur lors de l'appel et/ou ex�cution de la classe de modification d'arguments '%s' " + "\nPACKAGE-ARGUMENT-MODIFIER a t-il �t� renseign� correctement dans le projet qui " + "utilise la librairie codjo-data-process ? :\n%s", className, ex.getLocalizedMessage())); } return paramNotResolvableAndError; } private List<String> proceedParameters(DataProcessContext context, int repositoryId, String executionListName) throws TreatmentException { String parameters = argModel.getValue().substring(argModel.getValue().indexOf('(') + 1, argModel.getValue().length() - 1); List<String> parametersList = new ArrayList<String>(); List<String> parametersTemp = new ListCodec().decode(parameters); for (String param : parametersTemp) { param = param.trim(); if (ArgModelHelper.isGlobalValue(param)) { param = context.getProperty(ArgModelHelper.getGlobalValue(param)); } else if (ArgModelHelper.isLocalValue(param)) { if (executionListName != null && repositoryId != 0) { String key = CommonUtils.localify(repositoryId, executionListName, ArgModelHelper.getLocalValue(param)); param = context.getProperty(key); } else { throw new TreatmentException(impossibleResolveErrorMessage()); } } parametersList.add(param); } return parametersList; } private List<String> getNotResolvableParameters(DataProcessContext context, int repositoryId, String executionListName) { List<String> parametersList = new ArrayList<String>(); String parameters = argModel.getValue().substring(argModel.getValue().indexOf('(') + 1, argModel.getValue().length() - 1); List<String> parametersTemp = new ListCodec().decode(parameters); for (String aParametersTemp : parametersTemp) { String param = aParametersTemp.trim(); if (ArgModelHelper.isGlobalValue(param)) { if (context.getProperty(ArgModelHelper.getGlobalValue(param)) == null) { parametersList.add(getNotResolvedMessage(ArgModelHelper.getGlobalValue(param))); } } else if (ArgModelHelper.isLocalValue(param)) { if (executionListName != null && repositoryId != 0) { String key = CommonUtils.localify(repositoryId, executionListName, ArgModelHelper.getLocalValue(param)); if (context.getProperty(key) == null) { parametersList.add(getNotResolvedMessage(ArgModelHelper.getLocalValue(param))); } } else { parametersList.add(impossibleResolveErrorMessage()); } } } return parametersList; } static String getPackageArgumentModifier(DataProcessContext context) { String packageArgumentModifier = context.getProperty(DataProcessContext.PACKAGE_ARGUMENT_MODIFIER); if (!"".equals(packageArgumentModifier) && packageArgumentModifier != null) { packageArgumentModifier = packageArgumentModifier + "."; } if (packageArgumentModifier == null) { packageArgumentModifier = PACKAGE_ARGUMENT_MODIFIER_ERROR + "."; } return packageArgumentModifier; } public static String getNotResolvedMessage(String value) { return String.format("Le param�tre '%s' n'est pas configur�.", value); } private String impossibleResolveErrorMessage() { return String.format("La r�solution d'un argument local (%s) est impossible car le traitement " + "est utilis� en dehors d'un repository et/ou d'une liste d'ex�cution", argModel.getValue()); } public static Comparator<Argument> getPositionComparator() { return new ArgumentPositionComparator(); } private static class ArgumentPositionComparator implements Comparator<Argument> { public int compare(Argument arg1, Argument arg2) { if (arg1.getPosition() == arg2.getPosition()) { return 0; } else if (arg1.getPosition() > arg2.getPosition()) { return 1; } else { return -1; } } } }