/* * Copyright 2000-2010 JetBrains s.r.o. * * 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.napile.idea.thermit.dom; import java.io.File; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFileSystemItem; import com.intellij.psi.PsiManager; import com.intellij.psi.PsiReference; import com.intellij.util.xml.ConvertContext; import com.intellij.util.xml.Converter; import com.intellij.util.xml.CustomReferenceConverter; import com.intellij.util.xml.GenericAttributeValue; import com.intellij.util.xml.GenericDomValue; /** * @author Eugene Zhuravlev * Date: Apr 26, 2010 */ public class AntPathConverter extends Converter<PsiFileSystemItem> implements CustomReferenceConverter<PsiFileSystemItem> { private final boolean myShouldValidateRefs; public AntPathConverter() { this(false); } protected AntPathConverter(boolean validateRefs) { myShouldValidateRefs = validateRefs; } @Override public PsiFileSystemItem fromString(@Nullable @NonNls String s, ConvertContext context) { final GenericAttributeValue attribValue = context.getInvocationElement().getParentOfType(GenericAttributeValue.class, false); if(attribValue == null) { return null; } String path = attribValue.getStringValue(); if(path == null) { path = getAttributeDefaultValue(context, attribValue); } if(path == null) { return null; } File file = new File(path); if(!file.isAbsolute()) { final AntDomProject antProject = getEffectiveAntProject(attribValue); if(antProject == null) { return null; } file = new File(getPathResolveRoot(context, antProject), path); } VirtualFile vFile = LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(file.getAbsolutePath())); if(vFile == null) { return null; } final PsiManager psiManager = context.getPsiManager(); return vFile.isDirectory() ? psiManager.findDirectory(vFile) : psiManager.findFile(vFile); } protected AntDomProject getEffectiveAntProject(GenericAttributeValue attribValue) { AntDomProject project = attribValue.getParentOfType(AntDomProject.class, false); if(project != null) { project = project.getContextAntProject(); } return project; } @Nullable protected String getPathResolveRoot(ConvertContext context, AntDomProject antProject) { return antProject.getProjectBasedirPath(); } @Nullable protected String getAttributeDefaultValue(ConvertContext context, GenericAttributeValue attribValue) { return null; } @Override public String toString(@Nullable PsiFileSystemItem file, ConvertContext context) { final GenericAttributeValue attribValue = context.getInvocationElement().getParentOfType(GenericAttributeValue.class, false); if(attribValue == null) { return null; } return attribValue.getRawText(); } @NotNull public PsiReference[] createReferences(GenericDomValue<PsiFileSystemItem> genericDomValue, PsiElement element, ConvertContext context) { if(genericDomValue instanceof GenericAttributeValue) { final GenericAttributeValue attrib = (GenericAttributeValue) genericDomValue; if(attrib.getRawText() != null) { final AntDomFileReferenceSet refSet = new AntDomFileReferenceSet(attrib, myShouldValidateRefs); return refSet.getAllReferences(); } } return PsiReference.EMPTY_ARRAY; } }