/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.ambari.server.serveraction.users;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
@Singleton
public class CsvFilePersisterService implements CollectionPersisterService<String, List<String>> {
private static final Logger LOGGER = LoggerFactory.getLogger(CsvFilePersisterService.class);
private String NEW_LINE_SEPARATOR = "\n";
private String csvFile;
private CSVPrinter csvPrinter;
private FileWriter fileWriter;
@AssistedInject
public CsvFilePersisterService(@Assisted String csvFile) {
this.csvFile = csvFile;
}
public Set<PosixFilePermission> getCsvPermissions() {
Set<PosixFilePermission> permissionsSet = new HashSet<>();
permissionsSet.add(PosixFilePermission.OWNER_READ);
permissionsSet.add(PosixFilePermission.OWNER_WRITE);
permissionsSet.add(PosixFilePermission.GROUP_READ);
permissionsSet.add(PosixFilePermission.OTHERS_READ);
return permissionsSet;
}
@Inject
public void init() throws IOException {
Path csv = Files.createFile(Paths.get(csvFile));
Files.setPosixFilePermissions(Paths.get(csvFile), getCsvPermissions());
fileWriter = new FileWriter(csv.toFile());
csvPrinter = new CSVPrinter(fileWriter, CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR));
}
@Override
public boolean persist(Collection<List<String>> collectionData) {
try {
LOGGER.info("Persisting collection to csv file");
csvPrinter.printRecords(collectionData);
LOGGER.info("Collection successfully persisted to csv file.");
return true;
} catch (IOException e) {
LOGGER.error("Failed to persist the collection to csv file", e);
return false;
} finally {
try {
fileWriter.flush();
fileWriter.close();
csvPrinter.close();
} catch (IOException e) {
LOGGER.error("Error while flushing/closing fileWriter/csvPrinter", e);
}
}
}
@Override
public boolean persistMap(Map<String, List<String>> mapData) {
LOGGER.info("Persisting map data to csv file");
Collection<List<String>> collectionData = new ArrayList<>();
for (String key : mapData.keySet()) {
List<String> record = new ArrayList<>();
record.add(key);
record.addAll(mapData.get(key));
collectionData.add(record);
}
return persist(collectionData);
}
}