refactoring

This commit is contained in:
Michele Artini 2023-02-06 15:53:07 +01:00
parent 258366c4c6
commit 01635641f9
48 changed files with 73 additions and 126 deletions

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is.common;
package eu.dnetlib;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is;
package eu.dnetlib;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.boot.SpringApplication;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is;
package eu.dnetlib;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is;
package eu.dnetlib;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is.common;
package eu.dnetlib;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

View File

@ -4,26 +4,20 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
import eu.dnetlib.dhp.schema.mdstore.MDStoreVersion;
import eu.dnetlib.dhp.schema.mdstore.MDStoreWithInfo;
import eu.dnetlib.data.mdstore.manager.exceptions.MDStoreManagerException;
import eu.dnetlib.data.mdstore.utils.ControllerUtils;
import eu.dnetlib.data.mdstore.utils.DatabaseUtils;
import eu.dnetlib.errors.MDStoreManagerException;
@Controller
public class MDInspectorController {
@Autowired
private DatabaseUtils databaseUtils;
private MDStoreService databaseUtils;
private static final Logger log = LoggerFactory.getLogger(MDInspectorController.class);
@ -74,12 +68,6 @@ public class MDInspectorController {
return "inspector";
}
@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView handleException(final Exception e) {
return ControllerUtils.errorPage("Metadata Inspector - ERROR", e);
}
private boolean isMdstoreId(final String id) {
return id.length() < 40;
}

View File

@ -18,11 +18,10 @@ import org.springframework.web.bind.annotation.RestController;
import com.google.common.collect.Sets;
import eu.dnetlib.common.controller.AbstractDnetController;
import eu.dnetlib.data.mdstore.manager.exceptions.MDStoreManagerException;
import eu.dnetlib.data.mdstore.utils.DatabaseUtils;
import eu.dnetlib.data.mdstore.utils.HdfsClient;
import eu.dnetlib.data.mdstore.hadoop.HdfsClient;
import eu.dnetlib.dhp.schema.mdstore.MDStoreVersion;
import eu.dnetlib.dhp.schema.mdstore.MDStoreWithInfo;
import eu.dnetlib.errors.MDStoreManagerException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -33,12 +32,12 @@ import io.swagger.v3.oas.annotations.tags.Tag;
public class MDStoreController extends AbstractDnetController {
@Autowired
private DatabaseUtils databaseUtils;
private MDStoreService databaseUtils;
@Autowired
private HdfsClient hdfsClient;
private static final Logger log = LoggerFactory.getLogger(DatabaseUtils.class);
private static final Logger log = LoggerFactory.getLogger(MDStoreService.class);
@Operation(summary = "Return all the mdstores")
@GetMapping("/")
@ -221,7 +220,7 @@ public class MDStoreController extends AbstractDnetController {
return hdfsClient.readParquetFiles(path + "/store", limit);
}
protected void setDatabaseUtils(final DatabaseUtils databaseUtils) {
protected void setDatabaseUtils(final MDStoreService databaseUtils) {
this.databaseUtils = databaseUtils;
}

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.utils;
package eu.dnetlib.data.mdstore;
import java.util.Date;
import java.util.HashSet;
@ -16,7 +16,6 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import eu.dnetlib.data.mdstore.manager.exceptions.MDStoreManagerException;
import eu.dnetlib.data.mdstore.repository.MDStoreCurrentVersionRepository;
import eu.dnetlib.data.mdstore.repository.MDStoreRepository;
import eu.dnetlib.data.mdstore.repository.MDStoreVersionRepository;
@ -25,9 +24,10 @@ import eu.dnetlib.dhp.schema.mdstore.MDStore;
import eu.dnetlib.dhp.schema.mdstore.MDStoreCurrentVersion;
import eu.dnetlib.dhp.schema.mdstore.MDStoreVersion;
import eu.dnetlib.dhp.schema.mdstore.MDStoreWithInfo;
import eu.dnetlib.errors.MDStoreManagerException;
@Service
public class DatabaseUtils {
public class MDStoreService {
@Autowired
private MDStoreRepository mdstoreRepository;
@ -43,7 +43,7 @@ public class DatabaseUtils {
@Value("${dhp.mdstore-manager.hdfs.base-path}")
private String hdfsBasePath;
private static final Logger log = LoggerFactory.getLogger(DatabaseUtils.class);
private static final Logger log = LoggerFactory.getLogger(MDStoreService.class);
public Iterable<MDStoreWithInfo> listMdStores() {
return mdstoreWithInfoRepository.findAll();

View File

@ -8,8 +8,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import eu.dnetlib.common.controller.AbstractDnetController;
import eu.dnetlib.data.mdstore.manager.exceptions.MDStoreManagerException;
import eu.dnetlib.data.mdstore.utils.ZeppelinClient;
import eu.dnetlib.data.mdstore.hadoop.ZeppelinClient;
import eu.dnetlib.errors.MDStoreManagerException;
@RestController
@RequestMapping("/zeppelin")

View File

@ -1,19 +1,13 @@
package eu.dnetlib.data.mdstore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
import eu.dnetlib.data.mdstore.manager.exceptions.MDStoreManagerException;
import eu.dnetlib.data.mdstore.utils.ControllerUtils;
import eu.dnetlib.data.mdstore.utils.DatabaseUtils;
import eu.dnetlib.data.mdstore.utils.ZeppelinClient;
import eu.dnetlib.data.mdstore.hadoop.ZeppelinClient;
import eu.dnetlib.dhp.schema.mdstore.MDStoreWithInfo;
import eu.dnetlib.errors.MDStoreManagerException;
@Controller
public class ZeppelinController {
@ -22,7 +16,7 @@ public class ZeppelinController {
private ZeppelinClient zeppelinClient;
@Autowired
private DatabaseUtils databaseUtils;
private MDStoreService databaseUtils;
@RequestMapping("/zeppelin/{mdId}/{note}")
public String goToZeppelin(@PathVariable final String mdId, final @PathVariable String note) throws MDStoreManagerException {
@ -32,10 +26,4 @@ public class ZeppelinController {
return "redirect:" + zeppelinClient.zeppelinNote(note, mdstore, path);
}
@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView handleException(final Exception e) {
return ControllerUtils.errorPage("Metadata Store Manager - Zeppelin Client", e);
}
}

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.zeppelin;
package eu.dnetlib.data.mdstore.hadoop;
public interface HasStatus {

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.utils;
package eu.dnetlib.data.mdstore.hadoop;
import java.io.FileNotFoundException;
import java.io.IOException;
@ -20,7 +20,7 @@ import org.apache.hadoop.fs.Path;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import eu.dnetlib.data.mdstore.manager.exceptions.MDStoreManagerException;
import eu.dnetlib.errors.MDStoreManagerException;
import parquet.avro.AvroParquetReader;
import parquet.hadoop.ParquetReader;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.zeppelin;
package eu.dnetlib.data.mdstore.hadoop;
import java.util.List;
import java.util.Map;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.zeppelin;
package eu.dnetlib.data.mdstore.hadoop;
import java.util.Map;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.zeppelin;
package eu.dnetlib.data.mdstore.hadoop;
public class Note {

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.zeppelin;
package eu.dnetlib.data.mdstore.hadoop;
import java.util.LinkedHashMap;
import java.util.Map;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.zeppelin;
package eu.dnetlib.data.mdstore.hadoop;
public class SimpleResponse implements HasStatus {

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.zeppelin;
package eu.dnetlib.data.mdstore.hadoop;
public class StringResponse implements HasStatus {

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.utils;
package eu.dnetlib.data.mdstore.hadoop;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@ -33,14 +33,8 @@ import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import eu.dnetlib.data.mdstore.manager.exceptions.MDStoreManagerException;
import eu.dnetlib.data.mdstore.zeppelin.HasStatus;
import eu.dnetlib.data.mdstore.zeppelin.ListResponse;
import eu.dnetlib.data.mdstore.zeppelin.Note;
import eu.dnetlib.data.mdstore.zeppelin.Paragraph;
import eu.dnetlib.data.mdstore.zeppelin.SimpleResponse;
import eu.dnetlib.data.mdstore.zeppelin.StringResponse;
import eu.dnetlib.dhp.schema.mdstore.MDStoreWithInfo;
import eu.dnetlib.errors.MDStoreManagerException;
@Component
public class ZeppelinClient {

View File

@ -3,7 +3,7 @@ package eu.dnetlib.data.mdstore.repository;
import org.springframework.stereotype.Repository;
import eu.dnetlib.dhp.schema.mdstore.MDStoreWithInfo;
import eu.dnetlib.is.util.ReadOnlyRepository;
import eu.dnetlib.utils.ReadOnlyRepository;
@Repository
public interface MDStoreWithInfoRepository extends ReadOnlyRepository<MDStoreWithInfo, String> {

View File

@ -1,22 +0,0 @@
package eu.dnetlib.data.mdstore.utils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
public class ControllerUtils {
private static final Logger log = LoggerFactory.getLogger(ControllerUtils.class);
public static ModelAndView errorPage(final String title, final Throwable e) {
log.debug(e.getMessage(), e);
final ModelAndView mv = new ModelAndView();
mv.setViewName("error");
mv.addObject("title", title);
mv.addObject("error", e.getMessage());
mv.addObject("stacktrace", ExceptionUtils.getStackTrace(e));
return mv;
}
}

View File

@ -18,9 +18,9 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect;
import eu.dnetlib.common.controller.AbstractDnetController;
import eu.dnetlib.dsm.domain.Response;
import eu.dnetlib.is.errors.DsmException;
import eu.dnetlib.is.errors.DsmForbiddenException;
import eu.dnetlib.is.errors.DsmNotFoundException;
import eu.dnetlib.errors.DsmException;
import eu.dnetlib.errors.DsmForbiddenException;
import eu.dnetlib.errors.DsmNotFoundException;
/**
* Created by claudio on 18/07/2017.

View File

@ -4,9 +4,9 @@ import java.util.List;
import eu.dnetlib.dsm.model.Api;
import eu.dnetlib.dsm.model.Datasource;
import eu.dnetlib.is.errors.DsmException;
import eu.dnetlib.is.errors.DsmForbiddenException;
import eu.dnetlib.is.errors.DsmNotFoundException;
import eu.dnetlib.errors.DsmException;
import eu.dnetlib.errors.DsmForbiddenException;
import eu.dnetlib.errors.DsmNotFoundException;
public interface DatasourceManagerCommon {

View File

@ -21,7 +21,7 @@ import eu.dnetlib.dsm.model.Api;
import eu.dnetlib.dsm.model.BrowseTerm;
import eu.dnetlib.dsm.model.readonly.SimpleDsWithApis;
import eu.dnetlib.dsm.utils.DsmBrowsableFields;
import eu.dnetlib.is.errors.DsmException;
import eu.dnetlib.errors.DsmException;
import eu.dnetlib.is.info.KeyValue;
import eu.dnetlib.is.protocol.ProtocolService;
import eu.dnetlib.is.vocabulary.repository.VocabularyTermRepository;

View File

@ -51,9 +51,9 @@ import eu.dnetlib.dsm.model.Identity;
import eu.dnetlib.dsm.utils.DsmMappingUtils;
import eu.dnetlib.dsm.utils.ResponseUtils;
import eu.dnetlib.dsm.utils.WfLoggerClient;
import eu.dnetlib.is.errors.DsmException;
import eu.dnetlib.is.errors.DsmForbiddenException;
import eu.dnetlib.is.errors.DsmNotFoundException;
import eu.dnetlib.errors.DsmException;
import eu.dnetlib.errors.DsmForbiddenException;
import eu.dnetlib.errors.DsmNotFoundException;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;

View File

@ -61,9 +61,9 @@ import eu.dnetlib.dsm.utils.DsmBrowsableFields;
import eu.dnetlib.dsm.utils.DsmMappingUtils;
import eu.dnetlib.dsm.utils.ResponseUtils;
import eu.dnetlib.dsm.utils.VocabularyClient;
import eu.dnetlib.is.errors.DsmException;
import eu.dnetlib.is.errors.DsmForbiddenException;
import eu.dnetlib.is.errors.DsmNotFoundException;
import eu.dnetlib.errors.DsmException;
import eu.dnetlib.errors.DsmForbiddenException;
import eu.dnetlib.errors.DsmNotFoundException;
import eu.dnetlib.is.model.vocabulary.Vocabulary;
@Service

View File

@ -5,7 +5,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import eu.dnetlib.dsm.model.readonly.ApiWithAdditionalInfo;
import eu.dnetlib.is.util.ReadOnlyRepository;
import eu.dnetlib.utils.ReadOnlyRepository;
@Repository
@ConditionalOnProperty(value = "openaire.api.enable.dsm", havingValue = "true")

View File

@ -12,7 +12,7 @@ import org.springframework.stereotype.Repository;
import eu.dnetlib.dsm.model.BrowseTerm;
import eu.dnetlib.dsm.model.readonly.SimpleDsWithApis;
import eu.dnetlib.is.util.ReadOnlyRepository;
import eu.dnetlib.utils.ReadOnlyRepository;
@Repository
@ConditionalOnProperty(value = "openaire.api.enable.dsm", havingValue = "true")

View File

@ -8,7 +8,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import eu.dnetlib.dsm.domain.AggregationInfo;
import eu.dnetlib.is.errors.DsmException;
import eu.dnetlib.errors.DsmException;
/**
* Created by claudio on 20/10/2016.

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is.errors;
package eu.dnetlib.errors;
public class DsmException extends Exception {

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is.errors;
package eu.dnetlib.errors;
public class DsmForbiddenException extends DsmException {

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is.errors;
package eu.dnetlib.errors;
public class DsmNotFoundException extends DsmException {

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is.errors;
package eu.dnetlib.errors;
public class InformationServiceException extends Exception {

View File

@ -1,4 +1,4 @@
package eu.dnetlib.data.mdstore.manager.exceptions;
package eu.dnetlib.errors;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

View File

@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import eu.dnetlib.is.errors.InformationServiceException;
import eu.dnetlib.errors.InformationServiceException;
import eu.dnetlib.is.model.context.Category;
import eu.dnetlib.is.model.context.Context;
import eu.dnetlib.is.model.context.CtxChildInfo;

View File

@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.databind.node.ObjectNode;
import eu.dnetlib.is.errors.InformationServiceException;
import eu.dnetlib.errors.InformationServiceException;
@RestController
@RequestMapping("/api/contexts")

View File

@ -12,12 +12,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import eu.dnetlib.errors.InformationServiceException;
import eu.dnetlib.is.context.repository.CategoryRepository;
import eu.dnetlib.is.context.repository.ConceptLevel0Repository;
import eu.dnetlib.is.context.repository.ConceptLevel1Repository;
import eu.dnetlib.is.context.repository.ConceptLevel2Repository;
import eu.dnetlib.is.context.repository.ContextRepository;
import eu.dnetlib.is.errors.InformationServiceException;
import eu.dnetlib.is.model.context.Category;
import eu.dnetlib.is.model.context.Context;
import eu.dnetlib.is.model.context.CtxChildInfo;

View File

@ -12,16 +12,16 @@ import org.dom4j.Node;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import eu.dnetlib.is.errors.InformationServiceException;
import eu.dnetlib.errors.InformationServiceException;
import eu.dnetlib.is.model.resource.SimpleResource;
import eu.dnetlib.is.model.vocabulary.Synonym;
import eu.dnetlib.is.model.vocabulary.Vocabulary;
import eu.dnetlib.is.model.vocabulary.VocabularyTerm;
import eu.dnetlib.is.resource.repository.SimpleResourceRepository;
import eu.dnetlib.is.util.ResourceValidator;
import eu.dnetlib.is.util.XmlIndenter;
import eu.dnetlib.is.vocabulary.repository.VocabularyRepository;
import eu.dnetlib.is.vocabulary.repository.VocabularyTermRepository;
import eu.dnetlib.utils.ResourceValidator;
import eu.dnetlib.utils.XmlIndenter;
@Service
public class OldProfilesImporter {

View File

@ -13,9 +13,9 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import eu.dnetlib.common.controller.AbstractDnetController;
import eu.dnetlib.is.errors.InformationServiceException;
import eu.dnetlib.errors.InformationServiceException;
import eu.dnetlib.is.model.resource.SimpleResource;
import eu.dnetlib.is.util.XmlIndenter;
import eu.dnetlib.utils.XmlIndenter;
public class AbstractResourceController extends AbstractDnetController {

View File

@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import eu.dnetlib.is.errors.InformationServiceException;
import eu.dnetlib.errors.InformationServiceException;
import eu.dnetlib.is.model.resource.SimpleResource;
@RestController

View File

@ -14,10 +14,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;
import eu.dnetlib.is.errors.InformationServiceException;
import eu.dnetlib.errors.InformationServiceException;
import eu.dnetlib.is.model.resource.SimpleResource;
import eu.dnetlib.is.resource.repository.SimpleResourceRepository;
import eu.dnetlib.is.util.ResourceValidator;
import eu.dnetlib.utils.ResourceValidator;
@Service
public class SimpleResourceService {

View File

@ -1,7 +1,7 @@
package eu.dnetlib.is.resource.repository;
import eu.dnetlib.is.model.resource.ResourceType;
import eu.dnetlib.is.util.ReadOnlyRepository;
import eu.dnetlib.utils.ReadOnlyRepository;
public interface ResourceTypeRepository extends ReadOnlyRepository<ResourceType, String> {

View File

@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import eu.dnetlib.is.errors.InformationServiceException;
import eu.dnetlib.errors.InformationServiceException;
import eu.dnetlib.is.model.vocabulary.Vocabulary;
import eu.dnetlib.is.model.vocabulary.VocabularyTerm;

View File

@ -11,7 +11,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import eu.dnetlib.is.errors.InformationServiceException;
import eu.dnetlib.errors.InformationServiceException;
import eu.dnetlib.is.model.vocabulary.Vocabulary;
import eu.dnetlib.is.model.vocabulary.VocabularyTerm;
import eu.dnetlib.is.model.vocabulary.VocabularyTermPK;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is.util;
package eu.dnetlib.utils;
import java.io.StringWriter;
import java.text.SimpleDateFormat;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is.util;
package eu.dnetlib.utils;
import java.util.Optional;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is.util;
package eu.dnetlib.utils;
import java.io.IOException;
import java.io.InputStream;
@ -23,7 +23,7 @@ import org.xml.sax.SAXException;
import com.fasterxml.jackson.databind.ObjectMapper;
import eu.dnetlib.is.errors.InformationServiceException;
import eu.dnetlib.errors.InformationServiceException;
import eu.dnetlib.is.model.resource.ResourceType;
import eu.dnetlib.is.resource.repository.ResourceTypeRepository;

View File

@ -1,4 +1,4 @@
package eu.dnetlib.is.util;
package eu.dnetlib.utils;
import java.io.StringWriter;