Search in sources :

Example 1 with SingleModel

use of com.liferay.apio.architect.single.model.SingleModel in project com-liferay-apio-architect by liferay.

the class SingleModelMessageBodyWriter method writeTo.

@Override
public void writeTo(Try.Success<SingleModel<T>> success, Class<?> clazz, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8);
    PrintWriter printWriter = new PrintWriter(outputStreamWriter, true);
    SingleModel<T> singleModel = success.getValue();
    RequestInfo requestInfo = RequestInfo.create(builder -> builder.httpHeaders(_httpHeaders).httpServletRequest(_httpServletRequest).serverURL(_providerManager.provideMandatory(_httpServletRequest, ServerURL.class)).embedded(_providerManager.provideOptional(_httpServletRequest, Embedded.class).orElse(__ -> false)).fields(_providerManager.provideOptional(_httpServletRequest, Fields.class).orElse(__ -> string -> true)).language(_providerManager.provideOptional(_httpServletRequest, Language.class).orElse(Locale::getDefault)).build());
    Optional<SingleModelMessageMapper<T>> optional = _singleModelMessageMapperManager.getSingleModelMessageMapperOptional(_request);
    SingleModelMessageMapper<T> singleModelMessageMapper = optional.orElseThrow(NotSupportedException::new);
    SingleModelWriter<T> singleModelWriter = SingleModelWriter.create(builder -> builder.singleModel(singleModel).modelMessageMapper(singleModelMessageMapper).pathFunction(_pathIdentifierMapperManager::mapToPath).resourceNameFunction(_nameManager::getNameOptional).representorFunction(name -> unsafeCast(_representableManager.getRepresentorOptional(name))).requestInfo(requestInfo).singleModelFunction(this::_getSingleModelOptional).build());
    httpHeaders.put(CONTENT_TYPE, Collections.singletonList(singleModelMessageMapper.getMediaType()));
    Optional<String> resultOptional = singleModelWriter.write();
    resultOptional.ifPresent(printWriter::write);
    printWriter.close();
}
Also used : CONTENT_TYPE(javax.ws.rs.core.HttpHeaders.CONTENT_TYPE) Provider(javax.ws.rs.ext.Provider) RequestInfo(com.liferay.apio.architect.request.RequestInfo) ItemRoutes(com.liferay.apio.architect.routes.ItemRoutes) Embedded(com.liferay.apio.architect.response.control.Embedded) MessageBodyWriter(javax.ws.rs.ext.MessageBodyWriter) Identifier(com.liferay.apio.architect.identifier.Identifier) SingleModelMessageMapperManager(com.liferay.apio.architect.wiring.osgi.manager.message.json.SingleModelMessageMapperManager) HttpServletRequest(javax.servlet.http.HttpServletRequest) MediaType(javax.ws.rs.core.MediaType) Component(org.osgi.service.component.annotations.Component) Unsafe(com.liferay.apio.architect.unsafe.Unsafe) SingleModelWriter(com.liferay.apio.architect.writer.SingleModelWriter) Locale(java.util.Locale) Fields(com.liferay.apio.architect.response.control.Fields) GenericUtil(com.liferay.apio.architect.wiring.osgi.util.GenericUtil) OutputStreamWriter(java.io.OutputStreamWriter) ProviderManager(com.liferay.apio.architect.wiring.osgi.manager.ProviderManager) SingleModel(com.liferay.apio.architect.single.model.SingleModel) NotSupportedException(javax.ws.rs.NotSupportedException) OutputStream(java.io.OutputStream) PrintWriter(java.io.PrintWriter) Try(com.liferay.apio.architect.functional.Try) PathIdentifierMapperManager(com.liferay.apio.architect.wiring.osgi.manager.PathIdentifierMapperManager) Context(javax.ws.rs.core.Context) NameManager(com.liferay.apio.architect.wiring.osgi.manager.representable.NameManager) RepresentableManager(com.liferay.apio.architect.wiring.osgi.manager.representable.RepresentableManager) SingleModelMessageMapper(com.liferay.apio.architect.message.json.SingleModelMessageMapper) ServerURL(com.liferay.apio.architect.url.ServerURL) IOException(java.io.IOException) StandardCharsets(java.nio.charset.StandardCharsets) MultivaluedMap(javax.ws.rs.core.MultivaluedMap) IdentifierClassManager(com.liferay.apio.architect.wiring.osgi.manager.representable.IdentifierClassManager) Language(com.liferay.apio.architect.language.Language) HttpHeaders(javax.ws.rs.core.HttpHeaders) Type(java.lang.reflect.Type) Unsafe.unsafeCast(com.liferay.apio.architect.unsafe.Unsafe.unsafeCast) Annotation(java.lang.annotation.Annotation) Optional(java.util.Optional) WebApplicationException(javax.ws.rs.WebApplicationException) Request(javax.ws.rs.core.Request) Reference(org.osgi.service.component.annotations.Reference) Collections(java.util.Collections) ItemRouterManager(com.liferay.apio.architect.wiring.osgi.manager.router.ItemRouterManager) SingleModelMessageMapper(com.liferay.apio.architect.message.json.SingleModelMessageMapper) RequestInfo(com.liferay.apio.architect.request.RequestInfo) Fields(com.liferay.apio.architect.response.control.Fields) OutputStreamWriter(java.io.OutputStreamWriter) NotSupportedException(javax.ws.rs.NotSupportedException) PrintWriter(java.io.PrintWriter)

