/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.vertical.engine.handlers; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.Set; import org.springframework.stereotype.Component; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.enonic.esl.xml.XMLTool; import com.enonic.vertical.engine.VerticalEngineLogger; import com.enonic.vertical.engine.filters.Filter; import com.enonic.cms.framework.xml.XMLDocument; import com.enonic.cms.framework.xml.XMLDocumentFactory; import com.enonic.cms.core.CalendarUtil; import com.enonic.cms.core.content.category.UnitEntity; import com.enonic.cms.core.content.category.UnitKey; import com.enonic.cms.core.content.contenttype.ContentTypeEntity; @Component public class UnitHandler extends BaseHandler { private final static String UNI_SELECT = "SELECT uni_lKey,uni_lan_lKey,lan_sDescription,uni_sName,uni_sDescription," + "uni_lSuperKey,uni_bDeleted,uni_dteTimestamp,cat_lKey,cat_sName" + " FROM tUnit" + " JOIN tLanguage ON uni_lan_lKey=lan_lKey" + " JOIN tCategory ON tCategory.cat_uni_lKey = tUnit.uni_lKey" + " WHERE (uni_bDeleted=0) AND cat_cat_lSuper IS NULL"; private final static String UNI_SELECT_NAME = "SELECT uni_lKey, uni_sName, cat_sName, cat_lKey, lan_lKey, lan_sDescription, lan_sCode" + " FROM tUnit" + " JOIN tLanguage ON tLanguage.lan_lKey = tUnit.uni_lan_lKey" + " JOIN tCategory ON tCategory.cat_uni_lKey = tUnit.uni_lKey" + " WHERE (uni_bDeleted=0) AND cat_cat_lSuper IS NULL "; private final static String UNI_WHERE_CLAUSE = " uni_lKey=?"; /** * @param unitKey int * @return String */ public XMLDocument getUnit( int unitKey ) { StringBuffer sql = new StringBuffer( UNI_SELECT ); sql.append( " AND" ); sql.append( UNI_WHERE_CLAUSE ); int[] paramValue = {unitKey}; return XMLDocumentFactory.create( getUnit( sql.toString(), paramValue ) ); } private Document getUnit( String sql, int[] paramValue ) { sql += " ORDER BY uni_sName ASC"; PreparedStatement preparedStmt = null; ResultSet resultSet = null; Document doc = null; try { doc = XMLTool.createDocument( "units" ); Element root = doc.getDocumentElement(); Connection con = getConnection(); preparedStmt = con.prepareStatement( sql ); int length = ( paramValue != null ? paramValue.length : 0 ); for ( int i = 0; i < length; i++ ) { preparedStmt.setInt( i + 1, paramValue[i] ); } resultSet = preparedStmt.executeQuery(); while ( resultSet.next() ) { int unitkey = resultSet.getInt( "uni_lKey" ); // int sitekey = resultSet.getInt("uni_sit_lKey"); Element elem = XMLTool.createElement( doc, root, "unit" ); elem.setAttribute( "key", Integer.toString( unitkey ) ); // elem.setAttribute("sitekey", Integer.toString(sitekey)); String superkey = resultSet.getString( "uni_lSuperKey" ); if ( !resultSet.wasNull() ) { elem.setAttribute( "superkey", superkey ); } elem.setAttribute( "languagekey", resultSet.getString( "uni_lan_lKey" ) ); elem.setAttribute( "language", resultSet.getString( "lan_sDescription" ) ); elem.setAttribute( "categorykey", resultSet.getString( "cat_lKey" ) ); elem.setAttribute( "categoryname", resultSet.getString( "cat_sName" ) ); // sub-elements XMLTool.createElement( doc, elem, "name", resultSet.getString( "uni_sName" ) ); String description = resultSet.getString( "uni_sDescription" ); if ( !resultSet.wasNull() ) { XMLTool.createElement( doc, elem, "description", description ); } Timestamp timestamp = resultSet.getTimestamp( "uni_dteTimestamp" ); XMLTool.createElement( doc, elem, "timestamp", CalendarUtil.formatTimestamp( timestamp, true ) ); Element ctyElem = XMLTool.createElement( doc, elem, "contenttypes" ); int[] contentTypeKeys = getUnitContentTypes( unitkey ); for ( int contentTypeKey : contentTypeKeys ) { XMLTool.createElement( doc, ctyElem, "contenttype" ).setAttribute( "key", String.valueOf( contentTypeKey ) ); } } } catch ( SQLException sqle ) { String message = "Failed to get units: %t"; VerticalEngineLogger.error( message, sqle ); } finally { close( resultSet ); close( preparedStmt ); } return doc; } public String getUnitName( int unitKey ) { final UnitEntity entity = this.unitDao.findByKey( new UnitKey( unitKey ) ); return entity != null ? entity.getName() : null; } public Document getUnitNamesXML( Filter filter ) { Connection con = null; PreparedStatement preparedStmt = null; ResultSet resultSet = null; Document doc; try { doc = XMLTool.createDocument( "unitnames" ); Element root = doc.getDocumentElement(); StringBuffer sql = new StringBuffer( UNI_SELECT_NAME ); sql.append( " ORDER BY uni_sName ASC" ); con = getConnection(); preparedStmt = con.prepareStatement( sql.toString() ); resultSet = preparedStmt.executeQuery(); while ( resultSet.next() ) { if ( filter != null && filter.filter( baseEngine, resultSet ) ) { continue; } String siteName = resultSet.getString( "uni_sName" ); Element unitname = XMLTool.createElement( doc, root, "unitname", siteName ); unitname.setAttribute( "key", resultSet.getString( "uni_lKey" ) ); unitname.setAttribute( "categoryname", resultSet.getString( "cat_sName" ) ); unitname.setAttribute( "categorykey", resultSet.getString( "cat_lKey" ) ); unitname.setAttribute( "languagekey", resultSet.getString( "lan_lKey" ) ); unitname.setAttribute( "language", resultSet.getString( "lan_sDescription" ) ); unitname.setAttribute( "languagecode", resultSet.getString( "lan_sCode" ) ); } resultSet.close(); resultSet = null; preparedStmt.close(); preparedStmt = null; } catch ( SQLException sqle ) { String message = "Failed to get unit names: %t"; VerticalEngineLogger.error( message, sqle ); doc = null; } finally { close( resultSet ); close( preparedStmt ); } return doc; } public XMLDocument getUnits() { String sql = UNI_SELECT; return XMLDocumentFactory.create( getUnit( sql, null ) ); } private int[] getUnitContentTypes( int unitKey ) { final UnitEntity entity = this.unitDao.findByKey( new UnitKey( unitKey ) ); if ( entity == null ) { return new int[0]; } final Set<ContentTypeEntity> contentTypes = entity.getContentTypes(); int index = 0; final int[] result = new int[contentTypes.size()]; for ( final ContentTypeEntity contentType : contentTypes ) { result[index++] = contentType.getKey(); } return result; } public int getUnitLanguageKey( int unitKey ) { final UnitEntity entity = this.unitDao.findByKey( new UnitKey( unitKey ) ); return entity != null ? entity.getLanguage().getKey().toInt() : -1; } }