/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.upgrade.task; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Map; import com.google.common.base.Charsets; import com.google.common.collect.Maps; import com.enonic.cms.upgrade.UpgradeContext; import com.enonic.cms.upgrade.task.datasource.DataSourceConverter; import com.enonic.cms.upgrade.task.datasource.DataSourceConverterHelper; import com.enonic.cms.upgrade.task.datasource.DatasourceInfoHolder; abstract class AbstractDataSourceUpgradeTask extends AbstractUpgradeTask { private DataSourceConverterHelper helper; public AbstractDataSourceUpgradeTask( final int model ) { super( model ); } protected abstract DataSourceConverter newConverter( final UpgradeContext context ); protected final void upgradeDataSources( final UpgradeContext context ) throws Exception { this.helper = new DataSourceConverterHelper( newConverter( context ) ); final Connection conn = context.getConnection(); try { context.logInfo( "Converting pageTemplate datasources..." ); upgradePageTemplates( conn ); context.logInfo( "Converting portlet datasources..." ); upgradePortlets( conn ); } finally { context.close( conn ); } } private void upgradePageTemplates( final Connection conn ) throws Exception { final Map<Integer, DatasourceInfoHolder> map = loadPageTemplates( conn ); convertDataSources( map ); updatePageTemplates( conn, map ); } private void upgradePortlets( final Connection conn ) throws Exception { final Map<Integer, DatasourceInfoHolder> map = loadPortlets( conn ); convertDataSources( map ); updatePortlets( conn, map ); } private Map<Integer, DatasourceInfoHolder> loadPageTemplates( final Connection conn ) throws Exception { return loadXmlMap( conn, "SELECT pat_lkey, pat_xmlData, pat_sname, men_sname FROM tPageTemplate, tMenu WHERE pat_men_lkey = men_lkey" ); } private Map<Integer, DatasourceInfoHolder> loadPortlets( final Connection conn ) throws Exception { return loadXmlMap( conn, "SELECT cob_lkey, cob_xmlData, cob_sname, men_sname FROM tContentObject, tMenu WHERE cob_men_lkey = men_lkey" ); } private Map<Integer, DatasourceInfoHolder> loadXmlMap( final Connection conn, final String sql ) throws Exception { final Map<Integer, DatasourceInfoHolder> map = Maps.newHashMap(); final PreparedStatement stmt = conn.prepareStatement( sql ); final ResultSet result = stmt.executeQuery(); while ( result.next() ) { DatasourceInfoHolder datasourceInfoHolder = new DatasourceInfoHolder(); datasourceInfoHolder.setXml( new String( result.getBytes( 2 ), Charsets.UTF_8 ) ); datasourceInfoHolder.setObjectName( result.getString( 3 ) ); datasourceInfoHolder.setSite( result.getString( 4 ) ); map.put( result.getInt( 1 ), datasourceInfoHolder ); } result.close(); stmt.close(); return map; } private void convertDataSources( final Map<Integer, DatasourceInfoHolder> map ) throws Exception { for ( final Integer key : map.keySet() ) { final DatasourceInfoHolder datasourceInfoHolder = map.get( key ); final String result = this.helper.convert( datasourceInfoHolder ); datasourceInfoHolder.setXml( result ); } } private void updatePageTemplates( final Connection conn, final Map<Integer, DatasourceInfoHolder> map ) throws Exception { updateXmlMap( conn, "UPDATE tPageTemplate SET pat_xmlData = ? WHERE pat_lkey = ?", map ); } private void updatePortlets( final Connection conn, final Map<Integer, DatasourceInfoHolder> map ) throws Exception { updateXmlMap( conn, "UPDATE tContentObject SET cob_xmlData = ? WHERE cob_lkey = ?", map ); } private void updateXmlMap( final Connection conn, final String sql, final Map<Integer, DatasourceInfoHolder> map ) throws Exception { final PreparedStatement stmt = conn.prepareStatement( sql ); for ( final Map.Entry<Integer, DatasourceInfoHolder> entry : map.entrySet() ) { stmt.setBytes( 1, entry.getValue().getXml().getBytes( Charsets.UTF_8 ) ); stmt.setInt( 2, entry.getKey() ); stmt.executeUpdate(); } stmt.close(); } }