package com.thinkbiganalytics.metadata.modeshape.datasource;
/*-
* #%L
* thinkbig-metadata-modeshape
* %%
* 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.datasource.Datasource;
import com.thinkbiganalytics.metadata.api.feed.FeedDestination;
import com.thinkbiganalytics.metadata.api.feed.FeedSource;
import com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException;
import com.thinkbiganalytics.metadata.modeshape.common.AbstractJcrAuditableSystemEntity;
import com.thinkbiganalytics.metadata.modeshape.common.JcrEntity;
import com.thinkbiganalytics.metadata.modeshape.feed.JcrFeedDestination;
import com.thinkbiganalytics.metadata.modeshape.feed.JcrFeedSource;
import com.thinkbiganalytics.metadata.modeshape.support.JcrPropertyUtil;
import com.thinkbiganalytics.metadata.modeshape.support.JcrUtil;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
/**
*/
public class JcrDatasource extends AbstractJcrAuditableSystemEntity implements Datasource {
public static final String NODE_TYPE = "tba:datasource";
public static final String SOURCE_NAME = "tba:feedSources";
public static final String DESTINATION_NAME = "tba:feedDestinations";
public static final String TYPE_NAME = "datasourceType";
public JcrDatasource(Node node) {
super(node);
}
@Override
public DatasourceId getId() {
try {
return new JcrDatasource.DatasourceId(getObjectId());
} catch (RepositoryException e) {
throw new MetadataRepositoryException("Failed to retrieve the entity id", e);
}
}
public List<JcrFeedSource> getSources() {
return JcrUtil.getJcrObjects(this.node, SOURCE_NAME, JcrFeedSource.class);
}
public void setSources(List<FeedSource> sources) {
JcrPropertyUtil.setProperty(this.node, SOURCE_NAME, null);
for (FeedSource src : sources) {
Node destNode = ((JcrFeedSource) src).getNode();
addSourceNode(destNode);
}
}
public List<JcrFeedDestination> getDestinations() {
return JcrUtil.getJcrObjects(this.node, DESTINATION_NAME, JcrFeedDestination.class);
}
public void setDestinations(List<FeedDestination> destinations) {
JcrPropertyUtil.setProperty(this.node, DESTINATION_NAME, null);
for (FeedDestination dest : destinations) {
Node destNode = ((JcrFeedSource) dest).getNode();
addDestinationNode(destNode);
}
}
@Override
public String getName() {
return super.getProperty(TITLE, String.class);
}
@Override
public String getDescription() {
return super.getProperty(DESCRIPTION, String.class);
}
@Override
public Set<? extends FeedSource> getFeedSources() {
return JcrPropertyUtil.getReferencedNodeSet(this.node, SOURCE_NAME).stream()
.map(n -> JcrUtil.createJcrObject(n, JcrFeedSource.class))
.collect(Collectors.toSet());
}
@Override
public Set<? extends FeedDestination> getFeedDestinations() {
return JcrPropertyUtil.getReferencedNodeSet(this.node, DESTINATION_NAME).stream()
.map(n -> JcrUtil.createJcrObject(n, JcrFeedDestination.class))
.collect(Collectors.toSet());
}
public void addSourceNode(Node node) {
JcrPropertyUtil.addToSetProperty(this.node, SOURCE_NAME, node, true);
}
public void removeSourceNode(Node node) {
JcrPropertyUtil.removeFromSetProperty(this.node, SOURCE_NAME, node);
}
public void addDestinationNode(Node node) {
JcrPropertyUtil.addToSetProperty(this.node, DESTINATION_NAME, node, true);
}
public void removeDestinationNode(Node node) {
JcrPropertyUtil.removeFromSetProperty(this.node, DESTINATION_NAME, node);
}
public static class DatasourceId extends JcrEntity.EntityId implements Datasource.ID {
public DatasourceId(Serializable ser) {
super(ser);
}
}
}