Browse Source

Lwm2m: front&back: refactoring add on the back ObjectIdFromTextSearch for search list models with filter by ObjectId

pull/3840/head
nickAS21 6 years ago
parent
commit
317dfdbc42
  1. 299
      application/src/main/java/org/thingsboard/server/service/lwm2m/LwM2MModelsRepository.java
  2. 4
      common/data/src/main/java/org/thingsboard/server/common/data/lwm2m/LwM2mObject.java

299
application/src/main/java/org/thingsboard/server/service/lwm2m/LwM2MModelsRepository.java

@ -35,7 +35,6 @@ import org.thingsboard.server.common.transport.lwm2m.LwM2MTransportConfigServer;
import org.thingsboard.server.dao.service.Validator; import org.thingsboard.server.dao.service.Validator;
import org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode; import org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode;
import java.lang.reflect.Field;
import java.math.BigInteger; import java.math.BigInteger;
import java.security.AlgorithmParameters; import java.security.AlgorithmParameters;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
@ -52,7 +51,9 @@ import java.security.spec.KeySpec;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collector;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.IntStream; import java.util.stream.IntStream;
@ -80,11 +81,13 @@ public class LwM2MModelsRepository {
* if textSearch is null then it uses AllList from List<ObjectModel>) * if textSearch is null then it uses AllList from List<ObjectModel>)
*/ */
public List<LwM2mObject> getLwm2mObjects(int[] objectIds, String textSearch, String sortProperty, String sortOrder) { public List<LwM2mObject> getLwm2mObjects(int[] objectIds, String textSearch, String sortProperty, String sortOrder) {
return getLwm2mObjects((objectIds != null && objectIds.length > 0 && textSearch != null && !textSearch.isEmpty()) ? return getLwm2mObjects((objectIds.length > 0 && textSearch != null && !textSearch.isEmpty()) ?
(ObjectModel element) -> IntStream.of(objectIds).anyMatch(x -> x == element.id) || element.name.contains(textSearch) : (ObjectModel element) -> IntStream.of(objectIds).anyMatch(x -> x == element.id) || element.name.contains(textSearch) :
(objectIds != null && objectIds.length > 0) ? (objectIds.length > 0) ?
(ObjectModel element) -> IntStream.of(objectIds).anyMatch(x -> x == element.id) : (ObjectModel element) -> IntStream.of(objectIds).anyMatch(x -> x == element.id) :
(textSearch != null && !textSearch.isEmpty()) ? (ObjectModel element) -> element.name.contains(textSearch) : null, (textSearch != null && !textSearch.isEmpty()) ?
(ObjectModel element) -> element.name.contains(textSearch) :
null,
sortProperty, sortOrder); sortProperty, sortOrder);
} }
@ -118,177 +121,189 @@ public class LwM2MModelsRepository {
lwM2mObject.setInstances(new LwM2mInstance[]{instance}); lwM2mObject.setInstances(new LwM2mInstance[]{instance});
lwM2mObjects.add(lwM2mObject); lwM2mObjects.add(lwM2mObject);
}); });
try { return lwM2mObjects.size() > 1 ? this.sortList (lwM2mObjects, sortProperty, sortOrder) : lwM2mObjects;
Field field = LwM2mObject.class.getField(sortProperty); }
} catch (NoSuchFieldException e) {
e.printStackTrace(); private List<LwM2mObject> sortList (List<LwM2mObject> lwM2mObjects, String sortProperty, String sortOrder) {
}
switch (sortProperty) { switch (sortProperty) {
case "name": case "name":
switch (sortOrder) { switch (sortOrder) {
case "ASC": case "ASC":
// ASC
lwM2mObjects.sort((o1, o2) -> o1.getName().compareTo(o2.getName())); lwM2mObjects.sort((o1, o2) -> o1.getName().compareTo(o2.getName()));
break; break;
case "DESC": case "DESC":
// DESC
lwM2mObjects.stream().sorted(Comparator.comparing(LwM2mObject::getName).reversed()); lwM2mObjects.stream().sorted(Comparator.comparing(LwM2mObject::getName).reversed());
break; break;
} }
case "id": case "id":
switch (sortOrder) { switch (sortOrder) {
case "ASC": case "ASC":
// ASC
lwM2mObjects.sort((o1, o2) -> Long.compare(o1.getId(), o2.getId())); lwM2mObjects.sort((o1, o2) -> Long.compare(o1.getId(), o2.getId()));
break; break;
case "DESC": case "DESC":
// DESC
lwM2mObjects.sort((o1, o2) -> Long.compare(o2.getId(), o1.getId())); lwM2mObjects.sort((o1, o2) -> Long.compare(o2.getId(), o1.getId()));
} }
} }
return lwM2mObjects; return lwM2mObjects;
} }
/** /**
* @param tenantId * @param tenantId
* @param pageLink * @param pageLink
* @return List of LwM2mObject in PageData format * @return List of LwM2mObject in PageData format
*/ */
public PageData<LwM2mObject> findDeviceLwm2mObjects (TenantId tenantId, PageLink pageLink){ public PageData<LwM2mObject> findDeviceLwm2mObjects(TenantId tenantId, PageLink pageLink) {
log.trace("Executing findDeviceProfileInfos tenantId [{}], pageLink [{}]", tenantId, pageLink); log.trace("Executing findDeviceProfileInfos tenantId [{}], pageLink [{}]", tenantId, pageLink);
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
Validator.validatePageLink(pageLink); Validator.validatePageLink(pageLink);
return this.findLwm2mListObjects(pageLink); return this.findLwm2mListObjects(pageLink);
} }
/** /**
* @param pageLink * @param pageLink
* @return List of LwM2mObject in PageData format, filter == TextSearch * @return List of LwM2mObject in PageData format, filter == TextSearch
* PageNumber = 1, PageSize = List<LwM2mObject>.size() * PageNumber = 1, PageSize = List<LwM2mObject>.size()
*/ */
public PageData<LwM2mObject> findLwm2mListObjects (PageLink pageLink){ public PageData<LwM2mObject> findLwm2mListObjects(PageLink pageLink) {
PageImpl page = new PageImpl(getLwm2mObjects(null, pageLink.getTextSearch(), pageLink.getSortOrder().getProperty(), pageLink.getSortOrder().getDirection().name())); PageImpl page = new PageImpl(getLwm2mObjects(getObjectIdFromTextSearch(pageLink.getTextSearch()), pageLink.getTextSearch(), pageLink.getSortOrder().getProperty(), pageLink.getSortOrder().getDirection().name()));
PageData pageData = new PageData(page.getContent(), page.getTotalPages(), page.getTotalElements(), page.hasNext()); PageData pageData = new PageData(page.getContent(), page.getTotalPages(), page.getTotalElements(), page.hasNext());
return pageData; return pageData;
} }
/** /**
* @param securityMode * Filter for id Object
* @param bootstrapServerIs * @param textSearch -
* @return ServerSecurityConfig more value is default: Important - port, host, publicKey * @return - return Object id only first chartAt in textSearch
*/ */
public ServerSecurityConfig getBootstrapSecurityInfo (String securityMode,boolean bootstrapServerIs){ private int[] getObjectIdFromTextSearch(String textSearch) {
LwM2MSecurityMode lwM2MSecurityMode = LwM2MSecurityMode.fromSecurityMode(securityMode.toLowerCase()); String filtered = null;
return getBootstrapServer(bootstrapServerIs, lwM2MSecurityMode); if (textSearch !=null && !textSearch.isEmpty()) {
AtomicInteger a = new AtomicInteger();
filtered = textSearch.chars ()
.mapToObj(chr -> (char) chr)
.filter(i -> Character.isDigit(i) && textSearch.charAt(a.getAndIncrement()) == i)
.collect(Collector.of(StringBuilder::new, StringBuilder::append, StringBuilder::append, StringBuilder::toString));
} }
return (filtered != null && !filtered.isEmpty()) ? new int[]{Integer.parseInt(filtered)} : new int[0];
}
/** /**
* @param bootstrapServerIs * @param securityMode
* @param mode * @param bootstrapServerIs
* @return ServerSecurityConfig more value is default: Important - port, host, publicKey * @return ServerSecurityConfig more value is default: Important - port, host, publicKey
*/ */
private ServerSecurityConfig getBootstrapServer ( boolean bootstrapServerIs, LwM2MSecurityMode mode){ public ServerSecurityConfig getBootstrapSecurityInfo(String securityMode, boolean bootstrapServerIs) {
ServerSecurityConfig bsServ = new ServerSecurityConfig(); LwM2MSecurityMode lwM2MSecurityMode = LwM2MSecurityMode.fromSecurityMode(securityMode.toLowerCase());
bsServ.setBootstrapServerIs(bootstrapServerIs); return getBootstrapServer(bootstrapServerIs, lwM2MSecurityMode);
if (bootstrapServerIs) { }
bsServ.setServerId(contextBootStrap.getBootstrapServerId());
switch (mode) { /**
case NO_SEC: * @param bootstrapServerIs
bsServ.setHost(contextBootStrap.getBootstrapHost()); * @param mode
bsServ.setPort(contextBootStrap.getBootstrapPortNoSecPsk()); * @return ServerSecurityConfig more value is default: Important - port, host, publicKey
bsServ.setServerPublicKey(""); */
break; private ServerSecurityConfig getBootstrapServer(boolean bootstrapServerIs, LwM2MSecurityMode mode) {
case PSK: ServerSecurityConfig bsServ = new ServerSecurityConfig();
bsServ.setHost(contextBootStrap.getBootstrapSecureHost()); bsServ.setBootstrapServerIs(bootstrapServerIs);
bsServ.setPort(contextBootStrap.getBootstrapSecurePortPsk()); if (bootstrapServerIs) {
bsServ.setServerPublicKey(""); bsServ.setServerId(contextBootStrap.getBootstrapServerId());
break; switch (mode) {
case RPK: case NO_SEC:
bsServ.setHost(contextBootStrap.getBootstrapSecureHost()); bsServ.setHost(contextBootStrap.getBootstrapHost());
bsServ.setPort(contextBootStrap.getBootstrapSecurePortRpk()); bsServ.setPort(contextBootStrap.getBootstrapPortNoSecPsk());
bsServ.setServerPublicKey(getRPKPublicKey(this.contextBootStrap.getBootstrapPublicX(), this.contextBootStrap.getBootstrapPublicY())); bsServ.setServerPublicKey("");
break; break;
case X509: case PSK:
bsServ.setHost(contextBootStrap.getBootstrapSecureHost()); bsServ.setHost(contextBootStrap.getBootstrapSecureHost());
bsServ.setPort(contextBootStrap.getBootstrapSecurePortX509()); bsServ.setPort(contextBootStrap.getBootstrapSecurePortPsk());
bsServ.setServerPublicKey(getServerPublicKeyX509(contextBootStrap.getBootstrapAlias())); bsServ.setServerPublicKey("");
break; break;
default: case RPK:
break; bsServ.setHost(contextBootStrap.getBootstrapSecureHost());
} bsServ.setPort(contextBootStrap.getBootstrapSecurePortRpk());
} else { bsServ.setServerPublicKey(getRPKPublicKey(this.contextBootStrap.getBootstrapPublicX(), this.contextBootStrap.getBootstrapPublicY()));
bsServ.setServerId(contextServer.getServerId()); break;
switch (mode) { case X509:
case NO_SEC: bsServ.setHost(contextBootStrap.getBootstrapSecureHost());
bsServ.setHost(contextServer.getServerHost()); bsServ.setPort(contextBootStrap.getBootstrapSecurePortX509());
bsServ.setPort(contextServer.getServerPortNoSecPsk()); bsServ.setServerPublicKey(getServerPublicKeyX509(contextBootStrap.getBootstrapAlias()));
bsServ.setServerPublicKey(""); break;
break; default:
case PSK: break;
bsServ.setHost(contextServer.getServerSecureHost()); }
bsServ.setPort(contextServer.getServerPortPsk()); } else {
bsServ.setServerPublicKey(""); bsServ.setServerId(contextServer.getServerId());
break; switch (mode) {
case RPK: case NO_SEC:
bsServ.setHost(contextServer.getServerSecureHost()); bsServ.setHost(contextServer.getServerHost());
bsServ.setPort(contextServer.getServerPortRpk()); bsServ.setPort(contextServer.getServerPortNoSecPsk());
bsServ.setServerPublicKey(getRPKPublicKey(this.contextServer.getServerPublicX(), this.contextServer.getServerPublicY())); bsServ.setServerPublicKey("");
break; break;
case X509: case PSK:
bsServ.setHost(contextServer.getServerSecureHost()); bsServ.setHost(contextServer.getServerSecureHost());
bsServ.setPort(contextServer.getServerPortX509()); bsServ.setPort(contextServer.getServerPortPsk());
bsServ.setServerPublicKey(getServerPublicKeyX509(contextServer.getServerAlias())); bsServ.setServerPublicKey("");
break; break;
default: case RPK:
break; bsServ.setHost(contextServer.getServerSecureHost());
} bsServ.setPort(contextServer.getServerPortRpk());
bsServ.setServerPublicKey(getRPKPublicKey(this.contextServer.getServerPublicX(), this.contextServer.getServerPublicY()));
break;
case X509:
bsServ.setHost(contextServer.getServerSecureHost());
bsServ.setPort(contextServer.getServerPortX509());
bsServ.setServerPublicKey(getServerPublicKeyX509(contextServer.getServerAlias()));
break;
default:
break;
} }
return bsServ;
} }
return bsServ;
}
/** /**
* @param alias * @param alias
* @return PublicKey format HexString or null * @return PublicKey format HexString or null
*/ */
private String getServerPublicKeyX509 (String alias){ private String getServerPublicKeyX509(String alias) {
try { try {
X509Certificate serverCertificate = (X509Certificate) contextServer.getKeyStoreValue().getCertificate(alias); X509Certificate serverCertificate = (X509Certificate) contextServer.getKeyStoreValue().getCertificate(alias);
return Hex.encodeHexString(serverCertificate.getEncoded()); return Hex.encodeHexString(serverCertificate.getEncoded());
} catch (CertificateEncodingException | KeyStoreException e) { } catch (CertificateEncodingException | KeyStoreException e) {
e.printStackTrace(); e.printStackTrace();
}
return null;
} }
return null;
}
/** /**
* @param publicServerX * @param publicServerX
* @param publicServerY * @param publicServerY
* @return PublicKey format HexString or null * @return PublicKey format HexString or null
*/ */
private String getRPKPublicKey (String publicServerX, String publicServerY){ private String getRPKPublicKey(String publicServerX, String publicServerY) {
try { try {
/** Get Elliptic Curve Parameter spec for secp256r1 */ /** Get Elliptic Curve Parameter spec for secp256r1 */
AlgorithmParameters algoParameters = AlgorithmParameters.getInstance("EC"); AlgorithmParameters algoParameters = AlgorithmParameters.getInstance("EC");
algoParameters.init(new ECGenParameterSpec("secp256r1")); algoParameters.init(new ECGenParameterSpec("secp256r1"));
ECParameterSpec parameterSpec = algoParameters.getParameterSpec(ECParameterSpec.class); ECParameterSpec parameterSpec = algoParameters.getParameterSpec(ECParameterSpec.class);
if (publicServerX != null && !publicServerX.isEmpty() && publicServerY != null && !publicServerY.isEmpty()) { if (publicServerX != null && !publicServerX.isEmpty() && publicServerY != null && !publicServerY.isEmpty()) {
/** Get point values */ /** Get point values */
byte[] publicX = Hex.decodeHex(publicServerX.toCharArray()); byte[] publicX = Hex.decodeHex(publicServerX.toCharArray());
byte[] publicY = Hex.decodeHex(publicServerY.toCharArray()); byte[] publicY = Hex.decodeHex(publicServerY.toCharArray());
/** Create key specs */ /** Create key specs */
KeySpec publicKeySpec = new ECPublicKeySpec(new ECPoint(new BigInteger(publicX), new BigInteger(publicY)), KeySpec publicKeySpec = new ECPublicKeySpec(new ECPoint(new BigInteger(publicX), new BigInteger(publicY)),
parameterSpec); parameterSpec);
/** Get keys */ /** Get keys */
PublicKey publicKey = KeyFactory.getInstance("EC").generatePublic(publicKeySpec); PublicKey publicKey = KeyFactory.getInstance("EC").generatePublic(publicKeySpec);
if (publicKey != null && publicKey.getEncoded().length > 0) { if (publicKey != null && publicKey.getEncoded().length > 0) {
return Hex.encodeHexString(publicKey.getEncoded()); return Hex.encodeHexString(publicKey.getEncoded());
}
} }
} catch (GeneralSecurityException | IllegalArgumentException e) {
log.error("[{}] Failed generate Server RPK for profile", e.getMessage());
throw new RuntimeException(e);
} }
return null; } catch (GeneralSecurityException | IllegalArgumentException e) {
log.error("[{}] Failed generate Server RPK for profile", e.getMessage());
throw new RuntimeException(e);
} }
return null;
} }
}

4
common/data/src/main/java/org/thingsboard/server/common/data/lwm2m/LwM2mObject.java

@ -16,11 +16,7 @@
package org.thingsboard.server.common.data.lwm2m; package org.thingsboard.server.common.data.lwm2m;
import lombok.Data; import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@Data @Data
public class LwM2mObject { public class LwM2mObject {
int id; int id;

Loading…
Cancel
Save