Example 2 with SingleModel

use of com.liferay.apio.architect.single.model.SingleModel in project com-liferay-apio-architect by liferay.

the class MockSingleModelWriter method write.

/**
 * Writes a {@link RootModel}, with the hierarchy of embedded models and
 * multiple fields.
 *
 * @param httpHeaders the request's {@code HttpHeaders}
 * @param singleModelMessageMapper the {@link SingleModelMessageMapper} to
 *        use for writing the JSON object
 */
public static JsonObject write(HttpHeaders httpHeaders, SingleModelMessageMapper<RootModel> singleModelMessageMapper) {
    RequestInfo requestInfo = getRequestInfo(httpHeaders);
    Operation deleteOperation = new Operation(DELETE, "delete-operation");
    Operation putOperation = new Operation(createForm("u", "r"), PUT, "update-operation");
    SingleModel<RootModel> singleModel = new SingleModel<>(() -> "first", "root", asList(deleteOperation, putOperation));
    SingleModelWriter<RootModel> singleModelWriter = SingleModelWriter.create(builder -> builder.singleModel(singleModel).modelMessageMapper(singleModelMessageMapper).pathFunction(MockWriterUtil::identifierToPath).resourceNameFunction(__ -> Optional.of("models")).representorFunction(MockWriterUtil::getRepresentorOptional).requestInfo(requestInfo).singleModelFunction(MockWriterUtil::getSingleModel).build());
    Optional<String> optional = singleModelWriter.write();
    if (!optional.isPresent()) {
        throw new AssertionError("Writer failed to write");
    }
    return new Gson().fromJson(optional.get(), JsonObject.class);
}
Also used : SingleModel(com.liferay.apio.architect.single.model.SingleModel) JsonObject(com.google.gson.JsonObject) MockFormCreator.createForm(com.liferay.apio.architect.test.util.form.MockFormCreator.createForm) RequestInfo(com.liferay.apio.architect.request.RequestInfo) SingleModelMessageMapper(com.liferay.apio.architect.message.json.SingleModelMessageMapper) Operation(com.liferay.apio.architect.operation.Operation) HttpHeaders(javax.ws.rs.core.HttpHeaders) SingleModelWriter(com.liferay.apio.architect.writer.SingleModelWriter) Arrays.asList(java.util.Arrays.asList) Gson(com.google.gson.Gson) RootModel(com.liferay.apio.architect.test.util.model.RootModel) DELETE(com.liferay.apio.architect.operation.Method.DELETE) Optional(java.util.Optional) MockWriterUtil.getRequestInfo(com.liferay.apio.architect.test.util.writer.MockWriterUtil.getRequestInfo) SingleModel(com.liferay.apio.architect.single.model.SingleModel) PUT(com.liferay.apio.architect.operation.Method.PUT) RootModel(com.liferay.apio.architect.test.util.model.RootModel) Gson(com.google.gson.Gson) Operation(com.liferay.apio.architect.operation.Operation) RequestInfo(com.liferay.apio.architect.request.RequestInfo) MockWriterUtil.getRequestInfo(com.liferay.apio.architect.test.util.writer.MockWriterUtil.getRequestInfo)

