Skip to content

Commit

Permalink
KAA-600: Started implementation of KAA-600.
Browse files Browse the repository at this point in the history
  • Loading branch information
Igor Khanenko committed Nov 10, 2015
1 parent e3655cd commit b98e402
Show file tree
Hide file tree
Showing 12 changed files with 369 additions and 60 deletions.
@@ -0,0 +1,4 @@
package org.kaaproject.kaa.server.common.dao.impl;

public interface CTLSchemaDao<T> extends SqlDao<T> {
}
Expand Up @@ -26,6 +26,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;

import java.util.ArrayList;
import java.util.Arrays;
Expand Down
@@ -0,0 +1,27 @@
package org.kaaproject.kaa.server.common.dao.impl.sql;

import org.hibernate.LockMode;
import org.hibernate.LockOptions;
import org.hibernate.Session;
import org.kaaproject.kaa.server.common.dao.impl.CTLSchemaDao;
import org.kaaproject.kaa.server.common.dao.model.sql.CTLSchema;
import org.springframework.stereotype.Repository;

@Repository
public class HibernateCTLSchemaDao extends HibernateAbstractDao<CTLSchema> implements CTLSchemaDao<CTLSchema> {

LockOptions lockOptions = new LockOptions(LockMode.PESSIMISTIC_WRITE);

@Override
public CTLSchema save(CTLSchema o) {
Session session = getSession();
CTLSchema t = (CTLSchema) session.merge(o);
session.flush();
return t;
}

@Override
protected Class<CTLSchema> getEntityClass() {
return CTLSchema.class;
}
}
@@ -0,0 +1,108 @@
package org.kaaproject.kaa.server.common.dao.model.sql;

import org.kaaproject.kaa.common.dto.CTLSchemaDto;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import java.io.Serializable;
import java.util.Set;

@Entity
@Table(name = "ctl", uniqueConstraints =
@UniqueConstraint(columnNames = {"version", "fqn", "tenant_id"}, name = "ctl_unique_constraint"))
public class CTLSchema extends GenericModel<CTLSchemaDto> implements Serializable {

private Integer version;
private String fqn;
@ManyToOne(optional = true, fetch = FetchType.EAGER)
@JoinColumn(nullable = true, name = "tenant_id", foreignKey = @ForeignKey(name = "fk_ctl_tenant_id"))
private Tenant tenant;
@Enumerated(EnumType.STRING)
private CTLSchemaScope scope;
@ManyToOne(optional = true, fetch = FetchType.EAGER)
@JoinColumn(nullable = true, name = "app_id", foreignKey = @ForeignKey(name = "fk_ctl_app_id"))
private Application application;
private String body;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "ctl_dependency",
joinColumns = {@JoinColumn(name = "parent_id")}, foreignKey = @ForeignKey(name = "fk_ctl_pr_id"),
inverseJoinColumns = {@JoinColumn(name = "child_id")}, inverseForeignKey = @ForeignKey(name = "fk_ctl_ch_id"))
private Set<CTLSchema> dependencySet;

public Integer getVersion() {
return version;
}

public void setVersion(Integer version) {
this.version = version;
}

public String getFqn() {
return fqn;
}

public void setFqn(String fqn) {
this.fqn = fqn;
}

public Tenant getTenant() {
return tenant;
}

public void setTenant(Tenant tenant) {
this.tenant = tenant;
}

public CTLSchemaScope getScope() {
return scope;
}

public void setScope(CTLSchemaScope scope) {
this.scope = scope;
}

public Application getApplication() {
return application;
}

public void setApplication(Application application) {
this.application = application;
}

public String getBody() {
return body;
}

public void setBody(String body) {
this.body = body;
}

public Set<CTLSchema> getDependencySet() {
return dependencySet;
}

public void setDependencySet(Set<CTLSchema> dependencySet) {
this.dependencySet = dependencySet;
}

@Override
protected CTLSchemaDto createDto() {
return new CTLSchemaDto();
}

