Browse Source

Merge branch 'master' of github.com:thingsboard/thingsboard

pull/2216/head
Andrew Shvayka 7 years ago
parent
commit
58a18ac326
  1. 2
      dao/src/main/java/org/thingsboard/server/dao/sql/component/AbstractComponentDescriptorInsertRepository.java
  2. 1
      dao/src/main/java/org/thingsboard/server/dao/sql/component/HsqlComponentDescriptorInsertRepository.java
  3. 90
      dao/src/main/java/org/thingsboard/server/dao/sql/event/AbstractEventInsertRepository.java
  4. 78
      dao/src/main/java/org/thingsboard/server/dao/sql/event/EventInsertRepository.java
  5. 2
      dao/src/main/java/org/thingsboard/server/dao/sql/event/HsqlEventInsertRepository.java
  6. 2
      dao/src/main/java/org/thingsboard/server/dao/sql/event/PsqlEventInsertRepository.java

2
dao/src/main/java/org/thingsboard/server/dao/sql/component/AbstractComponentDescriptorInsertRepository.java

@ -19,14 +19,12 @@ import lombok.extern.slf4j.Slf4j;
import org.hibernate.exception.ConstraintViolationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
import org.thingsboard.server.dao.util.SqlDao;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

1
dao/src/main/java/org/thingsboard/server/dao/sql/component/HsqlComponentDescriptorInsertRepository.java

@ -20,7 +20,6 @@ import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
import org.thingsboard.server.dao.util.HsqlDao;
import org.thingsboard.server.dao.util.SqlDao;
import org.thingsboard.server.dao.util.SqlTsDao;
@SqlDao
@HsqlDao

90
dao/src/main/java/org/thingsboard/server/dao/sql/event/AbstractEventInsertRepository.java

