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    /*
017     * To change this template, choose Tools | Templates
018     * and open the template in the editor.
019     */
020    package org.kuali.rice.krad.maintainablexml;
021    
022    import java.sql.ResultSet;
023    import java.sql.SQLException;
024    import java.util.HashMap;
025    import java.util.logging.Level;
026    import java.util.logging.Logger;
027    import javax.sql.DataSource;
028    import org.springframework.jdbc.core.JdbcTemplate;
029    import org.springframework.jdbc.core.RowCallbackHandler;
030    import org.springframework.jdbc.datasource.DriverManagerDataSource;
031    
032    /**
033     * Used to upgrade the maintenance document xml stored in krns_maint_doc_t.doc_cntnt
034     * to be able to still open and use any maintenance documents that were enroute at the time of an upgrade to Rice 2.0.
035     *
036     * @author Kuali Rice Team (rice.collab@kuali.org)
037     */
038    
039    public class FileConverter {
040    
041        private JdbcTemplate jdbcTemplate;
042        private int totalDocs = 0;
043    
044        /**
045         * Selects all the encrypted xml documents from krns_maint_doc_t, decrypts them, runs the rules to upgrade them,
046         * encrypt them and update krns_maint_doc_t with the upgraded xml.
047         *
048         * @param settingsMap - the settings
049         * @throws Exception
050         */
051        public void runFileConversion(HashMap settingsMap, final String runMode, final String fromRange,
052                final String toRange, final boolean hasRangeParameters) throws Exception {
053    
054            final EncryptionService encryptService = new EncryptionService((String) settingsMap.get("encryption.key"));
055    
056            String docSQL = "SELECT DOC_HDR_ID, DOC_CNTNT FROM krns_maint_doc_t ";
057    
058            // If user entered range add the sql parameters and filter results because DOC_HDR_ID is a varchar field.
059            if (hasRangeParameters) {
060                docSQL = docSQL.concat(" WHERE DOC_HDR_ID >= '" + fromRange + "' AND DOC_HDR_ID <= '" + toRange + "'");
061            }
062            System.out.println("SQL to run:"  + docSQL);
063    
064            jdbcTemplate = new JdbcTemplate(getDataSource(settingsMap));
065            jdbcTemplate.query(docSQL, new RowCallbackHandler() {
066    
067                public void processRow(ResultSet rs) throws SQLException {
068                    // Check that all docId's is in range
069                    if (hasRangeParameters) {
070                        int docId = Integer.parseInt(rs.getString(1));
071                        if (docId >= Integer.parseInt(fromRange) && docId <= Integer.parseInt(toRange)) {
072                            processDocumentRow(rs.getString(1), rs.getString(2), encryptService, runMode);
073                        }
074                    } else {
075                        processDocumentRow(rs.getString(1), rs.getString(2), encryptService, runMode);
076                    }
077                }
078            });
079    
080            System.out.println(totalDocs + " maintenance documents upgraded.");
081    
082        }
083    
084        /**
085         * Creates the data source from the settings map
086         *
087         * @param settingsMap - the settingMap containing the db connection settings
088         * @return the DataSource object
089         */
090        public static DataSource getDataSource(HashMap settingsMap) {
091            String driver;
092            if ("MySQL".equals(settingsMap.get("datasource.ojb.platform"))) {
093                driver = "com.mysql.jdbc.Driver";
094            } else if ("Oracle9i".equals(settingsMap.get("datasource.ojb.platform"))) {
095                driver = "oracle.jdbc.driver.OracleDriver";
096            } else {
097                driver = (String) settingsMap.get("datasource.driver.name");
098            }
099    
100            DriverManagerDataSource dataSource = new DriverManagerDataSource();
101            dataSource.setDriverClassName(driver);
102            dataSource.setUrl((String) settingsMap.get("datasource.url"));
103            dataSource.setUsername((String) settingsMap.get("datasource.username"));
104            dataSource.setPassword((String) settingsMap.get("datasource.password"));
105            return dataSource;
106        }
107    
108        /**
109         * Called for each row in the processRow method of the spring query. Upgrades the xml and update the
110         * krns_maint_doc_t table.
111         *
112         * @param docId - the document id string
113         * @param docCntnt - the old xml string
114         * @param encryptServ - the encryption service used to encrypt/decrypt the xml
115         */
116        public void processDocumentRow(String docId, String docCntnt, EncryptionService encryptServ, String runMode) {
117            System.out.println(docId);
118            try {
119                String oldXml = docCntnt;
120                if (encryptServ.isEnabled()) {
121                    oldXml = encryptServ.decrypt(docCntnt);
122                }
123                if ("2".equals(runMode)) {
124                    System.out.println("------ ORIGINAL DOC XML --------");
125                    System.out.println(oldXml);
126                    System.out.println("--------------------------------");
127                }
128    
129                MaintainableXMLConversionServiceImpl maintainableXMLConversionServiceImpl = new MaintainableXMLConversionServiceImpl();
130                String newXML = maintainableXMLConversionServiceImpl.transformMaintainableXML(oldXml);
131    
132                if ("2".equals(runMode)) {
133                    System.out.println("******* UPGRADED DOC XML ********");
134                    System.out.println(newXML);
135                    System.out.println("*********************************\n");
136                }
137                if ("1".equals(runMode)) {
138                     if (encryptServ.isEnabled()) {
139                        jdbcTemplate.update("update krns_maint_doc_t set DOC_CNTNT = ? where DOC_HDR_ID = ?",
140                            new Object[]{encryptServ.encrypt(newXML), docId});
141                     } else {
142                         jdbcTemplate.update("update krns_maint_doc_t set DOC_CNTNT = ? where DOC_HDR_ID = ?",
143                                 new Object[]{newXML, docId});
144                     }
145                }
146                totalDocs++;
147            } catch (Exception ex) {
148                Logger.getLogger(FileConverter.class.getName()).log(Level.SEVERE, null, ex);
149                System.exit(1);
150            }
151        }
152    }