/******************************************************************************* * 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.model.filesystems.impl; import java.text.MessageFormat; import java.util.*; import org.jboss.tools.common.model.markers.ResourceMarkers; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.filesystems.impl.RecognizedFileImpl; import org.jboss.tools.common.model.util.FindObjectHelper; import org.jboss.tools.common.model.util.XMLUtil; public class AbstractXMLFileImpl extends RecognizedFileImpl { private static final long serialVersionUID = 3794621010387468744L; private RM markers = new RM(); protected String[] _errors = new String[0]; protected String[] errors = new String[0]; protected String loaderError = null; /** * Licence does not allows for distributing copies of dtds. */ public final static boolean turnOffDTDCheck = true; public boolean isIncorrect() { return (YES.equals(get(ATTR_NAME_IS_INCORRECT))); } public AbstractXMLFileImpl() { markers.setModelObject(this); } public String[] getErrors() { return _errors; } public void setLoaderError(String loaderError) { this.loaderError = loaderError; } public String getLoaderError() { return loaderError; } protected final void setErrors(String body, boolean checkDTD, boolean checkSchema) { String[] errors = (body.length() == 0) ? null //do not compute errors for unrecognized files. : "FileXML".equals(getModelEntity().getName()) ? null //$NON-NLS-1$ //do not compute errors for files in jars : (getParent() instanceof JarFolderImpl) ? null : XMLUtil.getXMLErrors(new java.io.StringReader(body), checkDTD, checkSchema); if(errors == null || errors.length == 0) { if(loaderError != null) errors = new String[]{loaderError}; } setErrors(body, errors); } protected final void setErrors(String body, String[] errors) { if(errors == null) errors = new String[0]; this.errors = errors; _errors = (String[])errors.clone(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < errors.length; i++) { String er = errors[i]; int q = er.lastIndexOf(':'); String pos = (q < 0) ? "" : er.substring(q + 1); //$NON-NLS-1$ if(q >= 0) er = er.substring(0, q); q = er.lastIndexOf(':'); String ln = (q < 0) ? "" : er.substring(q + 1), ln1 = ln; //$NON-NLS-1$ if(q >= 0) er = er.substring(0, q); int iln = -1; try { if(q >= 0 && ln1.length() > 0) { iln = Integer.parseInt(ln1); ln1 = "" + (iln - 1); //$NON-NLS-1$ } } catch (NumberFormatException e) { // ignore, some errors found by entity resolver do not have coordinates // but use similar format to mention io exception. // ModelPlugin.getPluginLog().logError(e); } String ep = MessageFormat.format("ERROR: {0} {1}", FindObjectHelper.makeRef(getPath() + ":" + ln1, ln + ":" + pos), er); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if(iln < 0) markers.lines.remove(ep); else markers.lines.put(ep, Integer.valueOf(iln)); sb.append(ep).append('\n'); this.errors[i] = ep; } String s = sb.toString(); if(s.equals(get("errors"))) return; //$NON-NLS-1$ super.set(ATTR_NAME_INCORRECT_BODY, (errors.length == 0 && loaderError == null) ? "" : body); //$NON-NLS-1$ set("errors", s); //$NON-NLS-1$ setAttributeValue(ATTR_NAME_IS_INCORRECT, (errors.length == 0 && loaderError == null) ? NO : YES); if(!isOverlapped()) markers.update(); } protected boolean isOverlapped() { XModelObject p = getParent(); while(p != null && !TRUE.equals(p.get("overlapped"))) p = p.getParent(); //$NON-NLS-1$ return (p != null); } class RM extends ResourceMarkers { Map<String,Integer> lines = new HashMap<String,Integer>(); public RM() { super(ResourceMarkers.TEXT_PROBLEM); } protected String[] getErrors() { if(!isIncorrect()) return new String[0]; String es = (String)get("errors"); //$NON-NLS-1$ if(es == null || es.length() == 0) return new String[0]; return errors; } protected int getLocation(String s) { Integer i = (Integer)lines.get(s); return (i == null) ? -1 : i.intValue(); } boolean enabled = false; public void update() { if(enabled) super.update(); } } protected ResourceMarkers getResourceMarkers() { return markers; } }