package com.thinkbiganalytics.feedmgr.rest.model;
/*-
* #%L
* thinkbig-feed-manager-rest-model
* %%
* 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.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.thinkbiganalytics.feedmgr.rest.model.json.UserPropertyDeserializer;
import com.thinkbiganalytics.feedmgr.rest.model.schema.FeedProcessingOptions;
import com.thinkbiganalytics.feedmgr.rest.model.schema.TableSetup;
import com.thinkbiganalytics.metadata.FeedPropertySection;
import com.thinkbiganalytics.metadata.FeedPropertyType;
import com.thinkbiganalytics.metadata.MetadataField;
import com.thinkbiganalytics.metadata.rest.model.data.Datasource;
import com.thinkbiganalytics.nifi.rest.model.NifiProperty;
import com.thinkbiganalytics.security.rest.model.EntityAccessControl;
import com.thinkbiganalytics.support.FeedNameUtil;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* The specification for a feed and how it should interact with various components.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class FeedMetadata extends EntityAccessControl implements UIFeed {
boolean isNew = false;
private String id;
@MetadataField(description = "The unique feed GUID")
private String feedId;
//pointer to RegisteredTemplate.id
private String templateId;
//Nifi specific
private String inputProcessorType;
private String templateName;
private List<NifiProperty> properties;
@FeedPropertyType(section = FeedPropertySection.SCHEDULE)
private FeedSchedule schedule;
@FeedPropertyType(section = FeedPropertySection.SUMMARY)
@MetadataField
private String feedName;
@FeedPropertyType(section = FeedPropertySection.SUMMARY)
@MetadataField(description = "The system feed name")
private String systemFeedName;
@FeedPropertyType(section = FeedPropertySection.SUMMARY)
@MetadataField
private String description;
@FeedPropertyType(section = FeedPropertySection.PROPERTIES)
private List<Tag> tags;
@FeedPropertyType(section = FeedPropertySection.PROPERTIES)
@MetadataField
private String dataOwner;
private FeedCategory category;
@FeedPropertyType(section = FeedPropertySection.TABLE_DATA)
private TableSetup table;
@MetadataField
private Date createDate;
@MetadataField
private Date updateDate;
@FeedPropertyType(section = FeedPropertySection.TABLE_DATA)
private FeedDataTransformation dataTransformation;
private boolean active = true;
private String state;
private String nifiProcessGroupId;
//indicates this feed has inputPorts and is a "reusable template" for other feeds
@JsonProperty("reusableFeed")
private boolean isReusableFeed;
private FeedProcessingOptions options;
//deprecated
private Long version;
private String versionName;
private RegisteredTemplate registeredTemplate;
// private NifiProcessGroup nifiProcessGroup;
/**
* User-defined business metadata
*/
@FeedPropertyType(section = FeedPropertySection.PROPERTIES)
private Set<UserProperty> userProperties;
@FeedPropertyType(section = FeedPropertySection.PROPERTIES)
@MetadataField(description = "List of Ranger/Sentry groups that you want to grant access for this feed")
private String hadoopSecurityGroups;
@FeedPropertyType(section = FeedPropertySection.PROPERTIES)
@MetadataField(description = "Type of authorization system used. NONE, RANGER, or SENTRY")
private String hadoopAuthorizationType;
private List<HadoopSecurityGroup> securityGroups;
/**
* List of feed IDs dependent on this feed
*/
private List<FeedSummary> usedByFeeds;
/**
* List of data source dependencies.
*/
private List<Datasource> userDatasources;
public FeedMetadata() {
}
public String getTemplateId() {
return templateId;
}
public void setTemplateId(String templateId) {
this.templateId = templateId;
}
@Override
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTemplateName() {
return templateName;
}
public void setTemplateName(String templateName) {
this.templateName = templateName;
}
public String getFeedName() {
return feedName;
}
public void setFeedName(String feedName) {
this.feedName = feedName;
}
public List<NifiProperty> getProperties() {
if (properties == null) {
properties = new ArrayList<NifiProperty>();
}
return properties;
}
public void setProperties(List<NifiProperty> properties) {
this.properties = properties;
}
public FeedSchedule getSchedule() {
return schedule;
}
public void setSchedule(FeedSchedule schedule) {
this.schedule = schedule;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getInputProcessorType() {
return inputProcessorType;
}
public void setInputProcessorType(String inputProcessorType) {
this.inputProcessorType = inputProcessorType;
}
public List<Tag> getTags() {
return tags;
}
public void setTags(List<Tag> tags) {
this.tags = tags;
}
public String getDataOwner() {
return dataOwner;
}
public void setDataOwner(String dataOwner) {
this.dataOwner = dataOwner;
}
public FeedCategory getCategory() {
return category;
}
public void setCategory(FeedCategory category) {
this.category = category;
}
public String getSystemFeedName() {
return systemFeedName;
}
public void setSystemFeedName(String systemFeedName) {
this.systemFeedName = systemFeedName;
}
public TableSetup getTable() {
return table;
}
public void setTable(TableSetup table) {
this.table = table;
}
/* public NifiProcessGroup getNifiProcessGroup() {
return nifiProcessGroup;
}
public void setNifiProcessGroup(NifiProcessGroup nifiProcessGroup) {
this.nifiProcessGroup = nifiProcessGroup;
}
*/
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getUpdateDate() {
return updateDate;
}
public void setUpdateDate(Date updateDate) {
this.updateDate = updateDate;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public Long getVersion() {
if (StringUtils.isNotBlank(versionName)) {
try {
return new Long(versionName);
} catch (NumberFormatException e) {
return 0L;
}
} else {
return version;
}
}
public void setVersion(Long version) {
this.version = version;
setVersionName(version + "");
}
public String getVersionName() {
return this.versionName;
}
public void setVersionName(String versionName) {
this.versionName = versionName;
}
@JsonIgnore
public String getProfileTableName() {
return this.category.getSystemName() + "." + this.getSystemFeedName() + "_profile";
}
@JsonIgnore
public String getInvalidTableName() {
return this.category.getSystemName() + "." + this.getSystemFeedName() + "_invalid";
}
@JsonIgnore
public String getValidTableName() {
return this.category.getSystemName() + "." + this.getSystemFeedName() + "_valid";
}
@JsonIgnore
public String getCategoryAndFeedName() {
return FeedNameUtil.fullName(this.category.getSystemName(), this.getSystemFeedName());
}
public String getFeedId() {
return feedId;
}
public void setFeedId(String feedId) {
this.feedId = feedId;
}
public RegisteredTemplate getRegisteredTemplate() {
return registeredTemplate;
}
public void setRegisteredTemplate(RegisteredTemplate registeredTemplate) {
this.registeredTemplate = registeredTemplate;
}
@Override
public String getCategoryName() {
return this.category.getName();
}
@Override
public String getCategoryId() {
return this.category.getId();
}
@Override
public String getCategoryAndFeedDisplayName() {
return this.category.getName() + "." + this.getFeedName();
}
@Override
public String getSystemCategoryName() {
return category.getSystemName();
}
@Override
public String getCategoryIcon() {
return this.category.getIcon();
}
@Override
public String getCategoryIconColor() {
return this.category.getIconColor();
}
public String getNifiProcessGroupId() {
return nifiProcessGroupId;
}
public void setNifiProcessGroupId(String nifiProcessGroupId) {
this.nifiProcessGroupId = nifiProcessGroupId;
}
@JsonProperty("reusableFeed")
public boolean isReusableFeed() {
return isReusableFeed;
}
@JsonProperty("reusableFeed")
public void setIsReusableFeed(boolean isReusableFeed) {
this.isReusableFeed = isReusableFeed;
}
public FeedDataTransformation getDataTransformation() {
return dataTransformation;
}
public void setDataTransformation(FeedDataTransformation dataTransformation) {
this.dataTransformation = dataTransformation;
}
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
}
/**
* Gets the user-defined business metadata for this feed.
*
* @return the user-defined properties
* @see #setUserProperties(Set)
* @since 0.3.0
*/
public Set<UserProperty> getUserProperties() {
return userProperties;
}
/**
* Sets the user-defined business metadata for this feed.
*
* @param userProperties the user-defined properties
* @see #getUserProperties()
* @since 0.3.0
*/
@JsonDeserialize(using = UserPropertyDeserializer.class)
public void setUserProperties(final Set<UserProperty> userProperties) {
this.userProperties = userProperties;
}
public List<HadoopSecurityGroup> getSecurityGroups() {
return securityGroups;
}
public void setSecurityGroups(List<HadoopSecurityGroup> securityGroups) {
this.securityGroups = securityGroups;
}
public String getHadoopSecurityGroups() {
return hadoopSecurityGroups;
}
public String getHadoopAuthorizationType() {
return hadoopAuthorizationType;
}
public void setHadoopAuthorizationType(String hadoopAuthorizationType) {
this.hadoopAuthorizationType = hadoopAuthorizationType;
}
@JsonIgnore
public void updateHadoopSecurityGroups() {
if (getSecurityGroups() != null) {
hadoopSecurityGroups = StringUtils.join(getSecurityGroups().stream().map(group -> group.getName()).collect(Collectors.toList()), ",");
} else {
hadoopSecurityGroups = "";
}
}
public boolean isNew() {
return isNew;
}
public void setIsNew(boolean isNew) {
this.isNew = isNew;
}
public FeedProcessingOptions getOptions() {
return options;
}
public void setOptions(FeedProcessingOptions options) {
this.options = options;
}
public List<FeedSummary> getUsedByFeeds() {
return usedByFeeds;
}
public void setUsedByFeeds(List<FeedSummary> usedByFeeds) {
this.usedByFeeds = usedByFeeds;
}
public static enum STATE {
NEW, ENABLED, DISABLED
}
public List<NifiProperty> getConfigurationProperties() {
return getProperties().stream().filter(nifiProperty -> nifiProperty.isContainsConfigurationVariables()).collect(Collectors.toList());
}
/**
* Return the properties for this feed that are marked as being sensitive
*/
public List<NifiProperty> getSensitiveProperties() {
return getProperties().stream()
.filter(nifiProperty -> nifiProperty.isSensitive() && (!nifiProperty.isInputProperty() || (nifiProperty.isInputProperty()
&& nifiProperty.getProcessorType().equals(this.getInputProcessorType()))))
.collect(Collectors.toList());
}
public List<Datasource> getUserDatasources() {
return userDatasources;
}
public void setUserDatasources(List<Datasource> userDatasources) {
this.userDatasources = userDatasources;
}
}