blob: 12e2f9f8f40325eb25351c88f47b7940d34cfc3a [file] [log] [blame]
/*
* Copyright 2000-2009 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.
*/
/*
* User: anna
* Date: 05-Jan-2007
*/
package com.intellij.codeInspection.offlineViewer;
import com.intellij.codeInspection.InspectionApplication;
import com.intellij.codeInspection.offline.OfflineProblemDescriptor;
import com.intellij.codeInspection.reference.SmartRefElementPointerImpl;
import com.intellij.util.ArrayUtil;
import com.thoughtworks.xstream.io.xml.XppReader;
import gnu.trove.THashMap;
import gnu.trove.THashSet;
import gnu.trove.TObjectIntHashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class OfflineViewParseUtil {
@NonNls private static final String PACKAGE = "package";
@NonNls private static final String DESCRIPTION = "description";
@NonNls private static final String HINTS = "hints";
@NonNls private static final String LINE = "line";
@NonNls private static final String MODULE = "module";
private OfflineViewParseUtil() {
}
public static Map<String, Set<OfflineProblemDescriptor>> parse(final String problems) {
final TObjectIntHashMap<String> fqName2IdxMap = new TObjectIntHashMap<String>();
final Map<String, Set<OfflineProblemDescriptor>> package2Result = new THashMap<String, Set<OfflineProblemDescriptor>>();
final XppReader reader = new XppReader(new StringReader(problems));
try {
while(reader.hasMoreChildren()) {
reader.moveDown(); //problem
final OfflineProblemDescriptor descriptor = new OfflineProblemDescriptor();
boolean added = false;
while(reader.hasMoreChildren()) {
reader.moveDown();
if (SmartRefElementPointerImpl.ENTRY_POINT.equals(reader.getNodeName())) {
descriptor.setType(reader.getAttribute(SmartRefElementPointerImpl.TYPE_ATTR));
final String fqName = reader.getAttribute(SmartRefElementPointerImpl.FQNAME_ATTR);
descriptor.setFQName(fqName);
if (!fqName2IdxMap.containsKey(fqName)) {
fqName2IdxMap.put(fqName, 0);
}
int idx = fqName2IdxMap.get(fqName);
descriptor.setProblemIndex(idx);
fqName2IdxMap.put(fqName, idx + 1);
final List<String> parentTypes = new ArrayList<String>();
final List<String> parentNames = new ArrayList<String>();
int deep = 0;
while (true) {
if (reader.hasMoreChildren()) {
reader.moveDown();
parentTypes.add(reader.getAttribute(SmartRefElementPointerImpl.TYPE_ATTR));
parentNames.add(reader.getAttribute(SmartRefElementPointerImpl.FQNAME_ATTR));
deep ++;
} else {
while (deep-- > 0) {
reader.moveUp();
}
break;
}
}
if (!parentTypes.isEmpty() && !parentNames.isEmpty()) {
descriptor.setParentType(ArrayUtil.toStringArray(parentTypes));
descriptor.setParentFQName(ArrayUtil.toStringArray(parentNames));
}
}
if (DESCRIPTION.equals(reader.getNodeName())) {
descriptor.setDescription(reader.getValue());
}
if (LINE.equals(reader.getNodeName())) {
descriptor.setLine(Integer.parseInt(reader.getValue()));
}
if (MODULE.equals(reader.getNodeName())) {
descriptor.setModule(reader.getValue());
}
if (HINTS.equals(reader.getNodeName())) {
while(reader.hasMoreChildren()) {
reader.moveDown();
List<String> hints = descriptor.getHints();
if (hints == null) {
hints = new ArrayList<String>();
descriptor.setHints(hints);
}
hints.add(reader.getAttribute("value"));
reader.moveUp();
}
}
if (PACKAGE.equals(reader.getNodeName())) {
appendDescriptor(package2Result, reader.getValue(), descriptor);
added = true;
}
while(reader.hasMoreChildren()) {
reader.moveDown();
if (PACKAGE.equals(reader.getNodeName())) {
appendDescriptor(package2Result, reader.getValue(), descriptor);
added = true;
}
reader.moveUp();
}
reader.moveUp();
}
if (!added) appendDescriptor(package2Result, "", descriptor);
reader.moveUp();
}
}
finally {
reader.close();
}
return package2Result;
}
private static void appendDescriptor(final Map<String, Set<OfflineProblemDescriptor>> package2Result,
final String packageName,
final OfflineProblemDescriptor descriptor) {
Set<OfflineProblemDescriptor> descriptors = package2Result.get(packageName);
if (descriptors == null) {
descriptors = new THashSet<OfflineProblemDescriptor>();
package2Result.put(packageName, descriptors);
}
descriptors.add(descriptor);
}
@Nullable
public static String parseProfileName(String descriptors) {
final XppReader reader = new XppReader(new StringReader(descriptors));
try {
return reader.getAttribute(InspectionApplication.PROFILE);
}
catch (Exception e) {
return null;
}
finally {
reader.close();
}
}
}