/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.upgrade.task.datasource.method; import java.util.HashSet; import java.util.Iterator; import java.util.StringTokenizer; import org.jdom.Element; import com.google.common.base.Strings; final class FindContentByCategoryConverter extends DataSourceMethodConverter { public FindContentByCategoryConverter() { super( "findContentByCategory" ); } @Override public Element convert( final String[] params ) { final int numberOfParams = params.length; if ( numberOfParams != 15 ) { return null; } /* // Try to convert to getContentByCategory public XMLDocument findContentByCategory(15) 0 String c, QUERY 1 String operator, QUERY 2 int[] categories, OK 3 boolean includeSubCategories, LEVELS 4 String orderBy, OK 5 int index, OK 6 int count, OK 7 boolean titlesOnly, INCLUDE-DATA 8 int childrenLevel, OK 9 int parentLevel, OK 10 int parentChildrenLevel, SKIP 11 boolean relatedTitlesOnly, INCLUDE-DATA 12 boolean includeTotalCount, SKIP 13 boolean includeUserRights, SKIP 14 int[] contentTypes ); QUERY */ final String operator = params[1]; final boolean opAnd = ( operator != null ) && "AND".equalsIgnoreCase( operator ); String query = convertSimpleSearch( params[0], opAnd ); String contentTypesString = params[14]; if ( !Strings.isNullOrEmpty( contentTypesString ) ) { query = appendInFilterToQuery( query, contentTypesString, "contenttypekey" ); } final Integer levels = Boolean.valueOf( params[3] ) ? Integer.MAX_VALUE : 1; // Translated from !relatedTitlesOnly && !titlesOnly final Boolean includeData = !Boolean.valueOf( params[11] ) || !Boolean.valueOf( params[7] ); return method("getContentByCategory") .param( "categoryKeys", params[2] ) .param( "levels", levels.toString() ) .param( "query", query ) .param( "orderBy", params[4] ) .param( "index", params[5] ) .param( "count", params[6] ) .param( "includeData", Boolean.toString( includeData ) ) .param( "childrenLevel", params[8] ) .param( "parentLevel", params[9] ) .build(); } private String convertSimpleSearch( String search, boolean opAnd ) { String operator = opAnd ? " AND " : " OR "; final StringBuilder query = new StringBuilder(); if ( search != null ) { HashSet<String> params = new HashSet<String>(); StringTokenizer tok = new StringTokenizer( search, " " ); while ( tok.hasMoreTokens() ) { String param = tok.nextToken(); if ( param.length() > 0 ) { params.add( param ); } } for ( Iterator<String> i = params.iterator(); i.hasNext(); ) { String param = i.next(); query.append( "((title CONTAINS \"" ).append( param ).append( "\") OR " ); query.append( "(data/* CONTAINS \"" ).append( param ).append( "\"))" ); if ( i.hasNext() ) { query.append( operator ); } } } return query.toString(); } }