/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.vfs.impl.file;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Maps.newHashMap;
import static com.google.common.collect.Maps.newHashMapWithExpectedSize;
import static com.google.common.collect.Maps.newLinkedHashMap;
/**
* Serializer for properties of VirtualFile.
*
* @author andrew00x
*/
public class FileMetadataSerializer implements DataSerializer<Map<String, String>> {
@Override
public void write(DataOutput output, Map<String, String> props) throws IOException {
output.writeInt(props.size());
for (Map.Entry<String, String> entry : props.entrySet()) {
String value = entry.getValue();
if (value != null) {
final String name = entry.getKey();
output.writeUTF(name);
final List<String> asList = Splitter.on(',').splitToList(value);
output.writeInt(asList.size());
for (String single : asList) {
output.writeUTF(single);
}
}
}
}
@Override
public Map<String, String> read(DataInput input) throws IOException {
final int recordsNum = input.readInt();
if (recordsNum == 0) {
return newLinkedHashMap();
}
final Map<String, String> properties = newHashMapWithExpectedSize(recordsNum);
final List<String> valuesList = newArrayList();
int readRecords = 0;
while (readRecords < recordsNum) {
String name = input.readUTF();
final int valueItemNum = input.readInt();
valuesList.clear();
for (int i = 0; i < valueItemNum; i++) {
valuesList.add(input.readUTF());
}
properties.put(name, Joiner.on(',').join(valuesList));
++readRecords;
}
return properties;
}
}