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.feature.ObjectMember;
023import org.apache.isis.viewer.restfulobjects.applib.Rel;
024import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
025import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext;
026import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
027
028public class DomainObjectLinkTo implements ObjectAdapterLinkTo {
029
030    protected IResourceContext resourceContext;
031    protected ManagedObject objectAdapter;
032
033    @Override
034    public final DomainObjectLinkTo usingUrlBase(final IResourceContext resourceContext) {
035        this.resourceContext = resourceContext;
036        return this;
037    }
038
039    @Override
040    public ObjectAdapterLinkTo with(final ManagedObject objectAdapter) {
041        this.objectAdapter = objectAdapter;
042        return this;
043    }
044
045    @Override
046    public LinkBuilder builder() {
047        return builder(null);
048    }
049
050    @Override
051    public LinkBuilder builder(final Rel rel) {
052        final LinkBuilder linkBuilder = LinkBuilder.newBuilder(resourceContext, relElseDefault(rel).getName(), RepresentationType.DOMAIN_OBJECT, linkRef(new StringBuilder()).toString());
053        linkBuilder.withTitle(objectAdapter.titleString());
054        return linkBuilder;
055    }
056
057    /**
058     * hook method
059     */
060    protected StringBuilder linkRef(StringBuilder buf) {
061        String domainType = ManagedObject.getDomainType(objectAdapter);
062        String instanceId = ManagedObject._instanceId(objectAdapter);
063        return buf.append("objects/").append(domainType).append("/").append(instanceId);
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}