com.jaspersoft.jasperserver.export.RemoveDuplicatedDisplayName.java Source code

Java tutorial

Introduction

Here is the source code for com.jaspersoft.jasperserver.export.RemoveDuplicatedDisplayName.java

Source

/*
 * Copyright (C) 2005 - 2014 TIBCO Software Inc. All rights reserved.
 * http://www.jaspersoft.com.
 *
 * Unless you have purchased  a commercial license agreement from Jaspersoft,
 * the following license terms  apply:
 *
 * This program is free software: you can redistribute it and/or  modify
 * it under the terms of the GNU Affero General Public License  as
 * published by the Free Software Foundation, either version 3 of  the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero  General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public  License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

package com.jaspersoft.jasperserver.export;

import com.jaspersoft.jasperserver.api.common.util.CharacterEncodingProvider;
import com.jaspersoft.jasperserver.api.metadata.common.service.impl.hibernate.HibernateRepositoryServiceImpl;
import com.jaspersoft.jasperserver.api.metadata.view.domain.FilterCriteria;
import com.jaspersoft.jasperserver.api.metadata.common.domain.Resource;
import com.jaspersoft.jasperserver.api.metadata.common.service.RepositoryService;
import com.jaspersoft.jasperserver.api.metadata.common.domain.Folder;

import com.jaspersoft.jasperserver.export.BaseExportImportCommand.SpringResourceFactory;

import java.util.List;
import java.util.Hashtable;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.StringTokenizer;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.ClassPathResource;

import com.jaspersoft.jasperserver.export.util.CommandOut;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;
import java.nio.charset.Charset;

/**
 * @author achan
 *
 */
public class RemoveDuplicatedDisplayName implements CommandBean {

    private String rootUri = null;
    private RepositoryService repository;
    protected static final CommandOut commandOut = CommandOut.getInstance();
    private static OutputStreamWriter osw;
    private static CharacterEncodingProvider encodingProvider;
    private static boolean updateRepo = false;

    public static void main(String[] args) {

        Parameters params = null;
        boolean success = false;
        try {

            GenericApplicationContext ctx = new GenericApplicationContext();
            XmlBeanDefinitionReader configReader = new XmlBeanDefinitionReader(ctx);
            List resourceXML = getPaths(args[2]);
            if (args != null && args.length > 0) {
                for (int i = 0; i < resourceXML.size(); i++) {
                    org.springframework.core.io.Resource resource = classPathResourceFactory
                            .create((String) resourceXML.get(i));
                    configReader.loadBeanDefinitions(resource);
                }
            }
            ctx.refresh();
            if (args.length > 3) {
                if ("UPDATE".equals(args[3])) {
                    updateRepo = true;
                }
            }

            // write to file
            //

            try {
                CommandBean commandBean = (CommandBean) ctx.getBean("removeDuplicateDisplayName",
                        CommandBean.class);
                Charset encoding = Charset.forName(
                        ((RemoveDuplicatedDisplayName) commandBean).getEncodingProvider().getCharacterEncoding());
                osw = new OutputStreamWriter(new FileOutputStream("remove_duplicated_display_name_report.txt"),
                        encoding);
                commandBean.process(params);

            } finally {
                osw.close();
            }
            success = true;
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }
        System.exit(success ? 0 : -1);
    }

    public CharacterEncodingProvider getEncodingProvider() {
        return encodingProvider;
    }

    public void setEncodingProvider(CharacterEncodingProvider encodingProvider) {
        this.encodingProvider = encodingProvider;
    }

    private static List getPaths(String listOfXML) {

        ArrayList lst = new ArrayList();
        StringTokenizer str = new StringTokenizer(listOfXML, ",");
        while (str.hasMoreElements()) {
            lst.add(str.nextElement());
        }
        return lst;
    }

    protected static final SpringResourceFactory classPathResourceFactory = new SpringResourceFactory() {
        public org.springframework.core.io.Resource create(String location) {
            commandOut.debug("Loading Spring configuration classpath resource " + location);
            return new ClassPathResource(location);
        }
    };

    public RepositoryService getRepository() {
        return repository;
    }

    public void setRepository(RepositoryService repository) {
        this.repository = repository;
    }

    public RemoveDuplicatedDisplayName() {
        this("/");
    }

    public RemoveDuplicatedDisplayName(String rtUri) {
        this.rootUri = rtUri;
        this.repository = new HibernateRepositoryServiceImpl();
    }

    public String getRootUri() {
        return rootUri;
    }