Example 3 with SingleModel

use of com.liferay.apio.architect.single.model.SingleModel in project com-liferay-apio-architect by liferay.

the class SingleModelWriter method write.

/**
 * Writes the handled {@link SingleModel} to a string. This method uses a
 * {@link FieldsWriter} to write the different fields of its {@link
 * Representor}. If no {@code Representor} or {@code Path} exists for the
 * model, this method returns {@code Optional#empty()}.
 *
 * @return the string representation of the {@code SingleModel}, if the
 *         model's {@code Representor} and {@code Path} exist; returns
 *         {@code Optional#empty()} otherwise
 */
@SuppressWarnings("Duplicates")
public Optional<String> write() {
    Optional<FieldsWriter<T, ?>> optional = getFieldsWriter(_singleModel, null, _requestInfo, _pathFunction, _representorFunction, _singleModelFunction);
    if (!optional.isPresent()) {
        return Optional.empty();
    }
    FieldsWriter<T, ?> fieldsWriter = optional.get();
    _singleModelMessageMapper.onStart(_jsonObjectBuilder, _singleModel, _requestInfo.getHttpHeaders());
    fieldsWriter.writeBooleanFields((field, value) -> _singleModelMessageMapper.mapBooleanField(_jsonObjectBuilder, field, value));
    fieldsWriter.writeBooleanListFields((field, value) -> _singleModelMessageMapper.mapBooleanListField(_jsonObjectBuilder, field, value));
    fieldsWriter.writeLocalizedStringFields((field, value) -> _singleModelMessageMapper.mapStringField(_jsonObjectBuilder, field, value));
    fieldsWriter.writeNumberFields((field, value) -> _singleModelMessageMapper.mapNumberField(_jsonObjectBuilder, field, value));
    fieldsWriter.writeNumberListFields((field, value) -> _singleModelMessageMapper.mapNumberListField(_jsonObjectBuilder, field, value));
    fieldsWriter.writeStringFields((field, value) -> _singleModelMessageMapper.mapStringField(_jsonObjectBuilder, field, value));
    fieldsWriter.writeStringListFields((field, value) -> _singleModelMessageMapper.mapStringListField(_jsonObjectBuilder, field, value));
    fieldsWriter.writeLinks((fieldName, link) -> _singleModelMessageMapper.mapLink(_jsonObjectBuilder, fieldName, link));
    fieldsWriter.writeTypes(types -> _singleModelMessageMapper.mapTypes(_jsonObjectBuilder, types));
    fieldsWriter.writeBinaries((field, value) -> _singleModelMessageMapper.mapLink(_jsonObjectBuilder, field, value));
    fieldsWriter.writeSingleURL(url -> _singleModelMessageMapper.mapSelfURL(_jsonObjectBuilder, url));
    List<Operation> operations = _singleModel.getOperations();
    operations.forEach(operation -> {
        JSONObjectBuilder operationJSONObjectBuilder = new JSONObjectBuilder();
        _singleModelMessageMapper.onStartOperation(_jsonObjectBuilder, operationJSONObjectBuilder, operation);
        Optional<Form> formOptional = operation.getFormOptional();
        formOptional.map(form -> createFormURL(_requestInfo.getServerURL(), form)).ifPresent(url -> _singleModelMessageMapper.mapOperationFormURL(_jsonObjectBuilder, operationJSONObjectBuilder, url));
        _singleModelMessageMapper.mapOperationMethod(_jsonObjectBuilder, operationJSONObjectBuilder, operation.method);
        _singleModelMessageMapper.onFinishOperation(_jsonObjectBuilder, operationJSONObjectBuilder, operation);
    });
    fieldsWriter.writeRelatedModels(singleModel -> getPathOptional(singleModel, _pathFunction, _representorFunction), this::writeEmbeddedModelFields, (resourceURL, embeddedPathElements) -> _singleModelMessageMapper.mapLinkedResourceURL(_jsonObjectBuilder, embeddedPathElements, resourceURL), (resourceURL, embeddedPathElements) -> _singleModelMessageMapper.mapEmbeddedResourceURL(_jsonObjectBuilder, embeddedPathElements, resourceURL));
    fieldsWriter.writeRelatedCollections(_resourceNameFunction, (url, embeddedPathElements) -> _singleModelMessageMapper.mapLinkedResourceURL(_jsonObjectBuilder, embeddedPathElements, url));
    _writeNestedResources(_representorFunction, _singleModel, null);
    _singleModelMessageMapper.onFinish(_jsonObjectBuilder, _singleModel, _requestInfo.getHttpHeaders());
    JsonObject jsonObject = _jsonObjectBuilder.build();
    return Optional.of(jsonObject.toString());
}
Also used : JsonObject(com.google.gson.JsonObject) ResourceNameFunction(com.liferay.apio.architect.writer.alias.ResourceNameFunction) RepresentorFunction(com.liferay.apio.architect.writer.alias.RepresentorFunction) RequestInfo(com.liferay.apio.architect.request.RequestInfo) Form(com.liferay.apio.architect.form.Form) SingleModelMessageMapper(com.liferay.apio.architect.message.json.SingleModelMessageMapper) WriterUtil.getFieldsWriter(com.liferay.apio.architect.writer.util.WriterUtil.getFieldsWriter) SingleModelFunction(com.liferay.apio.architect.writer.alias.SingleModelFunction) Function(java.util.function.Function) Operation(com.liferay.apio.architect.operation.Operation) Representor(com.liferay.apio.architect.representor.Representor) JSONObjectBuilder(com.liferay.apio.architect.message.json.JSONObjectBuilder) List(java.util.List) Unsafe.unsafeCast(com.liferay.apio.architect.unsafe.Unsafe.unsafeCast) WriterUtil.getPathOptional(com.liferay.apio.architect.writer.util.WriterUtil.getPathOptional) FunctionalList(com.liferay.apio.architect.list.FunctionalList) Map(java.util.Map) Optional(java.util.Optional) SingleModel(com.liferay.apio.architect.single.model.SingleModel) PathFunction(com.liferay.apio.architect.writer.alias.PathFunction) Collections(java.util.Collections) URLCreator.createFormURL(com.liferay.apio.architect.writer.url.URLCreator.createFormURL) JSONObjectBuilder(com.liferay.apio.architect.message.json.JSONObjectBuilder) WriterUtil.getFieldsWriter(com.liferay.apio.architect.writer.util.WriterUtil.getFieldsWriter) Form(com.liferay.apio.architect.form.Form) JsonObject(com.google.gson.JsonObject) Operation(com.liferay.apio.architect.operation.Operation)

