001    /**
002     * Copyright 2005-2013 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
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,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.devtools.generators.dd;
017    
018    import org.apache.commons.beanutils.PropertyUtils;
019    import org.kuali.rice.krad.bo.BusinessObject;
020    
021    import java.beans.PropertyDescriptor;
022    
023    /**
024     * @deprecated this is for the legacy kns.
025     */
026    @Deprecated
027    public class BeanDDCreator {
028    
029        /**
030         * This method...
031         * @param args
032         */
033        public static void main(String[] args) throws Exception {
034            String className = args[0];
035            Class<? extends BusinessObject> boClass = (Class<? extends BusinessObject>)Class.forName( className );
036            PropertyDescriptor[] props = PropertyUtils.getPropertyDescriptors( boClass );
037            
038            StringBuffer sb = new StringBuffer( 4000 );
039            sb.append( "<beans xmlns=\"http://www.springframework.org/schema/beans\"\r\n" + 
040                            "    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n" + 
041                            "    xmlns:p=\"http://www.springframework.org/schema/p\"\r\n" + 
042                            "    xsi:schemaLocation=\"http://www.springframework.org/schema/beans\r\n" + 
043                            "        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd\">\r\n" + 
044                            "\r\n" + 
045                            "  <bean id=\"" );
046            sb.append( boClass.getSimpleName() );
047            sb.append( "\" parent=\"" );
048            sb.append( boClass.getSimpleName() );
049            sb.append( "-parentBean\" />\r\n" + 
050                            "\r\n" + 
051                            "  <bean id=\"" );
052            sb.append( boClass.getSimpleName() );
053            sb.append( "-parentBean\" abstract=\"true\" parent=\"BusinessObjectEntry\"\r\n" + 
054                            "        p:businessObjectClass=\"" );
055            sb.append( boClass.getName() );
056            sb.append( "\"\r\n" );
057            sb.append( "        p:titleAttribute=\"" ); 
058            sb.append( "FILL ME IN" );
059            sb.append( "\"\r\n" );
060            sb.append( "        p:objectLabel=\"" ); 
061            sb.append(  camelCaseToString( boClass.getSimpleName() ) );
062            sb.append( "\"\r\n" );
063            sb.append( "        p:inquiryDefinition-ref=\"" ); 
064            sb.append( boClass.getSimpleName() );
065            sb.append( "-inquiryDefinition\"\r\n" );
066            sb.append( "        p:lookupDefinition-ref=\"" ); 
067            sb.append( boClass.getSimpleName() );
068            sb.append( "-lookupDefinition\" >\r\n" );
069            sb.append( "    <property name=\"attributes\" >\r\n" + 
070                            "      <list>\r\n" );
071            for ( PropertyDescriptor p : props ) {
072                if ( isNormalProperty(p) ) {
073                    sb.append( "        <ref bean=\"" ).append( boClass.getSimpleName() ).append( '-' );
074                    sb.append( p.getName() );
075                    sb.append( "\" />\r\n" );
076                }
077            }
078            
079            sb.append( "      </list>\r\n" + 
080                            "    </property>\r\n" +
081                            "  </bean>\r\n" +
082                            "\r\n" );
083            for ( PropertyDescriptor p : props ) {
084                if ( isNormalProperty(p) ) {
085                    
086                    if ( p.getName().equals( "versionNumber" ) ) {
087                        sb.append( getSimpleParentBeanReference( boClass, p.getName() ) );
088                        sb.append( getSimpleAbstractInheritanceBean(boClass, p.getName(), "GenericAttributes-versionNumber" ) );
089                        
090                    } else if ( p.getName().endsWith("chartOfAccountsCode" ) ) {
091                        sb.append( getSimpleParentBeanReference( boClass, p.getName() ) );
092                        sb.append( getSimpleAbstractInheritanceBean(boClass, p.getName(), "Chart-chartOfAccountsCode" ) );
093    
094                    } else if ( p.getName().endsWith("organizationCode" ) ) {
095                        sb.append( getSimpleParentBeanReference( boClass, p.getName() ) );
096                        sb.append( getSimpleAbstractInheritanceBean(boClass, p.getName(), "Org-organizationCode" ) );
097    
098                    } else if ( p.getName().endsWith("accountNumber" ) ) {
099                        sb.append( getSimpleParentBeanReference( boClass, p.getName() ) );
100                        sb.append( getSimpleAbstractInheritanceBean(boClass, p.getName(), "Account-accountNumber" ) );
101    
102                    } else if ( p.getName().equals("active" ) ) {
103                        sb.append( getSimpleParentBeanReference( boClass, p.getName() ) );
104                        sb.append( getSimpleAbstractInheritanceBean(boClass, p.getName(), "GenericAttributes-activeIndicator" ) );
105    
106                    } else if ( p.getName().equals("codeAndDescription" ) ) {
107                        sb.append( getSimpleParentBeanReference( boClass, p.getName() ) );
108                        sb.append( getSimpleAbstractInheritanceBeanWithLabel(boClass, p.getName(), "CommonField-CodeAndDescription", camelCaseToString(boClass.getSimpleName()) ) );
109    
110                    } else if ( p.getPropertyType() == Boolean.TYPE ) {
111                        sb.append( getSimpleParentBeanReference( boClass, p.getName() ) );
112                        sb.append( getSimpleAbstractInheritanceBean(boClass, p.getName(), "GenericAttributes-genericBoolean" ) );
113    
114                    } else {
115                        // attribute bean
116                        sb.append( getSimpleParentBeanReference( boClass, p.getName() ) );
117                        // attribute parent bean
118                        sb.append( "  <bean id=\"" ).append( boClass.getSimpleName() ).append( '-' );
119                        sb.append( p.getName() ).append( "-parentBean\" parent=\"AttributeDefinition\" abstract=\"true\"\r\n" );
120                        sb.append( "        p:name=\"" ).append( p.getName() ).append( "\"\r\n" );
121                        sb.append( "        p:forceUppercase=\"false\"\r\n" );
122                        sb.append( "        p:label=\"" ).append( camelCaseToString(p.getName()) ).append( "\"\r\n" );
123                        sb.append( "        p:shortLabel=\"" ).append( camelCaseToString(p.getName()) ).append( "\"\r\n" );
124                        sb.append( "        p:maxLength=\"10\"\r\n" );
125                        sb.append( "        p:required=\"false\" >\r\n" );
126                        sb.append( "    <property name=\"validationPattern\" >\r\n" + 
127                                "      <bean parent=\"AnyCharacterValidationPattern\"\r\n" + 
128                                "            p:allowWhitespace=\"true\" />\r\n" + 
129                                "    </property>\r\n" + 
130                                "    <property name=\"control\" >\r\n" + 
131                                "      <bean parent=\"TextControlDefinition\"\r\n" + 
132                                "            p:size=\"10\" />\r\n" + 
133                                "    </property>\r\n" + 
134                                "  </bean>\r\n" );
135                        
136                    }
137                    sb.append( "\r\n" );
138                }
139            }
140            // inquiry definition
141            
142            sb.append( getSimpleParentBeanReference( boClass, "inquiryDefinition" ) );
143            sb.append( "\r\n" );
144            sb.append( "  <bean id=\"" );
145            sb.append( boClass.getSimpleName() );
146            sb.append( "-inquiryDefinition-parentBean\" abstract=\"true\" parent=\"InquiryDefinition\"\r\n" + 
147                            "        p:title=\"" );
148            sb.append( camelCaseToString(boClass.getSimpleName() ) );
149            sb.append( " Inquiry\" >\r\n" + 
150                            "    <property name=\"inquirySections\" >\r\n" + 
151                            "      <list>\r\n" + 
152                            "        <bean parent=\"InquirySectionDefinition\"\r\n" + 
153                            "              p:title=\"" );
154            sb.append( camelCaseToString(boClass.getSimpleName() ) );
155            sb.append( " Attributes\"\r\n" + 
156                            "              p:numberOfColumns=\"1\" >\r\n" + 
157                            "          <property name=\"inquiryFields\" >\r\n" + 
158                            "            <list>\r\n" );
159            for ( PropertyDescriptor p : props ) {
160                if ( isNormalProperty(p) ) {
161                    sb.append("              <bean parent=\"FieldDefinition\" p:attributeName=\"" );
162                    sb.append( p.getName() ).append( "\" />\r\n" );
163                }
164            }
165            sb.append( "            </list>\r\n" + 
166                            "          </property>\r\n" + 
167                            "        </bean>\r\n" + 
168                            "      </list>\r\n" + 
169                            "    </property>\r\n" + 
170                            "  </bean>\r\n" + 
171                            "\r\n" );
172    
173            sb.append( getSimpleParentBeanReference( boClass, "lookupDefinition" ) );
174            sb.append( "\r\n" );
175            sb.append( "  <bean id=\"" );
176            sb.append( boClass.getSimpleName() );
177            sb.append( "-lookupDefinition-parentBean\" abstract=\"true\" parent=\"LookupDefinition\"\r\n" + 
178                    "        p:title=\"" );
179            sb.append( camelCaseToString(boClass.getSimpleName() ) );
180            sb.append( " Lookup\" \r\n" );
181            //sb.append( "        p:instructions=\"Lookup a " );
182            //sb.append( camelCaseToString(boClass.getSimpleName() ) );
183            sb.append( "\" >\r\n" );
184            sb.append( "    <property name=\"defaultSort\" >\r\n" + 
185                            "      <bean parent=\"SortDefinition\">\r\n" + 
186                            "        <property name=\"attributeNames\" >\r\n" + 
187                            "          <list>\r\n" + 
188                            "            <value>FILL ME IN</value>\r\n" + 
189                            "          </list>\r\n" + 
190                            "        </property>\r\n" + 
191                            "        <property name=\"sortAscending\" value=\"true\" />\r\n" + 
192                            "      </bean>\r\n" + 
193                            "    </property>\r\n" + 
194                            "    <property name=\"lookupFields\" >\r\n" + 
195                            "      <list>\r\n" );
196            for ( PropertyDescriptor p : props ) {
197                if ( isNormalProperty(p) ) {
198                    sb.append("        <bean parent=\"FieldDefinition\" p:attributeName=\"" );
199                    sb.append( p.getName() ).append( "\" />\r\n" );
200                }
201            }
202            sb.append( "      </list>\r\n" + 
203                            "    </property>\r\n" + 
204                            "    <property name=\"resultFields\" >\r\n" + 
205                            "      <list>\r\n" );
206            for ( PropertyDescriptor p : props ) {
207                if ( isNormalProperty(p) ) {
208                    sb.append("        <bean parent=\"FieldDefinition\" p:attributeName=\"" );
209                    sb.append( p.getName() ).append( "\" />\r\n" );
210                }
211            }
212            sb.append( "      </list>\r\n" + 
213                            "    </property>\r\n" + 
214                            "  </bean>\r\n" );
215            sb.append( "\r\n</beans>" );
216            System.out.println( sb.toString() );
217        }
218    
219        public static String getSimpleAbstractInheritanceBean( Class<? extends BusinessObject> boClass, String propertyName, String parentBean ) {
220            StringBuffer sb = new StringBuffer( 100 );
221            sb.append( "  <bean id=\"" );
222            sb.append( boClass.getSimpleName() );                    
223            sb.append( "-" ).append( propertyName ).append( "-parentBean\" abstract=\"true\" parent=\"" );
224            sb.append( parentBean ).append( "\" \r\n" );        
225            sb.append( "        p:name=\"" ).append( propertyName ).append( "\"\r\n" );
226            sb.append( "        p:required=\"false\" />\r\n" );
227            return sb.toString();
228        }
229        
230        public static String getSimpleAbstractInheritanceBeanWithLabel( Class<? extends BusinessObject> boClass, String propertyName, String parentBean, String label ) {
231            StringBuffer sb = new StringBuffer( 100 );
232            sb.append( "  <bean id=\"" );
233            sb.append( boClass.getSimpleName() );                    
234            sb.append( "-" ).append( propertyName ).append( "-parentBean\" abstract=\"true\" parent=\"" );
235            sb.append( parentBean ).append( "\" \r\n" );        
236            sb.append( "        p:name=\"" ).append( propertyName ).append( "\"\r\n" );
237            sb.append( "        p:label=\"" ).append( label ).append( "\"\r\n" );
238            sb.append( "        p:required=\"false\" />\r\n" );
239            return sb.toString();
240        }
241        
242        public static String getSimpleParentBeanReference( Class<? extends BusinessObject> boClass, String propertyName ) {
243            StringBuffer sb = new StringBuffer( 100 );
244            sb.append( "  <bean id=\"" );
245            sb.append( boClass.getSimpleName() );                    
246            sb.append( "-" ).append( propertyName ).append( "\" parent=\"" );
247            sb.append( boClass.getSimpleName() );                    
248            sb.append( "-" ).append( propertyName ).append( "-parentBean\" />\r\n" );
249            return sb.toString();
250        }
251        
252        public static boolean isNormalProperty( PropertyDescriptor p ) {
253            return p.getPropertyType()!= null 
254                    && !BusinessObject.class.isAssignableFrom( p.getPropertyType() )
255                    && !p.getName().equals( "objectId" )
256                    && !p.getName().equals( "class" )
257                    && !p.getName().startsWith( "boNote" )
258                    && !p.getName().startsWith( "autoIncrementSet" )
259                    && !p.getName().equals( "newCollectionRecord" );
260        }
261        
262        public static String camelCaseToString( String className ) {
263            StringBuffer newName = new StringBuffer( className );
264            // upper case the 1st letter
265            newName.replace(0, 1, newName.substring(0, 1).toUpperCase());
266            // loop through, inserting spaces when cap
267            for ( int i = 0; i < newName.length(); i++ ) {
268                if ( Character.isUpperCase(newName.charAt(i)) ) {
269                    newName.insert(i, ' ');
270                    i++;
271                }
272            }
273    
274            return newName.toString().trim().replace( "Uc", "UC" );
275        }
276    }