001 /* 002 * Copyright 2002-2004 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 005 * use this file except in compliance with the License. You may obtain a copy of 006 * the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 013 * License for the specific language governing permissions and limitations under 014 * the License. 015 */ 016 package org.springframework.richclient.application.support; 017 018 import org.springframework.richclient.core.LabeledObjectSupport; 019 import org.springframework.richclient.application.ViewDescriptor; 020 import org.springframework.richclient.application.ApplicationWindow; 021 import org.springframework.richclient.application.PageComponent; 022 import org.springframework.richclient.application.View; 023 import org.springframework.richclient.command.ActionCommand; 024 import org.springframework.richclient.command.support.ShowViewCommand; 025 import org.springframework.richclient.command.config.CommandButtonLabelInfo; 026 import org.springframework.beans.factory.BeanNameAware; 027 import org.springframework.beans.factory.InitializingBean; 028 import org.springframework.beans.factory.BeanFactoryAware; 029 import org.springframework.beans.factory.BeanFactory; 030 import org.springframework.beans.BeansException; 031 import org.springframework.util.Assert; 032 033 /** 034 * An implementation of {@link ViewDescriptor} that instantiates new Views 035 * by looking them up in a Spring {@link BeanFactory}. You must set the bean 036 * name to lookup in the <code>BeanFactory</code> via 037 * {@link #setViewPrototypeBeanName(String)}, and the referenced bean 038 * <b>must</b> be a declared non-singleton in the <code>BeanFactory</code> 039 * (a prototype bean). 040 * 041 * @author Andy DePue 042 */ 043 public class LookupViewDescriptor extends LabeledObjectSupport 044 implements ViewDescriptor, BeanNameAware, BeanFactoryAware, InitializingBean 045 { 046 private String id; 047 private String viewPrototypeBeanName; 048 private BeanFactory beanFactory; 049 050 public void setId(final String id) 051 { 052 Assert.notNull(id); 053 this.id = id; 054 } 055 056 public String getViewPrototypeBeanName() 057 { 058 return this.viewPrototypeBeanName; 059 } 060 061 public void setViewPrototypeBeanName(final String viewPrototypeBeanName) 062 { 063 this.viewPrototypeBeanName = viewPrototypeBeanName; 064 } 065 066 public BeanFactory getBeanFactory() 067 { 068 return this.beanFactory; 069 } 070 071 protected View createView() 072 { 073 final View view = (View)getBeanFactory().getBean(getViewPrototypeBeanName(), View.class); 074 view.setDescriptor(this); 075 return view; 076 } 077 078 079 // 080 // METHODS FROM INTERFACE ViewDescriptor 081 // 082 083 public String getId() 084 { 085 return this.id; 086 } 087 088 public ActionCommand createShowViewCommand(final ApplicationWindow window) 089 { 090 return new ShowViewCommand(this, window); 091 } 092 093 public CommandButtonLabelInfo getShowViewCommandLabel() 094 { 095 return getLabel(); 096 } 097 098 public PageComponent createPageComponent() 099 { 100 return createView(); 101 } 102 103 104 105 // 106 // METHODS FROM INTERFACE BeanNameAware 107 // 108 109 public void setBeanName(final String name) 110 { 111 setId(name); 112 } 113 114 115 // 116 // METHODS FROM INTERFACE BeanFactoryAware 117 // 118 119 public void setBeanFactory(final BeanFactory beanFactory) throws BeansException 120 { 121 this.beanFactory = beanFactory; 122 } 123 124 125 // 126 // METHODS FROM INTERFACE InitializingBean 127 // 128 129 public final void afterPropertiesSet() throws Exception 130 { 131 initViewDescriptor(); 132 133 if(getViewPrototypeBeanName() == null) { 134 throw new IllegalArgumentException("viewPrototypeBeanName property must be set."); 135 } 136 if(getBeanFactory() == null) { 137 throw new IllegalArgumentException("beanFactory property must be set."); 138 } 139 if(!getBeanFactory().containsBean(getViewPrototypeBeanName())) { 140 throw new IllegalArgumentException("There is no bean in the bean factory with the given name '" + getViewPrototypeBeanName() + "'"); 141 } 142 if(getBeanFactory().isSingleton(getViewPrototypeBeanName())) { 143 throw new IllegalArgumentException("View bean '" + getViewPrototypeBeanName() + "' must be a prototype (singleton=\"false\")."); 144 } 145 if(!View.class.isAssignableFrom(getBeanFactory().getType(getViewPrototypeBeanName()))) { 146 throw new IllegalArgumentException("Prototype View bean '" + getViewPrototypeBeanName() + "' does not implement the View interface."); 147 } 148 } 149 150 151 /** 152 * Subclasses may override this method to perform intialization after 153 * properties have been set. 154 * @throws Exception 155 */ 156 protected void initViewDescriptor() throws Exception 157 { 158 } 159 }