Search in sources :

Example 6 with SParameter

use of org.bimserver.shared.meta.SParameter in project BIMserver by opensourceBIM.

the class ProtocolBuffersGenerator method createRequestMessage.

private void createRequestMessage(StringBuilder builder, SMethod method, String messageName) {
    if (generatedMessages.containsKey(messageName)) {
        return;
    }
    StringBuilder messageBuilder = new StringBuilder();
    generatedMessages.put(messageName, messageName);
    messageBuilder.append("message " + messageName + " {\n");
    int counter = 1;
    for (SParameter sParameter : method.getParameters()) {
        messageBuilder.append('\t');
        if (sParameter.isAggregate()) {
            messageBuilder.append("repeated ");
        } else {
            messageBuilder.append("optional ");
        }
        messageBuilder.append(createMessage(builder, sParameter.getBestType()) + " " + sParameter.getName() + " = " + (counter++) + ";\n");
    }
    messageBuilder.append("}\n\n");
    builder.append(messageBuilder);
}
Also used : SParameter(org.bimserver.shared.meta.SParameter)

Example 7 with SParameter

use of org.bimserver.shared.meta.SParameter in project BIMserver by opensourceBIM.

the class ReflectiveRpcChannel method callBlockingMethod.

@SuppressWarnings({ "unchecked", "rawtypes" })
public Message callBlockingMethod(MethodDescriptorContainer methodDescriptor, Message request) {
    FieldDescriptor errorMessageField = methodDescriptor.getOutputField("errorMessage");
    DynamicMessage response = DynamicMessage.getDefaultInstance(methodDescriptor.getOutputDescriptor());
    Descriptor inputType = methodDescriptor.getInputDescriptor();
    SMethod sMethod = servicesMap.getBySimpleName(methodDescriptor.getServiceDescriptorContainer().getName()).getSMethod(methodDescriptor.getName());
    if (sMethod == null) {
        LOGGER.info("Method " + methodDescriptor.getName() + " not found");
        return null;
    } else {
        try {
            KeyValuePair[] arguments = new KeyValuePair[inputType.getFields().size()];
            int i = 0;
            for (FieldDescriptor fieldDescriptor : inputType.getFields()) {
                SParameter sParameter = sMethod.getParameter(i);
                Object value = request.getField(fieldDescriptor);
                if (value instanceof EnumValueDescriptor) {
                    EnumValueDescriptor enumValueDescriptor = (EnumValueDescriptor) value;
                    Class en = getJavaType(fieldDescriptor);
                    arguments[i] = new KeyValuePair(fieldDescriptor.getName(), en.getEnumConstants()[enumValueDescriptor.getIndex()]);
                } else if (value instanceof ByteString) {
                    ByteString byteString = (ByteString) value;
                    DataSource dataSource = new org.bimserver.utils.ByteArrayDataSource("bytes", byteString.toByteArray());
                    DataHandler dataHandler = new DataHandler(dataSource);
                    arguments[i] = new KeyValuePair(fieldDescriptor.getName(), dataHandler);
                } else if (value instanceof DynamicMessage) {
                    arguments[i] = new KeyValuePair(fieldDescriptor.getName(), convertProtocolBuffersMessageToSObject((DynamicMessage) value, null, sParameter.getType()));
                } else if (value instanceof Collection) {
                    Collection col = (Collection) value;
                    if (sParameter.getType().isList()) {
                        List list = new ArrayList(col);
                        arguments[i] = new KeyValuePair(fieldDescriptor.getName(), list);
                    } else if (sParameter.getType().isSet()) {
                        Set set = new HashSet(col);
                        arguments[i] = new KeyValuePair(fieldDescriptor.getName(), set);
                    }
                } else {
                    arguments[i] = new KeyValuePair(fieldDescriptor.getName(), value);
                }
                i++;
            }
            Object result = sMethod.invoke(publicInterface, service, arguments);
            Builder builder = response.newBuilderForType();
            if (methodDescriptor.getOutputDescriptor().getName().equals("VoidResponse")) {
                builder.setField(errorMessageField, "OKE");
            } else {
                FieldDescriptor valueField = protocolBuffersMetaData.getMessageDescriptor(response.getDescriptorForType().getName()).getField("value");
                if (result != null) {
                    if (valueField.getType().getJavaType() == JavaType.ENUM) {
                        builder.setField(valueField, valueField.getEnumType().findValueByName(result.toString()));
                    } else if (valueField.getType().getJavaType() != JavaType.MESSAGE) {
                        if (result instanceof Date) {
                            builder.setField(valueField, ((Date) result).getTime());
                        } else {
                            if (valueField.isRepeated()) {
                                builder.setField(valueField, new ArrayList());
                            } else {
                                builder.setField(valueField, result);
                            }
                        }
                    } else if (result instanceof List) {
                        List list = new ArrayList();
                        List originalList = (List) result;
                        for (Object object : originalList) {
                            list.add(convertSObjectToProtocolBuffersObject((SBase) object, sMethod.getBestReturnType()));
                        }
                        builder.setField(valueField, list);
                    } else if (result instanceof Set) {
                        List list = new ArrayList();
                        Set originalSet = (Set) result;
                        for (Object object : originalSet) {
                            list.add(convertSObjectToProtocolBuffersObject((SBase) object, sMethod.getBestReturnType()));
                        }
                        builder.setField(valueField, list);
                    } else {
                        builder.setField(valueField, convertSObjectToProtocolBuffersObject((SBase) result, sMethod.getBestReturnType()));
                    }
                }
                builder.setField(errorMessageField, "OKE");
            }
            return builder.build();
        // } catch (InvocationTargetException e) {
        // Builder errorMessage = response.newBuilderForType();
        // if (e.getTargetException() != null && e.getTargetException().getMessage() != null) {
        // errorMessage.setField(errorMessageField, e.getTargetException().getMessage());
        // } else {
        // if (e.getMessage() != null) {
        // errorMessage.setField(errorMessageField, e.getMessage());
        // } else {
        // errorMessage.setField(errorMessageField, "Unknown error");
        // }
        // }
        // return errorMessage.build();
        } catch (Exception e) {
            if (!(e instanceof org.bimserver.shared.exceptions.ServiceException)) {
                LOGGER.error("", e);
            }
            Builder errorMessage = response.newBuilderForType();
            if (e.getMessage() != null) {
                errorMessage.setField(errorMessageField, e.getMessage());
            } else {
                LOGGER.error("", e);
                errorMessage.setField(errorMessageField, "Unknown error");
            }
            return errorMessage.build();
        }
    }
}
Also used : HashSet(java.util.HashSet) Set(java.util.Set) ByteString(com.google.protobuf.ByteString) Builder(com.google.protobuf.Message.Builder) ArrayList(java.util.ArrayList) DynamicMessage(com.google.protobuf.DynamicMessage) DataHandler(javax.activation.DataHandler) FieldDescriptor(com.google.protobuf.Descriptors.FieldDescriptor) SParameter(org.bimserver.shared.meta.SParameter) ArrayList(java.util.ArrayList) List(java.util.List) SMethod(org.bimserver.shared.meta.SMethod) EnumValueDescriptor(com.google.protobuf.Descriptors.EnumValueDescriptor) HashSet(java.util.HashSet) KeyValuePair(org.bimserver.shared.reflector.KeyValuePair) Date(java.util.Date) DataSource(javax.activation.DataSource) SBase(org.bimserver.shared.meta.SBase) Descriptor(com.google.protobuf.Descriptors.Descriptor) FieldDescriptor(com.google.protobuf.Descriptors.FieldDescriptor) EnumValueDescriptor(com.google.protobuf.Descriptors.EnumValueDescriptor) Collection(java.util.Collection)

