Package wicketforge.search

Source Code of wicketforge.search.ResourceInfo

/*
* Copyright 2013 The WicketForge-Team
*
* 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 wicketforge.search;

import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.pointers.VirtualFilePointer;
import com.intellij.psi.PsiFile;
import com.intellij.util.SmartList;
import com.intellij.util.indexing.FileContent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import wicketforge.facet.WicketForgeFacet;
import wicketforge.util.FilenameConstants;
import wicketforge.util.WicketFilenameUtil;

import java.util.Collections;
import java.util.List;

final class ResourceInfo {
    @NotNull
    public final String qualifiedName;
    @Nullable
    public final String locale;

    private ResourceInfo(@Nullable String packageName, @NotNull String className, @Nullable String locale) {
        this.qualifiedName = packageName == null ? className : packageName + '.' + className; // currently we only need full qualified name
        this.locale = locale;
    }

    /**
     * get ResourceInfo from PsiFile
     */
    @Nullable
    public static ResourceInfo from(@NotNull PsiFile file) {
        FileType fileType = file.getFileType();
        if (StdFileTypes.HTML.equals(fileType)) {
            return fromMarkup(file.getVirtualFile(), file.getProject(), file.getText());
        } else if (StdFileTypes.PROPERTIES.equals(fileType) || StdFileTypes.XML.equals(fileType)) {
            return fromProperties(file.getVirtualFile(), file.getProject());
        }
        return null;
    }

    /**
     * get ResourceInfo from FileContent
     */
    @Nullable
    public static ResourceInfo from(@NotNull FileContent fileContent) {
        FileType fileType = fileContent.getFileType();
        if (StdFileTypes.HTML.equals(fileType)) {
            return fromMarkup(fileContent.getFile(), fileContent.getProject(), fileContent.getContentAsText().toString());
        } else if (StdFileTypes.PROPERTIES.equals(fileType) || StdFileTypes.XML.equals(fileType)) {
            return fromProperties(fileContent.getFile(), fileContent.getProject());
        }
        return null;
    }

    @Nullable
    private static ResourceInfo fromMarkup(@Nullable VirtualFile file, @NotNull Project project, @Nullable String content) {
        if (file == null) {
            return null;
        }
        // get classname from wicketforge-bind
        String className = SearchUtils.getBoundClassName(content);
        if (className != null) {
            // extract locale
            String locale = WicketFilenameUtil.extractLocale(WicketFilenameUtil.removeExtension(file.getName(), FilenameConstants.MARKUP_EXTENSIONS));
            int index = className.lastIndexOf('.');
            return new ResourceInfo(index >= 0 ? className.substring(0, index) : null, index >= 0 ? className.substring(index + 1) : className, locale);
        }
        return fromResource(file, project, FilenameConstants.MARKUP_EXTENSIONS);
    }

    @Nullable
    private static ResourceInfo fromProperties(@Nullable VirtualFile file, @NotNull Project project) {
        if (file == null) {
            return null;
        }
        return fromResource(file, project, FilenameConstants.PROPERTIES_EXTENSIONS);
    }

    @Nullable
    private static ResourceInfo fromResource(@NotNull VirtualFile file, @NotNull Project project, @NotNull String[] fileExtensions) {
        VirtualFile dir = file.getParent();
        if (dir == null || !dir.isDirectory()) {
            return null;
        }

        String packageName = getPackageNameFromAdditionalResourcePaths(file, dir, project);
        if (packageName == null) {
            packageName = ProjectRootManager.getInstance(project).getFileIndex().getPackageNameByDirectory(dir);
        }

        // extract className from filename -> remove extensions
        String className = WicketFilenameUtil.removeExtension(file.getName(), fileExtensions);
        // extract locale
        String locale = WicketFilenameUtil.extractLocale(className);
        className = StringUtil.replace(WicketFilenameUtil.extractBasename(className), "$", ".");
        return new ResourceInfo(packageName, className, locale);
    }

    @Nullable
    private static String getPackageNameFromAdditionalResourcePaths(@NotNull VirtualFile file, @NotNull VirtualFile dir, @NotNull Project project) {
        List<Module> modules = new SmartList<Module>();
        Module module = ModuleUtil.findModuleForFile(file, project);
        if (module != null) {
            // if we have a module -> only get resourcepaths from this one
            modules.add(module);
        } else {
            // else scan all modules
            Collections.addAll(modules, ModuleManager.getInstance(project).getModules());
        }
        for (Module module1 : modules) {
            WicketForgeFacet facet = WicketForgeFacet.getInstance(module1);
            if (facet != null) {
                for (VirtualFilePointer virtualFilePointer : facet.getResourcePaths()) {
                    VirtualFile virtualFile = virtualFilePointer.getFile();
                    if (virtualFile != null && virtualFile.isValid()) {
                        String packageName = VfsUtil.getRelativePath(dir, virtualFile, '.');
                        if (packageName != null) {
                            return packageName;
                        }
                    }
                }
            }
        }
        return null;
    }
}
TOP

Related Classes of wicketforge.search.ResourceInfo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.