blob: 2c661ee6aafc7bdfcaba10ec54597394f5b0d85c [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2018 Microsoft Corporation and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
******************************************************************************/
package org.eclipse.lsp4j.adapters;
import java.io.IOException;
import org.eclipse.lsp4j.CreateFile;
import org.eclipse.lsp4j.DeleteFile;
import org.eclipse.lsp4j.RenameFile;
import org.eclipse.lsp4j.ResourceOperation;
import org.eclipse.lsp4j.ResourceOperationKind;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
public class ResourceOperationTypeAdapter implements TypeAdapterFactory {
@SuppressWarnings("unchecked")
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (!ResourceOperation.class.isAssignableFrom(type.getRawType())) {
return null;
}
return (TypeAdapter<T>) new InnerResourceOperationTypeAdapter(this, gson).nullSafe();
}
private static class InnerResourceOperationTypeAdapter extends TypeAdapter<ResourceOperation> {
TypeAdapter<CreateFile> createFileAdapter;
TypeAdapter<DeleteFile> deleteFileAdapter;
TypeAdapter<RenameFile> renameFileAdapter;
InnerResourceOperationTypeAdapter(TypeAdapterFactory factory, Gson gson) {
createFileAdapter = gson.getDelegateAdapter(factory, TypeToken.get(CreateFile.class));
deleteFileAdapter = gson.getDelegateAdapter(factory, TypeToken.get(DeleteFile.class));
renameFileAdapter = gson.getDelegateAdapter(factory, TypeToken.get(RenameFile.class));
}
@Override
public void write(JsonWriter out, ResourceOperation value) throws IOException {
if (value.getClass().isAssignableFrom(CreateFile.class)) {
createFileAdapter.write(out, (CreateFile) value);
} else if (value.getClass().isAssignableFrom(DeleteFile.class)) {
deleteFileAdapter.write(out, (DeleteFile) value);
} else if (value.getClass().isAssignableFrom(RenameFile.class)) {
renameFileAdapter.write(out, (RenameFile) value);
}
}
@Override
public ResourceOperation read(JsonReader in) throws IOException {
JsonObject objectJson = JsonParser.parseReader(in).getAsJsonObject();
JsonElement value = objectJson.get("kind");
if (value != null && value.isJsonPrimitive()) {
String kindValue = value.getAsString();
if (ResourceOperationKind.Create.equals(kindValue)) {
return createFileAdapter.fromJsonTree(objectJson);
} else if (ResourceOperationKind.Delete.equals(kindValue)) {
return deleteFileAdapter.fromJsonTree(objectJson);
} else if (ResourceOperationKind.Rename.equals(kindValue)) {
return renameFileAdapter.fromJsonTree(objectJson);
}
}
throw new JsonParseException(
"The ResourceOperation object either has null \"kind\" value or the \"kind\" value is not valid.");
}
}
}