package com.thinkbiganalytics.feedmgr.service.template;
/*-
* #%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.rest.model.FeedMetadata;
import com.thinkbiganalytics.feedmgr.rest.model.RegisteredTemplate;
import com.thinkbiganalytics.feedmgr.rest.model.ReusableTemplateConnectionInfo;
import com.thinkbiganalytics.feedmgr.service.FileObjectPersistence;
import com.thinkbiganalytics.feedmgr.service.feed.FeedManagerFeedService;
import com.thinkbiganalytics.nifi.rest.model.NifiProperty;
import org.apache.nifi.web.api.dto.PortDTO;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
/**
* in memory implementation of the FeedTemplateService for use in testing
*/
public class InMemoryFeedManagerTemplateService implements FeedManagerTemplateService {
@Inject
private FeedManagerFeedService feedProvider;
private Map<String, RegisteredTemplate> registeredTemplates = new HashMap<>();
@PostConstruct
private void postConstruct() {
Collection<RegisteredTemplate> templates = FileObjectPersistence.getInstance().getTemplatesFromFile();
if (templates != null) {
for (RegisteredTemplate t : templates) {
String id = t.getId() == null ? t.getNifiTemplateId() : t.getId();
registeredTemplates.put(id, t);
}
}
}
@Override
public RegisteredTemplate registerTemplate(RegisteredTemplate registeredTemplate) {
Date updateDate = new Date();
if (registeredTemplate.getId() == null || !registeredTemplates.containsKey(registeredTemplate.getId())) {
registeredTemplate.setCreateDate(updateDate);
}
registeredTemplate.setUpdateDate(updateDate);
if (registeredTemplate.getId() == null) {
registeredTemplate.setId(UUID.randomUUID().toString());
}
return saveRegisteredTemplate(registeredTemplate);
}
@Override
public void ensureRegisteredTemplateInputProcessors(RegisteredTemplate registeredTemplate) {
}
protected RegisteredTemplate saveRegisteredTemplate(RegisteredTemplate registeredTemplate) {
//ensure that the incoming template name doesnt already exist.
//if so remove and replace with this one
RegisteredTemplate template = getRegisteredTemplateByName(registeredTemplate.getTemplateName());
if (template != null && !template.getId().equalsIgnoreCase(registeredTemplate.getId())) {
//remove the old one with the same name
registeredTemplates.remove(template.getId());
//update those feeds that were pointing to this old one, to this new one
List<FeedMetadata> feedsToUpdate = feedProvider.getFeedsWithTemplate(registeredTemplate.getId());
if (feedsToUpdate != null && !feedsToUpdate.isEmpty()) {
for (FeedMetadata feedMetadata : feedsToUpdate) {
feedMetadata.setTemplateId(template.getId());
}
//save the feeds
FileObjectPersistence.getInstance().writeFeedsToFile(feedProvider.getFeeds());
}
}
registeredTemplates.put(registeredTemplate.getId(), registeredTemplate);
if (registeredTemplates.containsKey(registeredTemplate.getNifiTemplateId())) {
registeredTemplates.remove(registeredTemplate.getNifiTemplateId());
}
FileObjectPersistence.getInstance().writeTemplatesToFile(registeredTemplates.values());
return registeredTemplate;
}
public boolean deleteRegisteredTemplate(String templateId) {
throw new UnsupportedOperationException("unable to delete the template");
}
@Override
public RegisteredTemplate getRegisteredTemplate(String templateId) {
RegisteredTemplate savedTemplate = registeredTemplates.get(templateId);
if (savedTemplate != null) {
return new RegisteredTemplate(savedTemplate);
}
return null;
}
public RegisteredTemplate getRegisteredTemplateByName(final String templateName) {
return Iterables.tryFind(registeredTemplates.values(), new Predicate<RegisteredTemplate>() {
@Override
public boolean apply(RegisteredTemplate registeredTemplate) {
return registeredTemplate.getTemplateName().equalsIgnoreCase(templateName);
}
}).orNull();
}
public List<String> getRegisteredTemplateIds() {
return new ArrayList<>(registeredTemplates.keySet());
}
@Override
public List<RegisteredTemplate> getRegisteredTemplates() {
return new ArrayList<>(registeredTemplates.values());
}
@Override
public RegisteredTemplate enableTemplate(String templateId) {
return null;
}
@Override
public RegisteredTemplate disableTemplate(String templateId) {
return null;
}
@Override
public List<RegisteredTemplate.Processor> getRegisteredTemplateProcessors(String templateId, boolean includeReusableProcessors) {
return null;
}
@Override
public void orderTemplates(List<String> orderedTemplateIds, Set<String> exclude) {
}
@Override
public List<NifiProperty> getTemplateProperties(String templateId) {
return null;
}
@Override
public Set<PortDTO> getReusableFeedInputPorts() {
return null;
}
@Override
public List<RegisteredTemplate.Processor> getReusableTemplateProcessorsForInputPorts(List<String> inputPortIds) {
return null;
}
@Override
public List<RegisteredTemplate.FlowProcessor> getNiFiTemplateFlowProcessors(String templateId, List<ReusableTemplateConnectionInfo> connectionInfo) {
return null;
}
@Override
public List<RegisteredTemplate.Processor> getNiFiTemplateProcessorsWithProperties(String templateId) {
return null;
}
@Override
public RegisteredTemplate findRegisteredTemplateByName(String templateName) {
return null;
}
}