001// Copyright 2006, 2007, 2008, 2010 The Apache Software Foundation 002// 003// Licensed under the Apache License, Version 2.0 (the "License"); 004// you may not use this file except in compliance with the License. 005// You may obtain a copy of the License at 006// 007// http://www.apache.org/licenses/LICENSE-2.0 008// 009// Unless required by applicable law or agreed to in writing, software 010// distributed under the License is distributed on an "AS IS" BASIS, 011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012// See the License for the specific language governing permissions and 013// limitations under the License. 014 015package org.apache.tapestry5.internal.services; 016 017import org.apache.tapestry5.ComponentResources; 018import org.apache.tapestry5.http.services.RequestGlobals; 019import org.apache.tapestry5.internal.structure.ComponentPageElement; 020import org.apache.tapestry5.internal.structure.Page; 021import org.apache.tapestry5.ioc.internal.util.InternalUtils; 022import org.apache.tapestry5.runtime.Component; 023import org.apache.tapestry5.services.ComponentClassResolver; 024import org.apache.tapestry5.services.ComponentSource; 025 026@SuppressWarnings("all") 027public class ComponentSourceImpl implements ComponentSource 028{ 029 private final RequestPageCache pageCache; 030 031 private final ComponentClassResolver resolver; 032 033 private final RequestGlobals globals; 034 035 public ComponentSourceImpl(RequestPageCache pageCache, ComponentClassResolver resolver, RequestGlobals globals) 036 { 037 this.pageCache = pageCache; 038 this.resolver = resolver; 039 this.globals = globals; 040 } 041 042 public Component getComponent(String completeId) 043 { 044 assert InternalUtils.isNonBlank(completeId); 045 046 int colonx = completeId.indexOf(':'); 047 048 if (colonx < 0) 049 { 050 Page page = pageCache.get(completeId); 051 052 return page.getRootComponent(); 053 } 054 055 String pageName = completeId.substring(0, colonx); 056 057 Page page = pageCache.get(pageName); 058 String nestedId = completeId.substring(colonx + 1); 059 String mixinId = null; 060 061 int dollarx = nestedId.indexOf("$"); 062 063 if (dollarx > 0) 064 { 065 mixinId = nestedId.substring(dollarx + 1); 066 nestedId = nestedId.substring(0, dollarx); 067 } 068 069 ComponentPageElement element = page.getComponentElementByNestedId(nestedId); 070 071 if (mixinId == null) 072 return element.getComponent(); 073 074 ComponentResources resources = element.getMixinResources(mixinId); 075 076 return resources.getComponent(); 077 } 078 079 public Component getPage(String pageName) 080 { 081 assert pageName != null; 082 083 Page page = pageCache.get(pageName); 084 085 return page.getRootComponent(); 086 } 087 088 public Component getPage(Class pageClass) 089 { 090 assert pageClass != null; 091 092 String pageName = resolver.resolvePageClassNameToPageName(pageClass.getName()); 093 094 return getPage(pageName); 095 } 096 097 public Component getActivePage() 098 { 099 String pageName = globals.getActivePageName(); 100 101 return pageName == null ? null : getPage(pageName); 102 } 103 104}