package com.thinkbiganalytics.metadata.core.feed; /*- * #%L * thinkbig-metadata-core * %% * 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.metadata.api.category.Category; import com.thinkbiganalytics.metadata.api.datasource.Datasource; import com.thinkbiganalytics.metadata.api.extension.UserFieldDescriptor; import com.thinkbiganalytics.metadata.api.feed.Feed; import com.thinkbiganalytics.metadata.api.feed.FeedConnection; import com.thinkbiganalytics.metadata.api.feed.FeedDestination; import com.thinkbiganalytics.metadata.api.feed.FeedPrecondition; import com.thinkbiganalytics.metadata.api.feed.FeedSource; import com.thinkbiganalytics.metadata.api.feed.InitializationStatus; import com.thinkbiganalytics.metadata.api.security.HadoopSecurityGroup; import com.thinkbiganalytics.metadata.api.security.RoleMembership; import com.thinkbiganalytics.metadata.api.template.FeedManagerTemplate; import com.thinkbiganalytics.metadata.sla.api.ServiceLevelAgreement; import com.thinkbiganalytics.metadata.sla.api.ServiceLevelAssessment; import com.thinkbiganalytics.security.action.AllowedActions; import org.joda.time.DateTime; import java.io.Serializable; import java.security.Principal; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * A POJO implementation of {@link Feed}. * * @param the type of parent category */ public class BaseFeed implements Feed { private ID Id; private String name; private String displayName; private String description; private State state; private boolean initialized; private DateTime createdTime; private Set<Feed> dependentFeeds = new HashSet<>(); private Set<FeedSource> sources = new HashSet<>(); private Set<FeedDestination> destinations = new HashSet<>(); private FeedPreconditionImpl precondition; private Map<String, Object> properties; private List<ServiceLevelAgreement> feedServiceLevelAgreements; private List<? extends HadoopSecurityGroup> hadoopSecurityGroups; private Map<String, String> waterMarkValues = new HashMap<>(); private String json; private FeedManagerTemplate template; private String nifiProcessGroupId; private Principal owner; /** * User-defined properties */ private Map<String, String> userProperties; public BaseFeed(String name, String description) { this.Id = new FeedId(); this.name = name; this.displayName = name; this.description = description; this.createdTime = DateTime.now(); } @Override public String getVersionName() { return ""; } @Override @SuppressWarnings("unchecked") public List<Feed> getDependentFeeds() { return new ArrayList(this.dependentFeeds); } @Override public boolean addDependentFeed(Feed feed) { return this.dependentFeeds.add(feed); } @Override public boolean removeDependentFeed(Feed feed) { return this.dependentFeeds.remove(feed); } @Override public List<Feed> getUsedByFeeds() { return null; } @Override public boolean addUsedByFeed(Feed feed) { return false; } @Override public boolean removeUsedByFeed(Feed feed) { return false; } @Override public Map<String, Object> getProperties() { return this.properties; } @Override public void setProperties(Map<String, Object> props) { this.properties = props; } @Override public Map<String, Object> mergeProperties(Map<String, Object> props) { for (Entry<String, Object> entry : props.entrySet()) { this.properties.put(entry.getKey(), entry.getValue()); } return this.properties; } @Override public DateTime getCreatedTime() { return this.createdTime; } @Override public void setProperty(String key, Object value) { this.properties.put(key, value); } @Override public void removeProperty(String key) { this.properties.remove(key); } public ID getId() { return Id; } public String getName() { return name; } @Override public String getQualifiedName() { return getCategory().getName() + "." + getName(); } public boolean isInitialized() { return initialized; } public void setInitialized(boolean initialized) { this.initialized = initialized; } @Override public String getDisplayName() { return this.displayName; } @Override public void setDisplayName(String name) { this.displayName = name; } public String getDescription() { return description; } @Override public void setDescription(String descr) { this.description = descr; } @Override public State getState() { return this.state; } public void setState(State state) { this.state = state; } @Override public Category getCategory() { return null; } @Override public DateTime getModifiedTime() { return null; } public List<FeedSource> getSources() { return new ArrayList<>(this.sources); } public List<FeedDestination> getDestinations() { return new ArrayList<>(destinations); } @Override public FeedDestination getDestination(Datasource.ID id) { for (FeedDestination dest : this.destinations) { if (dest.getDatasource().getId().equals(id)) { return dest; } } return null; } @Override public FeedPrecondition getPrecondition() { return this.precondition; } public FeedSource addSource(Datasource ds) { return addSource(ds, null); } public FeedSource addSource(Datasource ds, ServiceLevelAgreement agreement) { Source src = new Source(ds, agreement); this.sources.add(src); return src; } @Override public FeedSource getSource(Datasource.ID id) { for (FeedSource src : this.sources) { if (src.getFeed().getId().equals(id)) { return src; } } return null; } // // @Override // public FeedSource getSource(FeedSource.ID id) { // return this.sources.get(id); // } public FeedDestination addDestination(Datasource ds) { FeedDestination dest = new Destination(ds); this.destinations.add(dest); return dest; } // // @Override // public FeedDestination getDestination(FeedDestination.ID id) { // return this.destinations.get(id); // } public FeedPrecondition setPrecondition(ServiceLevelAgreement sla) { this.precondition = new FeedPreconditionImpl(this, sla); return this.precondition; } @Override public List<? extends HadoopSecurityGroup> getSecurityGroups() { return this.hadoopSecurityGroups; } @Override public void setSecurityGroups(List<? extends HadoopSecurityGroup> securityGroups) { hadoopSecurityGroups = securityGroups; } @Override public List<ServiceLevelAgreement> getServiceLevelAgreements() { return feedServiceLevelAgreements; } @Nonnull @Override public Map<String, String> getUserProperties() { return userProperties; } @Override public void setUserProperties(@Nonnull Map<String, String> userProperties, @Nonnull Set<UserFieldDescriptor> userFields) { this.userProperties = userProperties; } /* (non-Javadoc) * @see com.thinkbiganalytics.metadata.api.feed.Feed#getWaterMarkValue(java.lang.String) */ @Override public Optional<String> getWaterMarkValue(String waterMarkName) { return Optional.ofNullable(this.waterMarkValues.get(waterMarkName)); } /* (non-Javadoc) * @see com.thinkbiganalytics.metadata.api.feed.Feed#getWaterMarkNames() */ @Override public Set<String> getWaterMarkNames() { return new HashSet<>(this.waterMarkValues.keySet()); } /* (non-Javadoc) * @see com.thinkbiganalytics.metadata.api.feed.Feed#setWaterMarkValue(java.lang.String, java.lang.String) */ @Override public void setWaterMarkValue(String waterMarkName, String value) { this.waterMarkValues.put(waterMarkName, waterMarkName); } @Override public void setTags(@Nullable final Set<String> tags) { // ignored } /* (non-Javadoc) * @see com.thinkbiganalytics.metadata.api.feed.Feed#getCurrentInitStatus() */ @Override public InitializationStatus getCurrentInitStatus() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see com.thinkbiganalytics.metadata.api.feed.Feed#updateInitStatus(com.thinkbiganalytics.metadata.api.feed.InitializationStatus) */ @Override public void updateInitStatus(InitializationStatus status) { // TODO Auto-generated method stub } // // protected static class SourceId extends BaseId implements FeedSource.ID { // public SourceId() { // super(); // } // // public SourceId(Serializable ser) { // super(ser); // } // } // // protected static class DestinationId extends BaseId implements FeedDestination.ID { // public DestinationId() { // super(); // } // // public DestinationId(Serializable ser) { // super(ser); // } // } // @Override // public String getVersionName() { // return null; // } /* (non-Javadoc) * @see com.thinkbiganalytics.metadata.api.feed.Feed#getInitHistory() */ @Override public List<InitializationStatus> getInitHistory() { // TODO Auto-generated method stub return null; } @Override public AllowedActions getAllowedActions() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see com.thinkbiganalytics.metadata.api.security.AccessControlled#getRoleAssignments() */ @Override public Set<RoleMembership> getRoleMemberships() { // TODO Auto-generated method stub return null; } @Override public Optional<RoleMembership> getRoleMembership(String roleName) { // TODO Auto-generated method stub return null; } @Override public String getJson() { return json; } @Override public void setJson(String json) { this.json = json; } public FeedManagerTemplate getTemplate() { return template; } @Override public void setTemplate(FeedManagerTemplate template) { this.template = template; } @Override public String getNifiProcessGroupId() { return nifiProcessGroupId; } @Override public void setNifiProcessGroupId(String nifiProcessGroupId) { this.nifiProcessGroupId = nifiProcessGroupId; } @Override public void setVersionName(String version) { // TODO Auto-generated method stub } @Override public Principal getOwner() { return owner; } public void setOwner(Principal owner) { this.owner = owner; } public static class BaseId { private final UUID uuid; public BaseId() { this.uuid = UUID.randomUUID(); } public BaseId(Serializable ser) { if (ser instanceof String) { this.uuid = UUID.fromString((String) ser); } else if (ser instanceof UUID) { this.uuid = (UUID) ser; } else { throw new IllegalArgumentException("Unknown ID value: " + ser); } } @Override public boolean equals(Object obj) { if (getClass().isAssignableFrom(obj.getClass())) { BaseId that = (BaseId) obj; return Objects.equals(this.uuid, that.uuid); } else { return false; } } @Override public int hashCode() { return Objects.hash(getClass(), this.uuid); } @Override public String toString() { return this.uuid.toString(); } } public static class FeedId extends BaseId implements Feed.ID { public FeedId() { super(); } public FeedId(Serializable ser) { super(ser); } } protected static class FeedPreconditionImpl implements FeedPrecondition { private ServiceLevelAgreement sla; private BaseFeed feed; private ServiceLevelAssessment lastAssessment; public FeedPreconditionImpl(BaseFeed feed, ServiceLevelAgreement sla) { this.sla = sla; this.feed = feed; } @Override public Feed getFeed() { return this.feed; } @Override public ServiceLevelAgreement getAgreement() { return sla; } @Override public ServiceLevelAssessment getLastAssessment() { return lastAssessment; } @Override public void setLastAssessment(ServiceLevelAssessment assmnt) { this.lastAssessment = assmnt; } } private abstract class Data implements FeedConnection { private Datasource dataset; public Data(Datasource ds) { this.dataset = ds; } @Override public Feed getFeed() { return BaseFeed.this; } @Override public Datasource getDatasource() { return this.dataset; } } private class Source extends Data implements FeedSource { private static final long serialVersionUID = -2407190619538717445L; // private SourceId id; private ServiceLevelAgreement agreement; public Source(Datasource ds, ServiceLevelAgreement agreement) { super(ds); // this.id = new SourceId(); this.agreement = agreement; } // // @Override // public ID getId() { // return this.id; // } @Override public ServiceLevelAgreement getAgreement() { return this.agreement; } } private class Destination extends Data implements FeedDestination { private static final long serialVersionUID = -6990911423133789381L; // private DestinationId id; public Destination(Datasource ds) { super(ds); // this.id = new DestinationId(); } // // @Override // public ID getId() { // return this.id; // } } }