Skip to content

Commit

Permalink
- Replace service beans creation
Browse files Browse the repository at this point in the history
 - Code refactoring on ES service
 - Add ES start detection, then run init commands
  • Loading branch information
blavenie committed Jun 17, 2016
1 parent 5c27bfc commit 26982b4
Show file tree
Hide file tree
Showing 39 changed files with 1,482 additions and 2,050 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ target
*/target
duniter4j-elasticsearch/src/main/misc/.index.sh.kate-swp
duniter4j-elasticsearch/src/main/misc/fr-cities.ods
duniter4j-elasticsearch/src/main/misc/geoflar-communes-2015.geojson
duniter4j-elasticsearch/src/main/misc/geoflar-communes-2015.geojson
duniter4j.iml
15 changes: 13 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,24 @@ duniter4j has four main components :

- core-client: a Client API to access to a Duniter network.

- elasticsearch: a tools to index all blockchain and more.
- elasticsearch: a ES plugin, to store blockchain, registry, market and more.

- web: an web/mobile client, for data navigation, payment and more !

## Install

- Install ElasticSearch 2.3.3

- Install plugins :

/bin/plugin install elastic/elasticsearch

/bin/plugin install duniter/duniter4j


## Test it



The elasticsearch component is ready to use !

- Install Java JRE 8 or more.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ public static ServiceLocator instance() {
return instance;
}

protected void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}

