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.server.resources; 020 021import java.util.Collection; 022import java.util.List; 023 024import org.apache.isis.core.commons.authentication.AuthenticationSession; 025import org.apache.isis.core.metamodel.adapter.ObjectAdapter; 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.LinkBuilder; 031import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs; 032import org.apache.isis.viewer.restfulobjects.rendering.RendererContext; 033import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererAbstract; 034import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainServiceLinkTo; 035import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ListReprRenderer; 036import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.TypeListReprRenderer; 037import org.apache.isis.viewer.restfulobjects.server.ResourceContext; 038 039public class HomePageReprRenderer extends ReprRendererAbstract<HomePageReprRenderer, Void> { 040 041 HomePageReprRenderer(final RendererContext resourceContext, final LinkFollowSpecs linkFollower, final JsonRepresentation representation) { 042 super(resourceContext, linkFollower, RepresentationType.HOME_PAGE, representation); 043 } 044 045 @Override 046 public HomePageReprRenderer with(final Void t) { 047 return this; 048 } 049 050 @Override 051 public JsonRepresentation render() { 052 053 // self 054 if (includesSelf) { 055 addLinkToSelf(); 056 } 057 058 addLinkToUser(getRendererContext().getAuthenticationSession()); 059 addLinkToServices(((ResourceContext)getRendererContext()).getPersistenceSession().getServices()); 060 addLinkToVersion(); 061 addLinkToDomainTypes(((ResourceContext)getRendererContext()).getSpecificationLookup().allSpecifications()); 062 063 // inks and extensions 064 representation.mapPut("extensions", JsonRepresentation.newMap()); 065 066 return representation; 067 } 068 069 private void addLinkToSelf() { 070 final JsonRepresentation link = LinkBuilder.newBuilder(rendererContext, Rel.SELF.getName(), RepresentationType.HOME_PAGE, "").build(); 071 072 final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("links"); 073 if (linkFollower.matches(link)) { 074 final HomePageReprRenderer renderer = new HomePageReprRenderer(getRendererContext(), linkFollower, JsonRepresentation.newMap()); 075 link.mapPut("value", renderer.render()); 076 } 077 getLinks().arrayAdd(link); 078 } 079 080 private void addLinkToVersion() { 081 final JsonRepresentation link = LinkBuilder.newBuilder(getRendererContext(), Rel.VERSION.getName(), RepresentationType.VERSION, "version").build(); 082 083 final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("links"); 084 if (linkFollower.matches(link)) { 085 final VersionReprRenderer renderer = new VersionReprRenderer(getRendererContext(), linkFollower, JsonRepresentation.newMap()); 086 link.mapPut("value", renderer.render()); 087 } 088 089 getLinks().arrayAdd(link); 090 } 091 092 private void addLinkToServices(List<ObjectAdapter> serviceAdapters) { 093 094 final JsonRepresentation link = LinkBuilder.newBuilder(getRendererContext(), Rel.SERVICES.getName(), RepresentationType.LIST, "services").build(); 095 096 final LinkFollowSpecs linkFollowSpecs = getLinkFollowSpecs().follow("links"); 097 if (linkFollowSpecs.matches(link)) { 098 099 final ListReprRenderer renderer = new ListReprRenderer(getRendererContext(), linkFollowSpecs, JsonRepresentation.newMap()); 100 renderer.usingLinkToBuilder(new DomainServiceLinkTo()).withLink(Rel.SELF, "services").with(serviceAdapters); 101 102 link.mapPut("value", renderer.render()); 103 } 104 105 getLinks().arrayAdd(link); 106 } 107 108 private void addLinkToUser(AuthenticationSession authenticationSession) { 109 final JsonRepresentation link = LinkBuilder.newBuilder(getRendererContext(), Rel.USER.getName(), RepresentationType.USER, "user").build(); 110 111 final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("links"); 112 if (linkFollower.matches(link)) { 113 final UserReprRenderer renderer = new UserReprRenderer(getRendererContext(), linkFollower, JsonRepresentation.newMap()); 114 renderer.with(authenticationSession); 115 link.mapPut("value", renderer.render()); 116 } 117 118 getLinks().arrayAdd(link); 119 } 120 121 private void addLinkToDomainTypes(final Collection<ObjectSpecification> specifications) { 122 123 final JsonRepresentation link = LinkBuilder.newBuilder(getRendererContext(), Rel.DOMAIN_TYPES.getName(), RepresentationType.TYPE_LIST, "domain-types").build(); 124 125 final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("links"); 126 if (linkFollower.matches(link)) { 127 final TypeListReprRenderer renderer = new TypeListReprRenderer(getRendererContext(), linkFollower, JsonRepresentation.newMap()); 128 renderer.withLink(Rel.SELF, "domain-types").with(specifications); 129 link.mapPut("value", renderer.render()); 130 } 131 132 getLinks().arrayAdd(link); 133 } 134 135}