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}