IDEA-86800 do not get dom for filtered manifest, because it can be in excluded folder; use nano xml parser instead

This commit is contained in:
Eugene Kudelevsky
2012-05-30 18:00:07 +04:00
parent 0f472ce8b2
commit 69cd061ddd
3 changed files with 38 additions and 9 deletions
@@ -6,7 +6,7 @@
</extensions>
<extensions defaultExtensionNs="com.intellij">
<compiler implementation="org.jetbrains.android.compiler.AndroidExternalApklibExtractingCompiler" order="first"/>
<compiler implementation="org.jetbrains.android.compiler.AndroidMavenResourcesCompiler"/>
<compiler implementation="org.jetbrains.android.compiler.AndroidMavenResourcesCompiler" order="first"/>
</extensions>
<extensions defaultExtensionNs="org.jetbrains">
<android.mavenProvider implementation="org.jetbrains.android.maven.AndroidMavenProviderImpl"/>
@@ -7,13 +7,13 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.android.dom.manifest.Manifest;
import com.intellij.util.xml.NanoXmlUtil;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.facet.AndroidRootUtil;
import org.jetbrains.android.util.AndroidBundle;
import org.jetbrains.android.util.AndroidUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -55,13 +55,16 @@ public class AndroidBuildConfigGeneratingCompiler implements SourceGeneratingCom
continue;
}
final Manifest manifest = AndroidUtils.loadDomElement(module, manifestFile, Manifest.class);
if (manifest == null) {
context.addMessage(CompilerMessageCategory.ERROR, "Cannot parse file", manifestFile.getUrl(), -1, -1);
String packageName;
try {
// we cannot use DOM here because custom manifest file can be excluded (ex. it can be located in /target/ folder)
packageName = parsePackageName(manifestFile);
}
catch (IOException e) {
context.addMessage(CompilerMessageCategory.ERROR, "I/O error: " + e.getMessage(), null, -1, -1);
continue;
}
String packageName = manifest.getPackage().getValue();
if (packageName != null) {
packageName = packageName.trim();
}
@@ -113,6 +116,31 @@ public class AndroidBuildConfigGeneratingCompiler implements SourceGeneratingCom
return result.toArray(new GenerationItem[result.size()]);
}
@Nullable
private static String parsePackageName(@NotNull VirtualFile manifestFile) throws IOException {
final Ref<String> packageNameRef = Ref.create(null);
NanoXmlUtil.parse(manifestFile.getInputStream(), new NanoXmlUtil.BaseXmlBuilder() {
@Override
public void addAttribute(String key, String nsPrefix, String nsURI, String value, String type)
throws Exception {
super.addAttribute(key, nsPrefix, nsURI, value, type);
if ("package".equals(key) && NanoXmlUtil.createLocation("manifest").equals(getLocation())) {
packageNameRef.set(value);
stop();
}
}
@Override
public void elementAttributesProcessed(String name, String nsPrefix, String nsURI) throws Exception {
super.elementAttributesProcessed(name, nsPrefix, nsURI);
stop();
}
});
return packageNameRef.get();
}
@NotNull
@Override
public String getDescription() {
@@ -129,7 +157,7 @@ public class AndroidBuildConfigGeneratingCompiler implements SourceGeneratingCom
return new MyValidityState(in);
}
private static class MyGenerationItem implements GenerationItem{
private static class MyGenerationItem implements GenerationItem {
final Module myModule;
final String myPackage;
final boolean myDebug;
@@ -190,4 +218,4 @@ public class AndroidBuildConfigGeneratingCompiler implements SourceGeneratingCom
out.writeBoolean(myDebug);
}
}
}
}
@@ -71,6 +71,7 @@ public class AndroidRootUtil {
return getFileByRelativeModulePath(facet.getModule(), facet.getConfiguration().CUSTOM_COMPILER_MANIFEST, false);
}
// DO NOT get PSI or DOM from this file, because it may be excluded (f.ex. it can be in /target/ directory)
@Nullable
public static VirtualFile getManifestFileForCompiler(@NotNull AndroidFacet facet) {
return facet.getConfiguration().USE_CUSTOM_COMPILER_MANIFEST