001    package org.apache.ojb.broker.metadata.torque;
002    
003    /* Copyright 2002-2005 The Apache Software Foundation
004     *
005     * Licensed under the Apache License, Version 2.0 (the "License");
006     * you may not use this file except in compliance with the License.
007     * 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     */
017    
018    import org.apache.ojb.broker.metadata.FieldDescriptor;
019    
020    import java.sql.Types;
021    
022    public class TorqueFieldGenerator {
023    
024        private boolean ignoreAutoIncrement;
025    
026        public TorqueFieldGenerator(boolean ignoreAutoIncrement) {
027            this.ignoreAutoIncrement = ignoreAutoIncrement;
028        }
029    
030        public void generateFieldDescriptors(FieldDescriptor[] descriptors, StringBuffer buffer) {
031            if (descriptors != null) {
032                for (int i = 0; i < descriptors.length; i++) {
033                    FieldDescriptor descriptor = descriptors[i];
034                    generateFieldDescriptor(descriptor, descriptor.getColumnName(), descriptor.isRequired(), descriptor.isAutoIncrement(), descriptor.isPrimaryKey(), buffer);
035                }
036            }
037        }
038    
039        public void generateMappingFieldDescriptors(FieldDescriptor[] descriptors, StringBuffer buffer) {
040            if (descriptors != null) {
041                for (int i = 0; i < descriptors.length; i++) {
042                    FieldDescriptor descriptor = descriptors[i];
043                    StringBuffer fieldBuffer = new StringBuffer();
044                    generateFieldDescriptor(descriptor, descriptor.getColumnName(), true, false, true, fieldBuffer);
045                    buffer.append(fieldBuffer);
046                }
047            }
048        }
049    
050        private void generateFieldDescriptor(FieldDescriptor descriptor, String fieldName, boolean isRequired, boolean isAutoIncrement, boolean isPrimaryKey, StringBuffer buffer) {
051            buffer.append("        <column name=\"");
052            buffer.append(fieldName);
053            buffer.append("\" required=\"");
054            buffer.append(isRequired || isPrimaryKey);
055            if (!this.ignoreAutoIncrement) {
056                buffer.append("\" autoIncrement=\"");
057                buffer.append(isAutoIncrement);
058            }
059            buffer.append("\" primaryKey=\"");
060            buffer.append(isPrimaryKey);
061            buffer.append("\" type=\"");
062            buffer.append(descriptor.getColumnType());
063    
064            generateConstraints(descriptor, buffer);
065    
066            buffer.append("\"/>\n");
067        }
068    
069        private void generateConstraints(FieldDescriptor descriptor, StringBuffer buffer) {
070            int jdbcType = descriptor.getJdbcType().getType();
071    
072            switch (jdbcType) {
073                case Types.BIGINT:
074                case Types.DECIMAL:
075                case Types.DOUBLE:
076                case Types.FLOAT:
077    //            case Types.INTEGER:
078                case Types.NUMERIC:
079                case Types.REAL:
080                case Types.SMALLINT:
081                case Types.TINYINT:
082                    if (descriptor.isPrecisionSpecified()) {
083                        buffer.append("\" precision=\"");
084                        buffer.append(descriptor.getPrecision());
085                    }
086                    if (descriptor.isScaleSpecified()) {
087                        buffer.append("\" scale=\"");
088                        buffer.append(descriptor.getScale());
089                    }
090                    break;
091                default:
092                    if (descriptor.isLengthSpecified()) {
093                        buffer.append("\" size=\"");
094                        buffer.append(descriptor.getLength());
095                    }
096            }
097        }
098    
099    }