001/** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.isis.viewer.restfulobjects.rendering.domainobjects; 018 019import org.apache.isis.core.metamodel.adapter.ObjectAdapter; 020import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller; 021import org.apache.isis.core.metamodel.spec.feature.ObjectMember; 022import org.apache.isis.core.runtime.system.context.IsisContext; 023import org.apache.isis.viewer.restfulobjects.applib.Rel; 024import org.apache.isis.viewer.restfulobjects.applib.RepresentationType; 025import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder; 026import org.apache.isis.viewer.restfulobjects.rendering.RendererContext; 027import org.apache.isis.viewer.restfulobjects.rendering.util.OidUtils; 028 029public class DomainObjectLinkTo implements ObjectAdapterLinkTo { 030 031 protected RendererContext rendererContext; 032 protected ObjectAdapter objectAdapter; 033 034 @Override 035 public final DomainObjectLinkTo usingUrlBase(final RendererContext resourceContext) { 036 this.rendererContext = resourceContext; 037 return this; 038 } 039 040 @Override 041 public ObjectAdapterLinkTo with(final ObjectAdapter 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(rendererContext, 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 domainType = OidUtils.getDomainType(objectAdapter); 063 String instanceId = OidUtils.getInstanceId(rendererContext, objectAdapter); 064 return buf.append("objects/").append(domainType).append("/").append(instanceId); 065 } 066 067 protected Rel relElseDefault(final Rel rel) { 068 return rel != null ? rel : defaultRel(); 069 } 070 071 /** 072 * hook method; used by {@link #builder(Rel)}. 073 */ 074 protected Rel defaultRel() { 075 return Rel.VALUE; 076 } 077 078 @Override 079 public final LinkBuilder memberBuilder(final Rel rel, final MemberType memberType, final ObjectMember objectMember, final String... parts) { 080 return memberBuilder(rel, memberType, objectMember, memberType.getRepresentationType(), parts); 081 } 082 083 @Override 084 public final LinkBuilder memberBuilder(final Rel rel, final MemberType memberType, final ObjectMember objectMember, final RepresentationType representationType, final String... parts) { 085 final StringBuilder buf = linkRef(new StringBuilder()); 086 buf.append("/").append(memberType.getUrlPart()).append(objectMember.getId()); 087 for (final String part : parts) { 088 if (part == null) { 089 continue; 090 } 091 buf.append("/").append(part); 092 } 093 final String url = buf.toString(); 094 return LinkBuilder.newBuilder(rendererContext, rel.getName(), representationType, url); 095 } 096 097 098 099 ////////////////////////////////////////////////// 100 // Dependencies (from context) 101 ////////////////////////////////////////////////// 102 103 protected static OidMarshaller getOidMarshaller() { 104 return IsisContext.getOidMarshaller(); 105 } 106 107 108}