/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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 * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.verification.vrules.core.resources; import java.util.*; import org.jboss.tools.common.model.markers.*; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.filesystems.impl.FileAnyImpl; import org.jboss.tools.common.model.markers.ResourceProblems; import org.jboss.tools.common.model.options.PreferenceModelUtilities; import org.jboss.tools.common.model.plugin.ModelPlugin; import org.jboss.tools.common.model.util.PositionHolder; import org.jboss.tools.common.verification.vrules.*; import org.jboss.tools.common.verification.vrules.layer.VObjectImpl; public class VTaskListenerImpl implements VTaskListener { protected VTask task; protected XModel model; protected int errors = 0; protected Map<XModelObject,ResourceProblems> problemList = new HashMap<XModelObject,ResourceProblems>(); protected int significance = 0; public void setModel(XModel model) { this.model = model; } public void setTask(VTask task) { this.task = task; } public void setSignificance(int significance) { this.significance = significance; } public void onStart() { errors = 0; problemList.clear(); } public void onRuleApplied(final VRule rule, final VObject object, final VResult[] results) { if(!rule.isEnabled()) return; if(results != null) { for (int i = 0; i < results.length; i++) { if(results[i] == null) { /// ModelPlugin.log("Result in rule " + rule.getName() + " is null."); continue; } if (results[i].getSignificance() <= significance) continue; ++errors; if(getErrorCountLimit() >= 0 && errors > getErrorCountLimit()) { if(errors == getErrorCountLimit() + 1) { task.stop(); } } else { addProblem(rule, object, results[i]); } } } else addProblem(rule, object, null); } public void onRuleFinished(final VRule rule, VObject object) { onRuleApplied(rule, object, null); } public void onPause() {} public void onResume() {} public void onFinish() { addMarkers(); task.removeTaskListener(this); } protected void addProblem(VRule rule, VObject object, VResult result) { VObjectImpl oi = (VObjectImpl)object; XModelObject o = (oi == null) ? null : oi.getModelObject(); if(o == null) return; XModelObject f = o; while(f != null && f.getFileType() != XModelObject.FILE) f = f.getParent(); if(!(f instanceof FileAnyImpl)) return; ResourceProblems p = (ResourceProblems)problemList.get(f); String msg = (result == null) ? null : result.getMessage(); if(p == null) { problemList.put(f, p = new ResourceProblems(f)); } Object sp = result == null ? null : result.getSourcePosition(); String attr = sp == null ? null : sp.toString(); if(msg != null) { PositionHolder h = PositionHolder.getPosition(o, attr); h.update(); p.addError(o.getPath(), msg, attr, h); } } protected void addMarkers() { Iterator it = problemList.values().iterator(); while(it.hasNext()) { ResourceProblems p = (ResourceProblems)it.next(); ResourceMarkers markers = new VerificationMarkers(p); markers.setModelObject(p.getResourceObject()); markers.update(); } } int limit = -2; protected int getErrorCountLimit() { if(limit != -2) return limit; String path = "%Options%/Struts Studio/Verification"; //$NON-NLS-1$ String attr = "Reported Errors Number Limit"; //$NON-NLS-1$ XModelObject o = PreferenceModelUtilities.getPreferenceModel().getByPath(path); if(o == null) return limit = -1; String s = o.getAttributeValue(attr); limit = -1; if(!"unlimited".equals(s) && s != null && s.length() > 0) try { //$NON-NLS-1$ limit = Integer.parseInt(s); } catch (NumberFormatException e) { ModelPlugin.getPluginLog().logError(e); } return limit; } }