Example 4 with SingleModel

use of com.liferay.apio.architect.single.model.SingleModel in project com-liferay-apio-architect by liferay.

the class PageWriter method write.

/**
 * Writes the handled {@link Page} to a string. This method uses a {@link
 * FieldsWriter} to write the different fields of its items' {@link
 * Representor}. If no {@code Representor} or {@code Path} exist for the
 * model, this method returns {@code Optional#empty()}.
 *
 * @return the representation of the {@code Page}, if the {@code
 *         Representor} and {@code Path} exist for the model; returns {@code
 *         Optional#empty()} otherwise
 */
@SuppressWarnings("Duplicates")
public String write() {
    _pageMessageMapper.onStart(_jsonObjectBuilder, _page, _requestInfo.getHttpHeaders());
    _pageMessageMapper.mapItemTotalCount(_jsonObjectBuilder, _page.getTotalCount());
    Collection<T> items = _page.getItems();
    _pageMessageMapper.mapPageCount(_jsonObjectBuilder, items.size());
    _writePageURLs();
    String url = _getCollectionURL();
    _pageMessageMapper.mapCollectionURL(_jsonObjectBuilder, url);
    String resourceName = _page.getResourceName();
    items.forEach(model -> _writeItem(new SingleModel<>(model, resourceName, Collections.emptyList())));
    List<Operation> operations = _page.getOperations();
    operations.forEach(operation -> {
        JSONObjectBuilder operationJSONObjectBuilder = new JSONObjectBuilder();
        _pageMessageMapper.onStartOperation(_jsonObjectBuilder, operationJSONObjectBuilder, operation);
        Optional<Form> formOptional = operation.getFormOptional();
        formOptional.map(form -> createFormURL(_requestInfo.getServerURL(), form)).ifPresent(formURL -> _pageMessageMapper.mapOperationFormURL(_jsonObjectBuilder, operationJSONObjectBuilder, formURL));
        _pageMessageMapper.mapOperationMethod(_jsonObjectBuilder, operationJSONObjectBuilder, operation.method);
        _pageMessageMapper.onFinishOperation(_jsonObjectBuilder, operationJSONObjectBuilder, operation);
    });
    _pageMessageMapper.onFinish(_jsonObjectBuilder, _page, _requestInfo.getHttpHeaders());
    JsonObject jsonObject = _jsonObjectBuilder.build();
    return jsonObject.toString();
}
Also used : SingleModel(com.liferay.apio.architect.single.model.SingleModel) JsonObject(com.google.gson.JsonObject) ResourceNameFunction(com.liferay.apio.architect.writer.alias.ResourceNameFunction) RequestInfo(com.liferay.apio.architect.request.RequestInfo) URLCreator.createCollectionPageURL(com.liferay.apio.architect.writer.url.URLCreator.createCollectionPageURL) WriterUtil.getFieldsWriter(com.liferay.apio.architect.writer.util.WriterUtil.getFieldsWriter) SingleModelFunction(com.liferay.apio.architect.writer.alias.SingleModelFunction) Function(java.util.function.Function) URLCreator.createCollectionURL(com.liferay.apio.architect.writer.url.URLCreator.createCollectionURL) Operation(com.liferay.apio.architect.operation.Operation) Representor(com.liferay.apio.architect.representor.Representor) WriterUtil.getPathOptional(com.liferay.apio.architect.writer.util.WriterUtil.getPathOptional) FunctionalList(com.liferay.apio.architect.list.FunctionalList) Page(com.liferay.apio.architect.pagination.Page) Map(java.util.Map) PageType(com.liferay.apio.architect.pagination.PageType) SingleModel(com.liferay.apio.architect.single.model.SingleModel) PathFunction(com.liferay.apio.architect.writer.alias.PathFunction) RepresentorFunction(com.liferay.apio.architect.writer.alias.RepresentorFunction) Collection(java.util.Collection) Form(com.liferay.apio.architect.form.Form) Path(com.liferay.apio.architect.uri.Path) JSONObjectBuilder(com.liferay.apio.architect.message.json.JSONObjectBuilder) PageMessageMapper(com.liferay.apio.architect.message.json.PageMessageMapper) List(java.util.List) URLCreator.createNestedCollectionURL(com.liferay.apio.architect.writer.url.URLCreator.createNestedCollectionURL) Unsafe.unsafeCast(com.liferay.apio.architect.unsafe.Unsafe.unsafeCast) Optional(java.util.Optional) Collections(java.util.Collections) URLCreator.createFormURL(com.liferay.apio.architect.writer.url.URLCreator.createFormURL) JSONObjectBuilder(com.liferay.apio.architect.message.json.JSONObjectBuilder) Form(com.liferay.apio.architect.form.Form) JsonObject(com.google.gson.JsonObject) Operation(com.liferay.apio.architect.operation.Operation)

