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 org.apache.isis.core.metamodel.spec.ManagedObject;
022import org.apache.isis.core.metamodel.spec.ManagedObjects;
023import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
024import org.apache.isis.viewer.restfulobjects.applib.Rel;
025import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
026import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext;
027import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
028
029public class DomainObjectLinkTo implements ObjectAdapterLinkTo {
030
031    protected IResourceContext resourceContext;
032    protected ManagedObject objectAdapter;
033
034    @Override
035    public final DomainObjectLinkTo usingUrlBase(final IResourceContext resourceContext) {
036        this.resourceContext = resourceContext;
037        return this;
038    }
039
040    @Override
041    public ObjectAdapterLinkTo with(final ManagedObject objectAdapter) {
042        this.objectAdapter = objectAdapter;
043        return this;
044    }
045
046    @Override
047    public LinkBuilder builder() {
048        return builder(null);
049    }
050
051    @Override
052    public LinkBuilder builder(final Rel rel) {
053        final LinkBuilder linkBuilder = LinkBuilder.newBuilder(resourceContext, relElseDefault(rel).getName(), RepresentationType.DOMAIN_OBJECT, linkRef(new StringBuilder()).toString());
054        linkBuilder.withTitle(objectAdapter.titleString());
055        return linkBuilder;
056    }
057
058    /**
059     * hook method
060     */
061    protected StringBuilder linkRef(StringBuilder buf) {
062        String objectRef = ManagedObjects.stringifyElseFail(objectAdapter, "/");
063        return buf.append("objects/").append(objectRef);
064    }
065
066    protected Rel relElseDefault(final Rel rel) {
067        return rel != null ? rel : defaultRel();
068    }
069
070    /**
071     * hook method; used by {@link #builder(Rel)}.
072     */
073    protected Rel defaultRel() {
074        return Rel.VALUE;
075    }
076
077    @Override
078    public final LinkBuilder memberBuilder(final Rel rel, final MemberType memberType, final ObjectMember objectMember, final String... parts) {
079        return memberBuilder(rel, memberType, objectMember, memberType.getRepresentationType(), parts);
080    }
081
082    @Override
083    public final LinkBuilder memberBuilder(final Rel rel, final MemberType memberType, final ObjectMember objectMember, final RepresentationType representationType, final String... parts) {
084        final StringBuilder buf = linkRef(new StringBuilder());
085        buf.append("/").append(memberType.getUrlPart()).append(objectMember.getId());
086        for (final String part : parts) {
087            if (part == null) {
088                continue;
089            }
090            buf.append("/").append(part);
091        }
092        final String url = buf.toString();
093        return LinkBuilder.newBuilder(resourceContext, rel.andParam(memberType.getName(), objectMember.getId()), representationType, url);
094    }
095
096
097
098
099}