001 /* 002 * Copyright 2002-2008 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 java.util.Collections; 019 import java.util.Map; 020 021 import org.springframework.beans.BeanUtils; 022 import org.springframework.beans.BeanWrapper; 023 import org.springframework.beans.BeanWrapperImpl; 024 import org.springframework.beans.factory.BeanInitializationException; 025 import org.springframework.beans.factory.BeanNameAware; 026 import org.springframework.beans.factory.InitializingBean; 027 import org.springframework.richclient.application.ApplicationWindow; 028 import org.springframework.richclient.application.PageComponent; 029 import org.springframework.richclient.application.View; 030 import org.springframework.richclient.application.ViewDescriptor; 031 import org.springframework.richclient.command.ActionCommand; 032 import org.springframework.richclient.command.config.CommandButtonLabelInfo; 033 import org.springframework.richclient.command.support.ShowViewCommand; 034 import org.springframework.richclient.core.LabeledObjectSupport; 035 import org.springframework.util.Assert; 036 037 /** 038 * Provides a standard implementation of {@link ViewDescriptor}. 039 * 040 * @author Keith Donald 041 */ 042 public class DefaultViewDescriptor extends LabeledObjectSupport implements ViewDescriptor, BeanNameAware, 043 InitializingBean { 044 private String id; 045 046 private Class<? extends View> viewClass; 047 048 private Map<String, Object> viewProperties; 049 050 public DefaultViewDescriptor() { 051 // default constructor for spring creation 052 } 053 054 public DefaultViewDescriptor(String id, Class<? extends View> viewClass) { 055 this(id, viewClass, Collections.<String, Object> emptyMap()); 056 } 057 058 public DefaultViewDescriptor(String id, Class<? extends View> viewClass, Map<String, Object> viewProperties) { 059 setId(id); 060 setViewClass(viewClass); 061 setViewProperties(viewProperties); 062 } 063 064 public void setBeanName(String beanName) { 065 setId(beanName); 066 } 067 068 public void setId(String id) { 069 Assert.notNull("id is required"); 070 this.id = id; 071 } 072 073 public String getId() { 074 return id; 075 } 076 077 public Class<? extends View> getViewClass() { 078 return viewClass; 079 } 080 081 public void setViewClass(Class<? extends View> viewClass) { 082 Assert.notNull(viewClass, "viewClass cannot be null"); 083 Assert.isTrue(View.class.isAssignableFrom(viewClass), "viewClass doesn't derive from View"); 084 085 this.viewClass = viewClass; 086 } 087 088 public void setViewProperties(Map<String, Object> viewProperties) { 089 this.viewProperties = viewProperties; 090 } 091 092 public PageComponent createPageComponent() { 093 return createView(); 094 } 095 096 protected View createView() { 097 Assert.state(viewClass != null, "View class to instantiate is not set"); 098 Object o = BeanUtils.instantiateClass(viewClass); 099 Assert.isTrue((o instanceof View), "View class '" + viewClass 100 + "' was instantiated, but instance is not a View!"); 101 View view = (View) o; 102 view.setDescriptor(this); 103 if (viewProperties != null) { 104 BeanWrapper wrapper = new BeanWrapperImpl(view); 105 wrapper.setPropertyValues(viewProperties); 106 } 107 108 if (view instanceof InitializingBean) { 109 try { 110 ((InitializingBean) view).afterPropertiesSet(); 111 } catch (Exception e) { 112 throw new BeanInitializationException("Problem running on " + view, e); 113 } 114 } 115 return view; 116 } 117 118 public CommandButtonLabelInfo getShowViewCommandLabel() { 119 return getLabel(); 120 } 121 122 public ActionCommand createShowViewCommand(ApplicationWindow window) { 123 return new ShowViewCommand(this, window); 124 } 125 126 public void afterPropertiesSet() throws Exception { 127 Assert.notNull(id, "id is mandatory"); 128 Assert.notNull(viewClass, "viewClass is mandatory"); 129 } 130 131 }