Example 5 with SingleModel

use of com.liferay.apio.architect.single.model.SingleModel in project com-liferay-apio-architect by liferay.

the class CollectionRoutesTest method _testCollectionRoutes.

private void _testCollectionRoutes(CollectionRoutes<String> collectionRoutes) {
    Optional<CollectionRoutes<String>> optional = Optional.of(collectionRoutes);
    Map map = optional.flatMap(CollectionRoutes::getFormOptional).map(form -> {
        assertThat(form.id, is("c/name"));
        return (Map) form.get(_body);
    }).get();
    Optional<String> valueOptional = _body.getValueOptional("key");
    assertThat(map.get("key"), is(valueOptional.get()));
    SingleModel<String> singleModel = optional.flatMap(CollectionRoutes::getCreateItemFunctionOptional).get().apply(null).apply(_body).getUnchecked();
    assertThat(singleModel.getResourceName(), is("name"));
    assertThat(singleModel.getModel(), is("Apio"));
    Page<String> page = optional.flatMap(CollectionRoutes::getGetPageFunctionOptional).get().apply(null).getUnchecked();
    assertThat(page.getItems(), hasSize(1));
    assertThat(page.getItems(), hasItem("Apio"));
    assertThat(page.getTotalCount(), is(1));
    List<Operation> operations = page.getOperations();
    assertThat(operations, hasSize(1));
    Operation operation = operations.get(0);
    assertThat(operation.getFormOptional(), is(optionalWithValue()));
    assertThat(operation.method, is(POST));
    assertThat(operation.name, is("name/create"));
}
Also used : CoreMatchers.hasItem(org.hamcrest.CoreMatchers.hasItem) GetPageFunction(com.liferay.apio.architect.alias.routes.GetPageFunction) Body(com.liferay.apio.architect.form.Body) OptionalMatchers.emptyOptional(com.spotify.hamcrest.optional.OptionalMatchers.emptyOptional) Operation(com.liferay.apio.architect.operation.Operation) TreeSet(java.util.TreeSet) CreateItemFunction(com.liferay.apio.architect.alias.routes.CreateItemFunction) Builder(com.liferay.apio.architect.routes.CollectionRoutes.Builder) Pagination(com.liferay.apio.architect.pagination.Pagination) Page(com.liferay.apio.architect.pagination.Page) Map(java.util.Map) POST(com.liferay.apio.architect.operation.Method.POST) Is.is(org.hamcrest.core.Is.is) MatcherAssert.assertThat(org.hamcrest.MatcherAssert.assertThat) SingleModel(com.liferay.apio.architect.single.model.SingleModel) OptionalMatchers.optionalWithValue(com.spotify.hamcrest.optional.OptionalMatchers.optionalWithValue) Set(java.util.Set) Test(org.junit.Test) PageItems(com.liferay.apio.architect.pagination.PageItems) FORM_BUILDER_FUNCTION(com.liferay.apio.architect.routes.RoutesTestUtil.FORM_BUILDER_FUNCTION) REQUEST_PROVIDE_FUNCTION(com.liferay.apio.architect.routes.RoutesTestUtil.REQUEST_PROVIDE_FUNCTION) IsCollectionWithSize.hasSize(org.hamcrest.collection.IsCollectionWithSize.hasSize) List(java.util.List) PAGINATION(com.liferay.apio.architect.routes.RoutesTestUtil.PAGINATION) Matchers.contains(org.hamcrest.Matchers.contains) Optional(java.util.Optional) COLLECTION_PERMISSION_FUNCTION(com.liferay.apio.architect.routes.RoutesTestUtil.COLLECTION_PERMISSION_FUNCTION) Collections(java.util.Collections) Operation(com.liferay.apio.architect.operation.Operation) Map(java.util.Map)

