/**
*
*/
package com.thinkbiganalytics.metadata.rest;
/*-
* #%L
* thinkbig-metadata-rest-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.metadata.api.category.Category;
import com.thinkbiganalytics.metadata.api.datasource.DerivedDatasource;
import com.thinkbiganalytics.metadata.api.feed.Feed.State;
import com.thinkbiganalytics.metadata.rest.model.data.Datasource;
import com.thinkbiganalytics.metadata.rest.model.data.DatasourceDefinition;
import com.thinkbiganalytics.metadata.rest.model.data.DirectoryDatasource;
import com.thinkbiganalytics.metadata.rest.model.data.HiveTableDatasource;
import com.thinkbiganalytics.metadata.rest.model.feed.Feed;
import com.thinkbiganalytics.metadata.rest.model.feed.FeedCategory;
import com.thinkbiganalytics.metadata.rest.model.feed.FeedDestination;
import com.thinkbiganalytics.metadata.rest.model.feed.FeedPrecondition;
import com.thinkbiganalytics.metadata.rest.model.feed.FeedSource;
import com.thinkbiganalytics.metadata.rest.model.feed.InitializationStatus;
import com.thinkbiganalytics.metadata.rest.model.op.FeedOperation;
import com.thinkbiganalytics.security.rest.controller.SecurityModelTransform;
import com.thinkbiganalytics.security.rest.model.ActionGroup;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.inject.Inject;
/**
* Convenience functions and methods to transform between the metadata domain model and the REST model.
*/
public class MetadataModelTransform {
@Inject
private SecurityModelTransform actionsTransform;
public Function<com.thinkbiganalytics.metadata.api.feed.InitializationStatus, InitializationStatus> domainToInitStatus() {
return (domain) -> {
InitializationStatus status = new InitializationStatus();
status.setState(InitializationStatus.State.valueOf(domain.getState().name()));
status.setTimestamp(domain.getTimestamp());
return status;
};
}
// @formatter:off
public Function<com.thinkbiganalytics.metadata.api.feed.FeedPrecondition, FeedPrecondition> domainToFeedPrecond() {
return (domain) -> {
FeedPrecondition precond = new FeedPrecondition();
return precond;
};
}
/**
* Convert a Domin DatasourceDefinition to the Rest Model
*/
public Function<com.thinkbiganalytics.metadata.api.datasource.DatasourceDefinition, DatasourceDefinition> domainToDsDefinition() {
return (domain) -> {
DatasourceDefinition dsDef = new DatasourceDefinition();
dsDef.setDatasourceType(domain.getDatasourceType());
dsDef.setProcessorType(domain.getProcessorType());
if (domain.getConnectionType() != null) {
dsDef.setConnectionType(DatasourceDefinition.ConnectionType.valueOf(domain.getConnectionType().name()));
}
dsDef.setIdentityString(domain.getIdentityString());
dsDef.setDatasourcePropertyKeys(domain.getDatasourcePropertyKeys());
dsDef.setTitle(domain.getTitle());
dsDef.setDescription(domain.getDescription());
return dsDef;
};
}
public Function<DerivedDatasource, com.thinkbiganalytics.metadata.rest.model.data.DerivedDatasource> domainToDerivedDs() {
return (domain) -> {
com.thinkbiganalytics.metadata.rest.model.data.DerivedDatasource ds = new com.thinkbiganalytics.metadata.rest.model.data.DerivedDatasource();
ds.setId(domain.getId().toString());
ds.setName(domain.getName());
ds.setDescription(domain.getDescription());
ds.setProperties(domain.getProperties());
ds.setDatasourceType(domain.getDatasourceType());
return ds;
};
}
public Function<com.thinkbiganalytics.metadata.api.feed.FeedSource, FeedSource> domainToFeedSource() {
return (domain) -> {
FeedSource src = new FeedSource();
src.setDatasource(domainToDs().apply(domain.getDatasource()));
return src;
};
}
public Function<com.thinkbiganalytics.metadata.api.feed.FeedDestination, FeedDestination> domainToFeedDestination() {
return (domain) -> {
FeedDestination dest = new FeedDestination();
dest.setDatasource(domainToDs().apply(domain.getDatasource()));
return dest;
};
}
public Function<com.thinkbiganalytics.metadata.api.op.FeedOperation, FeedOperation> domainToFeedOp() {
return (domain) -> {
FeedOperation op = new FeedOperation();
op.setOperationId(domain.getId().toString());
op.setStartTime(domain.getStartTime());
op.setStopTime(domain.getStopTime());
op.setState(FeedOperation.State.valueOf(domain.getState().name()));
op.setStatus(domain.getStatus());
op.setResults(domain.getResults().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().toString())));
return op;
};
}
public Function<Category, FeedCategory> domainToFeedCategory() {
return (category) -> {
FeedCategory feedCategory = new FeedCategory();
feedCategory.setId(category.getId().toString());
feedCategory.setSystemName(category.getName());
feedCategory.setDisplayName(category.getDisplayName());
feedCategory.setDescription(category.getDescription());
return feedCategory;
};
}
public Function<com.thinkbiganalytics.metadata.api.feed.Feed, Feed> domainToFeed() {
return domainToFeed(true);
}
public Function<com.thinkbiganalytics.metadata.api.feed.Feed, Feed> domainToFeed(boolean addSources) {
return (domain) -> {
Feed feed = new Feed();
feed.setId(domain.getId().toString());
feed.setSystemName(domain.getName());
feed.setDisplayName(domain.getDisplayName());
feed.setDescription(domain.getDescription());
if (domain.getState() != null) feed.setState(Feed.State.valueOf(domain.getState().name()));
if (domain.getCreatedTime() != null) feed.setCreatedTime(domain.getCreatedTime());
if (domain.getCurrentInitStatus() != null) feed.setCurrentInitStatus(domainToInitStatus().apply(domain.getCurrentInitStatus()));
if (domain.getCategory() != null) {
feed.setCategory(domainToFeedCategory().apply(domain.getCategory()));
}
if (addSources) {
Collection<FeedSource> sources = domain.getSources().stream().map(domainToFeedSource()).collect(Collectors.toList());
feed.setSources(new HashSet<FeedSource>(sources));
Collection<FeedDestination> destinations = domain.getDestinations().stream().map(domainToFeedDestination()).collect(Collectors.toList());
feed.setDestinations(new HashSet<FeedDestination>(destinations));
}
for (Entry<String, Object> entry : domain.getProperties().entrySet()) {
if (entry.getValue() != null) {
feed.getProperties().setProperty(entry.getKey(), entry.getValue().toString());
}
}
ActionGroup allowed = actionsTransform.toActionGroup(null).apply(domain.getAllowedActions());
feed.setAllowedActions(allowed);
return feed;
};
}
public Function<com.thinkbiganalytics.metadata.api.datasource.Datasource, Datasource> domainToDs() {
return domainToDs(true);
}
public Function<com.thinkbiganalytics.metadata.api.datasource.Datasource, Datasource> domainToDs(boolean addConnections) {
return (domain) -> {
Datasource ds;
if (domain instanceof DerivedDatasource) {
ds = domainToDerivedDs().apply((DerivedDatasource) domain);
} else {
ds = new Datasource();
ds.setId(domain.getId().toString());
ds.setName(domain.getName());
ds.setDescription(domain.getDescription());
}
if (addConnections) {
addConnections(domain, ds);
}
return ds;
};
}
protected void addConnections(com.thinkbiganalytics.metadata.api.datasource.Datasource domain, Datasource datasource) {
for (com.thinkbiganalytics.metadata.api.feed.FeedSource domainSrc : domain.getFeedSources()) {
Feed feed = new Feed();
feed.setId(domainSrc.getFeed().getId().toString());
feed.setSystemName(domainSrc.getFeed().getName());
datasource.getSourceForFeeds().add(feed);
}
for (com.thinkbiganalytics.metadata.api.feed.FeedDestination domainDest : domain.getFeedDestinations()) {
Feed feed = new Feed();
feed.setId(domainDest.getFeed().getId().toString());
feed.setSystemName(domainDest.getFeed().getName());
datasource.getDestinationForFeeds().add(feed);
}
}
public com.thinkbiganalytics.metadata.api.feed.Feed updateDomain(Feed feed, com.thinkbiganalytics.metadata.api.feed.Feed domain) {
domain.setDisplayName(feed.getDisplayName());
domain.setDescription(feed.getDescription());
domain.setState(State.valueOf(feed.getState().name()));
return domain;
}
public void validateCreate(Feed feed) {
// TODO Auto-generated method stub
}
public void validateCreate(String fid, FeedDestination dest) {
// TODO Auto-generated method stub
}
public void validateCreate(HiveTableDatasource ds) {
// TODO Auto-generated method stub
}
public void validateCreate(DirectoryDatasource ds) {
// TODO Auto-generated method stub
}
// @formatter:on
}