package com.thinkbiganalytics.feedmgr.service.category;
/*-
* #%L
* thinkbig-feed-manager-controller
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* 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.
* #L%
*/
import com.thinkbiganalytics.feedmgr.rest.model.FeedCategory;
import com.thinkbiganalytics.feedmgr.rest.model.FeedSummary;
import com.thinkbiganalytics.feedmgr.service.AccessControlledEntityTransform;
import com.thinkbiganalytics.feedmgr.service.UserPropertyTransform;
import com.thinkbiganalytics.feedmgr.service.feed.FeedModelTransform;
import com.thinkbiganalytics.metadata.api.category.Category;
import com.thinkbiganalytics.metadata.api.category.CategoryNotFoundException;
import com.thinkbiganalytics.metadata.api.category.CategoryProvider;
import com.thinkbiganalytics.metadata.api.extension.UserFieldDescriptor;
import com.thinkbiganalytics.metadata.api.security.HadoopSecurityGroup;
import com.thinkbiganalytics.metadata.api.security.HadoopSecurityGroupProvider;
import com.thinkbiganalytics.metadata.modeshape.security.JcrHadoopSecurityGroup;
import org.joda.time.DateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
/**
* Transforms categories between Feed Manager and Metadata formats.
*/
public class CategoryModelTransform {
@Inject
private AccessControlledEntityTransform accessControlledEntityTransform;
/**
* Provider for categories
*/
@Inject
CategoryProvider categoryProvider;
/**
* Transform functions for feeds
*/
@Inject
FeedModelTransform feedModelTransform;
@Inject
private HadoopSecurityGroupProvider hadoopSecurityGroupProvider;
/**
* Transforms the specified Metadata category to a Feed Manager category.
*
* @param domainCategory the Metadata category
* @return the Feed Manager category
*/
@Nullable
public FeedCategory domainToFeedCategory(@Nullable final Category domainCategory) {
return domainToFeedCategory(domainCategory, categoryProvider.getUserFields());
}
/**
* Transforms the specified Metadata categories into Feed Manager categories.
*
* @param domain the Metadata categories
* @return the Feed Manager categories
*/
@Nonnull
public List<FeedCategory> domainToFeedCategory(@Nonnull final Collection<Category> domain) {
final Set<UserFieldDescriptor> userFields = categoryProvider.getUserFields();
return domain.stream().map(c -> domainToFeedCategory(c, userFields)).collect(Collectors.toList());
}
/**
* Transforms the specified Metadata category into a Feed Manager category.
*
* @param domainCategory the Metadata category
* @param userFields the user-defined fields
* @return the Feed Manager category
*/
@Nullable
private FeedCategory domainToFeedCategory(@Nullable final Category domainCategory, @Nonnull final Set<UserFieldDescriptor> userFields) {
if (domainCategory != null) {
FeedCategory category = new FeedCategory();
category.setId(domainCategory.getId().toString());
if (domainCategory.getFeeds() != null) {
List<FeedSummary> summaries = feedModelTransform.domainToFeedSummary(domainCategory.getFeeds());
category.setFeeds(summaries);
category.setRelatedFeeds(summaries.size());
}
category.setIconColor(domainCategory.getIconColor());
category.setIcon(domainCategory.getIcon());
category.setName(domainCategory.getDisplayName());
category.setSystemName(domainCategory.getName());
category.setDescription(domainCategory.getDescription());
category.setCreateDate(domainCategory.getCreatedTime() != null ? domainCategory.getCreatedTime().toDate() : null);
category.setUpdateDate(domainCategory.getModifiedTime() != null ? domainCategory.getModifiedTime().toDate() : null);
// Transform user-defined fields and properties
category.setUserFields(UserPropertyTransform.toUserFields(categoryProvider.getFeedUserFields(domainCategory.getId()).orElse(Collections.emptySet())));
category.setUserProperties(UserPropertyTransform.toUserProperties(domainCategory.getUserProperties(), userFields));
// Convert JCR securitygroup to DTO
List<com.thinkbiganalytics.feedmgr.rest.model.HadoopSecurityGroup> restSecurityGroups = new ArrayList<>();
if (domainCategory.getSecurityGroups() != null && domainCategory.getSecurityGroups().size() > 0) {
for (Object group : domainCategory.getSecurityGroups()) {
HadoopSecurityGroup hadoopSecurityGroup = (HadoopSecurityGroup) group;
com.thinkbiganalytics.feedmgr.rest.model.HadoopSecurityGroup restSecurityGroup = new com.thinkbiganalytics.feedmgr.rest.model.HadoopSecurityGroup();
restSecurityGroup.setDescription(hadoopSecurityGroup.getDescription());
restSecurityGroup.setId(hadoopSecurityGroup.getGroupId());
restSecurityGroup.setName(hadoopSecurityGroup.getName());
restSecurityGroups.add(restSecurityGroup);
}
}
category.setSecurityGroups(restSecurityGroups);
accessControlledEntityTransform.applyAccessControlToRestModel(domainCategory,category);
return category;
} else {
return null;
}
}
/**
* Transforms the specified Metadata category to a simple Feed Manager category.
*
* @param domainCategory the Metadata category
* @return the Feed Manager category
*/
@Nullable
public FeedCategory domainToFeedCategorySimple(@Nullable final Category domainCategory) {
if (domainCategory != null) {
FeedCategory category = new FeedCategory();
category.setId(domainCategory.getId().toString());
category.setIconColor(domainCategory.getIconColor());
category.setIcon(domainCategory.getIcon());
category.setName(domainCategory.getDisplayName());
category.setSystemName(domainCategory.getName());
category.setDescription(domainCategory.getDescription());
category.setCreateDate(domainCategory.getCreatedTime() != null ? domainCategory.getCreatedTime().toDate() : null);
category.setUpdateDate(domainCategory.getModifiedTime() != null ? domainCategory.getModifiedTime().toDate() : null);
return category;
} else {
return null;
}
}
/**
* Transforms the specified Metadata categories to simple Feed Manager categories.
*
* @param domain the Metadata categories
* @return the Feed Manager categories
*/
@Nonnull
public List<FeedCategory> domainToFeedCategorySimple(@Nonnull final Collection<Category> domain) {
return domain.stream().map(this::domainToFeedCategorySimple).collect(Collectors.toList());
}
/**
* Transforms the specified Feed Manager category to a Metadata category.
*
* @param feedCategory the Feed Manager category
* @return the Metadata category
*/
@Nonnull
public Category feedCategoryToDomain(@Nonnull final FeedCategory feedCategory) {
final Set<UserFieldDescriptor> userFields = categoryProvider.getUserFields();
return feedCategoryToDomain(feedCategory, userFields);
}
/**
* Transforms the specified Feed Manager categories to Metadata categories.
*
* @param feedCategories the Feed Manager categories
* @return the Metadata categories
*/
public List<Category> feedCategoryToDomain(Collection<FeedCategory> feedCategories) {
final Set<UserFieldDescriptor> userFields = categoryProvider.getUserFields();
return feedCategories.stream().map(c -> feedCategoryToDomain(c, userFields)).collect(Collectors.toList());
}
/**
* Transforms the specified Feed Manager category to a Metadata category.
*
* @param feedCategory the Feed Manager category
* @param userFields the user-defined fields
* @return the Metadata category
*/
@Nonnull
private Category feedCategoryToDomain(@Nonnull final FeedCategory feedCategory, @Nonnull final Set<UserFieldDescriptor> userFields) {
Category.ID domainId = feedCategory.getId() != null ? categoryProvider.resolveId(feedCategory.getId()) : null;
Category category = null;
if (domainId != null) {
category = categoryProvider.findById(domainId);
if (category != null && !feedCategory.getSystemName().equals(category.getName())) {
categoryProvider.rename(domainId, feedCategory.getSystemName());
}
}
if (category == null) {
category = categoryProvider.ensureCategory(feedCategory.getSystemName());
}
if (category == null) {
throw new CategoryNotFoundException("Unable to find Category ", domainId);
}
domainId = category.getId();
feedCategory.setId(domainId.toString());
category.setDisplayName(feedCategory.getName());
category.setDescription(feedCategory.getDescription());
category.setIcon(feedCategory.getIcon());
category.setIconColor(feedCategory.getIconColor());
category.setCreatedTime(new DateTime(feedCategory.getCreateDate()));
category.setModifiedTime(new DateTime(feedCategory.getUpdateDate()));
// Transforms the Feed Manager user-defined properties to domain user-defined properties
if (feedCategory.getUserProperties() != null) {
category.setUserProperties(UserPropertyTransform.toMetadataProperties(feedCategory.getUserProperties()), userFields);
}
// Set the hadoop security groups
final List<HadoopSecurityGroup> securityGroups = new ArrayList<>();
if (feedCategory.getSecurityGroups() != null) {
for (com.thinkbiganalytics.feedmgr.rest.model.HadoopSecurityGroup securityGroup : feedCategory.getSecurityGroups()) {
JcrHadoopSecurityGroup hadoopSecurityGroup = (JcrHadoopSecurityGroup) hadoopSecurityGroupProvider.ensureSecurityGroup(securityGroup.getName());
hadoopSecurityGroup.setGroupId(securityGroup.getId());
hadoopSecurityGroup.setDescription(securityGroup.getDescription());
securityGroups.add(hadoopSecurityGroup);
}
}
category.setSecurityGroups(securityGroups);
return category;
}
}