Aggregations

SingleModel (com.liferay.apio.architect.single.model.SingleModel)9 Optional (java.util.Optional)8 Operation (com.liferay.apio.architect.operation.Operation)6 Collections (java.util.Collections)5 List (java.util.List)5 Map (java.util.Map)5 Test (org.junit.Test)5 RequestInfo (com.liferay.apio.architect.request.RequestInfo)4 JsonObject (com.google.gson.JsonObject)3 Body (com.liferay.apio.architect.form.Body)3 FunctionalList (com.liferay.apio.architect.list.FunctionalList)3 SingleModelMessageMapper (com.liferay.apio.architect.message.json.SingleModelMessageMapper)3 Page (com.liferay.apio.architect.pagination.Page)3 FORM_BUILDER_FUNCTION (com.liferay.apio.architect.routes.RoutesTestUtil.FORM_BUILDER_FUNCTION)3 REQUEST_PROVIDE_FUNCTION (com.liferay.apio.architect.routes.RoutesTestUtil.REQUEST_PROVIDE_FUNCTION)3 Unsafe.unsafeCast (com.liferay.apio.architect.unsafe.Unsafe.unsafeCast)3 OptionalMatchers.emptyOptional (com.spotify.hamcrest.optional.OptionalMatchers.emptyOptional)3 OptionalMatchers.optionalWithValue (com.spotify.hamcrest.optional.OptionalMatchers.optionalWithValue)3 Set (java.util.Set)3 TreeSet (java.util.TreeSet)3