Browse Source

Cambios para DATA

Mario Martínez Hernández 1 month ago
parent
commit
d69499f032

+ 2 - 2
src/main/java/META-INF/additional-spring-configuration-metadata.json

@@ -145,9 +145,9 @@
     "description": "A description for 'saic.url.public'"
   },
   {
-    "name": "saic.url.core.domain",
+    "name": "saic.url.domain",
     "type": "java.lang.String",
-    "description": "A description for 'saic.url.core.domain'"
+    "description": "A description for 'saic.url.domain'"
   },
   {
     "name": "saic.url.data.domain",

+ 0 - 2
src/main/java/es/uv/saic/dto/EmailDTO.java

@@ -1,7 +1,5 @@
 package es.uv.saic.dto;
 
-import es.uv.saic.domain.Usuari;
-
 public class EmailDTO {
     private String to;
     private String subject;

+ 162 - 0
src/main/java/es/uv/saic/dto/ImportDTO.java

@@ -0,0 +1,162 @@
+package es.uv.saic.dto;
+
+import java.util.List;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import es.uv.saic.domain.Usuari;
+
+public class ImportDTO {
+    // Campos comunes
+    String tipus;
+    Usuari principal;
+    String enquesta;
+    String ambit;
+    String estudi;
+    String locale;
+    String clau;
+    List<String> ignoredColumns;
+    
+    // Campos específicos para importación desde archivo
+    MultipartFile file;
+    String delim;
+    
+    // Campos específicos para importación desde base de datos
+    Integer dbOrigen;
+    String vista;
+    Integer curs;
+    Integer dstCurs;
+
+    // Constructor completo para todos los campos
+    public ImportDTO(MultipartFile file, String tipus, Usuari principal, String enquesta, String ambit, String estudi,
+            String locale, String delim, String clau, List<String> ignoredColumns, Integer dbOrigen, String vista, 
+            Integer curs, Integer dstCurs) {
+        this.file = file;
+        this.tipus = tipus;
+        this.principal = principal;
+        this.enquesta = enquesta;
+        this.ambit = ambit;
+        this.estudi = estudi;
+        this.locale = locale;
+        this.delim = delim;
+        this.clau = clau;
+        this.ignoredColumns = ignoredColumns;
+        this.dbOrigen = dbOrigen;
+        this.vista = vista;
+        this.curs = curs;
+        this.dstCurs = dstCurs;
+    }
+
+    public MultipartFile getFile() {
+        return file;
+    }
+
+    public void setFile(MultipartFile file) {
+        this.file = file;
+    }
+
+    // Getters y Setters
+    public String getTipus() {
+        return tipus;
+    }
+
+    public void setTipus(String tipus) {
+        this.tipus = tipus;
+    }
+
+    public Usuari getPrincipal() {
+        return principal;
+    }
+
+    public void setPrincipal(Usuari principal) {
+        this.principal = principal;
+    }
+
+    public String getEnquesta() {
+        return enquesta;
+    }
+
+    public void setEnquesta(String enquesta) {
+        this.enquesta = enquesta;
+    }
+
+    public String getAmbit() {
+        return ambit;
+    }
+
+    public void setAmbit(String ambit) {
+        this.ambit = ambit;
+    }
+
+    public String getEstudi() {
+        return estudi;
+    }
+
+    public void setEstudi(String estudi) {
+        this.estudi = estudi;
+    }
+
+    public String getLocale() {
+        return locale;
+    }
+
+    public void setLocale(String locale) {
+        this.locale = locale;
+    }
+
+    public String getDelim() {
+        return delim;
+    }
+
+    public void setDelim(String delim) {
+        this.delim = delim;
+    }
+
+    public String getClau() {
+        return clau;
+    }
+
+    public void setClau(String clau) {
+        this.clau = clau;
+    }
+
+    public List<String> getIgnoredColumns() {
+        return ignoredColumns;
+    }
+
+    public void setIgnoredColumns(List<String> ignoredColumns) {
+        this.ignoredColumns = ignoredColumns;
+    }
+
+    public Integer getDbOrigen() {
+        return dbOrigen;
+    }
+
+    public void setDbOrigen(Integer dbOrigen) {
+        this.dbOrigen = dbOrigen;
+    }
+
+    public String getVista() {
+        return vista;
+    }
+
+    public void setVista(String vista) {
+        this.vista = vista;
+    }
+
+    public Integer getCurs() {
+        return curs;
+    }
+
+    public void setCurs(Integer curs) {
+        this.curs = curs;
+    }
+
+    public Integer getDstCurs() {
+        return dstCurs;
+    }
+
+    public void setDstCurs(Integer dstCurs) {
+        this.dstCurs = dstCurs;
+    }
+}

+ 33 - 0
src/main/java/es/uv/saic/dto/TablaDTO.java

@@ -0,0 +1,33 @@
+package es.uv.saic.dto;
+
+public class TablaDTO {
+    Integer dbOrigen;
+    String vista;
+    String locale;
+    
+    public TablaDTO(Integer dbOrigen, String vista, String locale) {
+        this.dbOrigen = dbOrigen;
+        this.vista = vista;
+        this.locale = locale;
+    }
+    public Integer getDbOrigen() {
+        return dbOrigen;
+    }
+    public void setDbOrigen(Integer dbOrigen) {
+        this.dbOrigen = dbOrigen;
+    }
+    public String getVista() {
+        return vista;
+    }
+    public void setVista(String vista) {
+        this.vista = vista;
+    }
+    public String getLocale() {
+        return locale;
+    }
+    public void setLocale(String locale) {
+        this.locale = locale;
+    }
+
+    
+}

+ 0 - 797
src/main/java/es/uv/saic/service/DataService.java

@@ -1,797 +0,0 @@
-package es.uv.saic.service;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.net.URI;
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.sql.rowset.CachedRowSet;
-import javax.sql.rowset.RowSetFactory;
-import javax.sql.rowset.RowSetProvider;
-
-import jakarta.mail.MessagingException;
-
-import org.apache.commons.csv.CSVFormat;
-import org.apache.commons.csv.CSVParser;
-import org.apache.commons.csv.CSVRecord;
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-import org.springframework.util.LinkedCaseInsensitiveMap;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import es.uv.saic.domain.IndicadorEnquestaTmp;
-import es.uv.saic.domain.Organ;
-import es.uv.saic.domain.Usuari;
-import es.uv.saic.dto.EmailDTO;
-import es.uv.saic.dto.IndicadorEnquestaTmpDup;
-import es.uv.saic.domain.Datasource;
-
-
-@Service
-public class DataService {
-	
-	@Autowired
-	private DatasourceService dss;
-
-	@Value("${saic.url.domain}")
-	private String uri;
-	
-	private HashMap<String, String> titsMap;
-	private HashMap<String, String> centresMap;
-	
-	public DataService() {
-		titsMap = new HashMap<String, String>();
-		titsMap.put("TRAD", "1099");
-		centresMap = new HashMap<String, String>();
-		centresMap.put("INDV", "121");
-		centresMap.put("POST", "121");
-		centresMap.put("EDOC", "62");
-	}
-
-	public String doImport(InputStreamReader in, Usuari usuari, String enquesta, String ambit, String estudi, 
-						   String locale, String delim, String clau, List<String> ignoredColumns) throws IOException, MessagingException {
-		
-		CSVFormat format =  CSVFormat.DEFAULT.builder()
-											 .setHeader()
-											 .setIgnoreHeaderCase(true)
-											 .setSkipHeaderRecord(true)
-											 .setIgnoreEmptyLines(true)
-											 .setIgnoreSurroundingSpaces(true)
-											 .setDelimiter(delim)
-											 .setRecordSeparator('\n')
-											 .build();
-		CSVParser parser = format.parse(in);
-		List<CSVRecord> records = parser.getRecords();
-		List<String> header = parser.getHeaderNames();
-		List<String> headerInds = new ArrayList<>(header);
-		StringBuilder errors = new StringBuilder();
-				
-		/*  1) Comprobar columnas obligatorias  */
-		List<String> mandatoryColumns = new ArrayList<String>();
-		List<String> knownColumns = new ArrayList<String>();
-		if(clau.equals("ruct")) {
-			this.setColumnsRuct(ambit, knownColumns, mandatoryColumns);
-		}
-		else {
-			this.setColumnsCod(ambit, knownColumns, mandatoryColumns);
-		}
-		
-		if(!this.checkColumns(header, mandatoryColumns, errors, locale)) {
-			return errors.append("[ERROR] " + (locale.equals("es") ? "Se han encontrado errores en el fichero proporcionado. No se ha importado ningún registro. " : "S'han trobat errors al fitxer proporcionat. No s'ha importat cap registre.")).append("<br>").toString();
-		}
-		
-		/*  2) Eliminar las columnas obligatorias, conocidas e ignoradas. El resto se consideran indicadores a importar */
-		knownColumns.addAll(mandatoryColumns);
-		knownColumns.addAll(ignoredColumns);
-		for(String c : knownColumns) {
-			headerInds.removeIf(v->v.equalsIgnoreCase(c));
-		}
-		
-		/*  3) Comprobar valores y tipos  */	
-		if(!this.checkValues(records, ambit, clau, errors, locale)) {
-			return errors.append(("[ERROR] " + (locale.equals("es") ? "Se han encontrado errores en el fichero proporcionado. No se ha importado ningún registro. " : "S'han trobat errors al fitxer proporcionat. No s'ha importat cap registre."))).append("<br>").toString();
-		}
-		
-		/*  4) Importar datos  */
-		Integer numRecords = 0;
-		Integer numTuples = 0;
-		for (CSVRecord record : records) {
-			Map<String, String> recordMap = new LinkedCaseInsensitiveMap<>();
-			recordMap.putAll(record.toMap());
-			String c = ambit.equals("T") || ambit.equals("C") ? translateCentre(recordMap.get("centre")) : null;
-			String t = ambit.equals("T") ? translateTitulacio(recordMap.get("titulacio")) : null;  
-			String type = recordMap.get("tipus");
-			Integer curs = Integer.parseInt(recordMap.get("curs").replaceAll("\\D+",""));
-			
-			String cursEnquesta = recordMap.containsKey("curs_enquesta") ? recordMap.get("curs_enquesta") : null;
-	    	String titulacioOrigen = recordMap.containsKey("titulacio_origen") ? recordMap.get("titulacio_origen") : null;
-	    	String centreOrigen = recordMap.containsKey("centre_origen") ? recordMap.get("centre_origen") : null;
-	    	Integer nenq = recordMap.containsKey("nenq") ? Integer.parseInt(recordMap.get("nenq").replaceAll("\\D+","")) : null;
-	    	String ructStr = recordMap.containsKey("ruct") ? recordMap.get("ruct").replaceAll("\\D+","") : null;
-			String cursd = recordMap.containsKey("cursd") ? recordMap.get("cursd") : null;
-	    	Integer ruct = null;
-	    	
-	    	if(ructStr != null) {
-		    	if(!(ructStr.isBlank() || ructStr.isEmpty() || ructStr.equals("NULL") || ructStr.equals("null"))) {
-		    		ruct = Integer.parseInt(ructStr);
-				}
-	    	}
-			
-			Integer centre;
-	    	Integer titulacio;
-			if(clau.equals("ruct") && ambit.equals("T") && ruct != null) {
-				Organ o = findOrgByRuct(ruct);
-				if(o == null) {
-					errors.append("[WARNING] " + (locale.equals("es") ? "No se ha encontrado el RUCT "+ructStr+", se omiten los registros de esta entrada." : "No s'ha trobat el RUCT "+ructStr+", s'ometen els registres d'aquesta entrada.")).append("<br>").toString();
-					continue;
-				}
-				titulacio = o.getId().getLugar();
-				centre = o.getOrgan().getId().getLugar();
-			}
-			else{
-				centre = ambit.equals("T") || ambit.equals("C") ? Integer.parseInt(c.replaceAll("\\D+","")) : null;
-		    	titulacio = ambit.equals("T") ? Integer.parseInt(t) : null;
-				if(!existsOrg("T", titulacio)){
-					errors.append("[WARNING] " + (locale.equals("es") ? "No se ha encontrado la titulación con código "+titulacio+" pero se importa igualmente." : "No s'ha trobat la titulació amb codi "+titulacio+" però s'importa igualment")).append("<br>").toString();
-				}
-			}
-	    	
-	    	if(header.contains("cursd")) {
-	    		cursd = recordMap.get("cursd").replaceAll("\\D+","");
-	    	}
-			for(String r : headerInds) {
-				IndicadorEnquestaTmp ie = new IndicadorEnquestaTmp();
-	        	ie.setEnquesta(enquesta);
-	    		ie.setTitulacio(titulacio);
-	    		ie.setCentre(centre);
-	    		ie.setCurs(curs);
-	    		ie.setAmbit(ambit); 
-	    		ie.setEstudi(estudi);
-	        	ie.setIndicador(r.replace("_min", "").replace("_max", "").toLowerCase());
-	        	ie.setNum(null);
-	        	ie.setCursd(cursd);
-	        	ie.setTipus(type);
-	        	ie.setUsuari(usuari.getUsuari());
-	        	ie.setData(new Timestamp(System.currentTimeMillis()));
-	        	ie.setCursEnquesta(cursEnquesta);
-	        	ie.setTitulacioOrigen(titulacioOrigen);
-	        	ie.setCentreOrigen(centreOrigen);
-	        	ie.setNenq(nenq);
-	        	ie.setRuct(ruct);
-	        	
-	        	try {
-	        		ie.setValor(record.get(r).replace(",", "."));
-	        	}
-	        	catch(Exception ex) {
-	        		ie.setValor(null);
-	        	}
-	        	
-	        	save(ie);
-	        	numRecords++;
-			}
-			numTuples++;
-		}
-
-		/*  5) Notificar administradores y usuario implicado  */
-		this.sendNotificacion(usuari, enquesta, ambit, estudi);
-		if(!usuari.isAdmin()){
-			this.sendConfirmation(usuari.getUsuari(), enquesta, ambit, estudi);
-		}
-
-		errors.append("[INFO] " + (locale.equals("es") ? ("Se han importado "+numRecords.toString()+" nuevos registros para un total de "+numTuples.toString()+" titulaciones") : ("[INFO] S'han importat "+numRecords.toString()+" nous registres per a un total de "+numTuples.toString()+" titulacions")));
-		return errors.toString();
-	}
-
-	public String doDbImport(Integer dbOrigen, String vista, Integer srcCurs, Integer dstCurs, Usuari usuari, String enquesta, String ambit, 
-							 String estudi, String locale, String clau, List<String> ignoredColumns) throws SQLException, ClassNotFoundException {
-
-		StringBuilder errors = new StringBuilder();
-		Datasource source = this.dss.findById(dbOrigen);
-		if(source == null){
-			return errors.append("[ERROR] " + (locale.equals("es") ? "No se ha proporcionado un origen de datos válido." : "No s'ha proporcionat un origen de dades vàlid.")).append("<br>").toString();
-		}
-		String query = "SELECT * FROM "+vista+ " WHERE curs = "+srcCurs;
-		Class.forName(source.getDriver());
-		Integer numRecords = 0;
-		Integer numTuples = 0;
-		try (Connection connection = DriverManager.getConnection(source.getConn())) {
-
-			/*  1) Ejecutar consulta  */
-			Statement statement = connection.createStatement();
-			ResultSet resultset = statement.executeQuery(query);
-			
-			ResultSetMetaData resultMetadata = resultset.getMetaData();
-			int columns = resultMetadata.getColumnCount();
-
-			/*  2) Obtener resultados para procesar online y cerrar conexión  */
-			RowSetFactory factory = RowSetProvider.newFactory();
-			CachedRowSet result = factory.createCachedRowSet();
-			result.populate(resultset);
-			connection.close();
-
-			/*  3) Comprobar columnas obligatorias  */
-			List<String> mandatoryColumns = new ArrayList<String>();
-			List<String> knownColumns = new ArrayList<String>();
-			if(clau.equals("ruct")) {
-				this.setColumnsRuct(ambit, knownColumns, mandatoryColumns);
-			}
-			else {
-				this.setColumnsCod(ambit, knownColumns, mandatoryColumns);
-			}
-
-			List<String> allColNames = new ArrayList<String>();
-			for(int i = 1; i <= columns; i++){
-				allColNames.add(resultMetadata.getColumnLabel(i).toLowerCase());
-			}
-			List<String> colnames = new ArrayList<String>(allColNames);
-			
-			if(!this.checkColumns(colnames, mandatoryColumns, errors, locale)) {
-				return errors.append("[ERROR] " + (locale.equals("es") ? "Se han encontrado errores al procesar la vista seleccionada. No se ha importado ningún registro. " : "S'han trobat errors al processar la vista seleccionada. No s'ha importat cap registre.")).append("<br>").toString();
-			}
-
-			knownColumns.addAll(mandatoryColumns);
-			knownColumns.addAll(ignoredColumns);
-			for(String c : knownColumns) {
-				colnames.removeIf(v->v.equalsIgnoreCase(c));
-			}
-
-			if(ambit.equals("T") && !clau.equals("ruct")){
-				return errors.append("[ERROR] " + (locale.equals("es") ? "Los datos de titulación deben de importarse por código RUCT" : "Les dades de titulació s'han d'importar per códi RUCT.")).append("<br>").toString();
-			}
-			
-			/*  4) Importar datos  */
-			while(result.next()) {
-				Integer ruct = null;
-				Integer titulacio = null;
-				Integer centre = null;
-				String c = ambit.equals("C") ? translateCentre(result.getString("centre")) : null;
-				boolean isValid = true; 
-
-				if(ambit.equals("T")) {
-					String ructStr = result.getString("ruct");
-					if(ructStr != null) {
-						if(!(ructStr.isBlank() || ructStr.isEmpty() || ructStr.equals("NULL") || ructStr.equals("null"))) {
-							ruct = Integer.parseInt(ructStr);
-						}
-						else{
-							isValid = false;
-						}
-					}
-					else{
-						isValid = false;
-					}
-					Organ o = findOrgByRuct(ruct);
-					if(o == null) {
-						errors.append("[WARNING] " + (locale.equals("es") ? "No se ha encontrado el RUCT "+ructStr+", se omiten los registros de esta entrada." : "No s'ha trobat el RUCT "+ructStr+", s'ometen els registres d'aquesta entrada.")).append("<br>").toString();
-						continue;
-					}
-					titulacio = o.getId().getLugar();
-					centre = o.getOrgan().getId().getLugar();
-				}
-				else if(ambit.equals("C")) {
-					centre = ambit.equals("T") || ambit.equals("C") ? Integer.parseInt(c.replaceAll("\\D+","")) : null;
-					if(centre == null){
-						isValid = false;
-					}
-				}
-								
-				if(isValid) {				
-					Integer curs = dstCurs == null ? result.getInt("curs") : dstCurs;
-					String tipus = allColNames.contains("tipus") ? result.getString("tipus") : "avg";
-					String cursEnquesta = allColNames.contains("curs_enquesta") ? result.getString("curs_enquesta") : null;
-					String titulacioOrigen = allColNames.contains("titulacio_origen") ? result.getString("titulacio_origen") : null;
-					String centreOrigen = allColNames.contains("centre_origen") ? result.getString("centre_origen") : null;
-					Integer nenq = allColNames.contains("nenq") ? result.getInt("nenq") : null;
-					String cursd = allColNames.contains("cursd") ? result.getString("cursd") : null;
-					for(String colName : colnames) {
-						IndicadorEnquestaTmp ie = new IndicadorEnquestaTmp();
-	
-						ie.setEnquesta(enquesta);
-						ie.setTitulacio(titulacio);
-						ie.setCentre(centre);
-						ie.setCurs(curs);
-						ie.setAmbit(ambit); 
-						ie.setEstudi(estudi);
-						ie.setIndicador(colName.replace("_min", "").replace("_max", "").toLowerCase());
-						ie.setNum(null);
-						ie.setCursd(cursd);
-						ie.setTipus(tipus);
-						ie.setUsuari(usuari.getUsuari());
-						ie.setData(new Timestamp(System.currentTimeMillis()));
-						ie.setCursEnquesta(cursEnquesta);
-						ie.setTitulacioOrigen(titulacioOrigen);
-						ie.setCentreOrigen(centreOrigen);
-						ie.setNenq(nenq);
-						ie.setRuct(ruct);
-	
-						try {
-							ie.setValor(result.getString(colName).replace(",", "."));
-						}
-						catch(Exception ex) {
-							ie.setValor(null);
-						}
-						
-						save(ie);
-						numRecords++;
-					} 
-					numTuples++;  
-				}
-			}
-		}
-
-		/*  5) Notificar administradores y usuario implicado  */
-		this.sendNotificacion(usuari, enquesta, ambit, estudi);
-		if(!usuari.isAdmin()){
-			this.sendConfirmation(usuari.getUsuari(), enquesta, ambit, estudi);
-		}
-		errors.append("[INFO] " + (locale.equals("es") ? ("Se han importado "+numRecords.toString()+" nuevos registros para un total de "+numTuples.toString()+" titulaciones") : ("[INFO] S'han importat "+numRecords.toString()+" nous registres per a un total de "+numTuples.toString()+" titulacions")));
-		return errors.toString();
-	}
-
-	public List<String> listTableColumns(Integer dbOrigen, String vista, String locale) throws SQLException, ClassNotFoundException {
-		
-		Datasource source = this.dss.findById(dbOrigen);
-		String query = "SELECT * FROM "+vista+" LIMIT 1;";
-		Class.forName(source.getDriver());
-		List<String> colNames = new ArrayList<String>();
-		try (Connection connection = DriverManager.getConnection(source.getConn())) {
-
-			Statement statement = connection.createStatement();
-			ResultSet resultset = statement.executeQuery(query);
-			
-			ResultSetMetaData resultMetadata = resultset.getMetaData();
-			int columns = resultMetadata.getColumnCount();
-
-			for(int i = 1; i <= columns; i++){
-				colNames.add(resultMetadata.getColumnLabel(i));
-			}
-
-		}
-
-		return colNames;
-	}
-	
-	public List<IndicadorEnquestaTmpDup> checkDuplicates(String enquesta) {
-		return checkDuplicatesAux(enquesta);
-	}
-
-	public Integer consolidateByEnquesta(String enquesta) {
-		if(checkDuplicates(enquesta).size() > 0) {
-			return -1;
-		}
-		else {
-			Integer i = consolidateByEnquestaAux(enquesta);
-			deleteByEnquesta(enquesta);
-			return i;
-		}
-	}
-
-    public Integer countByEnquesta(String enquesta) {
-		return countByEnquestaAux(enquesta);
-	}
-
-	public List<IndicadorEnquestaTmpDup> checkIntegrity(String enquesta){
-		return checkIntegrityAux(enquesta);
-	}
-
-	public Integer deleteFromCurrent(String enquesta){
-		return deleteFromCurrentAux(enquesta);
-	}
-
-	public Integer deleteFromPending(String enquesta){
-		return deleteFromPendingAux(enquesta);
-	}
-
-	private void setColumnsCod(String ambit, List<String> knownColumns, List<String> mandatoryColumns) {
-		knownColumns.addAll(Arrays.asList("ruct", "curs_enquesta", "centre_origen", "titulacio_origen", "nenq", "cursd"));	
-		if(ambit.equals("U")) {
-			mandatoryColumns.addAll(Arrays.asList("curs", "tipus"));
-		}
-		else if(ambit.equals("C")) {
-			mandatoryColumns.addAll(Arrays.asList("curs", "centre", "tipus"));
-		}
-		else {
-			mandatoryColumns.addAll(Arrays.asList("curs", "titulacio", "centre", "tipus"));
-		}
-	}
-	
-	private void setColumnsRuct(String ambit, List<String> knownColumns, List<String> mandatoryColumns) {
-		knownColumns.addAll(Arrays.asList("curs_enquesta", "centre_origen", "titulacio_origen", "nenq", "cursd"));	
-		if(ambit.equals("U")) {
-			mandatoryColumns.addAll(Arrays.asList("curs", "tipus"));
-		}
-		else if(ambit.equals("C")) {
-			mandatoryColumns.addAll(Arrays.asList("curs", "tipus", "ruct"));
-			knownColumns.add("centre");
-		}
-		else {
-			mandatoryColumns.addAll(Arrays.asList("curs", "tipus", "ruct"));
-			knownColumns.addAll(Arrays.asList("centre", "titulacio"));
-		}
-	}
-	
-	private boolean checkColumns(List<String> header, List<String> mandatoryColumns, StringBuilder errors, String locale) {
-		boolean isvalid = true;
-		for(String c : mandatoryColumns) {			
-			if(!header.stream().anyMatch(c::equalsIgnoreCase)) {
-				isvalid = false;
-		    	errors.append((locale.equals("es") ? "[ERROR] No se ha encontrado la columna " : "[ERROR] No s'ha trobat la columna ") +c).append("<br>");
-		    }
-		}
-		return isvalid;
-	}
-	
-	private boolean checkValues(List<CSVRecord> records, String ambit, String clau, StringBuilder errors, String locale) {
-		boolean isvalid = true;
-		Integer numRecords = 0;
-		for (CSVRecord record : records) {
-			Map<String, String> recordMap = new LinkedCaseInsensitiveMap<>();
-			recordMap.putAll(record.toMap());
-			
-			String type = recordMap.get("tipus");
-			numRecords++;
-			
-			if((ambit.equals("T") || ambit.equals("C")) && !clau.equals("ruct")) {
-				String c = recordMap.get("centre");
-				c = translateCentre(c);
-				if(!StringUtils.isNumeric(c.replace("C", ""))) {
-					isvalid = false;
-					errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? c+" no es un valor válido para la columna centre." : c+" no es un valor vàlid per la columna centre.")).append("<br>");
-				} 
-			}
-			
-			if(ambit.equals("T")) {
-				String t = recordMap.get("titulacio");
-				if(!clau.equals("ruct")) {
-					t = translateTitulacio(t);
-					if(!StringUtils.isNumeric(t)) {
-						isvalid = false;
-						errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? t+" no es un valor válido para la columna titulacio." : t+" no es un valor vàlid per la columna titulacio.")).append("<br>");
-					}
-				}
-				else {
-					String ructStr = recordMap.get("ruct");
-					if(!ructStr.isBlank() && ructStr.isEmpty() && ructStr.equals("NULL") && ructStr.equals("null") && !StringUtils.isNumeric(t)) {
-						isvalid = false;
-						errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? ructStr+" no es un valor válido para la columna ruct." : ructStr+" no es un valor vàlid per la columna ruct.")).append("<br>");
-					}
-				}
-			}
-			
-			if(!type.equals("avg") && !type.equals("min") && !type.equals("max")) {
-				isvalid = false;
-				errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? type+" no es un valor válido para la columna tipus." : type+" no es un valor vàlid per la columna tipus.")).append("<br>");
-			}
-		}
-		return isvalid;
-	}
-
-	private void sendNotificacion(Usuari usuari, String enquesta, String ambit, String estudi) {
-		sendMail("saic@uv.es", "[SYS] Datos pendientes de consolidar", "Estimado/a administrador: \n"
-				+ "\n"
-				+ "El usuario "+usuari.getUsuari()+" ha importado nuevos datos referentes a: \n"
-				+ "Origen: "+enquesta+"\n"
-				+ "Ámbito: "+ambit+"\n"
-				+ "Tipo titulación: "+estudi+"\n"
-				+ "\n"
-				+ "Acceda a https://saic.uv.es y realice las acciones pertinentes para consolidar los datos. ");
-
-	}
-
-	private void sendConfirmation(String to, String enquesta, String ambit, String estudi) {
-		sendMail(to, "[SYS] Nuevos datos importados", "Estimado/a usuario: \n"
-				+ "\n"
-				+ "Se han importado correctamente nuevos datos referentes a: \n"
-				+ "Origen: "+enquesta+"\n"
-				+ "Ámbito: "+ambit+"\n"
-				+ "Tipo titulación: "+estudi+"\n"
-				+ "\n"
-				+ "Los datos se quedarán en estado pendiente de consolidar hasta que un administrador inicie el proceso de consolidación.");
-
-	}
-	
-	/* Exepciones en el código de titulación que hay que traducir a código SAIC */
-	private String translateTitulacio(String t) {
-		if(!StringUtils.isNumeric(t)) {
-			if(this.titsMap.containsKey(t)) {
-				return this.titsMap.get(t); 
-			}
-		}
-		return t;
-	}
-	
-	/* Exepciones en el código de centro que hay que traducir a código SAIC */
-	private String translateCentre(String c) {
-		if(!StringUtils.isNumeric(c)) {
-			if(this.centresMap.containsKey(c)) {
-				return this.centresMap.get(c); 
-			}
-		}
-		return c;
-	}
-
-	private Organ findOrgByRuct(Integer ruct) {
-		URI uriObj = URI.create(uri + "/instanciatasca/" + ruct);
-		ObjectMapper mapper = new ObjectMapper();
-		Organ organ = null;
-		try {
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriObj)
-					.GET()
-					.build();
-
-			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-
-			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
-				organ = mapper.readValue(response.body(), new TypeReference<Organ>() {});
-			} else {
-				System.err.println("Failed to find Organ by Ruct. HTTP error code: " + response.statusCode());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		return organ;
-	}
-
-	private boolean existsOrg(String tlugar, Integer titulacio) {
-		URI uriObj = URI.create(uri + "/existOrg/" + tlugar + "/" + titulacio);
-		try {
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriObj)
-					.GET()
-					.build();
-
-			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-
-			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
-				return response.body() == "1" ? true : false;
-			} else {
-				System.err.println("Failed to find Organ by Ruct. HTTP error code: " + response.statusCode());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		return false;
-	}
-
-	private void deleteByEnquesta(String enquesta) {
-		URI uriobj = URI.create(uri + "/delete/by/" + enquesta);
-		try {
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriobj)
-					.DELETE()
-					.build();
-
-			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-
-			// Create the json with the response body
-			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
-				System.out.println("Enquesta eliminada correctamente");
-			} else {
-				System.err.println("Failed  to fix integrity by delete current/duplicated." + 
-				" HTTP error code: " + response.statusCode());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	private void save(IndicadorEnquestaTmp ie) {
-		URI uriObj = URI.create(uri + "/save/");
-		ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-
-		try {
-			String requestBody = mapper.writeValueAsString(ie);
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriObj)
-					.header("Content-Type", "application/json")
-					.POST(HttpRequest.BodyPublishers.ofString(requestBody))
-					.build();
-
-			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-
-			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
-				System.out.println("");
-			} else {
-				System.err.println("Failed to find save. HTTP error code: " + response.statusCode());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	private List<IndicadorEnquestaTmpDup> checkDuplicatesAux(String enquesta) {
-		URI uriObj = URI.create(uri + "/checkDuplicates/" + enquesta);
-		ObjectMapper mapper = new ObjectMapper();
-		List<IndicadorEnquestaTmpDup> inds = null;
-		try {
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriObj)
-					.GET()
-					.build();
-
-			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-
-			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
-				inds = mapper.readValue(response.body(), new TypeReference<List<IndicadorEnquestaTmpDup>>() {});
-			} else {
-				System.err.println("Failed to check duplicates of IndicadorEnquestaTmpDup by enquesta. HTTP error code: " + response.statusCode());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		return inds;
-	}
-
-	private Integer deleteFromPendingAux(String enquesta) {
-		URI uriobj = URI.create(uri + "/delete/pending/" + enquesta);
-
-		try {
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriobj)
-					.DELETE()
-					.build();
-
-			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-
-			// Create the json with the response body
-			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
-				return Integer.parseInt(response.body());
-			} else {
-				System.err.println("Failed to delete pending." + 
-				" HTTP error code: " + response.statusCode());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		return 0;
-	}
-
-	private Integer deleteFromCurrentAux(String enquesta) {
-		URI uriobj = URI.create(uri + "/delete/current/" + enquesta);
-
-		try {
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriobj)
-					.DELETE()
-					.build();
-
-			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-
-			// Create the json with the response body
-			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
-				return Integer.parseInt(response.body());
-			} else {
-				System.err.println("Failed to delete pending." + 
-				" HTTP error code: " + response.statusCode());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		return 0;
-	}
-
-	private List<IndicadorEnquestaTmpDup> checkIntegrityAux(String enquesta) {
-		URI uriObj = URI.create(uri + "/checkIntegrity/" + enquesta);
-		ObjectMapper mapper = new ObjectMapper();
-		List<IndicadorEnquestaTmpDup> inds = null;
-		try {
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriObj)
-					.GET()
-					.build();
-
-			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-
-			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
-				inds = mapper.readValue(response.body(), new TypeReference<List<IndicadorEnquestaTmpDup>>() {});
-			} else {
-				System.err.println("Failed to check integrity of IndicadorEnquestaTmpDup by enquesta. HTTP error code: " + response.statusCode());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		return inds;
-	}
-
-	private Integer countByEnquestaAux(String enquesta) {
-		URI uriObj = URI.create(uri + "/countByEnquesta/" + enquesta);
-		try {
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriObj)
-					.GET()
-					.build();
-
-			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-
-			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
-				return Integer.parseInt(response.body());
-			} else {
-				System.err.println("Failed to find Organ by Ruct. HTTP error code: " + response.statusCode());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		return 0;
-	}
-
-		private void sendMail(String string, String string2, String string3) {
-		EmailDTO email = new EmailDTO(string, string2, string3);
-
-		URI uriObj = URI.create(uri + "/sendEmail");
-		ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-
-		try {
-			String requestBody = mapper.writeValueAsString(email);
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriObj)
-					.header("Content-Type", "application/json")
-					.POST(HttpRequest.BodyPublishers.ofString(requestBody))
-					.build();
-
-			httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	private Integer consolidateByEnquestaAux(String enquesta) {
-		URI uriObj = URI.create(uri + "/consolidateByEnquesta/" + enquesta);
-		try {
-			HttpClient httpClient = HttpClient.newHttpClient();
-			HttpRequest request = HttpRequest.newBuilder()
-					.uri(uriObj)
-					.GET()
-					.build();
-
-			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
-
-			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
-				return Integer.parseInt(response.body());
-			} else {
-				System.err.println("Failed to find to consolidateByEnquesta. HTTP error code: " + response.statusCode());
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		return 0;
-	}
-}

+ 0 - 30
src/main/java/es/uv/saic/service/DatasourceService.java

@@ -1,30 +0,0 @@
-package es.uv.saic.service;
-
-import java.util.List;
-import java.util.Optional;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import es.uv.saic.domain.Datasource;
-import es.uv.saic.domain.DatasourceRepository;
-
-@Service
-public class DatasourceService {
-
-    @Autowired
-	private DatasourceRepository dr;
-
-    public List<Datasource> findAll(){
-        return dr.findAll();
-    }
-
-    public Datasource findById(Integer id){
-        Optional<Datasource> d = this.dr.findById(id);
-        if(d.isPresent()){
-            return d.get();
-        }
-        return null;
-    }
-
-}

+ 159 - 45
src/main/java/es/uv/saic/web/DataController.java

@@ -13,7 +13,6 @@ import java.util.List;
 
 import jakarta.mail.MessagingException;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.i18n.LocaleContextHolder;
 import org.springframework.security.access.annotation.Secured;
@@ -36,28 +35,25 @@ import es.uv.saic.domain.IndicadorEnquesta;
 import es.uv.saic.domain.IndicadorEnquestaTmp;
 import es.uv.saic.domain.Usuari;
 import es.uv.saic.dto.EnquestaDTO;
+import es.uv.saic.dto.ImportDTO;
 import es.uv.saic.dto.IndicadorEnquestaTmpDup;
 import es.uv.saic.dto.OrganDTOImp;
-import es.uv.saic.service.DataService;
-import es.uv.saic.service.DatasourceService;
+import es.uv.saic.dto.TablaDTO;
 
 @Controller
 public class DataController {
 
-	@Autowired
-	private DataService ips;
-
-	@Autowired
-	private DatasourceService das;
-
 	@Value("${saic.url.domain}")
-	private String uri;
+	private String uriCore;
+
+	@Value("${saic.url.data.domain}")
+	private String uriData;
 	
 	// GET que carga la interfaz relacionada con toda la importación de datos
 	@GetMapping("/data/import")
 	@Secured({"ROLE_ADMIN", "ROLE_TESTER"})
 	public String renderImport(Model model, Authentication auth) {
-		List<Datasource> sources = this.das.findAll();
+		List<Datasource> sources = findAll("import");
 		for(Datasource d : sources){
 			d.setConn(null);
 		}
@@ -75,18 +71,38 @@ public class DataController {
 							@RequestParam(required = false) Integer curs, @RequestParam(required = false) Integer dstCurs,
 							@RequestParam(required = false) Integer dbOrigen) throws IOException, MessagingException, ClassNotFoundException, SQLException { 
 		String locale = LocaleContextHolder.getLocale().getLanguage();
-		String retval = "";
-		if(tipus.equals("file")){
-			InputStreamReader in = new InputStreamReader(file.getInputStream());
-			retval = this.ips.doImport(in, (Usuari)auth.getPrincipal(), enquesta, ambit, estudi, locale, delim, clau, ignoredColumns);
-		}
-		else if(tipus.equals("db")){
-			retval = this.ips.doDbImport(dbOrigen, vista, curs, dstCurs, (Usuari)auth.getPrincipal(), enquesta, ambit, estudi, locale, clau, ignoredColumns);
+		ImportDTO importDto = new ImportDTO(file, tipus, (Usuari)auth.getPrincipal(), enquesta, ambit, estudi, locale, delim, clau, ignoredColumns, dbOrigen, vista, curs, dstCurs);
+		
+		URI uriobjUri = URI.create(uriData + "/data/import");
+		ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		
+		try {
+			String requestBody = mapper.writeValueAsString(importDto);
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriobjUri)
+					.header("Content-Type", "application/json")
+					.POST(HttpRequest.BodyPublishers.ofString(requestBody))
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			// Create the json with the response body
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				return response.body();
+			} else {
+				System.err.println("Failed to import document. HTTP error code: " + response.statusCode());
+			}			
+				
+		} catch (Exception e) {
+			System.err.println("Failed to find Document: " + e.getMessage());
 		}
 		
-		return retval;
+		return "Failed to import document";
+		
 	}
-	
+
 	// POST encargado de eliminar unos datos concretos
 	@PostMapping("/data/delete")
 	@Secured({"ROLE_ADMIN", "ROLE_TESTER"})
@@ -94,7 +110,7 @@ public class DataController {
 	public String delete(Model model, Authentication auth, @RequestParam String enquesta,
 			@RequestParam Integer curs, @RequestParam String ambit, @RequestParam String estudi) throws IOException {  
 		
-		URI uriobj = URI.create(uri + "/delete/ByEnquestaCursAmbitEstudi");
+		URI uriobj = URI.create(uriCore + "/delete/ByEnquestaCursAmbitEstudi");
 		String retval = "";
 
 		try {
@@ -133,7 +149,7 @@ public class DataController {
 	@ResponseBody
 	public List<IndicadorEnquestaTmp> show(Model model, Authentication auth, @RequestParam String enquesta,
 			@RequestParam Integer curs, @RequestParam String ambit, @RequestParam String estudi) throws IOException {    
-		URI uriobj = URI.create(uri + "/findByEnquestaCursAmbitEstudi");
+		URI uriobj = URI.create(uriCore + "/findByEnquestaCursAmbitEstudi");
 		List<IndicadorEnquestaTmp> inds = new ArrayList<IndicadorEnquestaTmp>();
 		ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 		EnquestaDTO enquestaDTO = new EnquestaDTO(enquesta, curs, ambit, estudi); 
@@ -167,7 +183,7 @@ public class DataController {
 	@GetMapping("/data/current")
 	@Secured({"ROLE_ADMIN", "ROLE_TESTER"})
 	public String current(Model model, Authentication auth) throws IOException {
-		URI uriobj = URI.create(uri + "/getTitulacionsWithCentre");
+		URI uriobj = URI.create(uriCore + "/getTitulacionsWithCentre");
 
 		try {
 			HttpClient httpClient = HttpClient.newHttpClient();
@@ -209,12 +225,34 @@ public class DataController {
 	@ResponseBody
 	public List<IndicadorEnquestaTmpDup> check(Model model, Authentication auth, 
 			@RequestParam String enquesta, @PathVariable Integer type) throws IOException {   
-		if(type == 1) {
-			return this.ips.checkDuplicates(enquesta);
-		}
-		else {
-			return this.ips.checkIntegrity(enquesta);
+		URI uriobjUri = URI.create(uriData + "/data/check/" + type);
+		ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		List<IndicadorEnquestaTmpDup> inds = null;
+
+		try {
+			String requestBody = mapper.writeValueAsString(enquesta);
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriobjUri)
+					.header("Content-Type", "application/json")
+					.POST(HttpRequest.BodyPublishers.ofString(requestBody))
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			// Create the json with the response body
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				inds = mapper.readValue(response.body(), new TypeReference<List<IndicadorEnquestaTmpDup>>() {});
+			} else {
+				System.err.println("Failed to import document. HTTP error code: " + response.statusCode());			
+			}			
+				
+		} catch (Exception e) {
+			System.err.println("Failed to find Document: " + e.getMessage());
 		}
+
+		return inds;
 		
 	}
 
@@ -227,10 +265,10 @@ public class DataController {
 		
 		URI uriobj = null;
 		if(deleteFrom.equals("current")) {
-			uriobj = URI.create(uri + "/delete/current/" + enquesta);
+			uriobj = URI.create(uriCore + "/delete/current/" + enquesta);
 		}
 		else if(deleteFrom.equals("new")) {
-			uriobj = URI.create(uri + "/delete/pending/" + enquesta);
+			uriobj = URI.create(uriCore + "/delete/pending/" + enquesta);
 		} else {
 			return 0;
 		}
@@ -263,7 +301,7 @@ public class DataController {
 	@Secured({"ROLE_ADMIN", "ROLE_TESTER"})
 	@ResponseBody
 	public Integer fixDuplicatesIssues(Model model, Authentication auth, @RequestParam String enquesta) throws IOException {   
-		URI uriobj = URI.create(uri + "/delete/duplicates/" + enquesta);
+		URI uriobj = URI.create(uriCore + "/delete/duplicates/" + enquesta);
 
 		try {
 			HttpClient httpClient = HttpClient.newHttpClient();
@@ -293,7 +331,7 @@ public class DataController {
 	@Secured({"ROLE_ADMIN", "ROLE_TESTER"})
 	@ResponseBody
 	public Integer consolidate(Model model, Authentication auth, @RequestParam String enquesta) throws IOException {    
-		return this.ips.consolidateByEnquesta(enquesta);
+		return byEnquesta("consolidate", enquesta);
 	}
 	
 	// POST que comprueba los datos a partir de la encuesta
@@ -301,7 +339,7 @@ public class DataController {
 	@Secured({"ROLE_ADMIN", "ROLE_TESTER"})
 	@ResponseBody
 	public Integer countByEnquesta(Model model, Authentication auth, @RequestParam String enquesta) throws IOException {    
-		return this.ips.countByEnquesta(enquesta);
+		return byEnquesta("count", enquesta);
 	}
 
 	// POST para mostrar los datos en columnas
@@ -310,13 +348,38 @@ public class DataController {
 	@ResponseBody
 	public List<String> listTableColumns(Model model, Authentication auth, @RequestParam Integer dbOrigen, @RequestParam String vista) {    
 		String locale = LocaleContextHolder.getLocale().getLanguage();
+		URI uriobjUri = URI.create(uriData + "/data/view/columns");
+		ObjectMapper mapper = new ObjectMapper();
+		List<String> list = null;
+
 		try {
-			return this.ips.listTableColumns(dbOrigen, vista, locale);
-		} catch (ClassNotFoundException | SQLException e) {
-			return new ArrayList<String>();
+			TablaDTO tablaDTO = new TablaDTO(dbOrigen, vista, locale);
+			String requestBody = mapper.writeValueAsString(tablaDTO);
+
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriobjUri)
+					.header("Content-Type", "application/json")
+					.POST(HttpRequest.BodyPublishers.ofString(requestBody))
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			// Create the json with the response body
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				list = mapper.readValue(response.body(), new TypeReference<List<String>>() {});
+			} else {
+				System.err.println("Failed to load table. HTTP error code: " + response.statusCode());
+			}			
+				
+		} catch (Exception e) {
+			System.err.println("Failed to load table: " + e.getMessage());
 		}
+
+		return list;
 	}
-	
+
 	// GET que muestra los datos de un curso que se ha elegido
 	@GetMapping("/data/current/show/{ruct}/{curs}")
 	@Secured({"ROLE_ADMIN", "ROLE_TESTER"})
@@ -324,7 +387,7 @@ public class DataController {
 	public List<IndicadorEnquesta> show(Model model, Authentication auth, @PathVariable Integer ruct, 
 			@PathVariable Integer curs) throws IOException { 
 			
-		URI uriobj = URI.create(uri + "/getAllIndsByRuct/" + ruct.toString() + "/" + curs);
+		URI uriobj = URI.create(uriCore + "/getAllIndsByRuct/" + ruct.toString() + "/" + curs);
 		List<IndicadorEnquesta> inds = new ArrayList<IndicadorEnquesta>();
 		ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
@@ -364,13 +427,13 @@ public class DataController {
 		ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);;
 
 		if(ambit.equals("U")) {
-			uriobj = URI.create(uri + "/findByEnquestaCursAmbitEstudi");
+			uriobj = URI.create(uriCore + "/findByEnquestaCursAmbitEstudi");
 		}
 		else if(ambit.equals("C")) {
-			uriobj = URI.create(uri + "/findByEnquestaCursAmbitEstudiCentre");
+			uriobj = URI.create(uriCore + "/findByEnquestaCursAmbitEstudiCentre");
 		}
 		if(ambit.equals("T")) {
-			uriobj = URI.create(uri + "/findByEnquestaCursAmbitEstudiCentreTitulacio");
+			uriobj = URI.create(uriCore + "/findByEnquestaCursAmbitEstudiCentreTitulacio");
 		}
 
 		try {
@@ -402,10 +465,61 @@ public class DataController {
 	@Secured({"ROLE_ADMIN", "ROLE_TESTER"})
 	@ResponseBody
 	public List<Datasource> getDatasources(Model model, Authentication auth) throws IOException {  
-		List<Datasource> sources = this.das.findAll();
-		for(Datasource d : sources){
-			d.setConn(null);
+        return findAll("sources");
+	}
+
+	private List<Datasource> findAll(String uString) {
+		URI uriObj = URI.create(uriData + "/data/" + uString);
+		ObjectMapper mapper = new ObjectMapper();
+		List<Datasource> dList = null;
+		try {
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.GET()
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				dList = mapper.readValue(response.body(), new TypeReference<List<Datasource>>() {});
+			} else {
+				System.err.println("Failed to check integrity of IndicadorEnquestaTmpDup by enquesta. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
 		}
-        return sources;
+
+		return dList;
+	}
+
+	private Integer byEnquesta(String uString, String enquesta) {
+
+		URI uriobjUri = URI.create(uriData + "/data/" + uString);
+		
+		try {
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriobjUri)
+					.header("Content-Type", "application/json")
+					.POST(HttpRequest.BodyPublishers.ofString(enquesta))
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			// Create the json with the response body
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				return Integer.parseInt(response.body());
+			} else {
+				System.err.println("Failed to /data/ " + uString + ". HTTP error code: " + response.statusCode());
+			}			
+				
+		} catch (Exception e) {
+			System.err.println("Failed to /data/ " + uString + ": " + e.getMessage());
+			return 0;
+		}
+
+		return 0;
 	}
 }

+ 2 - 1
src/main/resources/application-local.properties

@@ -1,5 +1,6 @@
+server.port = 8080
 # Urls
-saic.url.core.domain = http://127.0.0.1:8080
+saic.url.domain = http://127.0.0.1:8080
 saic.url.data.domain = http://127.0.0.1:8081
 saic.url.public = ${saic.url.domain}/public