public BlockchainRemoteService getBlockchainRemoteService() {
return getBean(BlockchainRemoteService.class);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,33 +79,37 @@ public <S extends Bean> S newBean(Class<S> clazz) {
log.trace(String.format("Asking bean on type [%s]...", clazz.getName()));
}

for (Bean bean: beansLoader) {
synchronized (beansLoader) {
for (Bean bean : beansLoader) {

if (clazz.isInstance(bean)) {
if (log.isDebugEnabled()) {
log.debug(String.format(" Creating new bean of type [%s]", clazz.getName()));
if (clazz.isInstance(bean)) {
if (log.isDebugEnabled()) {
log.debug(String.format(" Creating new bean of type [%s]", clazz.getName()));
}
return (S) bean;
}
return (S)bean;
}
}

for (Map.Entry<Class<? extends Bean>, Class<? extends Bean>> beanDef : beansClassMap.entrySet()) {
if (log.isTraceEnabled()) {
log.trace(String.format(" Check against type [%s]", beanDef.getKey().getName()));
}
if (clazz.equals(beanDef.getKey())) {
if (log.isDebugEnabled()) {
log.debug(String.format("Creating new bean of type [%s] with class [%s]", clazz.getName(), beanDef.getValue().getName()));
synchronized (beansClassMap) {
for (Map.Entry<Class<? extends Bean>, Class<? extends Bean>> beanDef : beansClassMap.entrySet()) {
if (log.isTraceEnabled()) {
log.trace(String.format(" Check against type [%s]", beanDef.getKey().getName()));
}
if (clazz.equals(beanDef.getKey())) {
if (log.isDebugEnabled()) {
log.debug(String.format("Creating new bean of type [%s] with class [%s]", clazz.getName(), beanDef.getValue().getName()));
}

Class<? extends Bean> beanDefClass = beanDef.getValue();
try {
Bean bean = beanDefClass.newInstance();
if (clazz.isInstance(bean)) {
return (S) beanDefClass.newInstance();
Class<? extends Bean> beanDefClass = beanDef.getValue();
try {
Bean bean = beanDefClass.newInstance();
if (clazz.isInstance(bean)) {
return (S) beanDefClass.newInstance();
}
} catch (Exception e) {
// skip
}
} catch(Exception e) {
// skip
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ log4j.logger.org.duniter.elasticsearch=DEBUG
# Other frameworks levels
log4j.logger.org.nuiton.util=WARN
log4j.logger.org.nuiton.config=WARN
log4j.logger.org.nuiton.converter=WARN
log4j.logger.org.nuiton.i18n=ERROR
log4j.logger.org.elasticsearch=WARN
#log4j.logger.org.elasticsearch=INFO

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@

import com.google.common.collect.Lists;
import org.duniter.elasticsearch.action.RestModule;
import org.duniter.elasticsearch.job.BlockIndexer;
import org.duniter.elasticsearch.node.DuniterNode;
import org.duniter.elasticsearch.threadpool.ThreadPool;
import org.duniter.elasticsearch.security.SecurityModule;
import org.duniter.elasticsearch.service.ServiceModule;
import org.elasticsearch.common.component.LifecycleComponent;
Expand Down Expand Up @@ -76,18 +77,9 @@ public Collection<Class<? extends LifecycleComponent>> nodeServices() {
if (disable) {
return components;
}
components.add(BlockIndexer.class);
//components.add(PluginSettings.class);
// Market
//components.add(CategoryMarketService.class);
//components.add(RecordMarketService.class);
// Registry
//components.add(CurrencyRegistryService.class);
//components.add(CategoryRegistryService.class);
//components.add(CitiesRegistryService.class);
//components.add(RecordRegistryService.class);
// BC
//components.add(BlockBlockchainService.class);
components.add(PluginSettings.class);
components.add(ThreadPool.class);
components.add(DuniterNode.class);
return components;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,56 +23,126 @@
*/


import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import org.apache.commons.io.FileUtils;
import org.duniter.core.client.config.Configuration;
import org.duniter.core.client.config.ConfigurationOption;
import org.elasticsearch.common.component.Lifecycle;
import org.elasticsearch.common.component.LifecycleComponent;
import org.elasticsearch.common.component.LifecycleListener;
import org.duniter.core.client.config.ConfigurationProvider;
import org.duniter.core.client.model.local.Peer;
import org.duniter.core.exception.TechnicalException;
import org.duniter.core.util.StringUtils;
import org.duniter.elasticsearch.service.ServiceLocator;
import org.elasticsearch.common.component.*;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.logging.ESLoggerFactory;
import org.elasticsearch.common.settings.Settings;
import org.nuiton.config.ApplicationConfig;
import org.nuiton.config.ApplicationConfigHelper;
import org.nuiton.config.ApplicationConfigProvider;
import org.nuiton.config.ArgumentsParserException;
import org.nuiton.i18n.I18n;
import org.nuiton.i18n.init.DefaultI18nInitializer;
import org.nuiton.i18n.init.UserI18nInitializer;

import java.io.File;
import java.io.IOException;
import java.util.Locale;
import java.util.Set;

import static org.nuiton.i18n.I18n.t;

/**
* Access to configuration options
* @author Benoit Lavenier <[email protected]>
* @since 1.0
*/
public class PluginSettings {
/** Logger. */
private ESLogger log = ESLoggerFactory.getLogger(PluginSettings.class.getName());
public class PluginSettings extends AbstractLifecycleComponent<PluginSettings> {

private org.elasticsearch.common.settings.Settings settings;
private Settings settings;

/**
* Delegate application config.
*/
protected final ApplicationConfig applicationConfig;
protected final org.duniter.core.client.config.Configuration clientConfig;

@Inject
public PluginSettings(org.elasticsearch.common.settings.Settings settings) {
super(settings);

this.settings = settings;
this.applicationConfig = new ApplicationConfig();

// Cascade the application config to the client module
org.duniter.core.client.config.Configuration clientConfig = new org.duniter.core.client.config.Configuration(applicationConfig);
org.duniter.core.client.config.Configuration.setInstance(clientConfig);
clientConfig = new org.duniter.core.client.config.Configuration(applicationConfig);
Configuration.setInstance(clientConfig);

}

@Override
protected void doStart() {


// get all config providers
Set<ApplicationConfigProvider> providers =
ImmutableSet.of(new ConfigurationProvider());

// load all default options
ApplicationConfigHelper.loadAllDefaultOption(applicationConfig,
providers);

// Ovverides defaults
String baseDir = settings.get("path.home");
applicationConfig.setDefaultOption(ConfigurationOption.BASEDIR.getKey(), baseDir);
applicationConfig.setDefaultOption(ConfigurationOption.NODE_HOST.getKey(), getNodeBmaHost());
applicationConfig.setDefaultOption(ConfigurationOption.NODE_PORT.getKey(), String.valueOf(getNodeBmaPort()));
applicationConfig.setDefaultOption(ConfigurationOption.NODE_PROTOCOL.getKey(), getNodeBmaPort() == 443 ? "https" : "http");

try {
applicationConfig.parse(new String[]{});

} catch (ArgumentsParserException e) {
throw new TechnicalException(t("duniter4j.config.parse.error"), e);
}

File appBasedir = applicationConfig.getOptionAsFile(
ConfigurationOption.BASEDIR.getKey());

if (appBasedir == null) {
appBasedir = new File("");
}
if (!appBasedir.isAbsolute()) {
appBasedir = new File(appBasedir.getAbsolutePath());
}
if (appBasedir.getName().equals("..")) {
appBasedir = appBasedir.getParentFile().getParentFile();
}
if (appBasedir.getName().equals(".")) {
appBasedir = appBasedir.getParentFile();
}
applicationConfig.setOption(
ConfigurationOption.BASEDIR.getKey(),
appBasedir.getAbsolutePath());

// Init i18n
try {
initI18n();
}
catch(IOException e) {
logger.error(String.format("Could not init i18n: %s", e.getMessage()), e);
}
}

@Override
protected void doStop() {

}

String baseDir = settings.get("es.path.home");
applicationConfig.setOption(ConfigurationOption.BASEDIR.getKey(), baseDir);
applicationConfig.setOption(ConfigurationOption.NODE_HOST.getKey(), getNodeBmaHost());
applicationConfig.setOption(ConfigurationOption.NODE_PORT.getKey(), String.valueOf(getNodeBmaPort()));
applicationConfig.setOption(ConfigurationOption.NODE_PROTOCOL.getKey(), getNodeBmaPort() == 443 ? "https" : "http");
@Override
protected void doClose() {

//initI18n();
}

public String getNodeBmaHost() {
Expand All @@ -91,10 +161,14 @@ public int getIndexBulkSize() {
return settings.getAsInt("duniter.bulk.size", 1000);
}

public String getIndexStringAnalyzer() {
public String getDefaultStringAnalyzer() {
return settings.get("duniter.string.analyzer", "english");
}

public boolean reloadIndices() {
return settings.getAsBoolean("duniter.indices.reload", false);
}

public File getTempDirectory() {
return Configuration.instance().getTempDirectory();
}
Expand All @@ -103,31 +177,46 @@ public boolean isDevMode() {
return settings.getAsBoolean("duniter.dev.enable", false);
}

/* */
public Peer checkAndGetPeer() {
if (StringUtils.isBlank(getNodeBmaHost())) {
logger.error("ERROR: node host is required");
System.exit(-1);
return null;
}
if (getNodeBmaPort() <= 0) {
logger.error("ERROR: node port is required");
System.exit(-1);
return null;
}

Peer peer = new Peer(getNodeBmaHost(), getNodeBmaPort());
return peer;
}

/* protected methods */

protected void initI18n() throws IOException {
Configuration config = Configuration.instance();

// --------------------------------------------------------------------//
// init i18n
// --------------------------------------------------------------------//

File i18nDirectory = new File(Configuration.instance().getDataDirectory(), "i18n");
File i18nDirectory = new File(clientConfig.getDataDirectory(), "i18n");
if (i18nDirectory.exists()) {
// clean i18n cache
FileUtils.cleanDirectory(i18nDirectory);
}

FileUtils.forceMkdir(i18nDirectory);

if (log.isDebugEnabled()) {
log.debug("I18N directory: " + i18nDirectory);
if (logger.isDebugEnabled()) {
logger.debug("I18N directory: " + i18nDirectory);
}

Locale i18nLocale = config.getI18nLocale();
Locale i18nLocale = clientConfig.getI18nLocale();

if (log.isInfoEnabled()) {
log.info(String.format("Starts i18n with locale [%s] at [%s]",
if (logger.isInfoEnabled()) {
logger.info(String.format("Starts i18n with locale [%s] at [%s]",
i18nLocale, i18nDirectory));
}
I18n.init(new UserI18nInitializer(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
*/

import org.duniter.core.exception.BusinessException;
import org.duniter.elasticsearch.service.market.RecordMarketService;
import org.duniter.elasticsearch.service.MarketService;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.logging.ESLogger;
Expand All @@ -39,10 +39,10 @@ public class RestMarketRecordIndexAction extends BaseRestHandler {

private static final ESLogger log = ESLoggerFactory.getLogger(RestMarketRecordIndexAction.class.getName());

private RecordMarketService service;
private MarketService service;

@Inject
public RestMarketRecordIndexAction(Settings settings, RestController controller, Client client, RecordMarketService service) {
public RestMarketRecordIndexAction(Settings settings, RestController controller, Client client, MarketService service) {
super(settings, controller, client);
controller.registerHandler(POST, "/market/record", this);
this.service = service;
Expand Down
Loading

0 comments on commit 26982b4

Please sign in to comment.