com.isotrol.impe3.pms.core.impl.ConfigurationManagerImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.isotrol.impe3.pms.core.impl.ConfigurationManagerImpl.java

Source

/**
 * This file is part of Port@l
 * Port@l 3.0 - Portal Engine and Management System
 * Copyright (C) 2010  Isotrol, SA.  http://www.isotrol.com
 *
 * Port@l 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.
 *
 * Port@l 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 Port@l.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.isotrol.impe3.pms.core.impl;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;

import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.isotrol.impe3.api.Category;
import com.isotrol.impe3.api.ContentType;
import com.isotrol.impe3.api.FileId;
import com.isotrol.impe3.core.Loggers;
import com.isotrol.impe3.core.config.PortalConfigurationDefinition;
import com.isotrol.impe3.core.config.PortalConfigurationDefinition.Item;
import com.isotrol.impe3.pbuf.BaseProtos.ConfigurationPB;
import com.isotrol.impe3.pbuf.BaseProtos.ConfigurationValuePB;
import com.isotrol.impe3.pbuf.BaseProtos.FileContentPB;
import com.isotrol.impe3.pms.api.PMSException;
import com.isotrol.impe3.pms.api.config.ConfigurationItemDTO;
import com.isotrol.impe3.pms.api.config.UploadedFileDTO;
import com.isotrol.impe3.pms.core.FileManager;
import com.isotrol.impe3.pms.core.PortalConfigurationManager;
import com.isotrol.impe3.pms.core.support.NotFoundProviders;
import com.isotrol.impe3.pms.model.CategoryEntity;
import com.isotrol.impe3.pms.model.ConfigurationEntity;
import com.isotrol.impe3.pms.model.ConfigurationValue;
import com.isotrol.impe3.pms.model.ContentTypeEntity;
import com.isotrol.impe3.pms.model.FileEntity;
import com.isotrol.impe3.pms.model.FilePurpose;

/**
 * Implementation of PortalConfigurationManager.
 * @author Enrique Diaz.
 */