    public void setRootUri(String rootUri) {
        this.rootUri = rootUri;
    }

    public void process(Parameters param) {
        //System.out.println("repo======" + repository);      
        remove(rootUri);
    }

    public boolean remove(String parentFolderUri) {

        // get list of subfolders
        List subFolders = repository.getSubFolders(null, parentFolderUri);
        // clean up current directory first
        cleanUpDisplayNames(parentFolderUri, subFolders);

        // for each sub directory, clean up
        for (int i = 0; i < subFolders.size(); i++) {
            remove(((Resource) subFolders.get(i)).getURIString());
        }

        return true;
    }

    private boolean cleanUpDisplayNames(String parentFolderUri, List subFolders) {

        // clean up resources
        // get list of resources   
        FilterCriteria criteria = FilterCriteria.createFilter();
        criteria.addFilterElement(FilterCriteria.createParentFolderFilter(parentFolderUri));
        List resources = repository.loadResourcesList(null, criteria);
        List allObjects = new ArrayList();
        //allObjects.add(repository.getFolder(null, parentFolderUri));
        allObjects.addAll(subFolders);
        allObjects.addAll(resources);
        hashNames(allObjects);

        return true;
    }

    private boolean hashNames(List objects) {
        Hashtable ht = new Hashtable();
        for (int i = 0; i < objects.size(); i++) {
            String curDisplayName = ((Resource) objects.get(i)).getLabel();
            if (!ht.containsKey(curDisplayName)) {
                ArrayList checkList = new ArrayList();
                checkList.add(objects.get(i));
                ht.put(curDisplayName, checkList);
            } else {
                ((List) (ht.get(curDisplayName))).add(objects.get(i));
            }
        }
        updateDuplicateNames(ht);
        return true;
    }

    private boolean updateDuplicateNames(Hashtable ht) {
        Enumeration enu = ht.keys();
        while (enu.hasMoreElements()) {
            List valueList = (List) ht.get((String) enu.nextElement());
            if (valueList.size() > 1) {
                int curValue = 2;
                for (int i = 1; i < valueList.size(); i++) {
                    try {
                        osw.write("\r\n");
                        osw.write("Parent Folder: " + ((Resource) valueList.get(i)).getParentURI());
                        osw.write("\r\n");
                        osw.write("Modified Object Name(ID): " + ((Resource) valueList.get(i)).getURIString());
                        osw.write("\r\n");
                        osw.write("Modified Object Old Display Name: " + ((Resource) valueList.get(i)).getLabel());
                        osw.write("\r\n");
                    } catch (IOException e) {
                    }

                    // need to find 2, 3, 4.. etc 
                    int newNumber = findUniqueDisplayNameNumber(ht, curValue,
                            ((Resource) valueList.get(i)).getLabel());
                    String newLabel = ((Resource) valueList.get(i)).getLabel() + " (" + newNumber + ")";
                    // update loaded values
                    ((Resource) valueList.get(i)).setLabel(newLabel);
                    if (valueList.get(i) instanceof Folder) {
                        if (updateRepo) {
                            repository.saveFolder(null, (Folder) valueList.get(i));
                        }
                        try {
                            //osw.write("Modified Object New Display Name: " + ((Folder)valueList.get(i)).getLabel());
                            osw.write("Modified Object New Display Name: " + newLabel);
                            osw.write("\r\n");
                            osw.write("Modified Object Type: Folder");
                            osw.write("\r\n");
                            osw.write("\r\n");
                        } catch (IOException e) {
                        }
                    } else {
                        // get the actual resource
                        if (updateRepo) {
                            Resource res = repository.getResource(null,
                                    ((Resource) valueList.get(i)).getURIString());
                            res.setLabel(newLabel);
                            repository.saveResource(null, res);
                        }
                        try {
                            //osw.write("Modified Object New Display Name: " + ((Resource)valueList.get(i)).getLabel());
                            osw.write("Modified Object New Display Name: " + newLabel);
                            osw.write("\r\n");
                            osw.write("Modified Object Type: " + ((Resource) valueList.get(i)).getResourceType());
                            osw.write("\r\n");
                            osw.write("\r\n");
                        } catch (IOException e) {
                        }
                    }
                    curValue = newNumber + 1;
                }
            }
        }

        return true;
    }

    private int findUniqueDisplayNameNumber(Hashtable ht, int appValue, String name) {
        String returnDisplayName = name;
        int tempValue = appValue;
        while (ht.containsKey(returnDisplayName + " (" + tempValue + ")")) {
            tempValue++;
        }

        return tempValue;
    }

}