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.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.thinkbiganalytics.feedmgr.InvalidOperationException; import com.thinkbiganalytics.feedmgr.rest.model.FeedCategory; import com.thinkbiganalytics.feedmgr.rest.model.FeedCategoryBuilder; import com.thinkbiganalytics.feedmgr.rest.model.FeedSummary; import com.thinkbiganalytics.feedmgr.rest.model.UserField; import com.thinkbiganalytics.feedmgr.rest.model.UserProperty; import com.thinkbiganalytics.feedmgr.service.FileObjectPersistence; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import javax.annotation.Nonnull; import javax.annotation.PostConstruct; /** * An in-memory implementation of {@link FeedManagerCategoryService} for testing the REST API. */ public class InMemoryFeedManagerCategoryService implements FeedManagerCategoryService { private Map<String, FeedCategory> categories = new HashMap<>(); @PostConstruct private void loadCategories() { Collection<FeedCategory> savedCategories = FileObjectPersistence.getInstance().getCategoriesFromFile(); if (savedCategories != null) { for (FeedCategory c : savedCategories) { categories.put(c.getId(), c); } } if (categories.isEmpty()) { bootstrapCategories(); } } private void bootstrapCategories() { List<FeedCategory> feedCategoryList = new ArrayList<>(); feedCategoryList.add( new FeedCategoryBuilder("Employees").description("Employee profile data and records").icon("people").iconColor("#F06292") .build()); feedCategoryList.add( new FeedCategoryBuilder("Sales").description("Sales data including opportunities and leads").icon("phone_android") .iconColor("#90A4AE").build()); feedCategoryList.add( new FeedCategoryBuilder("Online").description("Web traffic data and reports of online activity").icon("web") .iconColor("#66BB6A").build()); feedCategoryList.add( new FeedCategoryBuilder("Payroll").description("Payroll records for employees").icon("attach_money").iconColor("#FFCA28") .build()); feedCategoryList.add(new FeedCategoryBuilder("Travel").description("Employee travel records including all expense reports") .icon("local_airport").iconColor("#FFF176").build()); feedCategoryList.add(new FeedCategoryBuilder("Data").description("General Data ").icon("cloud").iconColor("#AB47BC").build()); feedCategoryList.add( new FeedCategoryBuilder("Emails").description("All email traffic data archived for the last 5 years").icon("email") .iconColor("#FF5252").build()); feedCategoryList.add(new FeedCategoryBuilder("Customers").description("All customer data for various companies").icon("face") .iconColor("#FF5252").build()); for (FeedCategory category : feedCategoryList) { category.setId(UUID.randomUUID().toString()); categories.put(category.getId(), category); } } @Override public Collection<FeedCategory> getCategories() { return categories.values(); } @Override public FeedCategory getCategoryBySystemName(final String name) { return Iterables.tryFind(categories.values(), new Predicate<FeedCategory>() { @Override public boolean apply(FeedCategory feedCategory) { return feedCategory.getSystemName().equalsIgnoreCase(name); } }).orNull(); } @Override public FeedCategory getCategoryById(final String id) { return Iterables.tryFind(categories.values(), new Predicate<FeedCategory>() { @Override public boolean apply(FeedCategory feedCategory) { return feedCategory.getId().equalsIgnoreCase(id); } }).orNull(); } @Override public void saveCategory(final FeedCategory category) { if (category.getId() == null) { category.setId(UUID.randomUUID().toString()); category.generateSystemName(); } else { FeedCategory oldCategory = categories.get(category.getId()); if (oldCategory != null && !oldCategory.getName().equalsIgnoreCase(category.getName())) { ///names have changed //only regenerate the system name if there are no related feeds if (oldCategory.getRelatedFeeds() == 0) { category.generateSystemName(); } } List<FeedSummary> feeds = categories.get(category.getId()).getFeeds(); category.setFeeds(feeds); } categories.put(category.getId(), category); FileObjectPersistence.getInstance().writeCategoriesToFile(categories.values()); } @Override public boolean deleteCategory(String categoryId) throws InvalidOperationException { FeedCategory category = categories.get(categoryId); if (category != null) { //dont allow if category has feeds on it if (category.getRelatedFeeds() > 0) { throw new InvalidOperationException( "Unable to delete Category " + category.getName() + ". This category has " + category.getRelatedFeeds() + " feeds associated to it."); } else { categories.remove(categoryId); FileObjectPersistence.getInstance().writeCategoriesToFile(categories.values()); return true; } } return false; } @Nonnull @Override public Set<UserField> getUserFields() { return Collections.emptySet(); } @Override public void setUserFields(@Nonnull final Set<UserField> userFields) { // do nothing } @Nonnull @Override public Set<UserProperty> getUserProperties() { return Collections.emptySet(); } }