/*
* Copyright 2014 the original author or authors.
*
* 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.
*/
package org.springframework.xd.dirt.stream.zookeeper;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.CollectionUtils;
//import org.apache.curator.framework.CuratorFramework;
//import org.apache.curator.framework.api.BackgroundPathAndBytesable;
//import org.apache.zookeeper.KeeperException.NoNodeException;
//import org.apache.zookeeper.KeeperException.NodeExistsException;
//import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.xd.dirt.stream.JobDefinition;
import org.springframework.xd.dirt.stream.JobDefinitionRepository;
import org.springframework.xd.dirt.util.PagingUtility;
//import org.springframework.xd.dirt.zookeeper.Paths;
//import org.springframework.xd.dirt.zookeeper.ZooKeeperConnection;
//import org.springframework.xd.dirt.zookeeper.ZooKeeperUtils;
/**
* A Zookeeper backed repository for persisting {@link JobDefinition}s.
*
* @author Mark Fisher
* @author David Turanski
*/
// todo: the JobDefinitionRepository abstraction can be removed once we are fully zk-enabled since we do not need to
// support multiple impls at that point
public class ZooKeeperJobDefinitionRepository implements JobDefinitionRepository, InitializingBean {
private final Logger logger = LoggerFactory.getLogger(ZooKeeperJobDefinitionRepository.class);
// private final ZooKeeperConnection zkConnection;
private final PagingUtility<JobDefinition> pagingUtility = new PagingUtility<JobDefinition>();
private final RepositoryConnectionListener connectionListener = new RepositoryConnectionListener();
// @Autowired
// public ZooKeeperJobDefinitionRepository(ZooKeeperConnection zkConnection) {
// this.zkConnection = zkConnection;
// }
//
// @Override
// public void afterPropertiesSet() throws Exception {
// zkConnection.addListener(connectionListener);
// if (zkConnection.isConnected()) {
// // already connected, invoke the callback directly
// connectionListener.onConnect(zkConnection.getClient());
// }
// }
@Override
public Iterable<JobDefinition> findAll(Sort sort) {
// todo: this ignores the Sort
List<JobDefinition> all = findAll();
Collections.sort(all);
return all;
}
@Override
public Page<JobDefinition> findAll(Pageable pageable) {
return pagingUtility.getPagedData(pageable, findAll());
}
@Override
public <S extends JobDefinition> Iterable<S> save(Iterable<S> entities) {
List<S> results = new ArrayList<S>();
for (S entity : entities) {
results.add(this.save(entity));
}
return results;
}
@Override
public <S extends JobDefinition> S save(S entity) {
// try {
Map<String, String> map = new HashMap<String, String>();
map.put("definition", entity.getDefinition());
//
// CuratorFramework client = zkConnection.getClient();
// String path = Paths.build(Paths.JOBS, entity.getName());
// byte[] binary = ZooKeeperUtils.mapToBytes(map);
//
// BackgroundPathAndBytesable<?> op = client.checkExists().forPath(path) == null
// ? client.create() : client.setData();
//
// op.forPath(path, binary);
// logger.info("Saved job {} with properties {}", path, map);
// }
// catch (Exception e) {
// //NodeExistsException indicates that we tried to create the
// // path just after another thread/jvm successfully created it
// ZooKeeperUtils.wrapAndThrowIgnoring(e, NodeExistsException.class);
// }
return entity;
}
@Override
public JobDefinition findOne(String id) {
// try {
// byte[] bytes = zkConnection.getClient().getData().forPath(Paths.build(Paths.JOBS, id));
// if (bytes == null) {
// return null;
// }
// Map<String, String> map = ZooKeeperUtils.bytesToMap(bytes);
// return new JobDefinition(id, map.get("definition"));
// }
// catch (Exception e) {
// ZooKeeperUtils.wrapAndThrowIgnoring(e, NoNodeException.class);
// }
return null;
}
@Override
public boolean exists(String id) {
// try {
// return (null != zkConnection.getClient().checkExists().forPath(Paths.build(Paths.JOBS, id)));
// }
// catch (Exception e) {
// throw ZooKeeperUtils.wrapThrowable(e);
// }
return false;
}
@Override
public List<JobDefinition> findAll() {
// try {
// return this.findAll(zkConnection.getClient().getChildren().forPath(Paths.JOBS));
// }
// catch (Exception e) {
// throw ZooKeeperUtils.wrapThrowable(e);
// }
return new ArrayList<JobDefinition>();
}
@Override
public List<JobDefinition> findAll(Iterable<String> ids) {
List<JobDefinition> results = new ArrayList<JobDefinition>();
for (String id : ids) {
results.add(this.findOne(id));
}
return results;
}
@Override
public long count() {
// try {
// Stat stat = zkConnection.getClient().checkExists().forPath(Paths.JOBS);
// return stat == null ? 0 : stat.getNumChildren();
// }
// catch (Exception e) {
// throw ZooKeeperUtils.wrapThrowable(e);
// }
return 0;
}
@Override
public void delete(String id) {
// try {
// zkConnection.getClient().delete().deletingChildrenIfNeeded().forPath(Paths.build(Paths.JOBS, id));
// }
// catch (Exception e) {
// //NoNodeException - nothing to delete
// ZooKeeperUtils.wrapAndThrowIgnoring(e, NoNodeException.class);
// }
}
@Override
public void delete(JobDefinition entity) {
this.delete(entity.getName());
}
@Override
public void delete(Iterable<? extends JobDefinition> entities) {
for (JobDefinition JobDefinition : entities) {
this.delete(JobDefinition);
}
}
@Override
public void deleteAll() {
// try {
// delete(findAll());
// }
// catch (Exception e) {
// //NoNodeException - no top level node, ignore
// ZooKeeperUtils.wrapAndThrowIgnoring(e, NoNodeException.class);
// }
}
@Override
public Iterable<JobDefinition> findAllInRange(String from, boolean fromInclusive, String to, boolean toInclusive) {
List<JobDefinition> all = findAll();
if (CollectionUtils.isEmpty(all)) {
return Collections.emptyList();
}
Collections.sort(all);
List<JobDefinition> results = new ArrayList<JobDefinition>();
for (JobDefinition definition : all) {
if (definition.getName().compareTo(to) > 1) {
break;
}
if (definition.getName().compareTo(from) < 0) {
continue;
}
results.add(definition);
}
return results;
}
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
}
}