package io.fathom.cloud.dbaas;
import io.fathom.cloud.services.DbaasService;
import javax.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.persist.Transactional;
@Singleton
@Transactional
public class DbaasServiceImpl implements DbaasService {
private static final Logger log = LoggerFactory.getLogger(DbaasService.class);
// private static final Comparator<Instance> ORDER_BY_NAME = new
// Comparator<Instance>() {
// @Override
// public int compare(Instance o1, Instance o2) {
// String s1 = o1.getName();
// String s2 = o2.getName();
//
// if (s1 == null) {
// return s2 == null ? 0 : -1;
// }
//
// if (s2 == null) {
// return 1;
// }
//
// return s1.compareTo(s2);
// //
// //
// // long v1 = o1.getId();
// // long v2 = o2.getId();
// // return Long.compare(v1, v2);
// }
// };
//
// @Inject
// DbaasRepository imageRepository;
//
// public List<Instance> listImages(Project project, ImageFilter filter)
// throws CloudException {
// List<Instance> matching = Lists.newArrayList();
// for (ImageData image : imageRepository.getImages().list()) {
// if (!isVisible(project, image)) {
// continue;
// }
//
// if (!filter.matches(image)) {
// continue;
// }
//
// matching.add(new ImageImpl(image));
// }
//
// Collections.sort(matching, ORDER_BY_NAME);
// return matching;
// }
//
// @Override
// public List<Instance> listImages(Project project) throws CloudException {
// ImageFilter filter = new ImageFilter();
// return listImages(project, filter);
// }
//
// @Override
// public ImageImpl findImage(Project project, long imageId) throws
// CloudException {
// ImageData image = imageRepository.getImages().find(imageId);
// if (image != null) {
// if (!isVisible(project, image)) {
// image = null;
// }
// }
// if (image == null) {
// return null;
// }
// return new ImageImpl(image);
// }
//
// private boolean isVisible(Project project, ImageData image) {
// if (image.hasImageState()) {
// switch (image.getImageState()) {
// case DELETED:
// return false;
//
// default:
// // Not blocked
// break;
// }
// }
//
// if (image.getIsPublic()) {
// return true;
// }
// if (image.getOwnerProject() == project.getId()) {
// return true;
// }
// return false;
// }
//
// public ImageData deleteImage(Project project, long id) throws
// CloudException {
// ImageImpl i = findImage(project, id);
// if (i == null) {
// // We check because it might not be visible!
// return null;
// }
//
// ImageData.Builder b = ImageData.newBuilder(i.getData());
// b.setImageState(ImageState.DELETED);
// b.setDeletedAt(Clock.getTimestamp());
//
// // TODO: Clean up old deleted images?
// // TODO: Remove from storage?
//
// return imageRepository.getImages().update(b);
// }
//
// public ImageData changeTags(Project project, int id, List<String>
// addTags, List<String> removeTags)
// throws CloudException {
// ImageImpl i = findImage(project, id);
// if (i == null) {
// throw new WebApplicationException(Status.NOT_FOUND);
// }
//
// ImageData.Builder b = ImageData.newBuilder(i.getData());
//
// List<String> tags = Lists.newArrayList(b.getTagList());
//
// for (String addTag : addTags) {
// if (tags.contains(addTag)) {
// continue;
// }
// tags.add(addTag);
// }
//
// tags.removeAll(removeTags);
//
// b.clearTag();
// b.addAllTag(tags);
//
// return imageRepository.getImages().update(b);
// }
//
// public ImageData updateImage(Project project, long id, Map<String,
// String> metadata) throws CloudException {
// ImageImpl i = findImage(project, id);
// if (i == null) {
// throw new WebApplicationException(Status.NOT_FOUND);
// }
//
// ImageData changes;
//
// {
// ImageData.Builder b = ImageData.newBuilder();
// mapHeadersToBuilder(metadata, b);
// changes = b.buildPartial();
// }
//
// Set<String> allowed = Sets.newHashSet("is_public", "name", "attributes",
// "is_protected");
//
// for (Entry<FieldDescriptor, Object> entry :
// changes.getAllFields().entrySet()) {
// FieldDescriptor field = entry.getKey();
// String key = field.getName();
//
// if (!allowed.contains(key)) {
// Object existing = i.getData().getField(field);
// if (!Objects.equal(existing, entry.getValue())) {
// log.warn("Attempt to update blocked field: " + key);
// throw new IllegalArgumentException();
// }
// }
// }
//
// ImageData.Builder b = ImageData.newBuilder(i.getData());
//
// b.mergeFrom(changes);
//
// removeRepeatedAttributes(b.getAttributesBuilder());
//
// return imageRepository.getImages().update(b);
// }
//
// private void removeRepeatedAttributes(Attributes.Builder attributes) {
// Map<String, KeyValueData> map = Maps.newLinkedHashMap();
//
// for (KeyValueData kv : attributes.getUserAttributesList()) {
// if (!kv.hasKey()) {
// continue;
// }
//
// map.put(kv.getKey(), kv);
// }
//
// if (map.size() != attributes.getUserAttributesCount()) {
// attributes.clearUserAttributes();
// for (KeyValueData kv : map.values()) {
// attributes.addUserAttributes(kv);
// }
// }
// }
//
// public BlobData findImageData(Project project, ImageData image) throws
// IOException {
// ImageLocation imageLocation = image.getLocation();
// if (imageLocation.hasStored()) {
// String cookie = imageLocation.getStored();
//
// BlobData blob = imageDataService.getImageFile(cookie);
//
// return blob;
// }
// return null;
// }
//
// // public void changeMembers(long id, List<String> addMembers,
// // List<String> removeMembers) {
// // ImageData i = findImage(id);
// // if (i == null) {
// // throw new WebApplicationException(Status.NOT_FOUND);
// // }
// //
// // ImageData.Builder b = ImageData.newBuilder(i);
// //
// // List<String> members = Lists.newArrayList(b.getMembers());
// //
// // for (String removeMember : removeMembers) {
// // if (members.contains(removeMember)) {
// // continue;
// // }
// // members.add(removeMember);
// // }
// //
// // members.removeAll(removeMembers);
// //
// // b.clearMember();
// // b.addallMembers(members);
// //
// // return imageRepository.getImages().update(b);
// // }
//
// @Override
// public BlobData getImageBlob(Instance i) throws IOException {
// ImageImpl image = (ImageImpl) i;
// ImageData data = image.getData();
//
// Project project = new Project(data.getOwnerProject());
// BlobData imageData = findImageData(project, data);
// return imageData;
// }
//
// @Override
// public ImageImpl createImage(long projectId, Map<String, String>
// metadata) throws CloudException {
// ImageData.Builder b = ImageData.newBuilder();
// b.setIsPublic(false);
//
// if (metadata != null) {
// mapHeadersToBuilder(metadata, b);
// }
//
// long t = Clock.getTimestamp();
// b.setCreatedAt(t);
// b.setUpdatedAt(t);
//
// b.setImageState(ImageState.QUEUED);
// b.setOwnerProject(projectId);
//
// ImageData created = imageRepository.getImages().create(b);
// return new ImageImpl(created);
// }
//
// @Override
// public ImageImpl uploadData(Instance i, BlobData src) throws IOException,
// CloudException {
// ImageImpl image = (ImageImpl) i;
// if (image == null || src == null) {
// throw new IllegalArgumentException();
// }
//
// long size = src.size();
//
// ImageData existing =
// imageRepository.getImages().find(image.data.getId());
// if (existing == null) {
// throw new WebApplicationException(Status.NOT_FOUND);
// }
// ImageData.Builder b = ImageData.newBuilder(existing);
//
// if (b.hasImageSize()) {
// if (b.getImageSize() != size) {
// throw new IllegalArgumentException();
// }
// }
//
// b.setUpdatedAt(Clock.getTimestamp());
// b.setImageSize(size);
// b.setImageState(ImageState.ACTIVE);
//
// {
// String stored = imageDataService.storeImageFile(src);
//
// ImageLocation.Builder loc = b.getLocationBuilder();
// loc.setStored(stored);
//
// b.setImageChecksum(src.getHash());
// }
//
// ImageData updated = imageRepository.getImages().update(b);
//
// return new ImageImpl(updated);
// }
//
// public static void mapHeadersToBuilder(Map<String, String> properties,
// ImageData.Builder b) {
// for (Entry<String, String> property : properties.entrySet()) {
// String key = property.getKey();
// String value = property.getValue();
//
// if (key.startsWith("property-")) {
// key = key.substring(9);
//
// KeyValueData.Builder kv =
// b.getAttributesBuilder().addUserAttributesBuilder();
// kv.setKey(key);
// kv.setValue(value);
// } else if (key.equals(DbaasService.METADATA_KEY_NAME)) {
// b.setName(value);
// } else if (key.equals(DbaasService.METADATA_KEY_CONTAINER_FORMAT)) {
// b.setContainerFormat(value);
// } else if (key.equals(DbaasService.METADATA_KEY_DISK_FORMAT)) {
// b.setDiskFormat(value);
// } else if (key.equals(DbaasService.METADATA_KEY_SIZE)) {
// b.setImageSize(Long.valueOf(value));
// } else if (key.equals("is_public")) {
// boolean isPublic = Boolean.parseBoolean(value);
// b.setIsPublic(isPublic);
// } else if (key.equals("protected")) {
// boolean isProtected = Boolean.parseBoolean(value);
// b.setIsProtected(isProtected);
// } else {
// log.warn("Ignoring unknown property: " + key);
// }
// }
// }
//
// public static class ImageImpl implements DbaasService.Instance {
// final ImageData data;
//
// public ImageImpl(ImageData data) {
// this.data = data;
// }
//
// @Override
// public long getId() {
// return data.getId();
// }
//
// @Override
// public String getUniqueKey() {
// return Hex.toHex(data.getImageChecksum().toByteArray());
// }
//
// public ImageData getData() {
// return data;
// }
//
// @Override
// public String getName() {
// return data.getName();
// }
//
// @Override
// public String getStatus() {
// return data.getImageState().name();
// }
// }
//
// @Override
// public String getUrl(HttpServletRequest httpRequest, long imageId) {
// String url = Urls.getRequestUrl(httpRequest);
//
// if (!url.endsWith("/")) {
// url += "/";
// }
//
// url += "openstack/images/v1/images/" + imageId;
//
// return url;
// }
}