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.google.common.collect.Sets;
import com.thinkbiganalytics.metadata.api.datasource.DatasourceDefinition;
import com.thinkbiganalytics.metadata.api.datasource.DatasourceDefinitionProvider;
import com.thinkbiganalytics.metadata.modeshape.BaseJcrProvider;
import com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException;
import com.thinkbiganalytics.metadata.modeshape.common.EntityUtil;
import com.thinkbiganalytics.metadata.modeshape.common.JcrEntity;
import com.thinkbiganalytics.metadata.modeshape.support.JcrQueryUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
/**
*/
public class JcrDatasourceDefinitionProvider extends BaseJcrProvider<DatasourceDefinition, DatasourceDefinition.ID> implements DatasourceDefinitionProvider {
private static final Logger log = LoggerFactory.getLogger(JcrDatasourceDefinitionProvider.class);
@Override
public Class<? extends DatasourceDefinition> getEntityClass() {
return JcrDatasourceDefinition.class;
}
@Override
public Class<? extends JcrEntity> getJcrEntityClass() {
return JcrDatasourceDefinition.class;
}
@Override
public String getNodeType(Class<? extends JcrEntity> jcrEntityType) {
return JcrDatasourceDefinition.NODE_TYPE;
}
@Override
public DatasourceDefinition.ID resolveId(Serializable fid) {
return new JcrDatasourceDefinition.DatasourceDefinitionId((fid));
}
@Override
public Set<DatasourceDefinition> getDatasourceDefinitions() {
List<DatasourceDefinition> list = findAll();
if (list != null) {
return Sets.newHashSet(list);
}
return null;
}
public DatasourceDefinition ensureDatasourceDefinition(String processorType) {
DatasourceDefinition dsDef = findByProcessorType(processorType);
if (dsDef == null) {
try {
if (!getSession().getRootNode().hasNode("metadata/datasourceDefinitions")) {
getSession().getRootNode().addNode("metadata/datasourceDefinitions", "tba:datasourceDefinitionsFolder");
}
} catch (RepositoryException e) {
log.error("Failed to create datasource definitions node", e);
}
String path = EntityUtil.pathForDatasourceDefinition();
Node node = findOrCreateEntityNode(path, processorType, getJcrEntityClass());
JcrDatasourceDefinition def = new JcrDatasourceDefinition(node);
dsDef = def;
}
return dsDef;
}
/**
* TODO change to go against Path directly
*/
public JcrDatasourceDefinition findByProcessorType(String processorType) {
String
query =
"SELECT * from " + EntityUtil.asQueryProperty(JcrDatasourceDefinition.NODE_TYPE) + " as e WHERE e." + EntityUtil.asQueryProperty(JcrDatasourceDefinition.PROCESSOR_TYPE)
+ " = $processorType";
Map<String, String> bindParams = new HashMap<>();
bindParams.put("processorType", processorType);
return JcrQueryUtil.findFirst(getSession(), query, bindParams, JcrDatasourceDefinition.class);
}
public void removeAll() {
try {
getSession().removeItem(EntityUtil.pathForDatasourceDefinition());
} catch (Exception e) {
throw new MetadataRepositoryException("Unable to remove DatasourceDefinitions ", e);
}
}
}