/**
* Copyright 2015 ArcBees Inc.
*
* 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 com.arcbees.gaestudio.server.service.visualizer;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Provider;
import org.json.JSONException;
import com.arcbees.gaestudio.server.channel.ChannelMessageSender;
import com.arcbees.gaestudio.server.channel.ClientId;
import com.arcbees.gaestudio.server.util.JsonToCsvConverter;
import com.arcbees.gaestudio.shared.Constants;
import com.arcbees.gaestudio.shared.channel.Message;
import com.arcbees.gaestudio.shared.channel.Topic;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
public class ExportServiceImpl implements ExportService {
private final EntitiesService entitiesService;
private final Gson gson;
private final JsonToCsvConverter jsonToCsvConverter;
private final ChannelMessageSender channelMessageSender;
private final Provider<String> clientIdProvider;
@Inject
ExportServiceImpl(
EntitiesService entitiesService,
Gson gson,
JsonToCsvConverter jsonToCsvConverter,
ChannelMessageSender channelMessageSender,
@ClientId Provider<String> clientIdProvider) {
this.entitiesService = entitiesService;
this.gson = gson;
this.jsonToCsvConverter = jsonToCsvConverter;
this.channelMessageSender = channelMessageSender;
this.clientIdProvider = clientIdProvider;
}
@Override
public String exportToJson(String kind, String namespace, String encodedKeys) {
Iterable<Entity> entities;
if (Strings.isNullOrEmpty(encodedKeys)) {
entities = entitiesService.getEntities(kind, namespace, null, Constants.FREE_IMPORT_EXPORT_QUOTA);
} else {
List<Key> keys = decodeKeys(encodedKeys);
entities = entitiesService.getEntities(keys);
}
String json = gson.toJson(entities);
channelMessageSender.sendMessage(clientIdProvider.get(), new Message(Topic.EXPORT_COMPLETED));
return json;
}
@Override
public String exportToCsv(String kind, String namespace, String encodedKeys) throws JSONException {
String json = exportToJson(kind, namespace, encodedKeys);
String csv = jsonToCsvConverter.convert(json);
channelMessageSender.sendMessage(clientIdProvider.get(), new Message(Topic.EXPORT_COMPLETED));
return csv;
}
private List<Key> decodeKeys(String encodedKeys) {
List<String> encodedKeysList = Splitter.on(",").limit(Constants.FREE_IMPORT_EXPORT_QUOTA)
.splitToList(encodedKeys);
return Lists.transform(encodedKeysList, new Function<String, Key>() {
@Override
public Key apply(String input) {
return KeyFactory.stringToKey(input);
}
});
}
}