001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019package org.apache.isis.viewer.restfulobjects.rendering.domainobjects; 020 021import java.util.List; 022import java.util.stream.Collectors; 023import java.util.stream.Stream; 024 025import org.apache.isis.core.metamodel.spec.ManagedObject; 026import org.apache.isis.core.metamodel.spec.ObjectSpecification; 027import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation; 028import org.apache.isis.viewer.restfulobjects.applib.Rel; 029import org.apache.isis.viewer.restfulobjects.applib.RepresentationType; 030import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext; 031import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs; 032import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererAbstract; 033 034public class ListReprRenderer extends ReprRendererAbstract<ListReprRenderer, Stream<ManagedObject>> { 035 036 private ObjectAdapterLinkTo linkTo; 037 private List<ManagedObject> objectAdapters; 038 private ObjectSpecification elementType; 039 private ObjectSpecification returnType; 040 private Rel elementRel; 041 042 public ListReprRenderer(final IResourceContext resourceContext, final LinkFollowSpecs linkFollower, final JsonRepresentation representation) { 043 super(resourceContext, linkFollower, RepresentationType.LIST, representation); 044 usingLinkToBuilder(new DomainObjectLinkTo()); 045 } 046 047 public ListReprRenderer usingLinkToBuilder(final ObjectAdapterLinkTo objectAdapterLinkToBuilder) { 048 this.linkTo = objectAdapterLinkToBuilder.usingUrlBase(resourceContext); 049 return this; 050 } 051 052 @Override 053 public ListReprRenderer with(final Stream<ManagedObject> objectAdapters) { 054 this.objectAdapters = objectAdapters!=null 055 ? objectAdapters 056 .filter(adapter->!adapter.getSpecification().isHidden()) 057 .collect(Collectors.toList()) 058 : null; 059 return this; 060 } 061 062 public ListReprRenderer withElementRel(Rel elementRel) { 063 this.elementRel = elementRel; 064 return this; 065 } 066 067 public ListReprRenderer withReturnType(final ObjectSpecification returnType) { 068 this.returnType = returnType; 069 return this; 070 } 071 072 public ListReprRenderer withElementType(final ObjectSpecification elementType) { 073 this.elementType = elementType; 074 return this; 075 } 076 077 @Override 078 public JsonRepresentation render() { 079 080 if(representation == null) { 081 return null; 082 } 083 084 addValue(); 085 086 addLinkToReturnType(); 087 addLinkToElementType(); 088 089 getExtensions(); 090 091 return representation; 092 } 093 094 private void addValue() { 095 if (objectAdapters == null) { 096 return; 097 } 098 099 final JsonRepresentation values = JsonRepresentation.newArray(); 100 101 objectAdapters 102 .forEach(adapter->{ 103 final JsonRepresentation linkToObject = linkTo.with(adapter).builder(elementRel).build(); 104 values.arrayAdd(linkToObject); 105 106 final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("value"); 107 if (linkFollower.matches(linkToObject)) { 108 final DomainObjectReprRenderer renderer = 109 new DomainObjectReprRenderer( 110 getResourceContext(), 111 linkFollower, 112 JsonRepresentation.newMap()); 113 final JsonRepresentation domainObject = renderer.with(adapter).render(); 114 linkToObject.mapPut("value", domainObject); 115 } 116 }); 117 118 representation.mapPut("value", values); 119 } 120 121 122 protected void addLinkToReturnType() { 123 addLink(Rel.RETURN_TYPE, returnType); 124 } 125 126 protected void addLinkToElementType() { 127 addLink(Rel.ELEMENT_TYPE, elementType); 128 } 129 130}