@ -0,0 +1,90 @@
/**
* Copyright © 2016-2019 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.sql.event;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.exception.ConstraintViolationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.dao.model.sql.EventEntity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
@Slf4j
public abstract class AbstractEventInsertRepository implements EventInsertRepository {
@PersistenceContext
protected EntityManager entityManager;
@Autowired
protected PlatformTransactionManager transactionManager;
protected EventEntity saveAndGet(EventEntity entity, String insertOrUpdateOnPrimaryKeyConflict, String insertOrUpdateOnUniqueKeyConflict) {
EventEntity eventEntity = null;
TransactionStatus insertTransaction = getTransactionStatus(TransactionDefinition.PROPAGATION_REQUIRED);
try {
eventEntity = processSaveOrUpdate(entity, insertOrUpdateOnPrimaryKeyConflict);
transactionManager.commit(insertTransaction);
} catch (Throwable throwable) {
transactionManager.rollback(insertTransaction);
if (throwable.getCause() instanceof ConstraintViolationException) {
log.trace("Insert request leaded in a violation of a defined integrity constraint {} for Entity with entityId {} and entityType {}", throwable.getMessage(), entity.getEventUid(), entity.getEventType());
TransactionStatus transaction = getTransactionStatus(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
try {
eventEntity = processSaveOrUpdate(entity, insertOrUpdateOnUniqueKeyConflict);
} catch (Throwable th) {
log.trace("Could not execute the update statement for Entity with entityId {} and entityType {}", entity.getEventUid(), entity.getEventType());
transactionManager.rollback(transaction);
}
transactionManager.commit(transaction);
} else {
log.trace("Could not execute the insert statement for Entity with entityId {} and entityType {}", entity.getEventUid(), entity.getEventType());
}
}
return eventEntity;
}
@Modifying
protected abstract EventEntity doProcessSaveOrUpdate(EventEntity entity, String query);
protected Query getQuery(EventEntity entity, String query) {
return entityManager.createNativeQuery(query, EventEntity.class)
.setParameter("id", UUIDConverter.fromTimeUUID(entity.getId()))
.setParameter("body", entity.getBody().toString())
.setParameter("entity_id", entity.getEntityId())
.setParameter("entity_type", entity.getEntityType().name())
.setParameter("event_type", entity.getEventType())
.setParameter("event_uid", entity.getEventUid())
.setParameter("tenant_id", entity.getTenantId());
}
private EventEntity processSaveOrUpdate(EventEntity entity, String query) {
return doProcessSaveOrUpdate(entity, query);
}
private TransactionStatus getTransactionStatus(int propagationRequired) {
DefaultTransactionDefinition insertDefinition = new DefaultTransactionDefinition();
insertDefinition.setPropagationBehavior(propagationRequired);
return transactionManager.getTransaction(insertDefinition);
}
}

78
dao/src/main/java/org/thingsboard/server/dao/sql/event/EventInsertRepository.java

@ -15,82 +15,10 @@
*/
package org.thingsboard.server.dao.sql.event;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.exception.ConstraintViolationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.dao.model.sql.EventEntity;
import org.thingsboard.server.dao.util.SqlDao;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
public interface EventInsertRepository {
@Slf4j
@SqlDao
@Repository
public abstract class EventInsertRepository {
EventEntity saveOrUpdate(EventEntity entity);
@PersistenceContext
protected EntityManager entityManager;
@Autowired
protected PlatformTransactionManager transactionManager;
public abstract EventEntity saveOrUpdate(EventEntity entity);
protected EventEntity saveAndGet(EventEntity entity, String insertOrUpdateOnPrimaryKeyConflict, String insertOrUpdateOnUniqueKeyConflict) {
EventEntity eventEntity = null;
TransactionStatus insertTransaction = getTransactionStatus(TransactionDefinition.PROPAGATION_REQUIRED);
try {
eventEntity = processSaveOrUpdate(entity, insertOrUpdateOnPrimaryKeyConflict);
transactionManager.commit(insertTransaction);
} catch (Throwable throwable) {
transactionManager.rollback(insertTransaction);
if (throwable.getCause() instanceof ConstraintViolationException) {
log.trace("Insert request leaded in a violation of a defined integrity constraint {} for Entity with entityId {} and entityType {}", throwable.getMessage(), entity.getEventUid(), entity.getEventType());
TransactionStatus transaction = getTransactionStatus(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
try {
eventEntity = processSaveOrUpdate(entity, insertOrUpdateOnUniqueKeyConflict);
} catch (Throwable th) {
log.trace("Could not execute the update statement for Entity with entityId {} and entityType {}", entity.getEventUid(), entity.getEventType());
transactionManager.rollback(transaction);
}
transactionManager.commit(transaction);
} else {
log.trace("Could not execute the insert statement for Entity with entityId {} and entityType {}", entity.getEventUid(), entity.getEventType());
}
}
return eventEntity;
}
@Modifying
protected abstract EventEntity doProcessSaveOrUpdate(EventEntity entity, String query);
protected Query getQuery(EventEntity entity, String query) {
return entityManager.createNativeQuery(query, EventEntity.class)
.setParameter("id", UUIDConverter.fromTimeUUID(entity.getId()))
.setParameter("body", entity.getBody().toString())
.setParameter("entity_id", entity.getEntityId())
.setParameter("entity_type", entity.getEntityType().name())
.setParameter("event_type", entity.getEventType())
.setParameter("event_uid", entity.getEventUid())
.setParameter("tenant_id", entity.getTenantId());
}
private EventEntity processSaveOrUpdate(EventEntity entity, String query) {
return doProcessSaveOrUpdate(entity, query);
}
private TransactionStatus getTransactionStatus(int propagationRequired) {
DefaultTransactionDefinition insertDefinition = new DefaultTransactionDefinition();
insertDefinition.setPropagationBehavior(propagationRequired);
return transactionManager.getTransaction(insertDefinition);
}
}
}

2
dao/src/main/java/org/thingsboard/server/dao/sql/event/HsqlEventInsertRepository.java

@ -24,7 +24,7 @@ import org.thingsboard.server.dao.util.SqlDao;
@SqlDao
@HsqlDao
@Repository
public class HsqlEventInsertRepository extends EventInsertRepository {
public class HsqlEventInsertRepository extends AbstractEventInsertRepository {
private static final String P_KEY_CONFLICT_STATEMENT = "(event.id=I.id)";
private static final String UNQ_KEY_CONFLICT_STATEMENT = "(event.tenant_id=I.tenant_id AND event.entity_type=I.entity_type AND event.entity_id=I.entity_id AND event.event_type=I.event_type AND event.event_uid=I.event_uid)";

2
dao/src/main/java/org/thingsboard/server/dao/sql/event/PsqlEventInsertRepository.java

@ -25,7 +25,7 @@ import org.thingsboard.server.dao.util.SqlDao;
@SqlDao
@PsqlDao
@Repository
public class PsqlEventInsertRepository extends EventInsertRepository {
public class PsqlEventInsertRepository extends AbstractEventInsertRepository {
private static final String P_KEY_CONFLICT_STATEMENT = "(id)";
private static final String UNQ_KEY_CONFLICT_STATEMENT = "(tenant_id, entity_type, entity_id, event_type, event_uid)";

Loading…
Cancel
Save