org.wso2.developerstudio.eclipse.artifact.registry.handler.ui.wizard.RegistryHandlerCreationWizard.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.developerstudio.eclipse.artifact.registry.handler.ui.wizard.RegistryHandlerCreationWizard.java

Source

/*
 * Copyright (c) 2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.wso2.developerstudio.eclipse.artifact.registry.handler.ui.wizard;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;

import org.apache.maven.model.Dependency;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.Repository;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.Activator;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.model.RegistryHandlerModel;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.ui.wizard.pages.FilterCreationOptionsWizardPage;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.ui.wizard.pages.HandlerMethodsInfoPage;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.ui.wizard.pages.ImportFilterClassWizardPage;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.ui.wizard.pages.ImportHandlerClassWizardPage;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.ui.wizard.pages.ImportHandlerJarWizardPage;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.ui.wizard.pages.NewFilterClassWizardPage;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.ui.wizard.pages.NewHandlerClassWizardPage;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.util.Constants;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.util.HandlerImageUtils;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.util.HandlerInfo;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.util.HandlerInfo.DataType;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.util.HandlerInfo.PropertyData;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.util.JavaCodeFormatter;
import org.wso2.developerstudio.eclipse.artifact.registry.handler.util.RegistryHandlerUtils;
import org.wso2.developerstudio.eclipse.libraries.utils.LibraryUtils;
import org.wso2.developerstudio.eclipse.logging.core.IDeveloperStudioLog;
import org.wso2.developerstudio.eclipse.logging.core.Logger;
import org.wso2.developerstudio.eclipse.maven.util.MavenUtils;
import org.wso2.developerstudio.eclipse.maven.util.ProjectDependencyConstants;
import org.wso2.developerstudio.eclipse.platform.ui.wizard.AbstractWSO2ProjectCreationWizard;
import org.wso2.developerstudio.eclipse.platform.ui.wizard.pages.MavenDetailsPage;
import org.wso2.developerstudio.eclipse.platform.ui.wizard.pages.ProjectOptionsDataPage;
import org.wso2.developerstudio.eclipse.utils.file.FileUtils;
import org.wso2.developerstudio.eclipse.utils.jdt.JavaLibraryBean;
import org.wso2.developerstudio.eclipse.utils.jdt.JavaLibraryUtil;
import org.wso2.developerstudio.eclipse.utils.jdt.JavaUtils;
import org.wso2.developerstudio.eclipse.utils.jdt.JavaUtils.WSO2JavaMethod;
import org.wso2.developerstudio.eclipse.utils.project.ProjectUtils;

public class RegistryHandlerCreationWizard extends AbstractWSO2ProjectCreationWizard {
    private static IDeveloperStudioLog log = Logger.getLog(Activator.PLUGIN_ID);

    private static final String PROJECT_WIZARD_WINDOW_TITLE = "New Registry Handler Artifact";
    private static final String ACTIVATOR_FQN = "org.osgi.framework.BundleActivator";
    private NewHandlerClassWizardPage newHandlerClassWizardPage;
    private ImportHandlerClassWizardPage importHandlerClassWizardPage;
    private NewFilterClassWizardPage newFilterClassWizardPage;
    private ImportFilterClassWizardPage importFilterClassWizardPage;
    private HandlerMethodsInfoPage handlerMethodsInfoPage;
    private FilterCreationOptionsWizardPage filterCreationOptionsWizardPage;
    private ImportHandlerJarWizardPage importHandlerJarWizardPage;
    private IWizardPage[] pages;
    private RegistryHandlerModel regModel;
    private IProject project;
    private IFolder sourceFolder;
    private IJavaProject javaProject;
    private IPackageFragmentRoot root;
    private String handlerClass;
    private String handlerPackageName;
    private String fullyQualifiedHandlerClassName;
    private String fullyQualifiedFilterClassName;
    private String filterClass;
    private String filterPackageName;
    private String handlerSelectedMethod;
    private String filterClassSelectedMethod;
    private List<String> selectedHandlerMethods;
    private Map<String, PropertyData> filterProperties;
    private Map<String, PropertyData> handlerProperties;
    private boolean isResourceImported = false;
    private boolean isCollectionImported = false;
    private boolean isAssociationImported = false;
    private boolean isCommentImported = false;
    private boolean isTaggedResourcePathImported = false;
    private boolean isTagImported = false;
    private IPackageFragment handlerSourcePackage;
    private IPackageFragment filterSourcePackage;
    private String activatorPackageName = "org.wso2.custom.internal.registry.handler";
    private IPackageFragment activatorSourcePackage;
    private final String BUNDLE_ACTIVATOR_NAME = "org.wso2.custom.internal.registry.handler.Activator";
    private IProject importHandlerProject;
    private boolean importHandlerFromWs;

    public RegistryHandlerCreationWizard() {
        regModel = new RegistryHandlerModel();
        setFilterModel(regModel);
        setModel(getFilterModel());
        setWindowTitle(PROJECT_WIZARD_WINDOW_TITLE);
        setDefaultPageImageDescriptor(
                HandlerImageUtils.getInstance().getImageDescriptor("registry-handler-wizard.png"));
    }

    public IResource getCreatedResource() {
        return null;
    }

    public boolean performFinish() {
        try {
            project = createNewProject();
            sourceFolder = ProjectUtils.getWorkspaceFolder(project, "src", "main", "java");
            javaProject = JavaCore.create(project);
            root = javaProject.getPackageFragmentRoot(sourceFolder);
            JavaUtils.addJavaSupportAndSourceFolder(project, sourceFolder);
            //            IFolder resourcesDir = ProjectUtils.getWorkspaceFolder(project, "src", "main", "resources");
            //            if(!resourcesDir.exists()){
            //               resourcesDir.create(false, true, null);
            //            }
            javaProject = JavaCore.create(project);
            boolean isImportJar = regModel.getHandlerClassSeletionMethod()
                    .equals(Constants.IMPORT_HANDLER_CLASS_FROM_FS_TEXT);

            if (isImportJar) {
                IFile distFile = project.getFile(regModel.getExternalJar().getName());
                FileUtils.copy(regModel.getExternalJar(), distFile.getLocation().toFile());
                IClasspathEntry prjEntry = JavaCore.newLibraryEntry(distFile.getLocation(), null, null);
                IClasspathEntry[] classPath = javaProject.getRawClasspath();
                int classPathCount = classPath.length;
                IClasspathEntry[] newClassPath = new IClasspathEntry[classPathCount + 1];
                System.arraycopy(classPath, 0, newClassPath, 0, classPathCount);
                newClassPath[classPathCount] = prjEntry;
                javaProject.setRawClasspath(newClassPath, null);
                File pomfile = project.getFile("pom.xml").getLocation().toFile();
                getModel().getMavenInfo().setPackageName("bundle");
                if (!pomfile.exists()) {
                    createPOM(pomfile);
                }
                ProjectUtils.addNatureToProject(project, false, Constants.REGISTRY_HANDLER_PROJECT_NATURE);
                MavenUtils.updateWithMavenEclipsePlugin(pomfile, new String[] { JDT_BUILD_COMMAND },
                        new String[] { Constants.REGISTRY_HANDLER_PROJECT_NATURE, JDT_PROJECT_NATURE });
                project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
                updatePom(project);
                project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
            } else {
                handlerSelectedMethod = regModel.getHandlerClassSeletionMethod();
                if (handlerSelectedMethod.equals(Constants.NEW_HANDLER_CLASS_TEXT)) {
                    handlerClass = newHandlerClassWizardPage.getClassName();
                    handlerPackageName = newHandlerClassWizardPage.getPackageName();
                    fullyQualifiedHandlerClassName = handlerPackageName + "." + handlerClass;
                } else if (handlerSelectedMethod.equals(Constants.IMPORT_HANDLER_CLASS_FROM_WS_TEXT)) {
                    fullyQualifiedHandlerClassName = importHandlerClassWizardPage.getHandlerClassName();
                    importHandlerFromWs = true;
                    importHandlerProject = getKeyByValue(regModel.getImportHandlerList(),
                            fullyQualifiedHandlerClassName);
                }
                addDependencies(project);
                generateHandler();
            }

        } catch (Exception e) {
            MessageDialog.openError(getShell(), "Registry Handler Artifact",
                    "Unable to create registry handler project: " + project.getName());
            log.error("Error occured while creating the Registry Handler Project " + project.getName(), e);

        }

        return true;
    }

    private void generateHandler() throws Exception {
        selectedHandlerMethods = handlerMethodsInfoPage.getSelectedMethods();
        handlerProperties = handlerMethodsInfoPage.getHandlerPropertyMap();

        filterClassSelectedMethod = filterCreationOptionsWizardPage.getFilterClassCreationMethod();

        if (filterClassSelectedMethod.equals(Constants.NEW_FILTER_CLASS)) {
            filterClass = newFilterClassWizardPage.getClassName();
            filterPackageName = newFilterClassWizardPage.getPackageName();
            fullyQualifiedFilterClassName = filterPackageName + "." + filterClass;
            filterProperties = newFilterClassWizardPage.getFilterMap();
        } else if (filterClassSelectedMethod.equals(Constants.FROM_EXISTING_FILTER_CLASS)) {
            fullyQualifiedFilterClassName = importFilterClassWizardPage.getClassName();
            String filterProject = importFilterClassWizardPage.getProject(fullyQualifiedFilterClassName);
            filterProperties = importFilterClassWizardPage.getFilterMap();
            addFilterProjectDependency(filterProject);
        }

        HandlerInfo handlerInfo = new HandlerInfo();
        handlerInfo.setHandlerClass(fullyQualifiedHandlerClassName);
        handlerInfo.setFilterClass(fullyQualifiedFilterClassName);
        handlerInfo.setSelectedMethods(selectedHandlerMethods);

        Map<String, PropertyData> propertyMap = handlerProperties;
        for (String propertyName : propertyMap.keySet()) {
            PropertyData propertyData = propertyMap.get(propertyName);
            handlerInfo.addHandlerProperty(propertyName, propertyData.type, propertyData.data);
        }
        propertyMap = filterProperties;
        for (String propertyName : propertyMap.keySet()) {
            PropertyData propertyData = propertyMap.get(propertyName);
            handlerInfo.addFilterProperty(propertyName, propertyData.type, propertyData.data);
        }

        if (handlerPackageName != null) {
            handlerSourcePackage = root.createPackageFragment(handlerPackageName, false, null);
            handlerSourcePackage.createCompilationUnit(handlerClass + ".java",
                    JavaCodeFormatter.format(getHandlerClassSource(handlerPackageName, handlerClass), javaProject),
                    false, null);

        }
        if (filterPackageName != null) {
            filterSourcePackage = root.createPackageFragment(filterPackageName, false, null);
            filterSourcePackage.createCompilationUnit(filterClass + ".java",
                    JavaCodeFormatter.format(getFilterClassSource(filterPackageName, filterClass), javaProject),
                    false, null);
        }

        IType javaITypeForClass = null;
        propertyMap = handlerInfo.getHandlerProperties();
        String projectName = regModel.getProjectName();
        if (projectName != null && !projectName.equalsIgnoreCase("")) {
            javaITypeForClass = JavaUtils.getJavaITypeForClass(
                    JavaCore.create(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName)),
                    handlerInfo.getHandlerClass());
            if (javaITypeForClass != null) {
                for (String propertyName : propertyMap.keySet()) {
                    PropertyData propertyData = propertyMap.get(propertyName);
                    WSO2JavaMethod method = new WSO2JavaMethod();
                    method.setModifier("public");
                    method.setReturnType(null);
                    method.setElementName(JavaUtils.getSetMethod(propertyName));
                    propertyName = propertyName.matches("^\\d+") ? ("var" + propertyName) : propertyName;
                    method.addParameter(propertyName + "Value",
                            propertyData.type == DataType.STRING ? "String" : "org.apache.axiom.om.OMElement");
                    method.addMethodCode("//TODO add property set code");
                    JavaUtils.addMethod(javaITypeForClass, method);
                }
            }
        }

        javaITypeForClass = null;
        propertyMap = handlerInfo.getFilterProperties();
        // projectName = regModel.getProjectName();
        if (!handlerInfo.getFilterClass()
                .equals("org.wso2.carbon.registry.core.jdbc.handlers.filters.MediaTypeMatcher")
                && !handlerInfo.getFilterClass()
                        .equals("org.wso2.carbon.registry.core.jdbc.handlers.filters.URLMatcher")) {
            // if (projectName != null && !projectName.equalsIgnoreCase("")) {
            javaITypeForClass = JavaUtils.getJavaITypeForClass(
                    JavaCore.create(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName)),
                    handlerInfo.getFilterClass());
            if (javaITypeForClass != null) {
                for (String propertyName : propertyMap.keySet()) {
                    PropertyData propertyData = propertyMap.get(propertyName);
                    WSO2JavaMethod method = new WSO2JavaMethod();
                    method.setModifier("public");
                    method.setReturnType(null);
                    method.setElementName(JavaUtils.getSetMethod(propertyName));
                    method.addParameter(propertyName + "Value",
                            propertyData.type == DataType.STRING ? "String" : "org.apache.axiom.om.OMElement");
                    method.addMethodCode("//TODO add property set code");
                    JavaUtils.addMethod(javaITypeForClass, method);
                }
            }
        }

        javaITypeForClass = null;
        projectName = regModel.getProjectName();
        if (projectName != null && !projectName.equalsIgnoreCase("")) {
            javaITypeForClass = JavaUtils.getJavaITypeForClass(
                    JavaCore.create(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName)),
                    handlerInfo.getHandlerClass());
            if (javaITypeForClass != null) {

                if (!handlerInfo.getSelectedMethods().isEmpty()) {
                    javaITypeForClass.getCompilationUnit().createImport(
                            "org.wso2.carbon.registry.core.exceptions.RegistryException", null,
                            new NullProgressMonitor());
                    javaITypeForClass.getCompilationUnit().createImport(
                            "org.wso2.carbon.registry.core.jdbc.handlers.RequestContext", null,
                            new NullProgressMonitor());
                }
                for (String selectedMethod : handlerInfo.getSelectedMethods()) {
                    overrideMethods(selectedMethod, javaITypeForClass);
                }
            }
        }

        createRegInfo(project, handlerInfo);
        IFolder handlerActivatorPackage = createSourceLocationForActivator(project);
        RegistryHandlerUtils.getActivatorJavaClass(handlerActivatorPackage.getLocation().toFile(), handlerInfo);

        project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());

        File pomfile = project.getFile("pom.xml").getLocation().toFile();
        getModel().getMavenInfo().setPackageName("bundle");
        if (!pomfile.exists()) {
            createPOM(pomfile);
        }
        ProjectUtils.addNatureToProject(project, false, Constants.REGISTRY_HANDLER_PROJECT_NATURE);

        updatePom(project, handlerInfo);
        project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());

        try {
            refreshDistProjects();
            IFile openFile = project.getFile("registry-handler-info.xml");
            IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), openFile);
        } catch (Exception e) { /* ignore */
        }

    }

    private void addFilterProjectDependency(String filterProjectName) {
        // import filter class case
        try {
            IJavaProject javaProject = JavaCore.create(project);
            IClasspathEntry[] classPath = javaProject.getRawClasspath();

            List<IClasspathEntry> classPathList = new ArrayList<IClasspathEntry>(Arrays.asList(classPath));
            IClasspathEntry prjEntry = JavaCore.newProjectEntry(new Path("/".concat(filterProjectName)), true);
            classPathList.add(prjEntry);
            IClasspathEntry[] newClassPath = new IClasspathEntry[classPathList.size()];
            classPathList.toArray(newClassPath);
            javaProject.setRawClasspath(newClassPath, null);
        } catch (Exception e) {
            log.error("Error occured while adding filter project dependency", e);
        }
    }

    public IFolder createSourceLocationForActivator(IProject project) throws JavaModelException, CoreException {
        IFolder workspaceFolder = ProjectUtils.getWorkspaceFolder(sourceFolder, "org", "wso2", "custom", "internal",
                "registry", "handler");
        activatorSourcePackage = root.createPackageFragment(activatorPackageName, false, null);
        activatorSourcePackage.createCompilationUnit("Activator.java", "", false, null);

        return workspaceFolder;
    }

    private void createRegInfo(IProject project, HandlerInfo handlerInfo) throws IOException {
        File regInfoFile = project.getFile("registry-handler-info.xml").getLocation().toFile();
        handlerInfo.toFile(regInfoFile);
    }

    private String getHandlerClassSource(String packageName, String className) {
        StringBuffer buffer = new StringBuffer();
        if (!packageName.equalsIgnoreCase("")) {
            buffer.append("package " + packageName + ";\n");
            buffer.append("\n");
        }
        buffer.append("import org.wso2.carbon.registry.core.exceptions.RegistryException;\n");
        buffer.append("import org.wso2.carbon.registry.core.jdbc.handlers.RequestContext;\n");
        buffer.append("import org.wso2.carbon.registry.core.jdbc.handlers.Handler;\n");
        buffer.append("\n");
        buffer.append("public class " + className + " extends Handler{\n\n");

        buffer.append("\n}");
        return buffer.toString();
    }

    private String getFilterClassSource(String packageName, String className) {
        StringBuffer buffer = new StringBuffer();
        if (!packageName.equalsIgnoreCase("")) {
            buffer.append("package " + packageName + ";\n");
            buffer.append("\n");
        }
        buffer.append("import org.wso2.carbon.registry.core.exceptions.RegistryException;\n");
        buffer.append("import org.wso2.carbon.registry.core.jdbc.handlers.RequestContext;\n");
        buffer.append("import org.wso2.carbon.registry.core.jdbc.handlers.filters.Filter;\n");
        buffer.append("\n");
        buffer.append("public class " + className + " extends Filter{\n\n");

        buffer.append("\t\n");
        buffer.append("\tpublic boolean handleDelete(RequestContext requestContext)\n");
        buffer.append("\t\t\tthrows RegistryException {\n");
        buffer.append("\t\t// TODO Implement your logic here\n");
        buffer.append("\t\treturn false;\n");
        buffer.append("\t}\n\n");

        buffer.append("\t\n");
        buffer.append("\tpublic boolean handleGet(RequestContext requestContext)\n");
        buffer.append("\t\t\tthrows RegistryException {\n");
        buffer.append("\t\t// TODO Implement your logic here\n");
        buffer.append("\t\treturn false;\n");
        buffer.append("\t}\n\n");

        buffer.append("\t\n");
        buffer.append("\tpublic boolean handleImportChild(RequestContext requestContext)\n");
        buffer.append("\t\t\tthrows RegistryException {\n");
        buffer.append("\t\t// TODO Implement your logic here\n");
        buffer.append("\treturn false;\n");
        buffer.append("\t}\n\n");

        buffer.append("\t\n");
        buffer.append("\tpublic boolean handleImportResource(RequestContext requestContext)\n");
        buffer.append("\t\tthrows RegistryException {\n");
        buffer.append("\t\t// TODO Implement your logic here\n");
        buffer.append("\treturn false;\n");
        buffer.append("\t}\n\n");

        buffer.append("\t\n");
        buffer.append("\tpublic boolean handlePut(RequestContext requestContext)\n");
        buffer.append("\t\t\tthrows RegistryException {\n");
        buffer.append("\t\t// TODO Implement your logic here\n");
        buffer.append("\treturn false;\n");
        buffer.append("\t}\n\n");

        buffer.append("\t\n");
        buffer.append("\tpublic boolean handlePutChild(RequestContext requestContext)\n");
        buffer.append("\t\t\tthrows RegistryException {\n");
        buffer.append("\t\t// TODO Implement your logic here\n");
        buffer.append("\treturn false;\n");
        buffer.append("\t}\n\n");

        buffer.append("\n}");
        return buffer.toString();
    }

    private void addDependencies(IProject project) throws Exception {

        String[] depedencyList = new String[] { LibraryUtils.abdera_wso2vXX_jar,
                LibraryUtils.axiom_1_2_11_wso2vXX_jar, LibraryUtils.axis2_1_6_1_wso2vXX_jar,
                LibraryUtils.commons_codec_wso2vXX_jar, LibraryUtils.commons_httpclient_wso2vXX_jar,
                LibraryUtils.commons_io_wso2vXX_jar, LibraryUtils.commons_loggingwso2vXX_jar,
                LibraryUtils.geronimo_stax_api_wso2vXX_jar, LibraryUtils.httpcore_4_3_0_wso2vXX_jar,
                LibraryUtils.neethi_wso2vXX_jar, LibraryUtils.not_yet_commons_ssl_wso2vXX_jar,
                LibraryUtils.carbon_registry_api_xxx_jar, LibraryUtils.carbon_registry_core_xxx_jar,
                LibraryUtils.wsdl4j_wso2vXX_jar, LibraryUtils.XmlSchema_wso2vXX_jar,
                LibraryUtils.woden_1_0_0_M8_wso2vXX_jar, LibraryUtils.eclips_osgi_xxx_jar };

        for (String dependency : depedencyList) {
            JavaUtils.addJarLibraryToProject(project, LibraryUtils.getDependencyPath(dependency));
        }
        if (importHandlerFromWs && importHandlerProject != null) {
            try {
                IJavaProject javaProject = JavaCore.create(project);
                IClasspathEntry[] classPath = javaProject.getRawClasspath();
                IClasspathEntry prjEntry = JavaCore
                        .newProjectEntry(new Path("/".concat(importHandlerProject.getName())), true);
                int classPathCount = classPath.length;
                IClasspathEntry[] newClassPath = new IClasspathEntry[classPathCount + 1];
                System.arraycopy(classPath, 0, newClassPath, 0, classPathCount);
                newClassPath[classPathCount] = prjEntry;
                javaProject.setRawClasspath(newClassPath, null);
            } catch (Exception ignored) {
                /*ignored*/}
        }
    }

    public void setFilterModel(RegistryHandlerModel filterModel) {
        this.regModel = filterModel;
    }

    public RegistryHandlerModel getFilterModel() {
        return regModel;
    }

    public void addPages() {
        newHandlerClassWizardPage = new NewHandlerClassWizardPage("New Handler Class", regModel);
        importHandlerClassWizardPage = new ImportHandlerClassWizardPage("Import Handler Class", regModel);
        handlerMethodsInfoPage = new HandlerMethodsInfoPage("Handler Methods");
        filterCreationOptionsWizardPage = new FilterCreationOptionsWizardPage("Filter Class Creation Methods");
        newFilterClassWizardPage = new NewFilterClassWizardPage("New Filter Class",
                filterCreationOptionsWizardPage);
        importFilterClassWizardPage = new ImportFilterClassWizardPage("Import Filter Class");
        importHandlerJarWizardPage = new ImportHandlerJarWizardPage("Import Handler from File System", regModel);

        super.addPages();
        addPage(newHandlerClassWizardPage);
        addPage(importHandlerClassWizardPage);
        addPage(handlerMethodsInfoPage);
        addPage(filterCreationOptionsWizardPage);
        addPage(importFilterClassWizardPage);
        addPage(newFilterClassWizardPage);
        addPage(importHandlerJarWizardPage);

        pages = getPages();

    }

    public IWizardPage getNextPage(IWizardPage page) {
        IWizardPage nextPage = super.getNextPage(page);
        if (page instanceof ProjectOptionsDataPage) {
            if (regModel.getHandlerClassSeletionMethod().equals(Constants.NEW_HANDLER_CLASS_TEXT)) {
                nextPage = newHandlerClassWizardPage;
            } else if (regModel.getHandlerClassSeletionMethod()
                    .equals(Constants.IMPORT_HANDLER_CLASS_FROM_FS_TEXT)) {
                nextPage = importHandlerJarWizardPage;
            } else {
                nextPage = importHandlerClassWizardPage;
            }
        } else if (page instanceof NewHandlerClassWizardPage || page instanceof ImportHandlerClassWizardPage) {
            nextPage = handlerMethodsInfoPage;
        } else if (page instanceof HandlerMethodsInfoPage) {
            nextPage = filterCreationOptionsWizardPage;
        } else if (page instanceof FilterCreationOptionsWizardPage) {
            if (filterCreationOptionsWizardPage.getFilterClassCreationMethod()
                    .equals(Constants.FROM_EXISTING_FILTER_CLASS)) {
                nextPage = importFilterClassWizardPage;
            } else {
                nextPage = newFilterClassWizardPage;
            }

        } else if (page instanceof ImportFilterClassWizardPage || page instanceof NewFilterClassWizardPage
                || page instanceof ImportHandlerJarWizardPage) {
            nextPage = pages[1];
        } else if (page instanceof MavenDetailsPage) {
            nextPage = null;

        }
        return nextPage;
    }

    public IWizardPage getPreviousPage(IWizardPage page) {
        IWizardPage previousPage = super.getPreviousPage(page);
        if (page instanceof MavenDetailsPage) {
            if (filterCreationOptionsWizardPage.getFilterClassCreationMethod()
                    .equals(Constants.FROM_EXISTING_FILTER_CLASS)) {
                previousPage = importFilterClassWizardPage;
            } else if (filterCreationOptionsWizardPage.getFilterClassCreationMethod()
                    .equals(Constants.IMPORT_HANDLER_CLASS_FROM_WS_TEXT)) {
                previousPage = importHandlerJarWizardPage;
            } else {
                previousPage = newFilterClassWizardPage;
            }
        }
        if (page instanceof ImportFilterClassWizardPage || page instanceof NewFilterClassWizardPage) {
            previousPage = filterCreationOptionsWizardPage;
        }
        if (page instanceof FilterCreationOptionsWizardPage) {
            if (regModel.getHandlerClassSeletionMethod().equals(Constants.NEW_HANDLER_CLASS_TEXT)) {
                previousPage = newHandlerClassWizardPage;
            } else if (regModel.getHandlerClassSeletionMethod()
                    .equals(Constants.IMPORT_HANDLER_CLASS_FROM_WS_TEXT)) {
                previousPage = importHandlerClassWizardPage;
            }
        }

        return previousPage;
    }

    public void overrideMethods(String key, IType javaITypeForClass) throws JavaModelException {

        WSO2JavaMethod method = new WSO2JavaMethod();
        method.setModifier("public");

        String methodName = null;
        String methodCode = null;

        if ("PUT".equals(key)) {
            methodName = "put";
            methodCode = "super.put(requestContext);";
            method.setReturnType(null);
        }

        else if ("PUT_CHILD".equals(key)) {
            methodName = "putChild";
            methodCode = "super.putChild(requestContext);";
            method.setReturnType(null);
        }

        else if ("COPY".equals(key)) {
            methodName = "copy";
            methodCode = "return super.copy(requestContext);";
            method.setReturnType("String");
        }

        else if ("MOVE".equals(key)) {
            methodName = "move";
            methodCode = "return super.move(requestContext);";
            method.setReturnType("String");
        }

        else if ("DELETE".equals(key)) {
            methodName = "delete";
            methodCode = "super.delete(requestContext);";
            method.setReturnType(null);
        }

        else if ("RENAME".equals(key)) {
            methodName = "rename";
            methodCode = "return super.rename(requestContext);";
            method.setReturnType("String");
        }

        else if ("GET".equals(key)) {
            methodName = "get";
            methodCode = "return super.get(requestContext);";
            method.setReturnType("Resource");
            if (!isResourceImported) {
                javaITypeForClass.getCompilationUnit().createImport("org.wso2.carbon.registry.core.Resource", null,
                        new NullProgressMonitor());
                isResourceImported = true;
            }
        }

        else if ("RESOURCE_EXISTS".equals(key)) {
            methodName = "resourceExists";
            methodCode = "return super.resourceExists(requestContext);";
            method.setReturnType("boolean");
        }

        else if ("IMPORT_CHILD".equals(key)) {
            methodName = "importChild";
            methodCode = "super.importChild(requestContext);";
            method.setReturnType(null);
        }

        else if ("IMPORT".equals(key)) {
            methodName = "importResource";
            methodCode = "super.importResource(requestContext);";
            method.setReturnType(null);
        }

        else if ("ADD_ASSOCIATION".equals(key)) {
            methodName = "addAssociation";
            methodCode = "super.addAssociation(requestContext);";
            method.setReturnType(null);
        }

        else if ("ADD_COMMENT".equals(key)) {
            methodName = "addComment";
            methodCode = "return super.addComment(requestContext);";
            method.setReturnType("String");
        }

        else if ("APPLY_TAG".equals(key)) {
            methodName = "applyTag";
            methodCode = "super.applyTag(requestContext);";
            method.setReturnType(null);
        }

        else if ("CREATE_LINK".equals(key)) {
            methodName = "createLink";
            methodCode = "super.createLink(requestContext);";
            method.setReturnType(null);
        }

        else if ("CREATE_VERSION".equals(key)) {
            methodName = "createVersion";
            methodCode = "super.createVersion(requestContext);";
            method.setReturnType(null);
        }

        else if ("DUMP".equals(key)) {
            methodName = "dump";
            methodCode = "super.dump(requestContext);";
            method.setReturnType(null);
        }

        else if ("EDIT_COMMENT".equals(key)) {
            methodName = "editComment";
            methodCode = "super.editComment(requestContext);";
            method.setReturnType(null);
        }

        else if ("EXECUTE_QUERY".equals(key)) {
            methodName = "executeQuery";
            methodCode = "return super.executeQuery(requestContext);";
            method.setReturnType("Collection");
            if (!isCollectionImported) {
                javaITypeForClass.getCompilationUnit().createImport("org.wso2.carbon.registry.core.Collection",
                        null, new NullProgressMonitor());
                isCollectionImported = true;
            }
        }

        else if ("GET_ALL_ASSOCIATIONS".equals(key)) {
            methodName = "getAllAssociations";
            methodCode = "return super.getAllAssociations(requestContext);";
            method.setReturnType("Association[]");
            if (!isAssociationImported) {
                javaITypeForClass.getCompilationUnit().createImport("org.wso2.carbon.registry.core.Association",
                        null, new NullProgressMonitor());
                isAssociationImported = true;
            }
        }

        else if ("GET_ASSOCIATIONS".equals(key)) {
            methodName = "getAssociations";
            methodCode = "return super.getAssociations(requestContext);";
            method.setReturnType("Association[]");
            if (!isAssociationImported) {
                javaITypeForClass.getCompilationUnit().createImport("org.wso2.carbon.registry.core.Association",
                        null, new NullProgressMonitor());
                isAssociationImported = true;
            }
        }

        else if ("GET_AVERAGE_RATING".equals(key)) {
            methodName = "getAverageRating";
            methodCode = "return super.getAverageRating(requestContext);";
            method.setReturnType("float");
        }

        else if ("GET_COMMENTS".equals(key)) {
            methodName = "getComments";
            methodCode = "return super.getComments(requestContext);";
            method.setReturnType("Comment[]");
            if (!isCommentImported) {
                javaITypeForClass.getCompilationUnit().createImport("org.wso2.carbon.registry.core.Comment", null,
                        new NullProgressMonitor());
                isCommentImported = true;
            }
        }

        else if ("GET_RESOURCE_PATHS_WITH_TAG".equals(key)) {
            methodName = "getResourcePathsWithTag";
            methodCode = "return super.getResourcePathsWithTag(requestContext);";
            method.setReturnType("TaggedResourcePath[]");
            if (!isTaggedResourcePathImported) {
                javaITypeForClass.getCompilationUnit().createImport(
                        "org.wso2.carbon.registry.core.TaggedResourcePath", null, new NullProgressMonitor());
                isTaggedResourcePathImported = true;
            }
        }

        else if ("GET_TAGS".equals(key)) {
            methodName = "getTags";
            methodCode = "return super.getTags(requestContext);";
            method.setReturnType("Tag[]");
            if (!isTagImported) {
                javaITypeForClass.getCompilationUnit().createImport("org.wso2.carbon.registry.core.Tag", null,
                        new NullProgressMonitor());
                isTagImported = true;
            }
        }

        else if ("GET_VERSIONS".equals(key)) {
            methodName = "getVersions";
            methodCode = "return super.getVersions(requestContext);";
            method.setReturnType("String[]");
        }

        else if ("REMOVE_LINK".equals(key)) {
            methodName = "removeLink";
            methodCode = "super.removeLink(requestContext);";
            method.setReturnType(null);
        }

        else if ("RATE_RESOURCE".equals(key)) {
            methodName = "rateResource";
            methodCode = "super.rateResource(requestContext);";
            method.setReturnType(null);
        }

        else if ("REMOVE_ASSOCIATION".equals(key)) {
            methodName = "removeAssociation";
            methodCode = "super.removeAssociation(requestContext);";
            method.setReturnType(null);
        }

        else if ("REMOVE_COMMENT".equals(key)) {
            methodName = "removeComment";
            methodCode = "super.removeComment(requestContext);";
            method.setReturnType(null);
        }

        else if ("REMOVE_TAG".equals(key)) {
            methodName = "removeTag";
            methodCode = "super.removeTag(requestContext);";
            method.setReturnType(null);
        }

        else if ("RESTORE".equals(key)) {
            methodName = "restore";
            methodCode = "super.restore(requestContext);";
            method.setReturnType(null);
        }

        else if ("RESTORE_VERSION".equals(key)) {
            methodName = "restoreVersion";
            methodCode = "super.restoreVersion(requestContext);";
            method.setReturnType(null);
        }

        else if ("SEARCH_CONTENT".equals(key)) {
            methodName = "searchContent";
            methodCode = "return super.searchContent(requestContext);";
            method.setReturnType("Collection");
            if (!isCollectionImported) {
                javaITypeForClass.getCompilationUnit().createImport("org.wso2.carbon.registry.core.Collection",
                        null, new NullProgressMonitor());
                isCollectionImported = true;
            }
        }

        else if ("INVOKE_ASPECT".equals(key)) {
            methodName = "invokeAspect";
            methodCode = "super.invokeAspect(requestContext);";
            method.setReturnType(null);
        }

        else if ("GET_RATING".equals(key)) {
            methodName = "getRating";
            methodCode = "return super.getRating(requestContext);";
            method.setReturnType("int");
        }

        method.setElementName(methodName);
        method.addParameter("requestContext", "RequestContext");
        method.addExceptionType("RegistryException");
        method.addMethodCode("// TODO Auto-generated method stub");
        method.addMethodCode(methodCode);
        JavaUtils.addMethod(javaITypeForClass, method);
    }

    public boolean canFinish() {
        IWizardPage currentPage = getContainer().getCurrentPage();
        if (currentPage instanceof ImportHandlerClassWizardPage) {
            String handlerClassName = importHandlerClassWizardPage.getHandlerClassName();
            if (handlerClassName == null || "".equals(handlerClassName))
                return false;
            else
                return true;
        } else if (currentPage instanceof ImportHandlerJarWizardPage) {
            if (regModel.getExternalJar() == null || !regModel.getExternalJar().exists())
                return false;
            else
                return true;
        } else if (currentPage instanceof HandlerMethodsInfoPage) {
            return true;
        } else if (currentPage instanceof FilterCreationOptionsWizardPage) {
            if (filterCreationOptionsWizardPage.getFilterClassCreationMethod()
                    .equals(Constants.FROM_EXISTING_FILTER_CLASS)) {
                return true;
            }
            return false;
        } else if (currentPage instanceof NewFilterClassWizardPage) {
            return !("".equalsIgnoreCase(newFilterClassWizardPage.getPackageName())
                    || "".equalsIgnoreCase(newFilterClassWizardPage.getClassName()));
        } else if (currentPage instanceof ImportFilterClassWizardPage
                || currentPage instanceof ImportHandlerJarWizardPage) {
            return true;
        } else if (currentPage instanceof MavenDetailsPage) {
            return true;
        }
        return super.canFinish();
    }

    public void updatePom(IProject project) throws Exception {
        File mavenProjectPomLocation = project.getFile("pom.xml").getLocation().toFile();
        MavenProject mavenProject = MavenUtils.getMavenProject(mavenProjectPomLocation);
        StringBuffer sb = new StringBuffer();
        String activatorClass = new String();

        Properties properties = mavenProject.getModel().getProperties();
        properties.put("CApp.type", "lib/registry/handlers");
        mavenProject.getModel().setProperties(properties);

        Plugin plugin = MavenUtils.createPluginEntry(mavenProject, "org.apache.felix", "maven-bundle-plugin",
                "2.3.4", true);

        // getting export packages
        IPackageFragmentRoot rootPkg = JavaCore
                .createJarPackageFragmentRootFrom(project.getFile(regModel.getExternalJar().getName()));

        for (IJavaElement item : rootPkg.getChildren()) {
            if (item instanceof IPackageFragment) {
                IPackageFragment pkg = (IPackageFragment) item;
                if (pkg.hasChildren()) {
                    sb.append(pkg.getElementName()).append(",");
                    for (IClassFile clazz : pkg.getClassFiles()) {
                        IType type = clazz.getType();
                        if (type.getSuperInterfaceNames().length > 0
                                && Arrays.asList(type.getSuperInterfaceNames()).contains(ACTIVATOR_FQN)) {
                            activatorClass = type.getFullyQualifiedName();
                        }
                    }
                }
            }
        }
        String exportedPackageList = sb.toString().replaceAll(",$", "");

        Xpp3Dom configurationNode = MavenUtils.createMainConfigurationNode(plugin);
        Xpp3Dom instructionNode = MavenUtils.createXpp3Node("instructions");
        Xpp3Dom bundleSymbolicNameNode = MavenUtils.createXpp3Node(instructionNode, "Bundle-SymbolicName");
        Xpp3Dom bundleNameNode = MavenUtils.createXpp3Node(instructionNode, "Bundle-Name");
        Xpp3Dom bundleActivatorNode = MavenUtils.createXpp3Node(instructionNode, "Bundle-Activator");
        Xpp3Dom exportPackageNode = MavenUtils.createXpp3Node(instructionNode, "Export-Package");
        Xpp3Dom dynamicImportNode = MavenUtils.createXpp3Node(instructionNode, "DynamicImport-Package");
        bundleSymbolicNameNode.setValue(project.getName());
        bundleNameNode.setValue(project.getName());
        bundleActivatorNode.setValue(activatorClass);
        exportPackageNode.setValue(exportedPackageList);
        dynamicImportNode.setValue("*");

        configurationNode.addChild(instructionNode);

        Repository repo = new Repository();
        repo.setUrl("http://maven.wso2.org/nexus/content/groups/wso2-public/");
        repo.setId("wso2-maven2-repository-1");

        mavenProject.getModel().addRepository(repo);
        mavenProject.getModel().addPluginRepository(repo);

        List<Dependency> dependencyList = new ArrayList<Dependency>();

        Dependency dependency = new Dependency();
        dependency.setArtifactId(regModel.getExternalJar().getName());
        dependency.setGroupId("dummy.groupid");
        dependency.setVersion("1.0.0");
        dependency.setScope("system");
        dependency.setSystemPath("${basedir}/" + regModel.getExternalJar().getName());
        dependencyList.add(dependency);
        dependencyList.add(dependency);

        MavenUtils.addMavenDependency(mavenProject, dependencyList);
        MavenUtils.saveMavenProject(mavenProject, mavenProjectPomLocation);

    }

    public void updatePom(IProject project, HandlerInfo handlerInfo) throws Exception {
        File mavenProjectPomLocation = project.getFile("pom.xml").getLocation().toFile();
        MavenProject mavenProject = MavenUtils.getMavenProject(mavenProjectPomLocation);

        Properties properties = mavenProject.getModel().getProperties();
        properties.put("CApp.type", "lib/registry/handlers");
        mavenProject.getModel().setProperties(properties);

        Plugin plugin = MavenUtils.createPluginEntry(mavenProject, "org.apache.felix", "maven-bundle-plugin",
                "2.3.4", true);

        Xpp3Dom configurationNode = MavenUtils.createMainConfigurationNode(plugin);
        Xpp3Dom instructionNode = MavenUtils.createXpp3Node("instructions");
        Xpp3Dom bundleSymbolicNameNode = MavenUtils.createXpp3Node(instructionNode, "Bundle-SymbolicName");
        Xpp3Dom bundleNameNode = MavenUtils.createXpp3Node(instructionNode, "Bundle-Name");
        Xpp3Dom bundleActivatorNode = MavenUtils.createXpp3Node(instructionNode, "Bundle-Activator");
        Xpp3Dom exportPackageNode = MavenUtils.createXpp3Node(instructionNode, "Export-Package");
        Xpp3Dom dynamicImportNode = MavenUtils.createXpp3Node(instructionNode, "DynamicImport-Package");
        bundleSymbolicNameNode.setValue(project.getName());
        bundleNameNode.setValue(project.getName());
        bundleActivatorNode.setValue(BUNDLE_ACTIVATOR_NAME);
        exportPackageNode.setValue(getExportedPackage(handlerInfo));
        dynamicImportNode.setValue("*");
        configurationNode.addChild(instructionNode);

        Repository repo = new Repository();
        repo.setUrl("http://maven.wso2.org/nexus/content/groups/wso2-public/");
        repo.setId("wso2-maven2-repository-1");

        mavenProject.getModel().addRepository(repo);
        mavenProject.getModel().addPluginRepository(repo);

        List<Dependency> dependencyList = new ArrayList<Dependency>();

        Map<String, JavaLibraryBean> dependencyInfoMap = JavaLibraryUtil.getDependencyInfoMap(project);
        Map<String, String> map = ProjectDependencyConstants.DEPENDENCY_MAP;
        for (JavaLibraryBean bean : dependencyInfoMap.values()) {
            if (bean.getVersion().contains("${")) {
                for (String path : map.keySet()) {
                    bean.setVersion(bean.getVersion().replace(path, map.get(path)));
                }
            }
            Dependency dependency = new Dependency();
            dependency.setArtifactId(bean.getArtifactId());
            dependency.setGroupId(bean.getGroupId());
            dependency.setVersion(bean.getVersion());
            dependencyList.add(dependency);
        }

        if (importHandlerFromWs && importHandlerProject != null) {
            try {
                IFile pomFile = importHandlerProject.getFile("pom.xml");
                MavenProject workspaceProject;
                if (pomFile.exists()) {
                    workspaceProject = MavenUtils.getMavenProject(pomFile.getLocation().toFile());
                } else {
                    String srcDir = "src";
                    workspaceProject = MavenUtils.createMavenProject(
                            "org.wso2.carbon." + importHandlerProject.getName(), importHandlerProject.getName(),
                            "1.0.0", "jar");
                    IJavaProject javaProject = JavaCore.create(importHandlerProject);
                    IClasspathEntry[] classpath = javaProject.getRawClasspath();
                    int entryCount = 0;
                    for (IClasspathEntry classpathEntry : classpath) {
                        if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
                            if (entryCount == 0) {
                                String entryPath = "";
                                String[] pathSegments = classpathEntry.getPath().segments();
                                if (pathSegments.length > 1) {
                                    for (int i = 1; i < pathSegments.length; i++) {
                                        if (i == 1) {
                                            entryPath = pathSegments[i];
                                        } else {
                                            entryPath += "/" + pathSegments[i];
                                        }
                                    }
                                    if (entryPath.length() > 0) {
                                        srcDir = entryPath;
                                        ++entryCount;
                                    }
                                }
                            } else {
                                log.warn("multiple source directories found, Considering '" + srcDir
                                        + "' as source directory");
                                break;
                            }
                        }
                    }
                    if (entryCount == 0) {
                        log.warn("No source directory specified, using default source directory.");
                    }
                    workspaceProject.getBuild().setSourceDirectory(srcDir);

                    Repository nexusRepo = new Repository();
                    nexusRepo.setUrl("http://maven.wso2.org/nexus/content/groups/wso2-public/");
                    nexusRepo.setId("wso2-maven2-repository-1");
                    workspaceProject.getModel().addRepository(nexusRepo);
                    workspaceProject.getModel().addPluginRepository(nexusRepo);

                    List<Dependency> libList = new ArrayList<Dependency>();

                    Map<String, JavaLibraryBean> dependencyMap = JavaLibraryUtil
                            .getDependencyInfoMap(importHandlerProject);

                    for (JavaLibraryBean bean : dependencyMap.values()) {
                        Dependency dependency = new Dependency();
                        dependency.setArtifactId(bean.getArtifactId());
                        dependency.setGroupId(bean.getGroupId());
                        dependency.setVersion(bean.getVersion());
                        libList.add(dependency);
                    }

                    workspaceProject.setDependencies(libList);
                    MavenUtils.saveMavenProject(workspaceProject, pomFile.getLocation().toFile());
                    project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
                }

                Dependency dependency = new Dependency();
                dependency.setArtifactId(workspaceProject.getArtifactId());
                dependency.setGroupId(workspaceProject.getGroupId());
                dependency.setVersion(workspaceProject.getVersion());
                dependencyList.add(dependency);
            } catch (Exception e) {
                log.warn("Error reading or updating pom file.", e);
            }
        }

        MavenUtils.addMavenDependency(mavenProject, dependencyList);
        MavenUtils.saveMavenProject(mavenProject, mavenProjectPomLocation);

    }

    private String getExportedPackage(HandlerInfo handlerInfo) {
        String handlerCls = handlerInfo.getHandlerClass();
        String filterCls = handlerInfo.getFilterClass();
        String[] collection = handlerCls.split("\\.");
        StringBuffer sb = new StringBuffer();
        if (collection.length > 0) {
            sb.append(collection[0]);
            for (int i = 1; i < (collection.length - 1); i++) {
                sb.append(".").append(collection[i]);
            }
        }
        if (filterCls != null) {
            if (!(filterCls.equals(Constants.CLASS_FQN_URL_MATCHER)
                    || filterCls.equals(Constants.CLASS_FQN_MEDIA_TYPE_MATCHER))) {
                String[] segments = filterCls.split("\\.");
                StringBuffer buffer = new StringBuffer();
                buffer.append(segments[0]);
                if (segments.length > 0) {
                    for (int i = 1; i < (segments.length - 1); i++) {
                        buffer.append(".").append(segments[i]);
                    }
                }
                if (!sb.toString().equals(buffer.toString())) {
                    sb.append(",").append(buffer);
                }
            }
        }
        return sb.toString();

    }

    private <T, E> T getKeyByValue(Map<T, E> map, E value) {
        for (Entry<T, E> entry : map.entrySet()) {
            if (value.equals(entry.getValue())) {
                return entry.getKey();
            }
        }
        return null;
    }
}