/******************************************************************************* * Copyright (c) 2007 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.xml.components.model; import java.io.IOException; import org.jboss.tools.common.model.loaders.EntityRecognizer; import org.jboss.tools.common.model.loaders.EntityRecognizerContext; import org.jboss.tools.common.model.loaders.XMLRecognizerContext; import org.jboss.tools.common.xml.XMLEntityResolver; import org.jboss.tools.seam.xml.SeamXMLPlugin; public class SeamComponentsEntityRecognizer implements EntityRecognizer, SeamComponentConstants { static { try { Class<?> c = SeamComponentsEntityRecognizer.class; XMLEntityResolver.registerPublicEntity(PUBLIC_ID_11, c, "/meta/components-1.1.dtd"); //$NON-NLS-1$ } catch (IOException e) { SeamXMLPlugin.log(e); } } public SeamComponentsEntityRecognizer() {} public String getEntityName(EntityRecognizerContext context) { String body = context.getBody(); if(body == null) return null; XMLRecognizerContext xml = context.getXMLContext(); if(xml.isDTD()) { String publicId = xml.getPublicId(); if(PUBLIC_ID_11.equals(publicId)) return ENT_SEAM_COMPONENTS_11; return null; } int isSingleComponent = isSingleComponent(body); if(isComponentsSchema(body) == NONE && isSingleComponent == NONE) { return null; } int isMultiComponent = isMultiComponent(body); int i = body.indexOf("xsi:schemaLocation"); //$NON-NLS-1$ if(i < 0) return null; int j = body.indexOf("\"", i); //$NON-NLS-1$ if(j < 0) return null; int k = body.indexOf("\"", j + 1); //$NON-NLS-1$ if(k < 0) return null; String schemaLocation = body.substring(j + 1, k); int i12 = schemaLocation.indexOf("1.2"); //$NON-NLS-1$ if(i12 >= 0) { if(isSingleComponent == COM) return ENT_SEAM_COMPONENT_12; if(isMultiComponent == COM) return ENT_SEAM_COMPONENTS_12; return null; } //Let it work now for all 2.x versions //If in future releases differences are essential, this should be modified int i20 = schemaLocation.indexOf("-2.0"); //$NON-NLS-1$ int i21 = schemaLocation.indexOf("-2.1"); //$NON-NLS-1$ int i22 = schemaLocation.indexOf("-2.2"); //$NON-NLS-1$ int i23 = schemaLocation.indexOf("-2."); //$NON-NLS-1$ if(i21 < 0 && i20 < 0 && i22 < 0 && i23 < 0) { //Try the latest known version anyway. i23 = 0; } if(i23 >= 0) { if(isSingleComponent == COM) { if(i20 >= 0) { return ENT_SEAM_COMPONENT_FILE_20; } if(i21 >= 0) { return ENT_SEAM_COMPONENT_FILE_21; } if(i22 >= 0) { return ENT_SEAM_COMPONENT_FILE_22; } return ENT_SEAM_COMPONENT_FILE_23; } if(isMultiComponent == COM) { if(i20 >= 0) { return ENT_SEAM_COMPONENTS_20; } if(i21 >= 0) { return ENT_SEAM_COMPONENTS_21; } if(i22 >= 0) { return ENT_SEAM_COMPONENTS_22; } return ENT_SEAM_COMPONENTS_23; } if(isSingleComponent == ORG && i23 >= 0) { return ENT_SEAM_COMPONENT_FILE_230; } if(isMultiComponent == ORG && i23 >= 0) { return ENT_SEAM_COMPONENTS_230; } } return null; } static int NONE = 0; static int COM = 1; static int ORG = 2; static String COM_SCHEMA = "\"http://jboss.com/products/seam/components\""; //$NON-NLS-1$ static String ORG_SCHEMA = "\"http://jboss.org/schema/seam/components\""; //$NON-NLS-1$ private int isComponentsSchema(String body) { int i = body.indexOf("<components"); //$NON-NLS-1$ if(i < 0) return NONE; int j = body.indexOf(">", i); //$NON-NLS-1$ if(j < 0) return NONE; String s = body.substring(i, j); return s.indexOf(COM_SCHEMA) > 0 ? COM : s.indexOf(ORG_SCHEMA) > 0 ? ORG : NONE; } private int isMultiComponent(String body) { int i = body.indexOf("<components"); //$NON-NLS-1$ if(i < 0) return NONE; int j = body.indexOf(">", i); //$NON-NLS-1$ if(j < 0) return NONE; String s = body.substring(i, j); return s.indexOf(COM_SCHEMA) > 0 ? COM : s.indexOf(ORG_SCHEMA) > 0 ? ORG : NONE; } private int isSingleComponent(String body) { int i = body.indexOf("<component"); //$NON-NLS-1$ int is = body.indexOf("<components"); //$NON-NLS-1$ if(i < 0 || is >= 0) return NONE; int j = body.indexOf(">", i); //$NON-NLS-1$ if(j < 0) return NONE; String s = body.substring(i, j); return s.indexOf(COM_SCHEMA) > 0 ? COM : s.indexOf(ORG_SCHEMA) > 0 ? ORG : NONE; } }