@Service("portalConfigurationManager")
public final class ConfigurationManagerImpl extends AbstractEntityService<ConfigurationEntity>
        implements PortalConfigurationManager {

    /** Logger. */
    private final Logger logger = Loggers.pms();
    /** File manager. */
    @Autowired
    private FileManager fileManager;

    /** Default constructor. */
    public ConfigurationManagerImpl() {
    }

    /**
     * @see com.isotrol.impe3.pms.core.ConfigurationManager#create(com.isotrol.impe3.core.config.ConfigurationDefinition,
     * java.util.Collection)
     */
    @Transactional(rollbackFor = Throwable.class)
    public ConfigurationEntity create(PortalConfigurationDefinition<?> cd,
            Collection<ConfigurationItemDTO> configuration) throws PMSException {
        final ConfigurationEntity entity = new ConfigurationEntity();
        setValues(cd, entity, configuration);
        saveNew(entity);
        return entity;
    }

    /**
     * (non-Javadoc)
     * @see com.isotrol.impe3.pms.core.ConfigurationManager#create(com.isotrol.impe3.core.config.ConfigurationDefinition,
     * com.isotrol.impe3.pbuf.BaseProtos.ConfigurationPB)
     */
    @Transactional(rollbackFor = Throwable.class)
    public ConfigurationEntity create(PortalConfigurationDefinition<?> cd, ConfigurationPB configuration)
            throws PMSException {
        return create(cd, pb2dto(configuration));
    }

    /**
     * @see com.isotrol.impe3.pms.core.ConfigurationManager#update(com.isotrol.impe3.core.config.ConfigurationDefinition,
     * com.isotrol.impe3.pms.model.ConfigurationEntity, java.util.Collection)
     */
    @Transactional(rollbackFor = Throwable.class)
    public ConfigurationEntity update(PortalConfigurationDefinition<?> cd, ConfigurationEntity entity,
            Collection<ConfigurationItemDTO> configuration) throws PMSException {
        setValues(cd, entity, configuration);
        return entity;
    }

    /**
     * @see com.isotrol.impe3.pms.core.ConfigurationManager#update(com.isotrol.impe3.core.config.ConfigurationDefinition,
     * com.isotrol.impe3.pms.model.ConfigurationEntity, com.isotrol.impe3.pbuf.BaseProtos.ConfigurationPB)
     */
    @Transactional(rollbackFor = Throwable.class)
    public ConfigurationEntity update(PortalConfigurationDefinition<?> cd, ConfigurationEntity entity,
            ConfigurationPB configuration) throws PMSException {
        return update(cd, entity, pb2dto(configuration));
    }

    /**
     * @see com.isotrol.impe3.pms.core.ConfigurationManager#update(com.isotrol.impe3.core.config.ConfigurationDefinition,
     * java.util.UUID, java.util.Collection)
     */
    @Transactional(rollbackFor = Throwable.class)
    public ConfigurationEntity update(PortalConfigurationDefinition<?> cd, UUID id,
            Collection<ConfigurationItemDTO> configuration) throws PMSException {
        return update(cd, load(id), configuration);
    }

    /**
     * @see com.isotrol.impe3.pms.core.ConfigurationManager#update(com.isotrol.impe3.core.config.ConfigurationDefinition,
     * java.util.UUID, com.isotrol.impe3.pbuf.BaseProtos.ConfigurationPB)
     */
    @Transactional(rollbackFor = Throwable.class)
    public ConfigurationEntity update(PortalConfigurationDefinition<?> cd, UUID id, ConfigurationPB configuration)
            throws PMSException {
        return update(cd, load(id), configuration);
    }

    private void setValues(PortalConfigurationDefinition<?> cd, ConfigurationEntity entity,
            Collection<ConfigurationItemDTO> configuration) throws PMSException {
        checkNotNull(configuration);
        checkArgument(!configuration.isEmpty() || cd.getMBPParameters().isEmpty());
        final Map<String, ConfigurationValue> values = entity.getValues();
        values.clear();
        final ImmutableMap<String, Item> parameters = cd.getParameters();
        for (final ConfigurationItemDTO itemDTO : configuration) {
            final String name = itemDTO.getKey();
            checkNotNull(name);
            checkArgument(!values.containsKey(name));
            checkArgument(parameters.containsKey(name));
            final Item item = parameters.get(name);
            final String value = itemDTO.getCurrentValue();
            if (value == null) {
                if (item.isMVP()) {
                    logger.error("Configuration [{}] type [{}]: Required item [{}].",
                            new Object[] { entity.getId().toString(), cd.getType().getName(), name });
                    throw new IllegalArgumentException(); // TODO
                }
                continue;
            }
            final ConfigurationValue configValue = new ConfigurationValue();
            final Class<?> type = item.getType();
            if (item.isEnum()) {
                configValue.setStringValue(((Enum<?>) item.fromString(value)).name());
            } else if (String.class == type) {
                configValue.setStringValue(value);
            } else if (Integer.class == type) {
                configValue.setIntegerValue(Integer.valueOf(value));
            } else if (FileId.class == type) {
                FileEntity file = load(FileEntity.class, value, NotFoundProviders.FILE);
                if (file.getPurpose() == FilePurpose.UNKNOWN) {
                    file.setPurpose(FilePurpose.CONFIG);
                }
                NotFoundProviders.FILE.checkCondition(file.getPurpose() == FilePurpose.CONFIG, value);
                if (item.isCompressed()) {
                    file.compress();
                }
                file.setBundle(item.isBundle());
                file.setDownloadable(item.isDownloadable());
                configValue.setFileValue(file);
            } else if (Category.class == type) {
                configValue.setCategoryValue(load(CategoryEntity.class, value, NotFoundProviders.CATEGORY));
            } else if (ContentType.class == type) {
                configValue
                        .setContentTypeValue(load(ContentTypeEntity.class, value, NotFoundProviders.CONTENT_TYPE));
            } else if (Boolean.class == type) {
                configValue.setBooleanValue(Boolean.valueOf(value));
            } else {
                logger.error("Configuration [{}] type [{}] item [{}] Invalid type.",
                        new Object[] { entity.getId().toString(), cd.getType().getName(), name });
                // TODO: other types.
                throw new IllegalStateException();
            }
            values.put(name, configValue);
        }
        for (final Item item : parameters.values()) {
            checkState(!item.isMVP() || values.containsKey(item.getParameter()));
        }
    }

    /**
     * @see com.isotrol.impe3.pms.core.ConfigurationManager#delete(com.isotrol.impe3.pms.model.ConfigurationEntity)
     */
    @Transactional(rollbackFor = Throwable.class)
    public void delete(ConfigurationEntity entity) {
        getDao().delete(entity);
    }

    @Transactional(rollbackFor = Throwable.class)
    public List<ConfigurationItemDTO> pb2dto(ConfigurationPB configuration) throws PMSException {
        if (configuration == null) {
            return null;
        }
        final int n = configuration.getConfigurationValuesCount();
        if (n == 0) {
            return ImmutableList.of();
        }
        final List<ConfigurationItemDTO> list = Lists.newArrayListWithCapacity(n);
        for (final ConfigurationValuePB value : configuration.getConfigurationValuesList()) {
            final ConfigurationItemDTO dto = new ConfigurationItemDTO();
            if (value.hasCtFile()) {
                final FileContentPB filePB = value.getCtFile();
                final UploadedFileDTO uf = fileManager.upload(filePB.getName(), filePB.getContent().toByteArray());
                dto.setCurrentValue(uf.getId());
            } else if (value.hasCtString()) {
                dto.setCurrentValue(value.getCtString());
            } else if (value.hasCtInteger()) {
                dto.setCurrentValue(Integer.toString(value.getCtInteger()));
            } else if (value.hasCtBoolean()) {
                dto.setCurrentValue(Boolean.toString(value.getCtBoolean()));
            } else {
                continue;
            }
            dto.setKey(value.getName());
            list.add(dto);
        }
        return list;
    }

    /**
     * @see com.isotrol.impe3.pms.core.ConfigurationManager#duplicate(com.isotrol.impe3.pms.model.ConfigurationEntity)
     */
    @Transactional(rollbackFor = Throwable.class)
    public ConfigurationEntity duplicate(ConfigurationEntity entity) throws PMSException {
        if (entity == null) {
            return null;
        }
        final ConfigurationEntity dup = new ConfigurationEntity();
        for (Entry<String, ConfigurationValue> entry : entity.getValues().entrySet()) {
            dup.getValues().put(entry.getKey(), entry.getValue().duplicate());
        }
        saveNew(dup);
        return dup;
    }

}