@Override
public CTLSchemaDto toDto() {
CTLSchemaDto ctlSchemaDto = createDto();
return ctlSchemaDto;
}
}
@@ -0,0 +1,5 @@
package org.kaaproject.kaa.server.common.dao.model.sql;

public enum CTLSchemaScope {
SYSTEM, TENANT, APPLICATION, PLUGIN;
}
2 changes: 1 addition & 1 deletion server/common/dao/src/main/resources/logback.xml
Expand Up @@ -32,7 +32,7 @@
</encoder>
</appender>

<logger name="org.kaaproject.kaa.server.common.dao.service.test" level="DEBUG"/>
<logger name="org.kaaproject.kaa.server.common.dao" level="INFO"/>
<logger name="org.springframework" level="INFO"/>

<root level="INFO">
Expand Down
Expand Up @@ -16,19 +16,6 @@

package org.kaaproject.kaa.server.common.dao.impl.sql;

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.UUID;

import org.junit.Assert;
import org.kaaproject.kaa.common.dto.KaaAuthorityDto;
import org.kaaproject.kaa.common.dto.NotificationTypeDto;
Expand All @@ -39,12 +26,14 @@
import org.kaaproject.kaa.server.common.core.schema.KaaSchemaFactoryImpl;
import org.kaaproject.kaa.server.common.dao.impl.ApplicationDao;
import org.kaaproject.kaa.server.common.dao.impl.ApplicationEventFamilyMapDao;
import org.kaaproject.kaa.server.common.dao.impl.CTLSchemaDao;
import org.kaaproject.kaa.server.common.dao.impl.ConfigurationDao;
import org.kaaproject.kaa.server.common.dao.impl.ConfigurationSchemaDao;
import org.kaaproject.kaa.server.common.dao.impl.EndpointGroupDao;
import org.kaaproject.kaa.server.common.dao.impl.EventClassDao;
import org.kaaproject.kaa.server.common.dao.impl.EventClassFamilyDao;
import org.kaaproject.kaa.server.common.dao.impl.HistoryDao;
import org.kaaproject.kaa.server.common.dao.impl.LogAppenderDao;
import org.kaaproject.kaa.server.common.dao.impl.LogSchemaDao;
import org.kaaproject.kaa.server.common.dao.impl.NotificationSchemaDao;
import org.kaaproject.kaa.server.common.dao.impl.ProfileFilterDao;
Expand All @@ -54,10 +43,10 @@
import org.kaaproject.kaa.server.common.dao.impl.TopicDao;
import org.kaaproject.kaa.server.common.dao.impl.UserDao;
import org.kaaproject.kaa.server.common.dao.impl.UserVerifierDao;
import org.kaaproject.kaa.server.common.dao.impl.LogAppenderDao;
import org.kaaproject.kaa.server.common.dao.model.sql.Application;
import org.kaaproject.kaa.server.common.dao.model.sql.ApplicationEventFamilyMap;
import org.kaaproject.kaa.server.common.dao.model.sql.ApplicationEventMap;
import org.kaaproject.kaa.server.common.dao.model.sql.CTLSchema;
import org.kaaproject.kaa.server.common.dao.model.sql.Change;
import org.kaaproject.kaa.server.common.dao.model.sql.Configuration;
import org.kaaproject.kaa.server.common.dao.model.sql.ConfigurationSchema;
Expand All @@ -66,6 +55,7 @@
import org.kaaproject.kaa.server.common.dao.model.sql.EventClassFamily;
import org.kaaproject.kaa.server.common.dao.model.sql.EventSchemaVersion;
import org.kaaproject.kaa.server.common.dao.model.sql.History;
import org.kaaproject.kaa.server.common.dao.model.sql.LogAppender;
import org.kaaproject.kaa.server.common.dao.model.sql.LogSchema;
import org.kaaproject.kaa.server.common.dao.model.sql.NotificationSchema;
import org.kaaproject.kaa.server.common.dao.model.sql.ProfileFilter;
Expand All @@ -75,11 +65,25 @@
import org.kaaproject.kaa.server.common.dao.model.sql.Topic;
import org.kaaproject.kaa.server.common.dao.model.sql.User;
import org.kaaproject.kaa.server.common.dao.model.sql.UserVerifier;
import org.kaaproject.kaa.server.common.dao.model.sql.LogAppender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.UUID;

