/******************************************************************************* * Copyright (c) 2012 Nokia Corporation * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Comarch team - initial API and implementation *******************************************************************************/ package org.ned.client.library.advanced; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import org.ned.client.Localization; import org.ned.client.NedMidlet; import org.ned.client.NedResources; public class LibraryChangesReport { private Vector mCatalogsL; private Vector mCategoriesL; private Vector mMediaItemsL; private Vector mCatalogsR; private Vector mCategoriesR; private Vector mMediaItemsR; private LibraryChangesReport() { mCatalogsL = new Vector( 4, 4 ); mCategoriesL = new Vector( 4, 4 ); mMediaItemsL = new Vector( 4, 4 ); mCatalogsR = new Vector( 4, 4 ); mCategoriesR = new Vector( 4, 4 ); mMediaItemsR = new Vector( 4, 4 ); } public static LibraryChangesReport generateReport( LibraryGeneralModel aL, LibraryGeneralModel aR ) { LibraryChangesReport report = new LibraryChangesReport(); if ( aL != null ) { aL.getFlatList( report.mCatalogsL, report.mCategoriesL, report.mMediaItemsL ); } if ( aR != null ) { aR.getFlatList( report.mCatalogsR, report.mCategoriesR, report.mMediaItemsR ); } return report; } public String shortReport() { StringBuffer builder = new StringBuffer(); builder.append( Localization.getMessage( NedResources.CATALOGS_ADDED, new Object[]{ String.valueOf( compareVector( mCatalogsL, mCatalogsR ) ) } ) ); builder.append( "\n" ); builder.append( Localization.getMessage( NedResources.CATALOGS_REMOVED, new Object[]{ String.valueOf( compareVector( mCatalogsR, mCatalogsL ) ) } ) ); builder.append( "\n" ); builder.append( Localization.getMessage( NedResources.CATEGORIES_ADDED, new Object[]{ String.valueOf( compareVector( mCategoriesL, mCategoriesR ) ) } ) ); builder.append( "\n" ); builder.append( Localization.getMessage( NedResources.CATEGORIES_REMOVED, new Object[]{ String.valueOf( compareVector( mCategoriesR, mCategoriesL ) ) } ) ); builder.append( "\n" ); builder.append( Localization.getMessage( NedResources.MEDIAITEMS_ADDED, new Object[]{ String.valueOf( compareVector( mMediaItemsL, mMediaItemsR ) ) } ) ); builder.append( "\n" ); builder.append( Localization.getMessage( NedResources.MEDIAITEMS_REMOVED, new Object[]{ String.valueOf( compareVector( mMediaItemsR, mMediaItemsL ) ) } ) ); return builder.toString(); } private int compareVector( Vector aL, Vector aR ) { return getDiff( aL, aR ).size(); } private Vector getDiff( Vector aL, Vector aR ) { Vector diff = new Vector( 4, 4 ); Enumeration enL = aL.elements(); while ( enL.hasMoreElements() ) { Object object = enL.nextElement(); if ( !aR.contains( object ) ) { diff.addElement( object ); } } return diff; } public String getFullReport() { Vector added = getDiff( mMediaItemsL, mMediaItemsR ); Hashtable changesInCategory = new Hashtable( 4 ); Enumeration en = added.elements(); while ( en.hasMoreElements() ) { LibraryElement mediaItem = (LibraryElement)en.nextElement(); LibraryElement parentCategory = findParent( mCategoriesL, mediaItem );//search in new version of library firs if ( parentCategory == null ) {//not found in new version, must be in old version of library parentCategory = findParent( mCategoriesR, mediaItem ); } LibraryBranchChanges categoryChnged; if ( changesInCategory.containsKey( parentCategory ) ) { categoryChnged = (LibraryBranchChanges)changesInCategory.get( parentCategory ); } else { categoryChnged = new LibraryBranchChanges(); changesInCategory.put( parentCategory, categoryChnged ); } categoryChnged.getAdded().addElement( mediaItem ); } en = changesInCategory.keys(); Hashtable catalogs = new Hashtable( 4 ); while ( en.hasMoreElements() ) { LibraryElement category = (LibraryElement)en.nextElement(); LibraryElement parentCatalog = findParent( mCatalogsL, category ); if ( parentCatalog == null ) { parentCatalog = findParent( mCatalogsR, category ); } LibraryBranchChanges catalogsChanges; if ( catalogs.containsKey( parentCatalog ) ) { catalogsChanges = (LibraryBranchChanges)catalogs.get( parentCatalog ); } else { catalogsChanges = new LibraryBranchChanges(); catalogs.put( parentCatalog, catalogsChanges ); } catalogsChanges.getAdded().addElement( category ); } return serialize( catalogs, changesInCategory ); } public void persistChangesInfo() { LibraryChanges.persistChangesInfo( getDiff( mMediaItemsL, mMediaItemsR ), NedMidlet. getSettingsManager().getLibraryManager().getCurrentLibrary(). getFileUri(), false ); } private String serialize( Hashtable catalogs, Hashtable changesInCategory ) { StringBuffer builder = new StringBuffer(); Enumeration catalogsEn = catalogs.keys(); while ( catalogsEn.hasMoreElements() ) { LibraryElement catalogElement = (LibraryElement)catalogsEn. nextElement(); builder.append( NedResources.CATALOG ).append( " - " ).append( catalogElement. getName() ).append( ":\n" ); Enumeration categoryEnumeration = ((LibraryBranchChanges)catalogs. get( catalogElement )).getAdded().elements(); while ( categoryEnumeration.hasMoreElements() ) { LibraryElement category = (LibraryElement)categoryEnumeration. nextElement(); builder.append( " " ).append( NedResources.CATEGORY ).append( " - " ). append( category.getName() ).append( ":\n" ); Enumeration itemsEnum = ((LibraryBranchChanges)changesInCategory. get( category )).getAdded().elements(); while ( itemsEnum.hasMoreElements() ) { LibraryElement item = (LibraryElement)itemsEnum.nextElement(); builder.append( " + " ).append( item.getName() ).append( ":\n" ); } } } return builder.toString(); } private LibraryElement findParent( Vector categoriesR, LibraryElement mediaItem ) { Enumeration en = categoriesR.elements(); while ( en.hasMoreElements() ) { LibraryElement category = (LibraryElement)en.nextElement(); if ( category.getChildern().contains( mediaItem ) ) { return category; } } return null; } }