package eu.dnetlib; import com.google.common.collect.Lists; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.ServerAddress; import eu.dnetlib.OpenaireExporterConfig.Jdbc; import eu.dnetlib.data.objectstore.rmi.ObjectStoreService; import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService; import io.micrometer.core.instrument.ImmutableTag; import io.micrometer.core.instrument.Metrics; import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; import org.apache.maven.model.Model; import org.apache.maven.model.io.xpp3.MavenXpp3Reader; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ResourceLoader; import javax.annotation.PostConstruct; import javax.sql.DataSource; import java.io.IOException; import java.io.InputStreamReader; /** * Created by claudio on 07/07/2017. */ @Configuration public class DNetOpenaireExporterBeanFactory { private static final Log log = LogFactory.getLog(DNetOpenaireExporterBeanFactory.class); @Autowired private ResourceLoader resourceLoader; @Value("pom.xml") private ClassPathResource pom; @PostConstruct public void init() { final MavenXpp3Reader reader = new MavenXpp3Reader(); try { final Model model = reader.read(new InputStreamReader(pom.getInputStream())); log.info(String.format("registering metric for %s", model.getArtifactId())); Metrics.gauge("micrometer_info", Lists.newArrayList( new ImmutableTag("component", model.getGroupId()+":"+model.getArtifactId()), new ImmutableTag("version", model.getVersion()), new ImmutableTag("scmtag", model.getScm().getTag())), 1); } catch (IOException | XmlPullParserException e) { log.error(e); } } @Autowired private OpenaireExporterConfig config; @Bean public ISLookUpService getLookUpService() { return getServiceStub(ISLookUpService.class, config.getIsLookupUrl()); } @Bean public ObjectStoreService getObjectStoreService() { return getServiceStub(ObjectStoreService.class, config.getObjectStoreServiceUrl()); } @Bean public ISRegistryService getRegistryService() { return getServiceStub(ISRegistryService.class, config.getIsRegistryServiceUrl()); } @SuppressWarnings("unchecked") private T getServiceStub(final Class clazz, final String endpoint) { log.info(String.format("Initializing service stub %s, endpoint %s", clazz.toString(),endpoint)); final JaxWsProxyFactoryBean jaxWsProxyFactory = new JaxWsProxyFactoryBean(); jaxWsProxyFactory.setServiceClass(clazz); jaxWsProxyFactory.setAddress(endpoint); final T service = (T) jaxWsProxyFactory.create(); Client client = ClientProxy.getClient(service); if (client != null) { HTTPConduit conduit = (HTTPConduit) client.getConduit(); HTTPClientPolicy policy = new HTTPClientPolicy(); log.info(String.format("setting connectTimeout to %s, receiveTimeout to %s for service %s", config.getCxfClientConnectTimeout(), config.getCxfClientReceiveTimeout(), clazz.getCanonicalName())); policy.setConnectionTimeout(config.getCxfClientConnectTimeout()); policy.setReceiveTimeout(config.getCxfClientReceiveTimeout()); conduit.setClient(policy); } return service; } @Bean public DataSource getSqlDataSource() { final Jdbc jdbc = config.getJdbc(); return getDatasource( jdbc.getDriverClassName(), jdbc.getUrl(), jdbc.getUser(), jdbc.getPwd(), jdbc.getMinIdle(), jdbc.getMaxRows()); } private BasicDataSource getDatasource(String driverClassName, String jdbcUrl, String jdbcUser, String jdbcPwd, int jdbcMinIdle, int jdbcMaxIdle) { final BasicDataSource d = new BasicDataSource(); d.setDriverClassName(driverClassName); d.setUrl(jdbcUrl); d.setUsername(jdbcUser); d.setPassword(jdbcPwd); d.setMinIdle(jdbcMinIdle); d.setMaxIdle(jdbcMaxIdle); return d; } @Bean public MongoClient getMongoClient() { return new MongoClient( new ServerAddress(config.getDatasource().getMongoHost(), config.getDatasource().getMongoPort()), MongoClientOptions.builder().connectionsPerHost(config.getDatasource().getMongoConnectionsPerHost()).build()); } }