From 4df577101e7ff0fc9047605795fe194a2ee9c6f9 Mon Sep 17 00:00:00 2001 From: Michel Date: Thu, 29 Nov 2018 20:20:40 +0100 Subject: [PATCH 1/2] fix build on the master branch re-encode files to UTF-8 to avoid issues with spanish accents replace deprecated use of raw Enumeration to Iterator through List --- .settings/org.eclipse.buildship.core.prefs | 16 ++-- build.gradle | 8 ++ .../common/core/utilities/FileUtils.java | 2 +- .../common/core/utilities/SetUtil.java | 8 +- .../variamos/dynsup/instance/InstCell.java | 2 +- .../dynsup/model/OpersSubOperation.java | 2 +- .../dynsup/translation/SolverOpersTask.java | 2 +- .../gui/maineditor/ParadigmChooserPane.java | 2 +- .../gui/perspeditor/panels/AboutDialog.java | 2 +- .../widgets/RefasWidgetFactory.java | 2 +- .../importExport/ExportDefectAnalyzer.java | 4 +- .../io/core/importExport/ExportUtil.java | 4 +- com.variamos.reasoning/.classpath | 19 +++-- .../FeatureModelSPLOTransformer.java | 16 +++- .../FeatureModelTransformerRules.java | 2 +- .../defectAnalyzer/core/CauCosAnayzer.java | 78 +++++++++---------- .../core/DefectAnalyzerController.java | 30 +++---- .../defectAnalyzer/core/DefectsVerifier.java | 28 +++---- .../core/HittingSetIdentifier.java | 58 +++++++------- ...riabilityModelCausesCorrectionsSorter.java | 20 ++--- .../defectAnalyzer/model/defects/Defect.java | 2 +- .../diagnosis/ClassifiableDiagnosis.java | 2 +- .../model/diagnosis/Diagnosis.java | 6 +- .../diagnosis/VariabilityElementDefAna.java | 6 +- .../model/dto/DefectAnalyzerResultDTO.java | 2 +- .../model/dto/VMTransformerInDTO.java | 2 +- .../model/transformation/Dependency.java | 6 +- .../transformation/VariabilityModel.java | 6 +- .../MinimalSetsDFSIterationsHLCL.java | 2 +- .../model/graph/ConstraintGraphHLCL.java | 8 +- .../util/ConstraintRepresentationUtil.java | 8 +- .../reasoning/util/ExportDefectAnalyzer.java | 20 ++--- .../variamos/reasoning/util/PowerSetUtil.java | 18 ++--- .../CauseAnalyzerApplicationCaseTest.java | 16 ++-- .../com/variamos/solver/core/IntSolver.java | 4 +- .../solver/core/compiler/Hlcl2SWIProlog.java | 2 +- .../solver/model/ConfigurationOptionsDTO.java | 2 +- 37 files changed, 216 insertions(+), 201 deletions(-) diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs index 32816336..530358e1 100644 --- a/.settings/org.eclipse.buildship.core.prefs +++ b/.settings/org.eclipse.buildship.core.prefs @@ -1,8 +1,8 @@ -build.commands=org.eclipse.jdt.core.javabuilder -connection.arguments= -connection.gradle.user.home=null -connection.java.home=null -connection.jvm.arguments= -connection.project.dir= -derived.resources=.gradle,build -eclipse.preferences.version=1 +build.commands=org.eclipse.jdt.core.javabuilder +connection.arguments= +connection.gradle.user.home=null +connection.java.home=null +connection.jvm.arguments= +connection.project.dir= +derived.resources=.gradle,build +eclipse.preferences.version=1 diff --git a/build.gradle b/build.gradle index 0308fad7..feeb8132 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,14 @@ group = 'com.variamos' version = '1.1.0.1' compileJava.options.encoding = 'UTF-8' +allprojects { + gradle.projectsEvaluated { + tasks.withType(JavaCompile) { + //options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" + } + } +} + subprojects { /* the Java plugin adds several tasks like clean, assemble, build, etc, which make it easy to work with the build process when we follow conventions such as src/main/java and src/main/test as main folders*/ diff --git a/com.variamos.common/src/main/java/com/variamos/common/core/utilities/FileUtils.java b/com.variamos.common/src/main/java/com/variamos/common/core/utilities/FileUtils.java index c652b250..ace8db35 100644 --- a/com.variamos.common/src/main/java/com/variamos/common/core/utilities/FileUtils.java +++ b/com.variamos.common/src/main/java/com/variamos/common/core/utilities/FileUtils.java @@ -89,7 +89,7 @@ public static void writeFile(String path, String content) { public static String writeFile(File file, String content) throws TechnicalException { - // Se guarda la representaci�n en el archivo temporal de prolog + // Se guarda la representaci�n en el archivo temporal de prolog FileUtils.writeFile(file.getAbsolutePath(), content); return file.getAbsolutePath(); diff --git a/com.variamos.common/src/main/java/com/variamos/common/core/utilities/SetUtil.java b/com.variamos.common/src/main/java/com/variamos/common/core/utilities/SetUtil.java index 1710acc5..76557ff1 100644 --- a/com.variamos.common/src/main/java/com/variamos/common/core/utilities/SetUtil.java +++ b/com.variamos.common/src/main/java/com/variamos/common/core/utilities/SetUtil.java @@ -210,7 +210,7 @@ public static boolean verifyCollectionSetContainsSet(List inputSet, * @return true:Set is superset of some set of collection of sets. * Otherwise False Ejm inputSet es {a,b,c} y not collectionOfSets * tiene un elemento con el valor de {a,c}. En este caso el inputSet - * es superset pq tiene los mismos elementos( o más ) que el set de + * es superset pq tiene los mismos elementos( o más ) que el set de * collectionOfSets */ public static boolean verifySetIsSuperSetOfCollectionSets( @@ -303,7 +303,7 @@ public static List> maintainNoSupersets( List inputSet = null; Set> setsToRemove = new HashSet>(); - // Se ordenan los conjuntos por tamaño de menor mayor + // Se ordenan los conjuntos por tamaño de menor mayor Collections .sort(inputCollectionOfSets, new CollectionsSizeComparator()); @@ -326,7 +326,7 @@ public static List> maintainNoSupersets( } }// Cierra while que recorre lista desde la segunda posicion - }// Cierra while que recorre la lista desde la primera posición + }// Cierra while que recorre la lista desde la primera posición // Se eliminan los elementos if (!setsToRemove.isEmpty()) { @@ -372,7 +372,7 @@ public static List> maintainNoSubsets( } }// Cierra while que recorre lista de MCS desde la segunda posicion - }// Cierra while que recorre la lista de MCS desde la primera posición + }// Cierra while que recorre la lista de MCS desde la primera posición // Se eliminan los elementos // Se eliminan los elementos diff --git a/com.variamos.dynsup/src/com/variamos/dynsup/instance/InstCell.java b/com.variamos.dynsup/src/com/variamos/dynsup/instance/InstCell.java index 38ac2185..cd94dac9 100644 --- a/com.variamos.dynsup/src/com/variamos/dynsup/instance/InstCell.java +++ b/com.variamos.dynsup/src/com/variamos/dynsup/instance/InstCell.java @@ -8,7 +8,7 @@ * A class to support clones of instance elements with shared values. Part of * PhD work at University of Paris 1 * - * @author Juan C. Mu�oz Fern�ndez + * @author Juan C. Mu�oz Fern�ndez * * @version 1.1 * @since 2015-01-29 * diff --git a/com.variamos.dynsup/src/com/variamos/dynsup/model/OpersSubOperation.java b/com.variamos.dynsup/src/com/variamos/dynsup/model/OpersSubOperation.java index 63fa5907..35944c23 100644 --- a/com.variamos.dynsup/src/com/variamos/dynsup/model/OpersSubOperation.java +++ b/com.variamos.dynsup/src/com/variamos/dynsup/model/OpersSubOperation.java @@ -11,7 +11,7 @@ * operationalization with GUI edition. Part of PhD work at University of Paris * 1 * - * @author Juan C. Mu�oz Fern�ndez + * @author Juan C. Mu�oz Fern�ndez * * @version 1.1 * @since 2014-02-05 diff --git a/com.variamos.dynsup/src/com/variamos/dynsup/translation/SolverOpersTask.java b/com.variamos.dynsup/src/com/variamos/dynsup/translation/SolverOpersTask.java index 0328cf4e..05ed1461 100644 --- a/com.variamos.dynsup/src/com/variamos/dynsup/translation/SolverOpersTask.java +++ b/com.variamos.dynsup/src/com/variamos/dynsup/translation/SolverOpersTask.java @@ -848,7 +848,7 @@ public int medicExecution(InstElement operation, InstElement subOper, String ver //inconsistentPath.add(split[0]); - // añadir la variable a la lista y después una por una las retsricciones + // añadir la variable a la lista y después una por una las retsricciones // unarias asociadas. for (NodeConstraintHLCL cons : ((NodeVariableHLCL) vertex).getUnary()) { String [] object = getIdFromTable(cons.getConstraint(), table).split("_"); //this lines allow to obtain the id of the object diff --git a/com.variamos.gui/src/com/variamos/gui/maineditor/ParadigmChooserPane.java b/com.variamos.gui/src/com/variamos/gui/maineditor/ParadigmChooserPane.java index 8c481f29..7c04249d 100644 --- a/com.variamos.gui/src/com/variamos/gui/maineditor/ParadigmChooserPane.java +++ b/com.variamos.gui/src/com/variamos/gui/maineditor/ParadigmChooserPane.java @@ -222,6 +222,6 @@ public static ParadigmTypeEnum showInputDialog(Frame f,String openModelOption) { public static void main(String[] args) { ParadigmTypeEnum optionChoosed = ParadigmChooserPane.showInputDialog(); - System.out.println("La opción elegida es: "+optionChoosed); + System.out.println("La opción elegida es: "+optionChoosed); } } diff --git a/com.variamos.gui/src/com/variamos/gui/perspeditor/panels/AboutDialog.java b/com.variamos.gui/src/com/variamos/gui/perspeditor/panels/AboutDialog.java index 9e041809..6192b947 100644 --- a/com.variamos.gui/src/com/variamos/gui/perspeditor/panels/AboutDialog.java +++ b/com.variamos.gui/src/com/variamos/gui/perspeditor/panels/AboutDialog.java @@ -116,7 +116,7 @@ public AboutDialog(VariamosGraphEditor editor, ElemAttribute... arguments) "http://www.flaticon.com/free-icon/settings_23408#term=configuration&page=1&position=3")); panel.add(new JLabel( "Organization of notification for elements and some icons:")); - panel.add(new JLabel("Jose Andr�s Moncada")); + panel.add(new JLabel("Jose Andr�s Moncada")); SpringUtilities.makeCompactGrid(panel, 14, 1, 4, 4, 4, 4); diff --git a/com.variamos.gui/src/com/variamos/gui/perspeditor/widgets/RefasWidgetFactory.java b/com.variamos.gui/src/com/variamos/gui/perspeditor/widgets/RefasWidgetFactory.java index 7cad027c..74d0e72c 100644 --- a/com.variamos.gui/src/com/variamos/gui/perspeditor/widgets/RefasWidgetFactory.java +++ b/com.variamos.gui/src/com/variamos/gui/perspeditor/widgets/RefasWidgetFactory.java @@ -22,7 +22,7 @@ * A class to dynamically load appropriate widget. Based on WidgetFactory from * ProductLine. Part of PhD work at University of Paris 1 * - * @author Juan C. Muñoz Fernández + * @author Juan C. Muñoz Fernández * * @version 1.1 * @since 2014-11-10 diff --git a/com.variamos.io/src/main/java/com/variamos/io/core/importExport/ExportDefectAnalyzer.java b/com.variamos.io/src/main/java/com/variamos/io/core/importExport/ExportDefectAnalyzer.java index 4ccb4108..b1fd0f95 100644 --- a/com.variamos.io/src/main/java/com/variamos/io/core/importExport/ExportDefectAnalyzer.java +++ b/com.variamos.io/src/main/java/com/variamos/io/core/importExport/ExportDefectAnalyzer.java @@ -29,7 +29,7 @@ public static void exportarListaModelosResumidaxTamCorrecc( List> resultadosAnalisis = new ArrayList>(); HSSFWorkbook resultadosLibro = new HSSFWorkbook(); int cont = 1; - // Informaci�n para guardar + // Informacion para guardar String titulos[] = { "Modelo", "#carac", "#depen", "#NonTraversal", "%NonTraversal", "#traver", "%traver", "tipDef", "def", "#caus", "#corr", "tiemp" }; @@ -55,7 +55,7 @@ private static void validatePath(String outputDirectoryPath) throws FunctionalException { File file = new File(outputDirectoryPath); if (!file.exists()) { - // Si no existe el directorio se lanza una excepci�n + // Si no existe el directorio se lanza una excepcion throw new FunctionalException("El directorio de salida " + outputDirectoryPath + " no existe"); } diff --git a/com.variamos.io/src/main/java/com/variamos/io/core/importExport/ExportUtil.java b/com.variamos.io/src/main/java/com/variamos/io/core/importExport/ExportUtil.java index 8a339b5a..1914b962 100644 --- a/com.variamos.io/src/main/java/com/variamos/io/core/importExport/ExportUtil.java +++ b/com.variamos.io/src/main/java/com/variamos/io/core/importExport/ExportUtil.java @@ -68,8 +68,8 @@ public static void addInfoToSheet(List heads1List, int contadorCelda = 0; int filaInicialHoja = 0; - // Informaci�n con los tiempos - // Fila con las estad�sticas + // Informaci�n con los tiempos + // Fila con las estad�sticas HSSFRow estadisticasTitle = sheet.createRow(filaInicialHoja); HSSFCell celda0 = estadisticasTitle.createCell(0); celda0.setCellValue("Statistics"); diff --git a/com.variamos.reasoning/.classpath b/com.variamos.reasoning/.classpath index c2a009ff..82ca0a37 100644 --- a/com.variamos.reasoning/.classpath +++ b/com.variamos.reasoning/.classpath @@ -1,10 +1,9 @@ - - - - - - - - - - + + + + + + + + + diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/core/transformer/FeatureModelSPLOTransformer.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/core/transformer/FeatureModelSPLOTransformer.java index dc1aef54..eae26f21 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/core/transformer/FeatureModelSPLOTransformer.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/core/transformer/FeatureModelSPLOTransformer.java @@ -75,7 +75,7 @@ private void init(VMTransformerInDTO inDTO) { } /** - * Lee el xml para identificar las caracter�sticas raices + * Lee el xml para identificar las caracter�sticas raices * * @param node * @param tab @@ -209,10 +209,18 @@ else if (node instanceof FeatureGroup) { // Se recorre los hijos de la cardinalidad para construir la // restriccion - Enumeration childrenNodes = node.children(); + + // One should not use deprecated types + @SuppressWarnings("rawtypes") + Enumeration dummies = node.children(); + List childrenNodes = new ArrayList<>(); + while(dummies.hasMoreElements()) { + childrenNodes.add((FeatureTreeNode) dummies.nextElement()); + } + + - while (childrenNodes.hasMoreElements()) { - FeatureTreeNode childNode = childrenNodes.nextElement(); + for(FeatureTreeNode childNode : childrenNodes){ String childFeatureName = transformName(childNode.getName()); VariabilityElementDefAna variabilityElementDefAna = new VariabilityElementDefAna( childFeatureName); diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/core/transformer/FeatureModelTransformerRules.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/core/transformer/FeatureModelTransformerRules.java index 4792086e..61f2676f 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/core/transformer/FeatureModelTransformerRules.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/core/transformer/FeatureModelTransformerRules.java @@ -36,7 +36,7 @@ public IntBooleanExpression getMandatoryRule(VariabilityElementDefAna element1, } /** - * M�todo para negar una restricci�n mandatory + * M�todo para negar una restricci�n mandatory * * @param element1 * @param element2 diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/CauCosAnayzer.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/CauCosAnayzer.java index 7bfaf20a..1db63555 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/CauCosAnayzer.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/CauCosAnayzer.java @@ -85,8 +85,8 @@ private List getNextSet(List> d int indexDependencyToRemove = 0; if (!dependenciesToChange.isEmpty()) { // Antes de cambiar se verifica que no sea subconjunto de las - // cláusulas bloquedas, si es subconjunto no se analiza esa - // combinación + // cláusulas bloquedas, si es subconjunto no se analiza esa + // combinación for (int i = 0; i < dependenciesToChange.size(); i++) { if (blockedClausesSets == null || !SetUtil .verifySetIsSubSetOfCollectionSets(dependenciesToChange.get(i), blockedClausesSets)) { @@ -107,13 +107,13 @@ private List getNextSet(List> d } /** - * Identifica los MCS para un conjunto de dependencies según el mode - * ingresado ( Todos los MCS o los más pequeños) + * Identifica los MCS para un conjunto de dependencies según el mode + * ingresado ( Todos los MCS o los más pequeños) * * @param mode * @param maxK - * : Tamaño máximo del conjunto corrección cuando se desea - * restringir el tamaño del espacio de búsqueda + * : Tamaño máximo del conjunto corrección cuando se desea + * restringir el tamaño del espacio de búsqueda * @return * @throws FunctionalException * @throws PrologException @@ -129,7 +129,7 @@ private List> getMCSes(Defect defectToAnalyze, HlclPr List> allMCSes = new ArrayList>(); // Combinaciones de potenciales MCS que no deben ser analizadas pq se - // sabe previamente que no van a generar ningún resultado + // sabe previamente que no van a generar ningún resultado List> blockedConstraints = new ArrayList>(); HlclProgram modelExpressions = new HlclProgram(); @@ -143,16 +143,16 @@ private List> getMCSes(Defect defectToAnalyze, HlclPr } System.out.println("Defecto" + defectToAnalyze); System.out.println("McsIdentificados" + allMCSes); - System.out.println("Construyendo combinationes tamaño " + r + " ... "); + System.out.println("Construyendo combinationes tamaño " + r + " ... "); // Se construye el powerset de relaciones a ajustar se podan los - // elementos del MCS ya identificados y las cláusulas que se + // elementos del MCS ya identificados y las cláusulas que se // deben bloquear. List> subSets = PowerSetUtil.calculateSets(new ArrayList(), modelExpressions, new ArrayList>(), r, allMCSes, blockedConstraints); if (subSets.isEmpty()) { - // No se pudieron hacer combinaciones de tamaño k con los + // No se pudieron hacer combinaciones de tamaño k con los // elementos de entrada, entonces se termina el algoritmo advance = Boolean.FALSE; } else { @@ -182,7 +182,7 @@ private List> getMCSes(Defect defectToAnalyze, HlclPr allMCSes = unsatisfiableSets; } - // Se incrementa el tamaño del nivel de búsqueda + // Se incrementa el tamaño del nivel de búsqueda r++; } } @@ -238,7 +238,7 @@ private List getCauses(Defect defectToAnalyze, HlclProgram fixedConstrai * Reemplaza en el programa de restricciones de entrada una a una las * restricciones que se encuentran en dependenciesToChange y verifica si el * nuevo programa es satisfacible, si es satisfacible entonces esa - * restricción es un MCS + * restricción es un MCS * * @param expressionsToTest * @param modelToTest @@ -262,7 +262,7 @@ private List> identifyMCSBySize(List> MCSes = new ArrayList>(); List> newUnsatisfiableSet = new ArrayList>(); - // System.out.println("INICIO IDENTIFICACIÓN NIVEL " + r); + // System.out.println("INICIO IDENTIFICACIÓN NIVEL " + r); while (advance) { @@ -276,8 +276,8 @@ private List> identifyMCSBySize(List> identifyMCSBySize(List> identifyMCSBySize(List> identifyMCSBySize(List originalSetOfClauses max = center; } } - // Se resta 1 pq en java los vectores comienzan con la posición cero y + // Se resta 1 pq en java los vectores comienzan con la posición cero y // llegan hasta n-1 return (min - 1); @@ -429,7 +429,7 @@ private List blockConstraints(List e List modelToTestCopy = new ArrayList(); List newUnsatisfiableSetComplement = new ArrayList(); - // Guardará la copia que queda al final de cláusulas insatisfacibles ( + // Guardará la copia que queda al final de cláusulas insatisfacibles ( // sin el defecto a analizar) unsatisifableSetCopy.addAll(expressionsToTest); @@ -443,7 +443,7 @@ private List blockConstraints(List e "Error with the dicothomic approach.Please verify that fixed restrictions do not conflict with verification constraints"); } - // Se adiciona a la colección general de clausulas + // Se adiciona a la colección general de clausulas // unsatisfiables addedColllection = addUnsatisfiableConstraints(unsatisfiableSets, newUnsatisfiableSet); @@ -452,14 +452,14 @@ private List blockConstraints(List e // original, para // obtener el complemento correctamente. Sino como // el - // paso es por referencia se afecta la colección + // paso es por referencia se afecta la colección // original modelToTestCopy.clear(); modelToTestCopy.addAll(modelToTest); newUnsatisfiableSetComplement.clear(); newUnsatisfiableSetComplement.addAll(SetUtil.difference(modelToTestCopy, newUnsatisfiableSet)); - // Se adiciona al conjunto de cláusulas + // Se adiciona al conjunto de cláusulas // insatisfacibles // completo blockedConstraints = addConstraintsToBlock(blockedConstraints, newUnsatisfiableSetComplement, k); @@ -471,7 +471,7 @@ private List blockConstraints(List e } /** - * Adiciona a la collección de sets los sets insatisfacibles. Verificando + * Adiciona a la collección de sets los sets insatisfacibles. Verificando * que no existan subsets * * @param blockedSets @@ -481,12 +481,12 @@ private List blockConstraints(List e private List> addConstraintsToBlock(List> blockedSets, List setToBlock, int minimalSize) { - // Se adiciona la cláusula y luego se eliminan los subsets que existan - // dentro de la lista de cláusulas a bloquear, pq son innecesarios + // Se adiciona la cláusula y luego se eliminan los subsets que existan + // dentro de la lista de cláusulas a bloquear, pq son innecesarios if (setToBlock != null && !setToBlock.isEmpty()) { - // Si la cláusula a bloquear es mayor al tamaño de las cláusulas que - // se están analizando se adiciona. Sino no, pues ya se habría + // Si la cláusula a bloquear es mayor al tamaño de las cláusulas que + // se están analizando se adiciona. Sino no, pues ya se habría // analizado esa coleccion if (blockedSets != null) { if (setToBlock.size() >= minimalSize) { @@ -494,11 +494,11 @@ private List> addConstraintsToBlock(List> addConstraintsToBlock(List> addConstraintsToBlock(List> unsatisfiableCollectionOfSets, List clausesToAdd) { - // Se adiciona la cláusula y luego se eliminan los supersets que existan - // dentro de la lista de cláusulas a bloquear, pq son innecesarios + // Se adiciona la cláusula y luego se eliminan los supersets que existan + // dentro de la lista de cláusulas a bloquear, pq son innecesarios boolean addedCollection = false; if (clausesToAdd != null && !clausesToAdd.isEmpty()) { if (unsatisfiableCollectionOfSets != null) { @@ -528,7 +528,7 @@ private boolean addUnsatisfiableConstraints(List> uns unsatisfiableCollectionOfSets.add(clausesToAdd); addedCollection = true; } else { - System.out.println("Unsatisfiable set ya existía"); + System.out.println("Unsatisfiable set ya existía"); } } } @@ -631,7 +631,7 @@ public Diagnosis getCauCos(Defect defect, HlclProgram model, HlclProgram fixedCo @Override public List getCorrections(Defect defect, HlclProgram model, HlclProgram fixedConstraints, DefectAnalyzerModeEnum mode) throws FunctionalException { - // La lista vacía se envía para guardar los conjuntos irresolubles. Esto + // La lista vacía se envía para guardar los conjuntos irresolubles. Esto // es importante cuando se hallan causas y correcciones juntas List corrections = getCorrections(defect, model, fixedConstraints, new ArrayList>(), mode); @@ -647,10 +647,10 @@ private List getCorrections(Defect defect, HlclProgram model, HlclProgra progressMonitor.setProgress(1); } if (defect instanceof Redundancy) { - // Se quita de la lista la expresión que se considera - // redundante para que pueda ponerse su instrucción de verificación. - // Si ambas se dejan juntas se estaría generando una contradicción - // en el que la solución es quitar la misma restricción redundante y + // Se quita de la lista la expresión que se considera + // redundante para que pueda ponerse su instrucción de verificación. + // Si ambas se dejan juntas se estaría generando una contradicción + // en el que la solución es quitar la misma restricción redundante y // eso // no tiene sentido en este caso HlclProgram modelCopy = new HlclProgram(); diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/DefectAnalyzerController.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/DefectAnalyzerController.java index 245913a9..e083d79b 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/DefectAnalyzerController.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/DefectAnalyzerController.java @@ -33,7 +33,7 @@ public DefectAnalyzerController() { // Se valida que existan los directorios antes de continuar File file = new File(outputDirectoryPath); if (!file.exists()) { - // Si no existe el directorio se lanza una excepción + // Si no existe el directorio se lanza una excepción throw new FunctionalException("output directory " + outputDirectoryPath + " does not exist"); } @@ -83,7 +83,7 @@ public DefectAnalyzerController() { ClassificationType.CORRECTIONS); printAllClassifiedDiagnosis(classifiedCauses, ClassificationType.CAUSES); - // Información DTO de salida que sirve para analizar xls resumidos + // Información DTO de salida que sirve para analizar xls resumidos defectAnalyzerControllerOut.setAllDiagnostics(causeAnalizerOutDTO .getAllDiagnosis()); defectAnalyzerControllerOut.setTime(totalCorrectionSetTestTime); @@ -128,7 +128,7 @@ public DefectAnalyzerController() { ClassifiedElement classifiedDiagnosis, ClassificationType classificationType) { - System.out.println(" \n CLASIFICACIÓN:" + classificationType.name()); + System.out.println(" \n CLASIFICACIÓN:" + classificationType.name()); System.out.println("_______________________________________"); System.out.println("A.Comunes"); System.out.println("Cantidad: " @@ -199,7 +199,7 @@ public void printDiagnosis(List allDiagnosis) { List> defectos = new ArrayList>(); - // Estadistícas + // Estadistícas List numCaracteristicas = new ArrayList(); numCaracteristicas.add("#Caracteristicas"); numCaracteristicas.add(Integer.toString(defectAnalyzerInDTO @@ -263,12 +263,12 @@ public void printDiagnosis(List allDiagnosis) { general.add(Integer.toString(cantidadDefectos)); defectos.add(general); List defectoVoidModelo = new ArrayList(); - defectoVoidModelo.add("Modelo vacío"); + defectoVoidModelo.add("Modelo vacío"); defectoVoidModelo.add(Boolean.toString(vmVerifierOutDTO.isVoidModel())); defectos.add(defectoVoidModelo); List defectoFalseProductLine = new ArrayList(); - defectoFalseProductLine.add("Falsa Línea de productos"); + defectoFalseProductLine.add("Falsa Línea de productos"); defectoFalseProductLine.add(Boolean.toString(vmVerifierOutDTO .isFalseProductLineModel())); defectos.add(defectoFalseProductLine); @@ -280,14 +280,14 @@ public void printDiagnosis(List allDiagnosis) { defectos.addAll(saveDefects("Redundancies", vmVerifierOutDTO.getRedundanciesList())); - // Se pone información en la hoja + // Se pone información en la hoja ExportUtil.adicionarInfoHoja(Arrays.asList(titulosDefectos), 0, hojaDefectos, defectos, tiempoTest, cont); // CAUSAS Y CORECCIONES - // Información para guardar + // Información para guardar String titulos[] = { "Defecto", "#elementos relajados", - "Solución número", "correcionsets" }; + "Solución número", "correcionsets" }; HSSFSheet hoja = resultadosLibro.createSheet(); List allDiagnostics = causeAnalyzerOutDTO @@ -344,11 +344,11 @@ public void printDiagnosis(List allDiagnosis) { resultadosAnalisis.add(new ArrayList()); } - // Se pone información en la hoja + // Se pone información en la hoja ExportUtil.adicionarInfoHoja(Arrays.asList(titulos), 0, hoja, resultadosAnalisis, tiempoTest, cont); - // Se crea una nueva hoja para poner la clasificación de las causas y + // Se crea una nueva hoja para poner la clasificación de las causas y // las correciones HSSFSheet hojaClasificacion = resultadosLibro.createSheet(); @@ -368,7 +368,7 @@ public void printDiagnosis(List allDiagnosis) { clasificacion.addAll(saveClassification("correcciones no Comunes", classifiedCorrections.getNoCommonDiagnosis())); - // Se pone información en la hoja + // Se pone información en la hoja ExportUtil.adicionarInfoHoja(Arrays.asList(titulosClasificacion), 0, hojaClasificacion, clasificacion, tiempoTest, cont); @@ -405,7 +405,7 @@ private List> saveDefects(String encabezado, } /** - * Crea la información para guardar la clasificación en una hoja de excel + * Crea la información para guardar la clasificación en una hoja de excel * * @param encabezado * @param classifiedCausesCorrectionsList @@ -488,7 +488,7 @@ private VerificationResultDTO verifyDefects( } /** - * Identifica las causas de los defectos identificados según los criterios + * Identifica las causas de los defectos identificados según los criterios * definidos en el DTO de entrada * * @param defectAnalyzerInDTO @@ -500,7 +500,7 @@ private DefectAnalyzerResultDTO causesAnalyzer( DefectAnalyzerControllerInDTO defectAnalyzerInDTO, VerificationResultDTO verifierOutDTO) throws FunctionalException { - // Información del DTO + // Información del DTO VMAnalyzerInDTO vmAnalyzerInDTO = new VMAnalyzerInDTO(); vmAnalyzerInDTO.setVariabilityModel(defectAnalyzerInDTO .getVariabilityModel()); diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/DefectsVerifier.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/DefectsVerifier.java index 98ccc5e1..274255e1 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/DefectsVerifier.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/DefectsVerifier.java @@ -37,8 +37,8 @@ public class DefectsVerifier implements IntDefectsVerifier { - // Variables usadas para almacenar información que es útil cuando se hacen - // otras operaciones de verificación + // Variables usadas para almacenar información que es útil cuando se hacen + // otras operaciones de verificación private Map> verifiedValuesMap; private SolverOperationsUtil solver; private HlclProgram model; @@ -145,7 +145,7 @@ public List getVoids( } private boolean existValue(Identifier identifier, int valueToTest) { - // Cada vez que se hace una configuración se bloquean valores no tener + // Cada vez que se hace una configuración se bloquean valores no tener // que verificar luego estos valores Set attainableDomains = verifiedValuesMap.get(identifier); if (attainableDomains == null @@ -168,7 +168,7 @@ public List getNonAttainableDomains(Identifier identifier) IntBooleanExpression verificationExpression = null; - // Se verifica si el modelo es vacío + // Se verifica si el modelo es vacío boolean isSatisfiable = solver.isSatisfiable(model); if (isSatisfiable) { @@ -186,12 +186,12 @@ public List getNonAttainableDomains(Identifier identifier) .verifyAssignValueToVariabilityElementExpression( identifier, valueToTest); - // Se adiciona la restricción al conjunto de restricciones + // Se adiciona la restricción al conjunto de restricciones // que representa el modelo de variabilidad ConfigurationOptionsDTO options = new ConfigurationOptionsDTO(); options.addAdditionalExpression(verificationExpression); - // Se obtiene una configuración del solver + // Se obtiene una configuración del solver SolverSolution configurationResult = solver .getConfiguration(model, new SolverSolution(), options); @@ -230,7 +230,7 @@ private void updateEvaluatedDomainsMap(SolverSolution configuration) { for (Identifier identifier : identifiersList) { - // Se busca en la configuración el id del identificador + // Se busca en la configuración el id del identificador if (configurationValues.containsKey(identifier.getId())) { number = configurationValues.get(identifier.getId()); @@ -367,7 +367,7 @@ public Defect isDeadElement(Identifier identifier, // constraintToAdd = VerifierUtilExpression // .verifyAssignValueToVariabilityElementExpression( // identifier, definedDomainValue); - // // Se adiciona la restricción al conjunto de restricciones + // // Se adiciona la restricción al conjunto de restricciones // // que representa el modelo de variabilidad // ConfigurationOptions options = new ConfigurationOptions(); // options.addAdditionalExpression(constraintToAdd); @@ -446,7 +446,7 @@ public Defect isDeadElement(Identifier identifier, // // verificationExpression = VerifierUtilExpression // .verifyFalseOptionalExpression(identifier); - // // Se adiciona la restricción de verificacion al conjunto de + // // Se adiciona la restricción de verificacion al conjunto de // // restricciones // // que representa el modelo de variabilidad // ConfigurationOptions options = new ConfigurationOptions(); @@ -577,12 +577,12 @@ public Defect isRedundant(IntBooleanExpression expressionToVerify) isSatisfiable = solver.isSatisfiable(modelWithoutRedundancy); if (!isSatisfiable) { - // La relación no es redundante, pq se requiere para que el + // La relación no es redundante, pq se requiere para que el // modelo funcione return null; } else { // Si el nuevo modelo es resoluble entonces se adicionan las - // instrucciones que corresponen a la negación de la restricción + // instrucciones que corresponen a la negación de la restricción // que se cree redundante HlclFactory f = new HlclFactory(); @@ -590,8 +590,8 @@ public Defect isRedundant(IntBooleanExpression expressionToVerify) Identifier reification; IntBooleanExpression reifedExpression; List negationList = new ArrayList(); - // Se reifica la expresión a negar en una variable, luego se - // aplica la negación sobre esa variable que es ( 1- Variable) + // Se reifica la expresión a negar en una variable, luego se + // aplica la negación sobre esa variable que es ( 1- Variable) // #> 0 reification = f.newIdentifier("ReifRedundancy"); reifedExpression = f.doubleImplies(reification, @@ -607,7 +607,7 @@ public Defect isRedundant(IntBooleanExpression expressionToVerify) new SolverSolution(), options); if (!isSatisfiable) { - // La restricción si es redundante pq el modelo se volvió + // La restricción si es redundante pq el modelo se volvió // irresoluble Defect redundancy = new Redundancy(negationList, expressionToVerify); diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/HittingSetIdentifier.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/HittingSetIdentifier.java index 02b94c50..285e608b 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/HittingSetIdentifier.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/HittingSetIdentifier.java @@ -12,7 +12,7 @@ /** - * Contiene los métodos relacionados con la identificación de los MUSes + * Contiene los métodos relacionados con la identificación de los MUSes * @author LuFe * */ @@ -21,14 +21,14 @@ public class HittingSetIdentifier { /* - * Implementa la lógica propuesta en Lifton(2009) pero se modifica pq el - * algoritmo original omitía algunos subconjuntos + * Implementa la lógica propuesta en Lifton(2009) pero se modifica pq el + * algoritmo original omitía algunos subconjuntos */ public static void allMUSes(List> minimalCorrectionSubsets, List actualHittingSet, List> hittingSets) { - // Adiciona al MUS actual los conjutos de la lista que tengan tamaño + // Adiciona al MUS actual los conjutos de la lista que tengan tamaño // 1. // Estos siempre tienen que ir y permite ganar en velocidad. Elimina // luego estos conjuntos de la lista, y si hay mas conjuntos que @@ -45,7 +45,7 @@ public static void allMUSes(List> minimalCorrectionSubsets, return; } else { - // Unión de elementos que formarán los hitting sets + // Unión de elementos que formarán los hitting sets Collection allClausesMCSes = SetUtil .getUnionCollectionOfSets(minimalCorrectionSubsets); boolean stop = Boolean.FALSE; @@ -99,7 +99,7 @@ private static void propagateSingletons( // List> newMCSes = new ArrayList>(); Collection> minimalCorrectionSubsetsToRemove = new ArrayList>(); - // Se ordenan los conjuntos por tamaño de menor mayor + // Se ordenan los conjuntos por tamaño de menor mayor Collections.sort(minimalCorrectionSubsets, new CollectionsSizeComparator()); @@ -109,12 +109,12 @@ private static void propagateSingletons( if (list.size() == 1) { actualMUS.addAll(list); minimalCorrectionSubsetsToRemove.add(list); - // Se eliminan de los otros conjuntos las cláusulas que contiene + // Se eliminan de los otros conjuntos las cláusulas que contiene // el conjunto con un solo elemento clausesToRemove.addAll(list); } else { - // Como esta ordenado por tamaño, si la lista no es de tamaño 1 - // es pq no hay más de ese tamaño y se puede terminar el ciclo + // Como esta ordenado por tamaño, si la lista no es de tamaño 1 + // es pq no hay más de ese tamaño y se puede terminar el ciclo break; } } @@ -127,7 +127,7 @@ private static void propagateSingletons( testMCS.remove(clause); } if (testMCS.isEmpty()) { - // Si la lista es vacía se elimina del la lista de MCSes + // Si la lista es vacía se elimina del la lista de MCSes minimalCorrectionSubsetsToRemove.add(testMCS); } @@ -138,7 +138,7 @@ private static void propagateSingletons( minimalCorrectionSubsets.removeAll(minimalCorrectionSubsetsToRemove); // La lista modificada de minimalCorrectionsSUbsets y el actualMUS sale - // de aqui modificado pq los parámetros fueron pasados por referencia + // de aqui modificado pq los parámetros fueron pasados por referencia } @@ -146,7 +146,7 @@ private static void propagateSingletons( /** * Verifica que no existan superconjuntos en los hitting sets generados para - * garantizar que cada hitting set es mínimo + * garantizar que cada hitting set es mínimo * * @param minimalCorrectionSubsets * @param actualMUS @@ -158,15 +158,15 @@ public static List> filterMUSes( List> hittingSubsets) { // En caso de que la lista de entrada tenga supersets se eliminan ( - // Para la formación de un hitting set esto no debería pasar, pero se + // Para la formación de un hitting set esto no debería pasar, pero se // hace por seguridad) List> collectionOfSetCopy = cloneSet(minimalCorrectionSubsets); collectionOfSetCopy = SetUtil.maintainNoSupersets(collectionOfSetCopy); allMUSes(collectionOfSetCopy, actualMUS, hittingSubsets); // Se eliminan los supersets de los hitting sets. Esto para garantizar - // que los hittings sets identificados sean mínimo - // Un hitting set es mínimo si sus subconjuntos propios no son hitting + // que los hittings sets identificados sean mínimo + // Un hitting set es mínimo si sus subconjuntos propios no son hitting // sets, por lo tanto, no pueden haber supersets entre los conjuntos // para cumplir con esta propiedad SetUtil.maintainNoSupersets(hittingSubsets); @@ -192,7 +192,7 @@ private static List> cloneSet(List> collectionToClone) { /** - * Selecciona la siguiente cláusula con la cuál probar la generación del MUS + * Selecciona la siguiente cláusula con la cuál probar la generación del MUS * * @param collectionOfSets * @param blockedClauses @@ -212,7 +212,7 @@ private static E selectRemainingClause(List> collectionOfSets, } } - // Se retorna el primer elemento si la lista no es vacía + // Se retorna el primer elemento si la lista no es vacía if (!set.isEmpty()) { return set.get(0); } @@ -222,9 +222,9 @@ private static E selectRemainingClause(List> collectionOfSets, /** - * Implementa la lógica propuesta en Lifton(2009). Pero modifica la parte en + * Implementa la lógica propuesta en Lifton(2009). Pero modifica la parte en * la que elimina las clausulas del MCS seleccionado de otros conjuntos pq - * estaba descartando hitting set mínimos + * estaba descartando hitting set mínimos * * @param mCSes * @param clauseToAdd @@ -236,16 +236,16 @@ private static void propagateChoiceSinEliminarClausulas( Collection> minimalCorrectionSubsetsToRemove = new ArrayList>(); if (!mCSes.isEmpty()) { - // Se eliminan los subconjuntos que tienen la cláusula que se - // seleccionó + // Se eliminan los subconjuntos que tienen la cláusula que se + // seleccionó for (List testMCS : mCSes) { // Remove any other MCSes hit by choosing thisClause, because - // they have now been “satisfied” by the partial + // they have now been “satisfied” by the partial // solution(Lifton,2009) if (testMCS.contains(clauseToAdd)) { minimalCorrectionSubsetsToRemove.add(testMCS); - // Se deben eliminar las cláusulas de este MCS de los otros - // MCS pq no son cláusulas válidas + // Se deben eliminar las cláusulas de este MCS de los otros + // MCS pq no son cláusulas válidas // clausesToRemove.addAll(testMCS); } } @@ -264,7 +264,7 @@ private static E searchMoreRelatedElement(Collection elements, if (!elements.isEmpty()) { - // Se guarda la colección en una lista + // Se guarda la colección en una lista List elementsToCount = new ArrayList(); for (E element : elements) { elementsToCount.add(element); @@ -275,7 +275,7 @@ private static E searchMoreRelatedElement(Collection elements, return elementsToCount.get(0); } - // Vector que almacena el número de ocurrencias que tiene cada + // Vector que almacena el número de ocurrencias que tiene cada // elemento del set elements en la collectionOfSets int recordCount[] = new int[elements.size()]; @@ -291,7 +291,7 @@ private static E searchMoreRelatedElement(Collection elements, recordCount[i] = count; } - // Se verifica cuál es la posición del array que tiene el número más + // Se verifica cuál es la posición del array que tiene el número más // grande int position = 0; for (int i = 1; i < recordCount.length; i++) { @@ -300,8 +300,8 @@ private static E searchMoreRelatedElement(Collection elements, } } - // Se retorna la dependencia de la lista que este en la posición que - // tenía el mayor número de ocurrencias y se elimina de la lista + // Se retorna la dependencia de la lista que este en la posición que + // tenía el mayor número de ocurrencias y se elimina de la lista // original para que avance el ciclo elements.remove(elementsToCount.get(position)); return elementsToCount.get(position); diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/VariabilityModelCausesCorrectionsSorter.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/VariabilityModelCausesCorrectionsSorter.java index 0a88725d..bef1e813 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/VariabilityModelCausesCorrectionsSorter.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/core/VariabilityModelCausesCorrectionsSorter.java @@ -24,15 +24,15 @@ public VariabilityModelCausesCorrectionsSorter() { public ClassifiedElement classifyDiagnosis(List allDiagnoses, ClassificationTypeEnum classsificationType) { - // Almacena la colección completa de todos los MUSes o de todos los - // MCSes según el parámetro de entrada + // Almacena la colección completa de todos los MUSes o de todos los + // MCSes según el parámetro de entrada List cauCosAllElements = new ArrayList(); Set caucosAllElementsSet = new HashSet(); List commonDiagnosis = new ArrayList(); List noCommonDiagnosis = new ArrayList(); - // Se obtiene la colección de todos las causas o correcciones - // según el classificationType + // Se obtiene la colección de todos las causas o correcciones + // según el classificationType for (Diagnosis diagnosis : allDiagnoses) { if (classsificationType.equals(ClassificationTypeEnum.CAUSES)) { cauCosAllElements.addAll(diagnosis.getCauses()); @@ -48,7 +48,7 @@ public ClassifiedElement classifyDiagnosis(List allDiagnoses, caucosAllElementsSet.add(cauCos); } int setSize=caucosAllElementsSet.size(); - // Se eliminan los repetidos que tenían orden distinto y no eran + // Se eliminan los repetidos que tenían orden distinto y no eran // detectados por el equals de la clase CauCos List> cauCosExpressionsList = new ArrayList>(); for (CauCos cauCos : caucosAllElementsSet) { @@ -59,8 +59,8 @@ public ClassifiedElement classifyDiagnosis(List allDiagnoses, SetUtil.maintainNoSupersets(cauCosExpressionsList); //FIXME terminar el filtro para que no tenga valores repetidos - // Se recorre la unión anteriormente obtenida ( es una causa una - // correción) + // Se recorre la unión anteriormente obtenida ( es una causa una + // correción) long id = 1; for (CauCos cauCos : cauCosAllElements) { @@ -93,12 +93,12 @@ public ClassifiedElement classifyDiagnosis(List allDiagnoses, private List searchDiagnosisByDefects(List allDiagnoses, CauCos cauCos, ClassificationTypeEnum classsificationType) { - // Lista de defectos en los que se encuentra la causa o corrección + // Lista de defectos en los que se encuentra la causa o corrección List defects = new ArrayList(); for (Diagnosis diagnosis : allDiagnoses) { if (classsificationType.equals(ClassificationTypeEnum.CAUSES)) { - // Se verifica si en la colección de causas de este diagnostico + // Se verifica si en la colección de causas de este diagnostico // esta la causa o correccion a revisar List causes = diagnosis.getCauses(); if (causes.contains(cauCos)) { @@ -107,7 +107,7 @@ private List searchDiagnosisByDefects(List allDiagnoses, } else if (classsificationType .equals(ClassificationTypeEnum.CORRECTIONS)) { - // Se verifica si en la colección de correcciones de este + // Se verifica si en la colección de correcciones de este // diagnostico // esta ese conjunto List corrections = diagnosis.getCorrections(); diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/defects/Defect.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/defects/Defect.java index 3fbcfe20..f1cdbc4f 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/defects/Defect.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/defects/Defect.java @@ -10,7 +10,7 @@ public class Defect { protected String id; protected DefectTypeEnum defectType; // Guarda la lista de restricciones que se usan para identificar el defecto - // con las operaciones de verificación + // con las operaciones de verificación protected List verificationExpressions; public Defect() { diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/ClassifiableDiagnosis.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/ClassifiableDiagnosis.java index 0e367ea4..0bcd36ef 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/ClassifiableDiagnosis.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/ClassifiableDiagnosis.java @@ -6,7 +6,7 @@ public class ClassifiableDiagnosis { - // Puede ser una causa o una corrección según como se use + // Puede ser una causa o una corrección según como se use private CauCos cauCos; private Long id; diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/Diagnosis.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/Diagnosis.java index 0bb73ec3..d53e4875 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/Diagnosis.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/Diagnosis.java @@ -7,8 +7,8 @@ import com.variamos.reasoning.defectAnalyzer.model.defects.Defect; /** - * Objeto que representa el defecto, las causas y los subconjuntos corrección - * que podrían solucionar el defecto + * Objeto que representa el defecto, las causas y los subconjuntos corrección + * que podrían solucionar el defecto * * @author LuFe * @@ -51,7 +51,7 @@ public void printCorrections() { int i = 1; System.out.println("Defecto" + defect.getId()); for (CauCos correction : corrections) { - System.out.println("Corrección: " + i); + System.out.println("Corrección: " + i); printCorrectionSet(correction.getElements()); i++; } diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/VariabilityElementDefAna.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/VariabilityElementDefAna.java index f88c2d95..53e9c947 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/VariabilityElementDefAna.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/diagnosis/VariabilityElementDefAna.java @@ -51,15 +51,15 @@ public void setDomain(IntDefectAnalyzerDomain domain) { } /** - * // Se agrega a la lista de características, la actual (se pone sus // - * letras en mayúscula, se intercambian los espacios por _ y // se + * // Se agrega a la lista de características, la actual (se pone sus // + * letras en mayúscula, se intercambian los espacios por _ y // se * reemplazan los simbolos de + y - por Plus y Minus, // respectivamente) * * @param name * @return */ private String transformName(String name) { - // Se pasa a mayúsculas la primera letra para garantizar + // Se pasa a mayúsculas la primera letra para garantizar // que sea interpretada como variable en los solvers por ejemplo en // Prolog String changedName = evaluateFirstCharacter(name.charAt(0)) diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/dto/DefectAnalyzerResultDTO.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/dto/DefectAnalyzerResultDTO.java index 1982d6e2..c7e6c361 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/dto/DefectAnalyzerResultDTO.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/dto/DefectAnalyzerResultDTO.java @@ -8,7 +8,7 @@ import com.variamos.reasoning.defectAnalyzer.model.diagnosis.Diagnosis; /** - * Entrega los resultados del análisis del defecto causas y correcciones + * Entrega los resultados del análisis del defecto causas y correcciones * * @author LuFe * diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/dto/VMTransformerInDTO.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/dto/VMTransformerInDTO.java index b979aee3..0b67f347 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/dto/VMTransformerInDTO.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/dto/VMTransformerInDTO.java @@ -12,7 +12,7 @@ public class VMTransformerInDTO { private NotationType notationType; - //Para transformar desde Prolog Indica en que notación esta el modelo a transformar + //Para transformar desde Prolog Indica en que notación esta el modelo a transformar private SolverEditorType prologEditorTypeFileToTransform; /** diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/transformation/Dependency.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/transformation/Dependency.java index c4285a40..ebcd9501 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/transformation/Dependency.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/transformation/Dependency.java @@ -9,9 +9,9 @@ public class Dependency implements Cloneable { private IntBooleanExpression constraintExpression; - // Negación de la expresión. Sirve para identificar las redundancias - // automáticamente en modelos de caraacteristicas. En las otras notaciones - // si se debe escribir la expresión manualmente + // Negación de la expresión. Sirve para identificar las redundancias + // automáticamente en modelos de caraacteristicas. En las otras notaciones + // si se debe escribir la expresión manualmente private IntBooleanExpression negationExpression; diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/transformation/VariabilityModel.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/transformation/VariabilityModel.java index 16739829..13be2084 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/transformation/VariabilityModel.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/defectAnalyzer/model/transformation/VariabilityModel.java @@ -16,8 +16,8 @@ public class VariabilityModel { private Map dependencies; private String name; - // Dependencias propias de la notaci�n que se est� utilizando y que no - // pueden ser modificables pq hacen parte de la sem�ntica del modelo de + // Dependencias propias de la notaci�n que se est� utilizando y que no + // pueden ser modificables pq hacen parte de la sem�ntica del modelo de // variabilidad private Map fixedDependencies; @@ -25,7 +25,7 @@ public class VariabilityModel { // opcionales private Map optionalVariabilityElements; - // Dependencias de inclusi�n o exclusion. Son la dependencias para las que + // Dependencias de inclusi�n o exclusion. Son la dependencias para las que // se buscan redundancias si el modelo es un feature model private Map inclusionExclusionDependencies; diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/medic/model/diagnoseAlgorithm/MinimalSetsDFSIterationsHLCL.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/medic/model/diagnoseAlgorithm/MinimalSetsDFSIterationsHLCL.java index 0e1610bd..b0c9e8c5 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/medic/model/diagnoseAlgorithm/MinimalSetsDFSIterationsHLCL.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/medic/model/diagnoseAlgorithm/MinimalSetsDFSIterationsHLCL.java @@ -220,7 +220,7 @@ public LinkedList sourceOfInconsistentConstraints(String source, int * This method performs a DFS until an insatisfiable constraint is found * @param source is a string with the id of the vertex source of the search * @param csp is a copy of the inconsistent CSP with the variables and domains of the problem, - * no se esta usando por ahora, sirve cuando se haga la ejecución incremental + * no se esta usando por ahora, sirve cuando se haga la ejecución incremental * @param cc is the list of inconsistent constraints * @return path is a linked-list containing the sequence of visited vertices. * The last vertex in path is the inconsistent contains the inconsistent constraint diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/medic/model/graph/ConstraintGraphHLCL.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/medic/model/graph/ConstraintGraphHLCL.java index 63720b54..afb0d374 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/medic/model/graph/ConstraintGraphHLCL.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/medic/model/graph/ConstraintGraphHLCL.java @@ -22,7 +22,7 @@ /** * Esta es la clase que implementa una constraint network * using an adjacencies list. - * Un vértice en esta clase es una variable o una constraint + * Un vértice en esta clase es una variable o una constraint * Edges in this class represent the aparition of a constraint containing a variable * @author Angela Villota * @@ -108,9 +108,9 @@ public void addEdge(VertexHLCL v1, VertexHLCL v2) throws Exception{ /** * - * @param expression, es una expresion con la restricción. En la versión 0 es un string. + * @param expression, es una expresion con la restricción. En la versión 0 es un string. * @param vars debe ser una lista o arreglo de expresiones de variables. - * En la versión 0 las expresiones variable son objetos de la clase Variable + * En la versión 0 las expresiones variable son objetos de la clase Variable */ public void addConstraint(IntBooleanExpression cons){ constraintsCount++; //number of constraints in the problem, could be different than the number of nodes @@ -218,7 +218,7 @@ public int variablesSize(){ } - //Cambios aquí------------------------------------------------------- + //Cambios aquí------------------------------------------------------- public Collection getNeighbors(String id, boolean type){ Collection tmp= null; if (type==VertexHLCL.CONSTRAINT_TYPE) diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/ConstraintRepresentationUtil.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/ConstraintRepresentationUtil.java index 729bd121..9fcc49d2 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/ConstraintRepresentationUtil.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/ConstraintRepresentationUtil.java @@ -21,7 +21,7 @@ public class ConstraintRepresentationUtil { /** - * Realiza la lógica de convertir la representación de constraints agnostica + * Realiza la lógica de convertir la representación de constraints agnostica * a el solver que corresponda y guardarlo en un archivo temporal que luego * es analizado * @@ -37,7 +37,7 @@ public static void savePrologRepresentationProgram(String prologTempPath, String constraintProgramString = constraintToPrologProgram( constraintRepresentation, solverEditorType); - // Se guarda la representación en el archivo temporal de prolog + // Se guarda la representación en el archivo temporal de prolog FileUtils.writeFile(prologTempPath, constraintProgramString); } @@ -49,7 +49,7 @@ public static void savePrologRepresentationProgram(String prologTempPath, String constraintProgramString = constraintToPrologProgram( constraintRepresentation, domainList,solverEditorType); - // Se guarda la representación en el archivo temporal de prolog + // Se guarda la representación en el archivo temporal de prolog FileUtils.writeFile(prologTempPath, constraintProgramString); } @@ -163,7 +163,7 @@ public static Collection dependencyToExpressionList( } /** - * Se hace este método para que el resto del código no tenga que preocuparse + * Se hace este método para que el resto del código no tenga que preocuparse * por volver las expressions hlclcPrograms * * @param constraintRepresentation diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/ExportDefectAnalyzer.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/ExportDefectAnalyzer.java index de9bc377..e90df97c 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/ExportDefectAnalyzer.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/ExportDefectAnalyzer.java @@ -33,7 +33,7 @@ public class ExportDefectAnalyzer { List> resultadosAnalisis = new ArrayList>(); HSSFWorkbook resultadosLibro = new HSSFWorkbook(); int cont = 1; - // Información para guardar + // Información para guardar String titulos[] = { "Modelo", "#feat", "#depen", "#NonTraversal", "%NonTraversal", "#traver", "%traver", "tipoDefecto", "Defecto", "TamCorrec", "#Causas", "Tiempo", "Correc", @@ -145,7 +145,7 @@ public class ExportDefectAnalyzer { } - // Se pone información en la hoja + // Se pone información en la hoja ExportUtil.adicionarInfoHoja(Arrays.asList(titulos), 0, hoja, resultadosAnalisis, 0, cont); @@ -157,7 +157,7 @@ public class ExportDefectAnalyzer { /** * Entrega para cada modelo analizado para cada defecto cuantas causas y - * correcciones encontró + * correcciones encontró * * @param defectAnalyzerControllerOutDTOList * @param directoryName @@ -173,7 +173,7 @@ public class ExportDefectAnalyzer { List> resultadosAnalisis = new ArrayList>(); HSSFWorkbook resultadosLibro = new HSSFWorkbook(); int cont = 1; - // Información para guardar + // Información para guardar String titulos[] = { "Modelo", "#carac", "#depen", "#NonTraversal", "%NonTraversal", "#traver", "%traver", "tipDef", "def", "#caus", "#corr", "tiemp" }; @@ -230,7 +230,7 @@ public class ExportDefectAnalyzer { } - // Se pone información en la hoja + // Se pone información en la hoja ExportUtil.adicionarInfoHoja(Arrays.asList(titulos), 0, hoja, resultadosAnalisis, 0, cont); @@ -258,7 +258,7 @@ public class ExportDefectAnalyzer { List> resultadosAnalisis = new ArrayList>(); HSSFWorkbook resultadosLibro = new HSSFWorkbook(); int cont = 1; - // Información para guardar + // Información para guardar String titulos[] = { "modelo", "#caract", "#depen", "#NonTraversal", "%NonTraversal", "#traver", "%traver", "#def", "vac", "FPL", "CM", "FO", "Redun", "#caus", "#corr", "#causCom", @@ -349,7 +349,7 @@ public class ExportDefectAnalyzer { } - // Se pone información en la hoja + // Se pone información en la hoja ExportUtil.adicionarInfoHoja(Arrays.asList(titulos), 0, hoja, resultadosAnalisis, 0, cont); @@ -370,7 +370,7 @@ public static void exportarListaModelosComparacionFama( List> resultadosAnalisis = new ArrayList>(); HSSFWorkbook resultadosLibro = new HSSFWorkbook(); int cont = 1; - // Información para guardar + // Información para guardar String titulos[] = { "modelo", "#caract", "#depen", "#NonTraversal", "%NonTraversal", "#traver", "%traver", "#def", "vac", "CM", "FO", "#corr", "tiempo", "correccionesMayores" }; @@ -436,7 +436,7 @@ public static void exportarListaModelosComparacionFama( } - // Se pone información en la hoja + // Se pone información en la hoja ExportUtil.adicionarInfoHoja(Arrays.asList(titulos), 0, hoja, resultadosAnalisis, 0, cont); @@ -450,7 +450,7 @@ private static void validatePath(String outputDirectoryPath) throws FunctionalException { File file = new File(outputDirectoryPath); if (!file.exists()) { - // Si no existe el directorio se lanza una excepción + // Si no existe el directorio se lanza una excepción throw new FunctionalException("El directorio de salida " + outputDirectoryPath + " no existe"); } diff --git a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/PowerSetUtil.java b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/PowerSetUtil.java index bd488544..44a1c1eb 100644 --- a/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/PowerSetUtil.java +++ b/com.variamos.reasoning/src/main/java/com/variamos/reasoning/util/PowerSetUtil.java @@ -11,7 +11,7 @@ public class PowerSetUtil { /** - * Crea las combinaciones de k elementos de un conjunto de tamaño n + * Crea las combinaciones de k elementos de un conjunto de tamaño n * * @param prefix * @param elements @@ -60,9 +60,9 @@ public static List> doCombinations(List prefix, } /** - * Invoca el algoritmo que hace las combinaciones válidas. + * Invoca el algoritmo que hace las combinaciones válidas. * - * Construye las combinaciones de tamaño r de elementos que no son + * Construye las combinaciones de tamaño r de elementos que no son * superconjuntos de los conjuntos bloqueados, ni superconjuntos de los * conjuntos no permitidos * @param prefix @@ -94,7 +94,7 @@ public static List> calculateSets(List prefix, } /** - * Crea las combinaciones de k elementos de un conjunto de tamaño n + * Crea las combinaciones de k elementos de un conjunto de tamaño n * * @param prefix * @param elements @@ -145,12 +145,12 @@ public static List> doCombinations2(List prefix, List> resultListValids = new ArrayList>(); resultListValids = doCombinations(prefix2, validElements, resultListValids, notAllowedListSuperSets, r); - // Si hay elementos válidos + // Si hay elementos válidos if (!resultListValids.isEmpty()) { resultList.addAll(resultListValids); } } - // Ciclo con los que no se pueden ( debe ser menor al tamaño mínimo de r + // Ciclo con los que no se pueden ( debe ser menor al tamaño mínimo de r // en al menos 1) if (!elementsToBlock.isEmpty() && r > 1) { for (int j = 0; j < elementsToBlock.size(); j++) { @@ -163,7 +163,7 @@ public static List> doCombinations2(List prefix, . verifySetIsSuperSetOfCollectionSets(prefix2, notAllowedListSuperSets))) { - // Se obtiene la posición del elemento a bloquear en la + // Se obtiene la posición del elemento a bloquear en la // lista de entrada int actualPosition = elements.indexOf(elementsToBlock .get(j)); @@ -175,7 +175,7 @@ public static List> doCombinations2(List prefix, elements.size()), resultListValids, r - 1, notAllowedListSuperSets, notAllowedCollectionOfSets); - // Si hay elementos válidos + // Si hay elementos válidos if (!resultListValids.isEmpty()) { resultList.addAll(resultListValids); } @@ -199,7 +199,7 @@ private static Set getImpliedElements(List prefix, cont = 0; for (E prefixElement : prefix) { // Si el subconjunto a bloquear no tiene el elemento, entonces - // se continúa con el siguiente + // se continúa con el siguiente if (!notAllowedList.contains(prefixElement)) { break; } else { diff --git a/com.variamos.reasoning/src/test/java/com/variamos/reasoning/defectAnalyzer/core/CauseAnalyzerApplicationCaseTest.java b/com.variamos.reasoning/src/test/java/com/variamos/reasoning/defectAnalyzer/core/CauseAnalyzerApplicationCaseTest.java index 7cc8dd5c..104e2160 100644 --- a/com.variamos.reasoning/src/test/java/com/variamos/reasoning/defectAnalyzer/core/CauseAnalyzerApplicationCaseTest.java +++ b/com.variamos.reasoning/src/test/java/com/variamos/reasoning/defectAnalyzer/core/CauseAnalyzerApplicationCaseTest.java @@ -55,12 +55,12 @@ public class CauseAnalyzerApplicationCaseTest { // // try { // boolean isVoid = verifier.isVoid(); - // System.out.println("El modelo es vacío"); + // System.out.println("El modelo es vacío"); // // VoidModel voidModelDefect = new VoidModel( // variabilityModel.getModelName()); // - // // Información del DTO + // // Información del DTO // VMCauseAnalyzerInDTO causeAnalyzerInDTO = new VMCauseAnalyzerInDTO(); // // causeAnalyzerInDTO.setVariabilityModel(variabilityModel); @@ -142,7 +142,7 @@ public class CauseAnalyzerApplicationCaseTest { // .identifyDeadFeatures(verifierInDTO // .getVariabilityModel().getElements()); // - // // Información del DTO + // // Información del DTO // VMCauseAnalyzerInDTO causeAnalyzerInDTO = new VMCauseAnalyzerInDTO(); // // causeAnalyzerInDTO.setVariabilityModel(variabilityModel); @@ -237,7 +237,7 @@ public class CauseAnalyzerApplicationCaseTest { // verifierInDTO // .getVariabilityModel().getElements(); // - // // Se quitan de la lista las características que son full + // // Se quitan de la lista las características que son full // // mandatory, pq de esas se sabe que no pueden tener el valor de // // cero // elementsToVerifyDomainNoneAttainable.remove("Web_Portal"); @@ -305,7 +305,7 @@ public class CauseAnalyzerApplicationCaseTest { // verifierInDTO); // try { // - // // Se prueba con una relación que sí sea redundante + // // Se prueba con una relación que sí sea redundante // // Dependency: Flash-Image // // id 25 (1-Flash)+ Image #>0 // // negacion (1-Flash)+ Image #=<0 @@ -332,7 +332,7 @@ public class CauseAnalyzerApplicationCaseTest { // redundacyDefects.add(redundancy1); // redundacyDefects.add(redundancy2); // - // // Información del DTO + // // Información del DTO // VMCauseAnalyzerInDTO causeAnalyzerInDTO = new VMCauseAnalyzerInDTO(); // // causeAnalyzerInDTO.setVariabilityModel(variabilityModel); @@ -415,7 +415,7 @@ public class CauseAnalyzerApplicationCaseTest { // // private void analyzeMCS(VariabilityModelCauseAnalyzer causesAnalyzer, // List allDiagnostics) throws FunctionalException { - // System.out.println("ANALIZANDO LOS SUBCONJUNTOS CORRECCIÓN"); + // System.out.println("ANALIZANDO LOS SUBCONJUNTOS CORRECCIÓN"); // long startAnalysisTime = System.currentTimeMillis(); // List analyzedCorrectionSetList = new // ArrayList(); @@ -430,7 +430,7 @@ public class CauseAnalyzerApplicationCaseTest { // } // } // - // System.out.println(" Resultado análisis causas"); + // System.out.println(" Resultado análisis causas"); // for (AnalyzedCorrectionSet analizedCorrectionSet : // analyzedCorrectionSetList) { // System.out.println("Defect " diff --git a/com.variamos.solver/src/main/java/com/variamos/solver/core/IntSolver.java b/com.variamos.solver/src/main/java/com/variamos/solver/core/IntSolver.java index c46c4fb7..3a02f712 100644 --- a/com.variamos.solver/src/main/java/com/variamos/solver/core/IntSolver.java +++ b/com.variamos.solver/src/main/java/com/variamos/solver/core/IntSolver.java @@ -41,7 +41,7 @@ public interface IntSolver { public Map> reduceDomain(SolverSolution config, ConfigurationOptionsDTO params); - // Esto para qué sirve?: jcmunoz para que la ejecución ya no continue sobre - // la iteración anterior, no funciona igual que en la version anterior + // Esto para qué sirve?: jcmunoz para que la ejecución ya no continue sobre + // la iteración anterior, no funciona igual que en la version anterior public void clearQueryMonitor(); } diff --git a/com.variamos.solver/src/main/java/com/variamos/solver/core/compiler/Hlcl2SWIProlog.java b/com.variamos.solver/src/main/java/com/variamos/solver/core/compiler/Hlcl2SWIProlog.java index 149c56b4..d1955105 100644 --- a/com.variamos.solver/src/main/java/com/variamos/solver/core/compiler/Hlcl2SWIProlog.java +++ b/com.variamos.solver/src/main/java/com/variamos/solver/core/compiler/Hlcl2SWIProlog.java @@ -233,7 +233,7 @@ protected void writeHeader(HlclProgram program, StringBuilder out) { } private StringBuilder makeDomainsAndVariables(Set ids) { - // Se contruye la lista de caracter�sticas y de dominios + // Se contruye la lista de caracter�sticas y de dominios StringBuilder dommainAndVariables = new StringBuilder("L=["); StringBuilder variablesList = new StringBuilder(); StringBuilder domainString = new StringBuilder(); diff --git a/com.variamos.solver/src/main/java/com/variamos/solver/model/ConfigurationOptionsDTO.java b/com.variamos.solver/src/main/java/com/variamos/solver/model/ConfigurationOptionsDTO.java index ca641249..4d828a28 100644 --- a/com.variamos.solver/src/main/java/com/variamos/solver/model/ConfigurationOptionsDTO.java +++ b/com.variamos.solver/src/main/java/com/variamos/solver/model/ConfigurationOptionsDTO.java @@ -26,7 +26,7 @@ public class ConfigurationOptionsDTO { private List labelingOrder; private List orderExpressions; - // Sirve para saber cuando cerrar la conexión anterior para abrir una nueva + // Sirve para saber cuando cerrar la conexión anterior para abrir una nueva public boolean startFromZero; public String programName; From 9ab625e5c8eb84acd69b9d2a333be04055397b35 Mon Sep 17 00:00:00 2001 From: Nicolas Herbaut Date: Thu, 29 Nov 2018 20:20:40 +0100 Subject: [PATCH 2/2] fix build on the master branch re-encode files to UTF-8 to avoid issues with spanish accents replace deprecated use of raw Enumeration to Iterator through List removed dep provided by maven central removed eclipse files added JPL configuration to gradle.properties for native lib discovery fixed continuous integration added docker build specified docker build in travis added jpl dependency in repo oups java build in .travis --- .gitignore | 4 ++ .settings/.gitignore | 2 - .settings/org.eclipse.buildship.core.prefs | 8 ---- .travis.yml | 9 +++- Dockerfile | 10 +++++ README.md | 13 +++++- build.gradle | 13 ++++-- build.gradle.orig | 41 ++++++++++++++++++ .../org.eclipse.buildship.core.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 11 ----- .../org.eclipse.buildship.core.prefs | 9 ---- .../org.eclipse.buildship.core.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 11 ----- .../.settings/org.eclipse.jdt.core.prefs | 15 ------- .../org.eclipse.buildship.core.prefs | 14 ------ .../.settings/org.eclipse.jdt.core.prefs | 11 ----- .../org.eclipse.buildship.core.prefs | 3 -- .../.settings/org.eclipse.jdt.core.prefs | 11 ----- .../org.eclipse.buildship.core.prefs | 15 ------- .../.settings/org.eclipse.jdt.core.prefs | 11 ----- com.variamos.reasoning/build.gradle | 28 +++++++++--- com.variamos.reasoning/lib/java-json.jar | Bin 84697 -> 0 bytes .../lib/{sxfm.jar => sxfm-1.0.0.jar} | Bin com.variamos.solver/.classpath | 8 ---- .../org.eclipse.buildship.core.prefs | 3 -- .../.settings/org.eclipse.jdt.core.prefs | 11 ----- com.variamos.solver/build.gradle | 6 ++- com.variamos.solver/lib/SWIProlog/jpl723.jar | Bin 30261 -> 0 bytes docker-assets/gradle.properties | 1 + docker-assets/libjpl.so | Bin 0 -> 65448 bytes gradle.properties | 1 + settings.gradle | 2 +- 32 files changed, 115 insertions(+), 160 deletions(-) delete mode 100644 .settings/.gitignore delete mode 100644 .settings/org.eclipse.buildship.core.prefs create mode 100644 Dockerfile create mode 100644 build.gradle.orig delete mode 100644 com.variamos.common/.settings/org.eclipse.buildship.core.prefs delete mode 100644 com.variamos.common/.settings/org.eclipse.jdt.core.prefs delete mode 100644 com.variamos.compiler/.settings/org.eclipse.buildship.core.prefs delete mode 100644 com.variamos.componentparser/.settings/org.eclipse.buildship.core.prefs delete mode 100644 com.variamos.dynsup/.settings/org.eclipse.jdt.core.prefs delete mode 100644 com.variamos.gui/.settings/org.eclipse.jdt.core.prefs delete mode 100644 com.variamos.hlcl/.settings/org.eclipse.buildship.core.prefs delete mode 100644 com.variamos.hlcl/.settings/org.eclipse.jdt.core.prefs delete mode 100644 com.variamos.io/.settings/org.eclipse.buildship.core.prefs delete mode 100644 com.variamos.io/.settings/org.eclipse.jdt.core.prefs delete mode 100644 com.variamos.reasoning/.settings/org.eclipse.buildship.core.prefs delete mode 100644 com.variamos.reasoning/.settings/org.eclipse.jdt.core.prefs delete mode 100644 com.variamos.reasoning/lib/java-json.jar rename com.variamos.reasoning/lib/{sxfm.jar => sxfm-1.0.0.jar} (100%) delete mode 100644 com.variamos.solver/.classpath delete mode 100644 com.variamos.solver/.settings/org.eclipse.buildship.core.prefs delete mode 100644 com.variamos.solver/.settings/org.eclipse.jdt.core.prefs delete mode 100644 com.variamos.solver/lib/SWIProlog/jpl723.jar create mode 100644 docker-assets/gradle.properties create mode 100644 docker-assets/libjpl.so create mode 100644 gradle.properties diff --git a/.gitignore b/.gitignore index 65c48f7f..62a1b8f9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +.project +.classpath +.gitignore + /bin/ /target/ /build/ diff --git a/.settings/.gitignore b/.settings/.gitignore deleted file mode 100644 index 342a127a..00000000 --- a/.settings/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/org.eclipse.buildship.core.prefs -/.gitignore diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 530358e1..00000000 --- a/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,8 +0,0 @@ -build.commands=org.eclipse.jdt.core.javabuilder -connection.arguments= -connection.gradle.user.home=null -connection.java.home=null -connection.jvm.arguments= -connection.project.dir= -derived.resources=.gradle,build -eclipse.preferences.version=1 diff --git a/.travis.yml b/.travis.yml index f5c99a7f..16d40ef3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,8 @@ -language: java \ No newline at end of file +language: java + +services: + - docker + + +before_install: + - docker build -t spla/variamos . diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..775b7e55 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM openjdk:11 +RUN apt-get update +RUN apt-get install gradle software-properties-common --yes +RUN apt-add-repository ppa:swi-prolog/stable +RUN apt-get install swi-prolog --yes +RUN mkdir -p /opt/local/VARIAMOS +COPY ./docker-assets/libjpl.so /usr/lib/x86_64-linux-gnu/jni/libjpl.so +COPY . /opt/local/VARIAMOS/ +WORKDIR /opt/local/VARIAMOS +RUN gradle build diff --git a/README.md b/README.md index c26e79a5..0c0c34aa 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,11 @@ -VARIAMOS -======== +# VARIAMOS # + + +## Native Dependencies ## + +SWI-PROLOG >= 7.7.10 + +## Configuration ## + +specify the libjpl.so or libjpl.dll folder in the gradle.properties + diff --git a/build.gradle b/build.gradle index feeb8132..ade8f0e3 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,8 @@ allprojects { } } + + subprojects { /* the Java plugin adds several tasks like clean, assemble, build, etc, which make it easy to work with the build process when we follow conventions such as src/main/java and src/main/test as main folders*/ @@ -20,10 +22,15 @@ subprojects { apply plugin: 'eclipse' repositories { - jcenter() - } + mavenCentral() } dependencies { - testCompile "junit:junit:4+" + compile group: 'jpl', name: 'jpl', version: '7.4.0' + testCompile group: 'junit', name: 'junit', version: '4.12' + } } + + + + diff --git a/build.gradle.orig b/build.gradle.orig new file mode 100644 index 00000000..1ce91915 --- /dev/null +++ b/build.gradle.orig @@ -0,0 +1,41 @@ +/* Configurations here represents common characteristics shared for each of the sub projects*/ +apply plugin: "java" +apply plugin: 'eclipse' +group = 'com.variamos' +version = '1.1.0.1' +compileJava.options.encoding = 'UTF-8' + +allprojects { + gradle.projectsEvaluated { + tasks.withType(JavaCompile) { + //options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" + } + } +} + +<<<<<<< HEAD +======= + + +>>>>>>> de0ebfe4... fix build on the master branch +subprojects { + /* the Java plugin adds several tasks like clean, assemble, + build, etc, which make it easy to work with the build process when we follow conventions such as src/main/java and src/main/test as main folders*/ + apply plugin: "java" + apply plugin: 'eclipse' + + repositories { + mavenCentral() } + + dependencies { + compile group: 'jpl', name: 'jpl', version: '7.4.0' + testCompile group: 'junit', name: 'junit', version: '4.12' + + } +} + + +ext { + JplLibraryPath = "/usr/lib/x86_64-linux-gnu/jni/" +} + diff --git a/com.variamos.common/.settings/org.eclipse.buildship.core.prefs b/com.variamos.common/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 6eab7003..00000000 --- a/com.variamos.common/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -#Wed Jul 18 21:59:23 COT 2018 -connection.project.dir=.. diff --git a/com.variamos.common/.settings/org.eclipse.jdt.core.prefs b/com.variamos.common/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a215370..00000000 --- a/com.variamos.common/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/com.variamos.compiler/.settings/org.eclipse.buildship.core.prefs b/com.variamos.compiler/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 97b7cc51..00000000 --- a/com.variamos.compiler/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -connection.arguments= -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -connection.gradle.user.home=null -connection.java.home=null -connection.jvm.arguments= -connection.project.dir= -derived.resources=.gradle,build -eclipse.preferences.version=1 -project.path=\: diff --git a/com.variamos.componentparser/.settings/org.eclipse.buildship.core.prefs b/com.variamos.componentparser/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 3d53916a..00000000 --- a/com.variamos.componentparser/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -#Wed Jan 31 10:08:06 COT 2018 -connection.project.dir= diff --git a/com.variamos.dynsup/.settings/org.eclipse.jdt.core.prefs b/com.variamos.dynsup/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 838bd9d6..00000000 --- a/com.variamos.dynsup/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/com.variamos.gui/.settings/org.eclipse.jdt.core.prefs b/com.variamos.gui/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b7e5955d..00000000 --- a/com.variamos.gui/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,15 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -<<<<<<< HEAD -======= -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate ->>>>>>> development -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/com.variamos.hlcl/.settings/org.eclipse.buildship.core.prefs b/com.variamos.hlcl/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index c9a18d1c..00000000 --- a/com.variamos.hlcl/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,14 +0,0 @@ -#Wed Jul 18 20:51:52 COT 2018 -connection.arguments= ->>>>>>>=refs/remotes/upstream/master -connection.jvm.arguments= -build.commands=org.eclipse.jdt.core.javabuilder -connection.project.dir=.. -natures=org.eclipse.jdt.core.javanature -<<<<<<<=HEAD -connection.gradle.user.home=null -eclipse.preferences.version=1 -connection.java.home=null -derived.resources=.gradle,build -project.path=\:com.variamos.hlcl -=\=\=\=\=\=\= diff --git a/com.variamos.hlcl/.settings/org.eclipse.jdt.core.prefs b/com.variamos.hlcl/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a..00000000 --- a/com.variamos.hlcl/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/com.variamos.io/.settings/org.eclipse.buildship.core.prefs b/com.variamos.io/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 9d3feadc..00000000 --- a/com.variamos.io/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,3 +0,0 @@ -#Wed Jul 18 20:51:52 COT 2018 -eclipse.preferences.version=1 -connection.project.dir=.. diff --git a/com.variamos.io/.settings/org.eclipse.jdt.core.prefs b/com.variamos.io/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a215370..00000000 --- a/com.variamos.io/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/com.variamos.reasoning/.settings/org.eclipse.buildship.core.prefs b/com.variamos.reasoning/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index f52eb26f..00000000 --- a/com.variamos.reasoning/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,15 +0,0 @@ -#Wed Jul 18 20:51:52 COT 2018 -connection.arguments= ->>>>>>>=refs/remotes/upstream/master -connection.jvm.arguments= -build.commands=org.eclipse.jdt.core.javabuilder -connection.project.dir=.. -natures=org.eclipse.jdt.core.javanature -<<<<<<<=HEAD -connection.gradle.user.home=null -eclipse.preferences.version=1 -connection.java.home=null -derived.resources=.gradle,build -project.path=\:com.variamos.reasoning -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -=\=\=\=\=\=\= diff --git a/com.variamos.reasoning/.settings/org.eclipse.jdt.core.prefs b/com.variamos.reasoning/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a..00000000 --- a/com.variamos.reasoning/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/com.variamos.reasoning/build.gradle b/com.variamos.reasoning/build.gradle index 95bef9a6..55cf4326 100644 --- a/com.variamos.reasoning/build.gradle +++ b/com.variamos.reasoning/build.gradle @@ -4,8 +4,26 @@ archivesBaseName = 'com.variamos.reasoner' version = '1.0-SNAPSHOT' dependencies { - compile fileTree(dir: 'lib', include: ['*.jar']) - compile project(':com.variamos.common') - compile project(':com.variamos.hlcl') - compile project(':com.variamos.solver') -} \ No newline at end of file +compile group: 'jpl', name: 'jpl', version: '7.4.0' +compile 'org.json:json:20180813' + compile files('lib/sxfm-1.0.0.jar') +compile project(':com.variamos.common') +compile project(':com.variamos.hlcl') +compile project(':com.variamos.solver') + +} + +dependencies { + testCompile 'junit:junit:4.12' +} + +test { + environment "LD_LIBRARY_PATH", project.JPL_LIB_PATH + +} + +repositories { + + mavenCentral() +} + diff --git a/com.variamos.reasoning/lib/java-json.jar b/com.variamos.reasoning/lib/java-json.jar deleted file mode 100644 index 2f211e3660a0f7637cd055e3dfb011fcc5b4f167..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84697 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%0A^eARL~vZq+#%}VrSrx_m=pVc%a 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

8NQ;9Ans?P}n^>gcO>e>oYyAlbCB*-T|9&C$M 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%0A{lnE||A9G*TwwATGQ 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 CY#!SH diff --git a/com.variamos.reasoning/lib/sxfm.jar b/com.variamos.reasoning/lib/sxfm-1.0.0.jar similarity index 100% rename from com.variamos.reasoning/lib/sxfm.jar rename to com.variamos.reasoning/lib/sxfm-1.0.0.jar diff --git a/com.variamos.solver/.classpath b/com.variamos.solver/.classpath deleted file mode 100644 index 755c8124..00000000 --- a/com.variamos.solver/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/com.variamos.solver/.settings/org.eclipse.buildship.core.prefs b/com.variamos.solver/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 9d3feadc..00000000 --- a/com.variamos.solver/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,3 +0,0 @@ -#Wed Jul 18 20:51:52 COT 2018 -eclipse.preferences.version=1 -connection.project.dir=.. diff --git a/com.variamos.solver/.settings/org.eclipse.jdt.core.prefs b/com.variamos.solver/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a215370..00000000 --- a/com.variamos.solver/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/com.variamos.solver/build.gradle b/com.variamos.solver/build.gradle index aaacb2b7..727c4f11 100644 --- a/com.variamos.solver/build.gradle +++ b/com.variamos.solver/build.gradle @@ -4,8 +4,12 @@ archivesBaseName = 'com.variamos.solver' version = '1.0-SNAPSHOT' dependencies { - compile fileTree(dir: 'lib/SWIProlog', include: ['*.jar']) + compile project(':com.variamos.common') compile project(':com.variamos.hlcl') } +test { + environment "LD_LIBRARY_PATH", project.JPL_LIB_PATH + +} \ No newline at end of file diff --git a/com.variamos.solver/lib/SWIProlog/jpl723.jar b/com.variamos.solver/lib/SWIProlog/jpl723.jar deleted file mode 100644 index b0d71dd298147040e5c98844eac3458765b3b3c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30261 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 ZuZlb@aPb5IK?eL=0N#!$?Qr+)e*orBQ49b8 diff --git a/docker-assets/gradle.properties b/docker-assets/gradle.properties new file mode 100644 index 00000000..825d1e53 --- /dev/null +++ b/docker-assets/gradle.properties @@ -0,0 +1 @@ +JPL_LIB_PATH=/usr/lib/x86_64-linux-gnu/jni/ diff --git a/docker-assets/libjpl.so b/docker-assets/libjpl.so new file mode 100644 index 0000000000000000000000000000000000000000..764ef4dd1cf926330d440f607e6369903bc7df7a GIT binary patch literal 65448 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 M_TTjvA|15#Uk7i-`Tzg` literal 0 HcmV?d00001 diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..825d1e53 --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +JPL_LIB_PATH=/usr/lib/x86_64-linux-gnu/jni/ diff --git a/settings.gradle b/settings.gradle index ab592706..7a65f7a5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ":com.variamos.common",":com.variamos.hlcl",":com.variamos.solver",":com.variamos.reasoning", ":com.variamos.io" \ No newline at end of file +include ":com.variamos.common",":com.variamos.hlcl",":com.variamos.solver",":com.variamos.reasoning", ":com.variamos.io"