org.mayocat.accounts.store.jdbi.DBITenantStore.java Source code

Java tutorial

Introduction

Here is the source code for org.mayocat.accounts.store.jdbi.DBITenantStore.java

Source

/*
 * Copyright (c) 2012, Mayocat <hello@mayocat.org>
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package org.mayocat.accounts.store.jdbi;

import java.util.List;
import java.util.UUID;

import javax.inject.Inject;
import javax.validation.Valid;

import org.mayocat.accounts.model.Tenant;
import org.mayocat.accounts.model.TenantConfiguration;
import org.mayocat.accounts.store.TenantStore;
import mayoapp.dao.TenantDAO;

import org.mayocat.addons.store.dbi.AddonsHelper;
import org.mayocat.context.WebContext;
import org.mayocat.model.AddonGroup;
import org.mayocat.store.EntityAlreadyExistsException;
import org.mayocat.store.EntityDoesNotExistException;
import org.mayocat.store.InvalidEntityException;
import org.mayocat.store.StoreException;
import org.mayocat.store.rdbms.dbi.DBIProvider;
import org.xwiki.component.annotation.Component;
import org.xwiki.component.phase.Initializable;
import org.xwiki.component.phase.InitializationException;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import static org.mayocat.addons.util.AddonUtils.asMap;

@Component(hints = { "jdbi", "default" })
public class DBITenantStore implements TenantStore, Initializable {
    private static final String TENANT_TABLE_NAME = "tenant";

    @Inject
    private WebContext context;

    @Inject
    private DBIProvider dbi;

    private TenantDAO dao;

    @Override
    public Tenant create(Tenant tenant) throws EntityAlreadyExistsException, InvalidEntityException {
        if (this.dao.findBySlug(TENANT_TABLE_NAME, tenant.getSlug()) != null) {
            throw new EntityAlreadyExistsException();
        }

        this.dao.begin();

        TenantConfiguration configuration = tenant.getConfiguration();

        try {
            String configurationAsJson = convertConfigurationToJSON(configuration);

            UUID id = UUID.randomUUID();
            tenant.setId(id);
            this.dao.createEntity(tenant, TENANT_TABLE_NAME);
            this.dao.create(tenant, configuration.getVersion(), configurationAsJson);
            this.dao.createOrUpdateAddons(tenant);

            return tenant;
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Failed to create tenant", e);
        } finally {
            this.dao.commit();
        }
    }

    @Override
    public void update(Tenant tenant) throws InvalidEntityException, EntityDoesNotExistException {
        this.dao.begin();

        Tenant originalProduct = this.findBySlug(tenant.getSlug());
        if (originalProduct == null) {
            this.dao.commit();
            throw new EntityDoesNotExistException();
        }
        tenant.setId(originalProduct.getId());
        Integer updatedRows = this.dao.update(tenant);
        this.dao.createOrUpdateAddons(tenant);

        this.dao.commit();

        if (updatedRows <= 0) {
            throw new StoreException("No rows was updated when updating tenant");
        }
    }

    @Override
    public void delete(@Valid Tenant entity) throws EntityDoesNotExistException {
        this.dao.deleteEntityAndChildrenById(entity.getId());
    }

    @Override
    public Integer countAll() {
        return this.dao.countAllTenants();
    }

    @Override
    public void updateConfiguration(TenantConfiguration configuration) {
        try {
            this.dao.updateConfiguration(getTenant(), configuration.getVersion(),
                    convertConfigurationToJSON(configuration));
        } catch (JsonProcessingException e) {
            throw new RuntimeException("", e);
        }
    }

    @Override
    public List<Tenant> findAll(Integer number, Integer offset) {
        return AddonsHelper.withAddons(this.dao.findAll(number, offset), dao);
    }

    @Override
    public List<Tenant> findByIds(List<UUID> ids) {
        return AddonsHelper.withAddons(this.dao.findByIds(TENANT_TABLE_NAME, ids), dao);
    }

    @Override
    public Tenant findById(UUID id) {
        Tenant tenant = this.dao.findById(TENANT_TABLE_NAME, id);
        if (tenant != null) {
            List<AddonGroup> addons = this.dao.findAddons(tenant);
            tenant.setAddons(asMap(addons));
        }
        return tenant;
    }

    @Override
    public Tenant findBySlug(String slug) {
        Tenant tenant = this.dao.findBySlug("tenant", slug);
        if (tenant != null) {
            List<AddonGroup> addons = this.dao.findAddons(tenant);
            tenant.setAddons(asMap(addons));
        }
        return tenant;
    }

    @Override
    public Tenant findByDefaultHost(String host) {
        Tenant tenant = this.dao.findByDefaultHost(host);
        if (tenant != null) {
            List<AddonGroup> addons = this.dao.findAddons(tenant);
            tenant.setAddons(asMap(addons));
        }
        return tenant;
    }

    @Override
    public void initialize() throws InitializationException {
        this.dao = this.dbi.get().onDemand(TenantDAO.class);
    }

    private Tenant getTenant() {
        return this.context.getTenant();
    }

    private String convertConfigurationToJSON(TenantConfiguration configuration) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(configuration);
    }
}