Example 8 with SParameter

use of org.bimserver.shared.meta.SParameter in project BIMserver by opensourceBIM.

the class JsonHandler method processSingleRequest.

private void processSingleRequest(JsonObject request, String jsonToken, String oAuthCode, HttpServletRequest httpRequest, JsonWriter writer) throws Exception {
    long s = System.nanoTime();
    if (!request.has("interface")) {
        throw new UserException("No \"interface\" parameter found in request");
    }
    String interfaceName = request.get("interface").getAsString();
    if (!request.has("method")) {
        throw new UserException("No \"method\" parameter found in request");
    }
    String methodName = request.get("method").getAsString();
    SService sService = bimServer.getServicesMap().getByName(interfaceName);
    if (sService == null) {
        sService = bimServer.getServicesMap().getBySimpleName(interfaceName);
    }
    if (sService == null) {
        throw new UserException("No service found with name " + interfaceName);
    }
    SMethod method = sService.getSMethod(methodName);
    if (method == null) {
        SMethod alternative = bimServer.getServicesMap().findMethod(methodName);
        if (alternative == null) {
            throw new UserException("Method " + methodName + " not found on " + interfaceName);
        } else {
            throw new UserException("Method " + methodName + " not found on " + interfaceName + " (suggestion: " + alternative.getService().getSimpleName() + ")");
        }
    }
    KeyValuePair[] parameters = new KeyValuePair[method.getParameters().size()];
    if (request.has("parameters")) {
        JsonObject parametersJson = request.getAsJsonObject("parameters");
        for (int i = 0; i < method.getParameters().size(); i++) {
            SParameter parameter = method.getParameter(i);
            if (parametersJson.has(parameter.getName())) {
                parameters[i] = new KeyValuePair(parameter.getName(), converter.fromJson(parameter.getType(), parameter.getGenericType(), parametersJson.get(parameter.getName())));
            } else {
                LOGGER.error("Missing parameter: " + method.getName() + " -> " + parameter.getName());
                throw new UserException("Missing parameter: " + method.getName() + " -> " + parameter.getName());
            }
        }
    } else if (parameters.length > 0) {
        throw new UserException("Missing 'parameters' field, expected " + parameters.length + " parameters");
    }
    PublicInterface service = getServiceInterface(httpRequest, bimServer, sService.getInterfaceClass(), methodName, jsonToken, oAuthCode);
    String oldThreadName = Thread.currentThread().getName();
    Thread.currentThread().setName(interfaceName + "." + methodName);
    try {
        Recording recording = bimServer.getMetricsRegistry().startRecording(sService, method);
        Object result = method.invoke(sService.getInterfaceClass(), service, parameters);
        recording.finish();
        // can start streaming
        if (writer != null) {
            if (result == null) {
                writer.beginObject();
                writer.name("result");
                writer.beginObject();
                writer.endObject();
                writer.endObject();
            } else {
                writer.beginObject();
                writer.name("result");
                converter.toJson(result, writer);
                writer.endObject();
            }
        }
        long e = System.nanoTime();
        LOGGER.debug(interfaceName + "." + methodName + " " + ((e - s) / 1000000) + "ms");
    } finally {
        Thread.currentThread().setName(oldThreadName);
    }
}
Also used : KeyValuePair(org.bimserver.shared.reflector.KeyValuePair) JsonObject(com.google.gson.JsonObject) PublicInterface(org.bimserver.shared.interfaces.PublicInterface) SParameter(org.bimserver.shared.meta.SParameter) JsonObject(com.google.gson.JsonObject) UserException(org.bimserver.shared.exceptions.UserException) SMethod(org.bimserver.shared.meta.SMethod) SService(org.bimserver.shared.meta.SService)

Aggregations

SParameter (org.bimserver.shared.meta.SParameter)8 SMethod (org.bimserver.shared.meta.SMethod)7 UserException (org.bimserver.shared.exceptions.UserException)3 SService (org.bimserver.shared.meta.SService)3 KeyValuePair (org.bimserver.shared.reflector.KeyValuePair)3 JsonObject (com.google.gson.JsonObject)2 ArrayList (java.util.ArrayList)2 CannotCompileException (javassist.CannotCompileException)2 CtClass (javassist.CtClass)2 CtConstructor (javassist.CtConstructor)2 CtField (javassist.CtField)2 CtMethod (javassist.CtMethod)2 NotFoundException (javassist.NotFoundException)2 DataHandler (javax.activation.DataHandler)2 ByteString (com.google.protobuf.ByteString)1 Descriptor (com.google.protobuf.Descriptors.Descriptor)1 EnumValueDescriptor (com.google.protobuf.Descriptors.EnumValueDescriptor)1 FieldDescriptor (com.google.protobuf.Descriptors.FieldDescriptor)1 DynamicMessage (com.google.protobuf.DynamicMessage)1 Builder (com.google.protobuf.Message.Builder)1