diff --git a/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/bma/BlockchainBlock.java b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/bma/BlockchainBlock.java index 41a4d5625d1702392bdb157e340635c3695fec19..32dfb34d732d3dafef624c01c5d0acd017734b18 100644 --- a/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/bma/BlockchainBlock.java +++ b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/bma/BlockchainBlock.java @@ -52,7 +52,7 @@ public class BlockchainBlock implements Serializable { private String parameters; private String previousHash; private String previousIssuer; - private Integer dividend; + private BigInteger dividend; private String[] membersChanges; private Identity[] identities; private Joiner[] joiners; @@ -162,10 +162,10 @@ public class BlockchainBlock implements Serializable { public void setPreviousIssuer(String previousIssuer) { this.previousIssuer = previousIssuer; } - public Integer getDividend() { + public BigInteger getDividend() { return dividend; } - public void setDividend(Integer dividend) { + public void setDividend(BigInteger dividend) { this.dividend = dividend; } public Identity[] getIdentities() { diff --git a/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Currency.java b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Currency.java index bc9a7c5f59731fb0df6530e38349c4571ed9640f..736d356f160fcca4ab1659aa93eedae3ed862ca5 100644 --- a/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Currency.java +++ b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Currency.java @@ -33,6 +33,8 @@ import java.io.Serializable; */ public class Currency implements Serializable { + public static final String PROPERTY_CURRENCY_NAME="currencyName"; + private String currencyName; private Integer membersCount; private String firstBlockSignature; diff --git a/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Record.java b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Record.java new file mode 100644 index 0000000000000000000000000000000000000000..dda9af3248c44e0172ea4cfbd977e27080f93571 --- /dev/null +++ b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Record.java @@ -0,0 +1,39 @@ +package io.ucoin.ucoinj.core.client.model.elasticsearch; + +/** + * Created by blavenie on 01/03/16. + */ +public class Record { + + public static final String PROPERTY_ISSUER="issuer"; + public static final String PROPERTY_HASH="hash"; + public static final String PROPERTY_SIGNATURE="signature"; + + private String issuer; + private String hash; + private String signature; + + public String getIssuer() { + return issuer; + } + + public void setIssuer(String issuer) { + this.issuer = issuer; + } + + public String getHash() { + return hash; + } + + public void setHash(String hash) { + this.hash = hash; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } +} diff --git a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/RestModule.java b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/RestModule.java index af97463d16628aae8631bf3f140b145a7e2acd08..fa946fddf67a22d5bc39362edf9def8a84b5ee5c 100644 --- a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/RestModule.java +++ b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/RestModule.java @@ -1,7 +1,8 @@ package io.ucoin.ucoinj.elasticsearch.action; import io.ucoin.ucoinj.elasticsearch.action.currency.RestCurrencyIndexAction; -import io.ucoin.ucoinj.elasticsearch.action.product.RestRecordIndexAction; +import io.ucoin.ucoinj.elasticsearch.action.market.RestMarketRecordIndexAction; +import io.ucoin.ucoinj.elasticsearch.action.registry.RestRegistryRecordIndexAction; import io.ucoin.ucoinj.elasticsearch.action.security.RestSecurityAuthAction; import io.ucoin.ucoinj.elasticsearch.action.security.RestSecurityGetChallengeAction; import org.elasticsearch.common.inject.AbstractModule; @@ -12,7 +13,9 @@ public class RestModule extends AbstractModule implements Module { @Override protected void configure() { bind(RestCurrencyIndexAction.class).asEagerSingleton(); - bind(RestRecordIndexAction.class).asEagerSingleton(); + bind(RestMarketRecordIndexAction.class).asEagerSingleton(); + + bind(RestRegistryRecordIndexAction.class).asEagerSingleton(); bind(RestSecurityGetChallengeAction.class).asEagerSingleton(); bind(RestSecurityAuthAction.class).asEagerSingleton(); diff --git a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/market/RestMarketRecordIndexAction.java b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/market/RestMarketRecordIndexAction.java new file mode 100644 index 0000000000000000000000000000000000000000..6f2addb0870c0a528d42b4c897f395135c06b5c2 --- /dev/null +++ b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/market/RestMarketRecordIndexAction.java @@ -0,0 +1,43 @@ +package io.ucoin.ucoinj.elasticsearch.action.market; + +import io.ucoin.ucoinj.core.exception.BusinessException; +import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator; +import org.elasticsearch.client.Client; +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.elasticsearch.rest.*; + +import static org.elasticsearch.rest.RestRequest.Method.POST; +import static org.elasticsearch.rest.RestStatus.BAD_REQUEST; +import static org.elasticsearch.rest.RestStatus.OK; + +public class RestMarketRecordIndexAction extends BaseRestHandler { + + private static final ESLogger log = ESLoggerFactory.getLogger(RestMarketRecordIndexAction.class.getName()); + + @Inject + public RestMarketRecordIndexAction(Settings settings, RestController controller, Client client) { + super(settings, controller, client); + controller.registerHandler(POST, "/market/record", this); + } + + @Override + protected void handleRequest(final RestRequest request, RestChannel restChannel, Client client) throws Exception { + + try { + String recordId = ServiceLocator.instance().getMarketRecordIndexerService().indexRecordFromJson(request.content().toUtf8()); + + restChannel.sendResponse(new BytesRestResponse(OK, recordId)); + } + catch(BusinessException e) { + log.error(e.getMessage(), e); + restChannel.sendResponse(new BytesRestResponse(BAD_REQUEST, String.format("{error: {ucode: 'XXX', message:'%s'}}", e.getMessage()))); + } + catch(Exception e) { + log.error(e.getMessage(), e); + } + } + +} \ No newline at end of file diff --git a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/product/RestRecordIndexAction.java b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/product/RestRecordIndexAction.java deleted file mode 100644 index ccb682c85416db4ddd72305faa9b22c8e949c8b5..0000000000000000000000000000000000000000 --- a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/product/RestRecordIndexAction.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.ucoin.ucoinj.elasticsearch.action.product; - -import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator; -import org.elasticsearch.client.Client; -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.elasticsearch.rest.*; - -import static org.elasticsearch.rest.RestRequest.Method.POST; -import static org.elasticsearch.rest.RestStatus.OK; - -public class RestRecordIndexAction extends BaseRestHandler { - - private static final ESLogger log = ESLoggerFactory.getLogger(RestRecordIndexAction.class.getName()); - - @Inject - public RestRecordIndexAction(Settings settings, RestController controller, Client client) { - super(settings, controller, client); - controller.registerHandler(POST, "/store/record", this); - } - - @Override - protected void handleRequest(final RestRequest request, RestChannel restChannel, Client client) throws Exception { - - String productId = ServiceLocator.instance().getRecordIndexerService().indexRecordFromJson(request.content().toUtf8()); - - restChannel.sendResponse(new BytesRestResponse(OK, productId)); - } - -} \ No newline at end of file diff --git a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/registry/RestRegistryRecordIndexAction.java b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/registry/RestRegistryRecordIndexAction.java new file mode 100644 index 0000000000000000000000000000000000000000..5726e1b676ffc772feeb575aac752ec94ebe11cf --- /dev/null +++ b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/registry/RestRegistryRecordIndexAction.java @@ -0,0 +1,43 @@ +package io.ucoin.ucoinj.elasticsearch.action.registry; + +import io.ucoin.ucoinj.core.exception.BusinessException; +import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator; +import org.elasticsearch.client.Client; +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.elasticsearch.rest.*; + +import static org.elasticsearch.rest.RestRequest.Method.POST; +import static org.elasticsearch.rest.RestStatus.BAD_REQUEST; +import static org.elasticsearch.rest.RestStatus.OK; + +public class RestRegistryRecordIndexAction extends BaseRestHandler { + + private static final ESLogger log = ESLoggerFactory.getLogger(RestRegistryRecordIndexAction.class.getName()); + + @Inject + public RestRegistryRecordIndexAction(Settings settings, RestController controller, Client client) { + super(settings, controller, client); + controller.registerHandler(POST, "/registry/record", this); + } + + @Override + protected void handleRequest(final RestRequest request, RestChannel restChannel, Client client) throws Exception { + + try { + String recordId = ServiceLocator.instance().getRegistryRecordIndexerService().indexRecordFromJson(request.content().toUtf8()); + + restChannel.sendResponse(new BytesRestResponse(OK, recordId)); + } + catch(BusinessException e) { + log.error(e.getMessage(), e); + restChannel.sendResponse(new BytesRestResponse(BAD_REQUEST, String.format("{error: {ucode: 'XXX', message:'%s'}}", e.getMessage()))); + } + catch(Exception e) { + log.error(e.getMessage(), e); + } + } + +} \ No newline at end of file diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/IndexerAction.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/IndexerAction.java index 2da45cb323a7287195961d9d428b7b0b30ac3709..e37b532408ed37c41887f032bc2a74d6e6c8799b 100644 --- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/IndexerAction.java +++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/IndexerAction.java @@ -31,9 +31,11 @@ import io.ucoin.ucoinj.core.client.service.bma.BlockchainRemoteService; import io.ucoin.ucoinj.core.util.websocket.WebsocketClientEndpoint; import io.ucoin.ucoinj.elasticsearch.config.Configuration; import io.ucoin.ucoinj.elasticsearch.service.BlockIndexerService; -import io.ucoin.ucoinj.elasticsearch.service.CategoryIndexerService; -import io.ucoin.ucoinj.elasticsearch.service.RecordIndexerService; +import io.ucoin.ucoinj.elasticsearch.service.market.MarketCategoryIndexerService; +import io.ucoin.ucoinj.elasticsearch.service.market.MarketRecordIndexerService; import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator; +import io.ucoin.ucoinj.elasticsearch.service.registry.RegistryCategoryIndexerService; +import io.ucoin.ucoinj.elasticsearch.service.registry.RegistryRecordIndexerService; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -80,7 +82,8 @@ public class IndexerAction { public void resetAllData() { resetDataBlocks(); - resetDataRecords(); + resetMarketRecords(); + resetRegistryRecords(); } public void resetDataBlocks() { @@ -115,9 +118,9 @@ public class IndexerAction { } } - public void resetDataRecords() { - RecordIndexerService recordIndexerService = ServiceLocator.instance().getRecordIndexerService(); - CategoryIndexerService categoryIndexerService = ServiceLocator.instance().getCategoryIndexerService(); + public void resetMarketRecords() { + MarketRecordIndexerService recordIndexerService = ServiceLocator.instance().getMarketRecordIndexerService(); + MarketCategoryIndexerService categoryIndexerService = ServiceLocator.instance().getMarketCategoryIndexerService(); try { // Delete then create index on records @@ -125,14 +128,35 @@ public class IndexerAction { if (indexExists) { recordIndexerService.deleteIndex(); } - log.info(String.format("Successfully reset products data")); + log.info(String.format("Successfully reset market records")); categoryIndexerService.createIndex(); categoryIndexerService.initCategories(); - log.info(String.format("Successfully re-initialized categories data")); + log.info(String.format("Successfully re-initialized market categories data")); } catch(Exception e) { - log.error("Error during reset products data: " + e.getMessage(), e); + log.error("Error during reset market records: " + e.getMessage(), e); + } + } + + public void resetRegistryRecords() { + RegistryRecordIndexerService recordIndexerService = ServiceLocator.instance().getRegistryRecordIndexerService(); + RegistryCategoryIndexerService categoryIndexerService = ServiceLocator.instance().getRegistryCategoryIndexerService(); + + try { + // Delete then create index on records + boolean indexExists = recordIndexerService.existsIndex(); + if (indexExists) { + recordIndexerService.deleteIndex(); + } + log.info(String.format("Successfully reset registry records")); + + categoryIndexerService.createIndex(); + categoryIndexerService.initCategories(); + log.info(String.format("Successfully re-initialized market categories data")); + + } catch(Exception e) { + log.error("Error during reset registry records: " + e.getMessage(), e); } } diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/NodeAction.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/NodeAction.java index 68746b7d66615de83ab8b9511bc045663aa6ae32..fad714952a9b59012c97ce9635c6c3d9e5b0febf 100644 --- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/NodeAction.java +++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/NodeAction.java @@ -26,6 +26,8 @@ package io.ucoin.ucoinj.elasticsearch.action; import io.ucoin.ucoinj.elasticsearch.config.Configuration; import io.ucoin.ucoinj.elasticsearch.service.*; +import io.ucoin.ucoinj.elasticsearch.service.market.MarketCategoryIndexerService; +import io.ucoin.ucoinj.elasticsearch.service.market.MarketRecordIndexerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -74,11 +76,11 @@ public class NodeAction { currencyIndexerService.createIndexIfNotExists(); // Product index - RecordIndexerService recordIndexerService = ServiceLocator.instance().getRecordIndexerService(); + MarketRecordIndexerService recordIndexerService = ServiceLocator.instance().getMarketRecordIndexerService(); recordIndexerService.createIndexIfNotExists(); // Category index - CategoryIndexerService categoryIndexerService = ServiceLocator.instance().getCategoryIndexerService(); + MarketCategoryIndexerService categoryIndexerService = ServiceLocator.instance().getMarketCategoryIndexerService(); categoryIndexerService.createIndexIfNotExists(); } } diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/config/ConfigurationAction.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/config/ConfigurationAction.java index ee21bd1b4b17c84cb935a0184a2414278877cafd..a1e14c4ae605661a8c7c8bf4d03c2c6b1fa52ccc 100644 --- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/config/ConfigurationAction.java +++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/config/ConfigurationAction.java @@ -39,10 +39,11 @@ public enum ConfigurationAction implements ConfigActionDef { RESET_ALL_DATA(IndexerAction.class.getName() + "#resetAllData", "reset-data"), - RESET_BLOCKS(IndexerAction.class.getName() + "#resetDataBlocks", "reset-data-blocks"), + RESET_BLOCKS(IndexerAction.class.getName() + "#resetDataBlocks", "reset-blocks"), - RESET_RECORDS(IndexerAction.class.getName() + "#resetDataRecords", "reset-data-records"); + RESET_MARKET(IndexerAction.class.getName() + "#resetMarketRecords", "reset-market"), + RESET_REGISTRY(IndexerAction.class.getName() + "#resetRegistryRecords", "reset-registry"); public String action; public String[] aliases; diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/ServiceLocator.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/ServiceLocator.java index d094fe14dc9e3cfff36b59fd24af0f84588733c0..2b4d65ee535f30692fb25732393f928c7b7cbbfd 100644 --- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/ServiceLocator.java +++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/ServiceLocator.java @@ -23,6 +23,10 @@ package io.ucoin.ucoinj.elasticsearch.service; */ +import io.ucoin.ucoinj.elasticsearch.service.market.MarketCategoryIndexerService; +import io.ucoin.ucoinj.elasticsearch.service.market.MarketRecordIndexerService; +import io.ucoin.ucoinj.elasticsearch.service.registry.RegistryCategoryIndexerService; +import io.ucoin.ucoinj.elasticsearch.service.registry.RegistryRecordIndexerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,12 +67,20 @@ public class ServiceLocator extends io.ucoin.ucoinj.core.client.service.ServiceL return getBean(ExecutorService.class); } - public RecordIndexerService getRecordIndexerService() { - return getBean(RecordIndexerService.class); + public MarketRecordIndexerService getMarketRecordIndexerService() { + return getBean(MarketRecordIndexerService.class); } - public CategoryIndexerService getCategoryIndexerService() { - return getBean(CategoryIndexerService.class); + public MarketCategoryIndexerService getMarketCategoryIndexerService() { + return getBean(MarketCategoryIndexerService.class); + } + + public RegistryRecordIndexerService getRegistryRecordIndexerService() { + return getBean(RegistryRecordIndexerService.class); + } + + public RegistryCategoryIndexerService getRegistryCategoryIndexerService() { + return getBean(RegistryCategoryIndexerService.class); } } diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/exception/InvalidFormatException.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/exception/InvalidFormatException.java new file mode 100644 index 0000000000000000000000000000000000000000..36966cde773a749708491e28c8615e3b97ecac4b --- /dev/null +++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/exception/InvalidFormatException.java @@ -0,0 +1,24 @@ +package io.ucoin.ucoinj.elasticsearch.service.exception; + +import io.ucoin.ucoinj.core.exception.BusinessException; + +/** + * Created by blavenie on 01/03/16. + */ +public class InvalidFormatException extends BusinessException { + public InvalidFormatException() { + super(); + } + + public InvalidFormatException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidFormatException(String message) { + super(message); + } + + public InvalidFormatException(Throwable cause) { + super(cause); + } +} diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/CategoryIndexerService.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketCategoryIndexerService.java similarity index 88% rename from ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/CategoryIndexerService.java rename to ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketCategoryIndexerService.java index 68cac548ef6bcdc9c52bd51b50604c8101c0bf0e..e06009b6679879f706f09259c7b162a6e20850a2 100644 --- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/CategoryIndexerService.java +++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketCategoryIndexerService.java @@ -1,4 +1,4 @@ -package io.ucoin.ucoinj.elasticsearch.service; +package io.ucoin.ucoinj.elasticsearch.service.market; /* * #%L @@ -29,43 +29,38 @@ import io.ucoin.ucoinj.core.client.model.bma.gson.GsonUtils; import io.ucoin.ucoinj.core.exception.TechnicalException; import io.ucoin.ucoinj.core.util.StringUtils; import io.ucoin.ucoinj.elasticsearch.config.Configuration; -import org.apache.lucene.util.BytesRef; +import io.ucoin.ucoinj.elasticsearch.service.BaseIndexerService; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.client.Client; import org.elasticsearch.client.Requests; import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.io.stream.InputStreamStreamInput; -import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; -import org.jboss.netty.buffer.ChannelBuffer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; -import java.nio.channels.GatheringByteChannel; /** * Created by Benoit on 30/03/2015. */ -public class CategoryIndexerService extends BaseIndexerService { +public class MarketCategoryIndexerService extends BaseIndexerService { - private static final Logger log = LoggerFactory.getLogger(CategoryIndexerService.class); + private static final Logger log = LoggerFactory.getLogger(MarketCategoryIndexerService.class); + private static final String CATEGORIES_BULK_CLASSPATH_FILE = "market-categories-bulk-insert.json"; - public static final String INDEX_NAME = "store"; + + public static final String INDEX_NAME = "market"; public static final String INDEX_TYPE = "category"; private Gson gson; private Configuration config; - public CategoryIndexerService() { + public MarketCategoryIndexerService() { gson = GsonUtils.newBuilder().create(); } @@ -159,9 +154,9 @@ public class CategoryIndexerService extends BaseIndexerService { InputStream ris = null; try { - ris = getClass().getClassLoader().getResourceAsStream("categories-bulk-insert.json"); + ris = getClass().getClassLoader().getResourceAsStream(CATEGORIES_BULK_CLASSPATH_FILE); if (ris == null) { - throw new TechnicalException(String.format("Could not retrieve data file [%s] need to fill index [%s]: ", "categories-bulk-insert.json", INDEX_NAME)); + throw new TechnicalException(String.format("Could not retrieve data file [%s] need to fill index [%s]: ", CATEGORIES_BULK_CLASSPATH_FILE, INDEX_NAME)); } StringBuilder builder = new StringBuilder(); @@ -169,8 +164,8 @@ public class CategoryIndexerService extends BaseIndexerService { String line = bf.readLine(); while(line != null) { if (StringUtils.isNotBlank(line)) { - if (log.isDebugEnabled()) { - log.debug("Add to category bulk: " + line); + if (log.isTraceEnabled()) { + log.trace("Add to category bulk: " + line); } builder.append(line).append('\n'); } diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketRecordIndexerService.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketRecordIndexerService.java new file mode 100644 index 0000000000000000000000000000000000000000..6f4020b2590e5f866def77724b9ca76ea5cd00b3 --- /dev/null +++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketRecordIndexerService.java @@ -0,0 +1,249 @@ +package io.ucoin.ucoinj.elasticsearch.service.market; + +/* + * #%L + * UCoin Java Client :: Core API + * %% + * Copyright (C) 2014 - 2015 EIS + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Sets; +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; +import io.ucoin.ucoinj.core.client.model.bma.gson.GsonUtils; +import io.ucoin.ucoinj.core.client.model.elasticsearch.Record; +import io.ucoin.ucoinj.core.client.service.bma.WotRemoteService; +import io.ucoin.ucoinj.core.exception.TechnicalException; +import io.ucoin.ucoinj.core.service.CryptoService; +import io.ucoin.ucoinj.elasticsearch.config.Configuration; +import io.ucoin.ucoinj.elasticsearch.service.BaseIndexerService; +import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator; +import io.ucoin.ucoinj.elasticsearch.service.exception.InvalidFormatException; +import io.ucoin.ucoinj.elasticsearch.service.exception.InvalidSignatureException; +import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; +import org.elasticsearch.action.index.IndexRequestBuilder; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Set; + +/** + * Created by Benoit on 30/03/2015. + */ +public class MarketRecordIndexerService extends BaseIndexerService { + + private static final Logger log = LoggerFactory.getLogger(MarketRecordIndexerService.class); + + private static final String JSON_STRING_PROPERTY_REGEX = "[,]?[\"\\s\\n\\r]*%s[\"]?[\\s\\n\\r]*:[\\s\\n\\r]*\"[^\"]+\""; + + public static final String INDEX_NAME = "market"; + public static final String INDEX_TYPE = "record"; + + private Gson gson; + + private Configuration config; + + private WotRemoteService wotRemoteService; + + private CryptoService cryptoService; + + public MarketRecordIndexerService() { + gson = GsonUtils.newBuilder().create(); + } + + @Override + public void afterPropertiesSet() throws Exception { + super.afterPropertiesSet(); + wotRemoteService = ServiceLocator.instance().getWotRemoteService(); + cryptoService = ServiceLocator.instance().getCryptoService(); + config = Configuration.instance(); + } + + @Override + public void close() throws IOException { + super.close(); + wotRemoteService = null; + config = null; + gson = null; + } + + /** + * Delete currency index, and all data + * @throws JsonProcessingException + */ + public void deleteIndex() throws JsonProcessingException { + deleteIndexIfExists(INDEX_NAME); + } + + + public boolean existsIndex() { + return super.existsIndex(INDEX_NAME); + } + + /** + * Create index need for currency registry, if need + */ + public void createIndexIfNotExists() { + try { + if (!existsIndex(INDEX_NAME)) { + createIndex(); + } + } + catch(JsonProcessingException e) { + throw new TechnicalException(String.format("Error while creating index [%s]", INDEX_NAME)); + } + } + + /** + * Create index need for record registry + * @throws JsonProcessingException + */ + public void createIndex() throws JsonProcessingException { + log.info(String.format("Creating index [%s/%s]", INDEX_NAME, INDEX_TYPE)); + + CreateIndexRequestBuilder createIndexRequestBuilder = getClient().admin().indices().prepareCreate(INDEX_NAME); + Settings indexSettings = Settings.settingsBuilder() + .put("number_of_shards", 1) + .put("number_of_replicas", 1) + .put("analyzer", createDefaultAnalyzer()) + .build(); + createIndexRequestBuilder.setSettings(indexSettings); + createIndexRequestBuilder.addMapping(INDEX_TYPE, createIndexMapping()); + createIndexRequestBuilder.execute().actionGet(); + } + + /** + * + * @param recordJson + * @return the record id + */ + public String indexRecordFromJson(String recordJson) { + + try { + ObjectMapper mapper = new ObjectMapper(); + JsonNode actualObj = mapper.readTree(recordJson); + Set<String> fieldNames = Sets.newHashSet(actualObj.fieldNames()); + if (!fieldNames.contains(Record.PROPERTY_ISSUER) + || !fieldNames.contains(Record.PROPERTY_SIGNATURE)) { + throw new InvalidFormatException("Invalid record JSON format. Required fields [issuer,signature]"); + } + String issuer = actualObj.get(Record.PROPERTY_ISSUER).asText(); + String signature = actualObj.get(Record.PROPERTY_SIGNATURE).asText(); + + String recordNoSign = recordJson.replaceAll(String.format(JSON_STRING_PROPERTY_REGEX, Record.PROPERTY_SIGNATURE), "") + .replaceAll(String.format(JSON_STRING_PROPERTY_REGEX, Record.PROPERTY_HASH), ""); + + if (!cryptoService.verify(recordNoSign, signature, issuer)) { + throw new InvalidSignatureException("Invalid signature for JSON string: " + recordNoSign); + } + + if (log.isDebugEnabled()) { + log.debug(String.format("Indexing a record from issuer [%s]", issuer.substring(0, 8))); + } + + } + catch(IOException | JsonSyntaxException e) { + throw new InvalidFormatException("Invalid record JSON: " + e.getMessage(), e); + } + + // Preparing indexBlocksFromNode + IndexRequestBuilder indexRequest = getClient().prepareIndex(INDEX_NAME, INDEX_TYPE) + .setSource(recordJson); + + // Execute indexBlocksFromNode + IndexResponse response = indexRequest + .setRefresh(false) + .execute().actionGet(); + + return response.getId(); + } + + /* -- Internal methods -- */ + + + public XContentBuilder createIndexMapping() { + try { + XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject(INDEX_TYPE) + .startObject("properties") + + // title + .startObject("title") + .field("type", "string") + .endObject() + + // description + .startObject("description") + .field("type", "string") + .endObject() + + // time + .startObject("time") + .field("type", "integer") + .endObject() + + // issuer + .startObject("issuer") + .field("type", "string") + .endObject() + + // issuer + .startObject("location") + .field("type", "geo_point") + .endObject() + + // categories + .startObject("categories") + .field("type", "nested") + .startObject("properties") + .startObject("cat1") // cat1 + .field("type", "string") + .endObject() + .startObject("cat2") // cat2 + .field("type", "string") + .endObject() + .endObject() + .endObject() + + // tags + .startObject("tags") + .field("type", "completion") + .field("search_analyzer", "simple") + .field("analyzer", "simple") + .field("preserve_separators", "false") + .endObject() + + .endObject() + .endObject().endObject(); + + return mapping; + } + catch(IOException ioe) { + throw new TechnicalException(String.format("Error while getting mapping for index [%s/%s]: %s", INDEX_NAME, INDEX_TYPE, ioe.getMessage()), ioe); + } + } + +} diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryCategoryIndexerService.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryCategoryIndexerService.java new file mode 100644 index 0000000000000000000000000000000000000000..64ca95053cbacf2c18db3663a6c26327111f4800 --- /dev/null +++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryCategoryIndexerService.java @@ -0,0 +1,244 @@ +package io.ucoin.ucoinj.elasticsearch.service.registry; + +/* + * #%L + * UCoin Java Client :: Core API + * %% + * Copyright (C) 2014 - 2015 EIS + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.google.gson.Gson; +import io.ucoin.ucoinj.core.client.model.bma.gson.GsonUtils; +import io.ucoin.ucoinj.core.exception.TechnicalException; +import io.ucoin.ucoinj.core.util.StringUtils; +import io.ucoin.ucoinj.elasticsearch.config.Configuration; +import io.ucoin.ucoinj.elasticsearch.service.BaseIndexerService; +import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; +import org.elasticsearch.action.bulk.BulkRequest; +import org.elasticsearch.action.index.IndexRequestBuilder; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.client.Requests; +import org.elasticsearch.common.bytes.BytesArray; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * Created by Benoit on 30/03/2015. + */ +public class RegistryCategoryIndexerService extends BaseIndexerService { + + private static final Logger log = LoggerFactory.getLogger(RegistryCategoryIndexerService.class); + + private static final String CATEGORIES_BULK_CLASSPATH_FILE = "registry-categories-bulk-insert.json"; + + public static final String INDEX_NAME = "registry"; + public static final String INDEX_TYPE = "category"; + + + private Gson gson; + + private Configuration config; + + public RegistryCategoryIndexerService() { + gson = GsonUtils.newBuilder().create(); + } + + @Override + public void afterPropertiesSet() throws Exception { + super.afterPropertiesSet(); + config = Configuration.instance(); + } + + @Override + public void close() throws IOException { + super.close(); + config = null; + gson = null; + } + + /** + * Delete currency index, and all data + * @throws JsonProcessingException + */ + public void deleteIndex() throws JsonProcessingException { + deleteIndexIfExists(INDEX_NAME); + } + + + public boolean existsIndex() { + return super.existsIndex(INDEX_NAME); + } + + /** + * Create index need for currency registry, if need + */ + public void createIndexIfNotExists() { + try { + if (!existsIndex(INDEX_NAME)) { + createIndex(); + } + } + catch(JsonProcessingException e) { + throw new TechnicalException(String.format("Error while creating index [%s]", INDEX_NAME)); + } + } + + /** + * Create index need for category registry + * @throws JsonProcessingException + */ + public void createIndex() throws JsonProcessingException { + log.info(String.format("Creating index [%s/%s]", INDEX_NAME, INDEX_TYPE)); + + CreateIndexRequestBuilder createIndexRequestBuilder = getClient().admin().indices().prepareCreate(INDEX_NAME); + Settings indexSettings = Settings.settingsBuilder() + .put("number_of_shards", 1) + .put("number_of_replicas", 1) + .put("analyzer", createDefaultAnalyzer()) + .build(); + createIndexRequestBuilder.setSettings(indexSettings); + createIndexRequestBuilder.addMapping(INDEX_TYPE, createIndexMapping()); + createIndexRequestBuilder.execute().actionGet(); + } + + /** + * + * @param jsonCategory + * @return the product id + */ + public String indexCategoryFromJson(String jsonCategory) { + if (log.isDebugEnabled()) { + log.debug("Indexing a category"); + } + + // Preparing indexBlocksFromNode + IndexRequestBuilder indexRequest = getClient().prepareIndex(INDEX_NAME, INDEX_TYPE) + .setSource(jsonCategory); + + // Execute indexBlocksFromNode + IndexResponse response = indexRequest + .setRefresh(false) + .execute().actionGet(); + + return response.getId(); + } + + + public void initCategories() { + if (log.isDebugEnabled()) { + log.debug("Initializing all categories"); + } + + BulkRequest bulkRequest = Requests.bulkRequest(); + + InputStream ris = null; + try { + ris = getClass().getClassLoader().getResourceAsStream(CATEGORIES_BULK_CLASSPATH_FILE); + if (ris == null) { + throw new TechnicalException(String.format("Could not retrieve data file [%s] need to fill index [%s]: ", CATEGORIES_BULK_CLASSPATH_FILE, INDEX_NAME)); + } + + StringBuilder builder = new StringBuilder(); + BufferedReader bf = new BufferedReader(new InputStreamReader(ris)); + String line = bf.readLine(); + while(line != null) { + if (StringUtils.isNotBlank(line)) { + if (log.isTraceEnabled()) { + log.trace("Add to category bulk: " + line); + } + builder.append(line).append('\n'); + } + line = bf.readLine(); + } + + byte[] data = builder.toString().getBytes(); + bulkRequest.add(new BytesArray(data), INDEX_NAME, INDEX_TYPE, false); + + } catch(Exception e) { + throw new TechnicalException(String.format("Error while initializing data [%s]", INDEX_NAME), e); + } + finally { + if (ris != null) { + try { + ris.close(); + } + catch(IOException e) { + // Silent is gold + } + } + } + + try { + getClient().bulk(bulkRequest).actionGet(); + } catch(Exception e) { + throw new TechnicalException(String.format("Error while initializing data [%s]", INDEX_NAME), e); + } + } + + /* -- Internal methods -- */ + + + public XContentBuilder createIndexMapping() { + try { + XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject(INDEX_TYPE) + .startObject("properties") + + // name + .startObject("name") + .field("type", "string") + .endObject() + + // description + /*.startObject("description") + .field("type", "string") + .endObject()*/ + + // parent + .startObject("parent") + .field("type", "string") + .endObject() + + // tags + /*.startObject("tags") + .field("type", "completion") + .field("search_analyzer", "simple") + .field("analyzer", "simple") + .field("preserve_separators", "false") + .endObject()*/ + + .endObject() + .endObject().endObject(); + + return mapping; + } + catch(IOException ioe) { + throw new TechnicalException(String.format("Error while getting mapping for index [%s/%s]: %s", INDEX_NAME, INDEX_TYPE, ioe.getMessage()), ioe); + } + } + +} diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/RecordIndexerService.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryRecordIndexerService.java similarity index 69% rename from ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/RecordIndexerService.java rename to ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryRecordIndexerService.java index d68597c9740144a3ded4bd9f3421e8ac22c76f24..108e25696843b7f3f5f2bdb3ce581d7d1d4870b0 100644 --- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/RecordIndexerService.java +++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryRecordIndexerService.java @@ -1,4 +1,4 @@ -package io.ucoin.ucoinj.elasticsearch.service; +package io.ucoin.ucoinj.elasticsearch.service.registry; /* * #%L @@ -24,11 +24,21 @@ package io.ucoin.ucoinj.elasticsearch.service; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Sets; import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; import io.ucoin.ucoinj.core.client.model.bma.gson.GsonUtils; +import io.ucoin.ucoinj.core.client.model.elasticsearch.Record; import io.ucoin.ucoinj.core.client.service.bma.WotRemoteService; import io.ucoin.ucoinj.core.exception.TechnicalException; +import io.ucoin.ucoinj.core.service.CryptoService; import io.ucoin.ucoinj.elasticsearch.config.Configuration; +import io.ucoin.ucoinj.elasticsearch.service.BaseIndexerService; +import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator; +import io.ucoin.ucoinj.elasticsearch.service.exception.InvalidFormatException; +import io.ucoin.ucoinj.elasticsearch.service.exception.InvalidSignatureException; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexResponse; @@ -39,16 +49,19 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.util.Set; /** * Created by Benoit on 30/03/2015. */ -public class RecordIndexerService extends BaseIndexerService { +public class RegistryRecordIndexerService extends BaseIndexerService { - private static final Logger log = LoggerFactory.getLogger(RecordIndexerService.class); + private static final Logger log = LoggerFactory.getLogger(RegistryRecordIndexerService.class); - public static final String INDEX_NAME = "store"; - public static final String INDEX_TYPE_SIMPLE = "record"; + private static final String JSON_STRING_PROPERTY_REGEX = "[,]?[\"\\s\\n\\r]*%s[\"]?[\\s\\n\\r]*:[\\s\\n\\r]*\"[^\"]+\""; + + public static final String INDEX_NAME = "registry"; + public static final String INDEX_TYPE = "record"; private Gson gson; @@ -56,7 +69,9 @@ public class RecordIndexerService extends BaseIndexerService { private WotRemoteService wotRemoteService; - public RecordIndexerService() { + private CryptoService cryptoService; + + public RegistryRecordIndexerService() { gson = GsonUtils.newBuilder().create(); } @@ -64,6 +79,7 @@ public class RecordIndexerService extends BaseIndexerService { public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); wotRemoteService = ServiceLocator.instance().getWotRemoteService(); + cryptoService = ServiceLocator.instance().getCryptoService(); config = Configuration.instance(); } @@ -107,7 +123,7 @@ public class RecordIndexerService extends BaseIndexerService { * @throws JsonProcessingException */ public void createIndex() throws JsonProcessingException { - log.info(String.format("Creating index [%s/%s]", INDEX_NAME, INDEX_TYPE_SIMPLE)); + log.info(String.format("Creating index [%s/%s]", INDEX_NAME, INDEX_TYPE)); CreateIndexRequestBuilder createIndexRequestBuilder = getClient().admin().indices().prepareCreate(INDEX_NAME); Settings indexSettings = Settings.settingsBuilder() @@ -116,7 +132,7 @@ public class RecordIndexerService extends BaseIndexerService { .put("analyzer", createDefaultAnalyzer()) .build(); createIndexRequestBuilder.setSettings(indexSettings); - createIndexRequestBuilder.addMapping(INDEX_TYPE_SIMPLE, createIndexMapping()); + createIndexRequestBuilder.addMapping(INDEX_TYPE, createIndexMapping()); createIndexRequestBuilder.execute().actionGet(); } @@ -126,12 +142,36 @@ public class RecordIndexerService extends BaseIndexerService { * @return the record id */ public String indexRecordFromJson(String recordJson) { - if (log.isDebugEnabled()) { - log.debug("Indexing a record"); + + try { + ObjectMapper mapper = new ObjectMapper(); + JsonNode actualObj = mapper.readTree(recordJson); + Set<String> fieldNames = Sets.newHashSet(actualObj.fieldNames()); + if (!fieldNames.contains(Record.PROPERTY_ISSUER) + || !fieldNames.contains(Record.PROPERTY_SIGNATURE)) { + throw new InvalidFormatException("Invalid record JSON format. Required fields [issuer,signature]"); + } + String issuer = actualObj.get(Record.PROPERTY_ISSUER).asText(); + String signature = actualObj.get(Record.PROPERTY_SIGNATURE).asText(); + + String recordNoSign = recordJson.replaceAll(String.format(JSON_STRING_PROPERTY_REGEX, Record.PROPERTY_SIGNATURE), "") + .replaceAll(String.format(JSON_STRING_PROPERTY_REGEX, Record.PROPERTY_HASH), ""); + + if (!cryptoService.verify(recordNoSign, signature, issuer)) { + throw new InvalidSignatureException("Invalid signature for JSON string: " + recordNoSign); + } + + if (log.isDebugEnabled()) { + log.debug(String.format("Indexing a record from issuer [%s]", issuer.substring(0, 8))); + } + + } + catch(IOException | JsonSyntaxException e) { + throw new InvalidFormatException("Invalid record JSON: " + e.getMessage(), e); } // Preparing indexBlocksFromNode - IndexRequestBuilder indexRequest = getClient().prepareIndex(INDEX_NAME, INDEX_TYPE_SIMPLE) + IndexRequestBuilder indexRequest = getClient().prepareIndex(INDEX_NAME, INDEX_TYPE) .setSource(recordJson); // Execute indexBlocksFromNode @@ -147,7 +187,7 @@ public class RecordIndexerService extends BaseIndexerService { public XContentBuilder createIndexMapping() { try { - XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject(INDEX_TYPE_SIMPLE) + XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject(INDEX_TYPE) .startObject("properties") // title @@ -202,7 +242,7 @@ public class RecordIndexerService extends BaseIndexerService { return mapping; } catch(IOException ioe) { - throw new TechnicalException(String.format("Error while getting mapping for index [%s/%s]: %s", INDEX_NAME, INDEX_TYPE_SIMPLE, ioe.getMessage()), ioe); + throw new TechnicalException(String.format("Error while getting mapping for index [%s/%s]: %s", INDEX_NAME, INDEX_TYPE, ioe.getMessage()), ioe); } } diff --git a/ucoinj-elasticsearch/src/main/resources/META-INF/services/io.ucoin.ucoinj.core.beans.Bean b/ucoinj-elasticsearch/src/main/resources/META-INF/services/io.ucoin.ucoinj.core.beans.Bean index 3c97b16d92056f466d440d71cae4ced209543e5a..9a6eb45770eb580c14095cc89c35068a14570b18 100644 --- a/ucoinj-elasticsearch/src/main/resources/META-INF/services/io.ucoin.ucoinj.core.beans.Bean +++ b/ucoinj-elasticsearch/src/main/resources/META-INF/services/io.ucoin.ucoinj.core.beans.Bean @@ -12,8 +12,11 @@ io.ucoin.ucoinj.core.client.dao.mem.MemoryCurrencyDaoImpl io.ucoin.ucoinj.core.client.dao.mem.MemoryPeerDaoImpl io.ucoin.ucoinj.elasticsearch.service.ElasticSearchService io.ucoin.ucoinj.elasticsearch.service.CurrencyIndexerService -io.ucoin.ucoinj.elasticsearch.service.RecordIndexerService io.ucoin.ucoinj.elasticsearch.service.BlockIndexerService io.ucoin.ucoinj.elasticsearch.service.ExecutorServiceImpl -io.ucoin.ucoinj.elasticsearch.service.CategoryIndexerService +io.ucoin.ucoinj.elasticsearch.service.market.MarketRecordIndexerService +io.ucoin.ucoinj.elasticsearch.service.market.MarketCategoryIndexerService +io.ucoin.ucoinj.elasticsearch.service.registry.RegistryRecordIndexerService +io.ucoin.ucoinj.elasticsearch.service.registry.RegistryCategoryIndexerService + diff --git a/ucoinj-elasticsearch/src/main/resources/categories-bulk-insert.json b/ucoinj-elasticsearch/src/main/resources/market-categories-bulk-insert.json similarity index 100% rename from ucoinj-elasticsearch/src/main/resources/categories-bulk-insert.json rename to ucoinj-elasticsearch/src/main/resources/market-categories-bulk-insert.json diff --git a/ucoinj-elasticsearch/src/main/resources/registry-categories-bulk-insert.json b/ucoinj-elasticsearch/src/main/resources/registry-categories-bulk-insert.json new file mode 100644 index 0000000000000000000000000000000000000000..c19ddf13f2d397fc4e0c5acc66115b04df3b44ea --- /dev/null +++ b/ucoinj-elasticsearch/src/main/resources/registry-categories-bulk-insert.json @@ -0,0 +1,151 @@ +{ "index": { "_id": "cat71"}} +{ "name": "EMPLOI" , "parent": null} +{ "index": { "_id": "cat33"}} +{ "name": "Offres d'emploi", "parent": "cat33" } + +{ "index": { "_id": "cat1" }} +{ "name": "VEHICULES" , "parent": null} +{ "index": { "_id": "cat2" }} +{ "name": "Voitures" , "parent": "cat2" } +{ "index": { "_id": "cat3" }} +{ "name": "Motos" , "parent": "cat3" } +{ "index": { "_id": "cat4" }} +{ "name": "Caravaning" , "parent": "cat3" } +{ "index": { "_id": "cat5" }} +{ "name": "Utilitaires" , "parent": "cat3" } +{ "index": { "_id": "cat6" }} +{ "name": "Equipement Auto" , "parent": "cat3" } +{ "index": { "_id": "cat44" }} +{ "name": "Equipement Moto" , "parent": "cat3" } +{ "index": { "_id": "cat50" }} +{ "name": "Equipement Caravaning" , "parent": "cat3" } +{ "index": { "_id": "cat7" }} +{ "name": "Nautisme" , "parent": "cat3" } +{ "index": { "_id": "cat51" }} +{ "name": "Equipement Nautisme" , "parent": "cat3" } + +{ "index": { "_id": "cat8" }} +{ "name": "IMMOBILIER" , "parent": null} +{ "index": { "_id": "cat9" }} +{ "name": "Ventes immobilières" , "parent": "cat8" } +{ "index": { "_id": "cat10" }} +{ "name": "Locations" , "parent": "cat8" } +{ "index": { "_id": "cat11" }} +{ "name": "Colocations" , "parent": "cat8" } +{ "index": { "_id": "cat13" }} +{ "name": "Bureaux & Commerces" , "parent": "cat8" } + +{ "index": { "_id": "cat66" }} +{ "name": "VACANCES" , "parent": null} +{ "index": { "_id": "cat12" }} +{ "name": "Locations & Gîtes" , "parent": "cat66" } +{ "index": { "_id": "cat67" }} +{ "name": "Chambres d'hôtes" , "parent": "cat66" } +{ "index": { "_id": "cat68" }} +{ "name": "Campings" , "parent": "cat66" } +{ "index": { "_id": "cat69" }} +{ "name": "Hôtels" , "parent": "cat66" } +{ "index": { "_id": "cat70" }} +{ "name": "Hébergements insolites" , "parent": "cat66" } + +{ "index": { "_id": "cat14" }} +{ "name": "MULTIMEDIA" , "parent": null} +{ "index": { "_id": "cat15" }} +{ "name": "Informatique" , "parent": "cat14" } +{ "index": { "_id": "cat43" }} +{ "name": "Consoles & Jeux vidéo" , "parent": "cat14" } +{ "index": { "_id": "cat16" }} +{ "name": "Image & Son" , "parent": "cat14" } +{ "index": { "_id": "cat17" }} +{ "name": "Téléphonie" , "parent": "cat14" } + +{ "index": { "_id": "cat18" }} +{ "name": "MAISON" , "parent": null} +{ "index": { "_id": "cat19" }} +{ "name": "Ameublement" , "parent": "cat18" } +{ "index": { "_id": "cat20" }} +{ "name": "Electroménager" , "parent": "cat18" } +{ "index": { "_id": "cat45" }} +{ "name": "Arts de la table" , "parent": "cat18" } +{ "index": { "_id": "cat39" }} +{ "name": "Décoration" , "parent": "cat18" } +{ "index": { "_id": "cat46" }} +{ "name": "Linge de maison" , "parent": "cat18" } +{ "index": { "_id": "cat21" }} +{ "name": "Bricolage" , "parent": "cat18" } +{ "index": { "_id": "cat52" }} +{ "name": "Jardinage" , "parent": "cat18" } +{ "index": { "_id": "cat22" }} +{ "name": "Vêtements" , "parent": "cat18" } +{ "index": { "_id": "cat53" }} +{ "name": "Chaussures" , "parent": "cat18" } +{ "index": { "_id": "cat47" }} +{ "name": "Accessoires & Bagagerie" , "parent": "cat18" } +{ "index": { "_id": "cat42" }} +{ "name": "Montres & Bijoux" , "parent": "cat18" } +{ "index": { "_id": "cat23" }} +{ "name": "Equipement bébé" , "parent": "cat18" } +{ "index": { "_id": "cat54" }} +{ "name": "Vêtements bébé" , "parent": "cat18" } + +{ "index": { "_id": "cat24" }} +{ "name": "LOISIRS" , "parent": null} +{ "index": { "_id": "cat25" }} +{ "name": "DVD / Films" , "parent": "cat24" } +{ "index": { "_id": "cat26" }} +{ "name": "CD / Musique" , "parent": "cat24" } +{ "index": { "_id": "cat27" }} +{ "name": "Livres" , "parent": "cat24" } +{ "index": { "_id": "cat28" }} +{ "name": "Animaux" , "parent": "cat24" } +{ "index": { "_id": "cat55" }} +{ "name": "Vélos" , "parent": "cat24" } +{ "index": { "_id": "cat29" }} +{ "name": "Sports & Hobbies" } +{ "index": { "_id": "cat30" }} +{ "name": "Instruments de musique" , "parent": "cat24" } +{ "index": { "_id": "cat40" }} +{ "name": "Collection" , "parent": "cat24" } +{ "index": { "_id": "cat41" }} +{ "name": "Jeux & Jouets" , "parent": "cat24" } +{ "index": { "_id": "cat48" }} +{ "name": "Vins & Gastronomie" , "parent": "cat24" } + +{ "index": { "_id": "cat56" }} +{ "name": "MATERIEL PROFESSIONNEL" , "parent": null} +{ "index": { "_id": "cat57" }} +{ "name": "Matériel Agricole" , "parent": "cat56" } +{ "index": { "_id": "cat58" }} +{ "name": "Transport - Manutention" , "parent": "cat56" } +{ "index": { "_id": "cat59" }} +{ "name": "BTP - Chantier Gros-oeuvre" , "parent": "cat56" } +{ "index": { "_id": "cat60" }} +{ "name": "Outillage - Matériaux 2nd-oeuvre" , "parent": "cat56" } +{ "index": { "_id": "cat32" }} +{ "name": "Équipements Industriels" , "parent": "cat56" } +{ "index": { "_id": "cat61" }} +{ "name": "Restauration - Hôtellerie" , "parent": "cat56" } +{ "index": { "_id": "cat62" }} +{ "name": "Fournitures de Bureau" , "parent": "cat56" } +{ "index": { "_id": "cat63" }} +{ "name": "Commerces & Marchés" , "parent": "cat56" } +{ "index": { "_id": "cat64" }} +{ "name": "Matériel Médical" , "parent": "cat56" } + +{ "index": { "_id": "cat31" }} +{ "name": "SERVICES" , "parent": null} +{ "index": { "_id": "cat34" }} +{ "name": "Prestations de services" , "parent": "cat31" } +{ "index": { "_id": "cat35" }} +{ "name": "Billetterie" , "parent": "cat31" } +{ "index": { "_id": "cat49" }} +{ "name": "Evénements" , "parent": "cat31" } +{ "index": { "_id": "cat36" }} +{ "name": "Cours particuliers" , "parent": "cat31" } +{ "index": { "_id": "cat65" }} +{ "name": "Covoiturage" , "parent": "cat31" } +{ "index": { "_id": "cat37" }} + +{ "name": "DIVERS" , "parent": null} +{ "index": { "_id": "cat38" }} +{ "name": "Autres" , "parent": "cat37" }