@ActiveProfiles({"postgres"})
public abstract class HibernateAbstractTest {

private static final Logger LOG = LoggerFactory.getLogger(HibernateAbstractTest.class);
Expand Down Expand Up @@ -122,6 +126,8 @@ public abstract class HibernateAbstractTest {
protected UserVerifierDao<UserVerifier> verifierDao;
@Autowired
protected SdkProfileDao<SdkProfile> sdkProfileDao;
@Autowired
protected CTLSchemaDao<CTLSchema> ctlSchemaDao;

protected Tenant generateTenant() {
LOG.debug("Generate tenant...");
Expand Down Expand Up @@ -341,7 +347,7 @@ protected List<ProfileFilter> generateFilter(ProfileSchema schema, EndpointGroup

protected Topic generateTopic(Application app, TopicTypeDto type, String topicName) {
Topic topic = new Topic();
if(topicName != null && !topicName.isEmpty()){
if (topicName != null && !topicName.isEmpty()) {
topic.setName(topicName);
} else {
topic.setName("Generated Topic name");
Expand All @@ -357,7 +363,7 @@ protected Topic generateTopic(Application app, TopicTypeDto type, String topicNa
return topicDao.save(topic);
}

protected LogAppender generateLogAppender(Application app){
protected LogAppender generateLogAppender(Application app) {
LogAppender appender = new LogAppender();
if (app == null) {
app = generateApplication(null);
Expand Down Expand Up @@ -502,7 +508,7 @@ protected String readSchemaFileAsString(String filePath) throws IOException {
return null;
}

protected UserVerifier generateUserVerifier(Application app, String verifierToken){
protected UserVerifier generateUserVerifier(Application app, String verifierToken) {
UserVerifier verifier = new UserVerifier();
verifier.setName("GENERATED test Verifier");
if (app == null) {
Expand Down
@@ -0,0 +1,76 @@
package org.kaaproject.kaa.server.common.dao.impl.sql;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kaaproject.kaa.server.common.dao.model.sql.CTLSchema;
import org.kaaproject.kaa.server.common.dao.model.sql.CTLSchemaScope;
import org.kaaproject.kaa.server.common.dao.model.sql.Tenant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/common-dao-test-context.xml")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
@Transactional
public class HibernateCTLSchemaDaoTest extends HibernateAbstractTest {

private static final Logger LOG = LoggerFactory.getLogger(HibernateCTLSchemaDaoTest.class);

private ExecutorService executorService = Executors.newFixedThreadPool(10);
private Tenant tenant;

@Before
@Rollback(false)
public void go() {
if (tenant == null) {
tenant = generateTenant();
}
}

@After
public void afterTest() throws InterruptedException {
LOG.debug("If sdsfsddf");
}

@Test
@Rollback(false)
public void saveCTLSchema() throws InterruptedException {
ctlSchemaDao.save(generateCTLSchema(tenant));
ctlSchemaDao.save(generateCTLSchema(generateTenant()));
}

@Test
@Rollback(false)
public void multiThreadCTLSchemaSaveTest() throws InterruptedException {
for (int i = 0; i < 100; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
ctlSchemaDao.save(generateCTLSchema(generateTenant()));
}
});
}
}

private CTLSchema generateCTLSchema(Tenant tenant) {
CTLSchema ctlSchema = new CTLSchema();
ctlSchema.setBody(UUID.randomUUID().toString());
ctlSchema.setVersion(1);
ctlSchema.setTenant(tenant);
ctlSchema.setFqn("org.kaaproject.kaa.ctl.TestSchema");
ctlSchema.setScope(CTLSchemaScope.SYSTEM);
return ctlSchema;
}
}

0 comments on commit b98e402

Please sign in to comment.