/******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.eclipse.dltk.tcl.internal.tclchecker; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.tcl.tclchecker.TclCheckerPlugin; import org.eclipse.dltk.tcl.tclchecker.model.messages.CheckerMessage; import org.eclipse.dltk.tcl.tclchecker.model.messages.MessageCategory; import org.eclipse.dltk.tcl.tclchecker.model.messages.MessageGroup; import org.eclipse.dltk.tcl.tclchecker.model.messages.MessagesFactory; import org.eclipse.dltk.tcl.tclchecker.model.messages.MessagesPackage; import org.eclipse.dltk.tcl.tclchecker.model.messages.util.MessagesResourceFactoryImpl; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; public class TclCheckerProblemDescription { public static final String MESSAGE_ID_SEPARATOR = "::"; //$NON-NLS-1$ private static final Map<String, CheckerMessage> messageDefinitions = new HashMap<String, CheckerMessage>(); private static final Map<String, CheckerMessage> altDefinitions = new HashMap<String, CheckerMessage>(); private static final List<MessageGroup> messageGroups = new ArrayList<MessageGroup>(); private static CheckerMessage defaultMessage = null; private static final Set<String> reportedIds = new HashSet<String>(); public static CheckerMessage getProblem(String problemId) { return getProblem(problemId, true); } /** * @param problemId * @return */ public static CheckerMessage getProblem(String problemId, boolean useDefault) { loadIfNeeded(); CheckerMessage message = messageDefinitions.get(problemId); if (message == null) { message = altDefinitions.get(problemId); if (message == null && useDefault) { if (reportedIds.add(problemId)) { TclCheckerPlugin.warn("Unknown messageId " + problemId); //$NON-NLS-1$ } if (defaultMessage == null) { defaultMessage = MessagesFactory.eINSTANCE .createCheckerMessage(); defaultMessage.setCategory(MessageCategory.WARNING); defaultMessage.setExplanation("Unknown problem"); //$NON-NLS-1$ defaultMessage.setMessageId("Unknown"); //$NON-NLS-1$ } message = defaultMessage; } } return message; } private static void loadIfNeeded() { if (messageDefinitions.isEmpty()) { load(); } } private static void load() { try { ResourceSet resourceSet = new ResourceSetImpl(); resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new MessagesResourceFactoryImpl()); resourceSet.getPackageRegistry().put(MessagesPackage.eNS_URI, MessagesPackage.eINSTANCE); Resource r = resourceSet .getResource( URI .createPlatformPluginURI( TclCheckerPlugin.PLUGIN_ID + "/resources/tclchecker-messages.xml", true), true); //$NON-NLS-1$ for (EObject e : r.getContents()) { if (e instanceof MessageGroup) { final MessageGroup messageGroup = (MessageGroup) e; messageGroups.add(messageGroup); for (CheckerMessage message : messageGroup.getMessages()) { final String id = message.getMessageId(); if (DLTKCore.DEBUG && messageDefinitions.containsKey(id)) { TclCheckerPlugin.error("Duplicate message id " //$NON-NLS-1$ + id); } else { messageDefinitions.put(id, message); } } } } for (CheckerMessage message : messageDefinitions.values()) { final String id = message.getMessageId(); final int index = id.indexOf(MESSAGE_ID_SEPARATOR); if (index >= 0) { final String shortId = id.substring(index + MESSAGE_ID_SEPARATOR.length()); if (!messageDefinitions.containsKey(shortId)) { if (DLTKCore.DEBUG && altDefinitions.containsKey(shortId)) { TclCheckerPlugin.error("Duplicate message id " //$NON-NLS-1$ + shortId); } else { altDefinitions.put(shortId, message); } } } } } catch (Exception e) { TclCheckerPlugin.error(e); } } public static List<String> getProblemIdentifiers() { loadIfNeeded(); return new ArrayList<String>(messageDefinitions.keySet()); } public static List<String> getAltProblemIdentifiers() { loadIfNeeded(); return new ArrayList<String>(altDefinitions.keySet()); } /** * @return */ public static List<MessageGroup> getProblemGroups() { loadIfNeeded(); return Collections.unmodifiableList(messageGroups); } }