/*******************************************************************************
* 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.debugger.server;
import com.google.common.io.CharStreams;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.eclipse.che.api.debug.shared.dto.action.ActionDto;
import org.eclipse.che.api.debug.shared.dto.action.ResumeActionDto;
import org.eclipse.che.api.debug.shared.dto.action.StartActionDto;
import org.eclipse.che.api.debug.shared.dto.action.StepIntoActionDto;
import org.eclipse.che.api.debug.shared.dto.action.StepOutActionDto;
import org.eclipse.che.api.debug.shared.dto.action.StepOverActionDto;
import org.eclipse.che.api.debug.shared.dto.action.SuspendActionDto;
import org.eclipse.che.api.debug.shared.model.action.Action;
import org.eclipse.che.dto.server.DtoFactory;
import org.eclipse.che.dto.shared.DTO;
import javax.inject.Singleton;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
/**
* Implementation of {@link MessageBodyReader} needed for binding JSON content to Java Objects.
*
* @author Anatoliy Bazko
* @see DTO
* @see DtoFactory
*/
@Singleton
@Provider
@Consumes({MediaType.APPLICATION_JSON})
public class DebuggerActionProvider implements MessageBodyReader<ActionDto> {
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return ActionDto.class.isAssignableFrom(type);
}
@Override
public ActionDto readFrom(Class<ActionDto> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
InputStream entityStream) throws IOException, WebApplicationException {
String json = CharStreams.toString(new BufferedReader(new InputStreamReader(entityStream)));
JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(json);
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (!jsonObject.has("type")) {
throw new IOException("Json is broken. There is not type key in json object");
}
Action.TYPE actionType = Action.TYPE.valueOf(jsonObject.get("type").getAsString());
switch (actionType) {
case RESUME:
return DtoFactory.getInstance().createDtoFromJson(json, ResumeActionDto.class);
case START:
return DtoFactory.getInstance().createDtoFromJson(json, StartActionDto.class);
case STEP_INTO:
return DtoFactory.getInstance().createDtoFromJson(json, StepIntoActionDto.class);
case STEP_OUT:
return DtoFactory.getInstance().createDtoFromJson(json, StepOutActionDto.class);
case STEP_OVER:
return DtoFactory.getInstance().createDtoFromJson(json, StepOverActionDto.class);
case SUSPEND:
return DtoFactory.getInstance().createDtoFromJson(json, SuspendActionDto.class);
default:
throw new IOException("Can't parse json. Unknown action type: " + actionType);
}
}
}