/******************************************************************************* * Copyright (c) 2006 Oracle 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 * * Contributors: * Oracle Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.validator.rules; import org.eclipse.bpel.validator.model.Filters; import org.eclipse.bpel.validator.model.IFilter; import org.eclipse.bpel.validator.model.IModelQueryLookups; import org.eclipse.bpel.validator.model.INode; import org.eclipse.bpel.validator.model.IProblem; import org.eclipse.bpel.validator.model.ARule; import org.eclipse.bpel.validator.model.Runner; /** * Validates Import nodes. * * @author Michal Chmielewski (michal.chmielewski@oracle.com) * @date Oct 3, 2006 * */ @SuppressWarnings("nls") public class ImportValidator extends CValidator { /** * Parent nodes */ static public IFilter<INode> PARENTS = Filters.PROCESS; String fImportType; String fLocation; String fNamespace; INode fImportedNode; /** * Start the validation of this node. */ @Override protected void start () { super.start(); fLocation = mNode.getAttribute( AT_LOCATION ); fImportType = mNode.getAttribute(AT_IMPORT_TYPE ); fNamespace = mNode.getAttribute( AT_NAMESPACE ); } /** * Check if the importType attribute is set on the * import. If it is not, then this is an error, per SA00013. */ @ARule( desc = "Check if importType is set on import", author = "michal.chmielewski@oracle.com", date = "03/15/2007", errors="BPELC__UNSET_ATTRIBUTE" ) @SuppressWarnings("boxing") public void rule_CheckIfImportTypesSet_1 () { IProblem problem; if (isEmptyOrWhitespace(fImportType)) { problem = createError(); problem.fill("BPELC__UNSET_ATTRIBUTE", //$NON-NLS-1$ toString(mNode.nodeName()), AT_IMPORT_TYPE, KIND_NODE); fImportType = null; } } /** * Check the location of the import. The location * need not be specified, so this is a noop if it is not * specified as we don't generally know how to resolve imports * otherwise. * Since ODE BPEL runtime only support the artifacts that be contained * within the folder hierarchy of the deployment descriptor at the root */ @ARule( desc = "Check if location is set on import", author = "michal.chmielewski@oracle.com", date = "03/15/2007", errors="BPELC_IMPORT_LOCATION" ) public void rule_CheckLocation_3 () { if (fLocation == null) { return ; } // TODO: Check import locations to see if accessible ? // https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813 IProblem problem; if(fLocation.indexOf("../") >=0 ){ problem = createError(); problem.fill( "BPELC_IMPORT_LOCATION", //$NON-NLS-1$ fLocation, AT_LOCATION, toString(mNode.nodeName()), KIND_NODE ); } } /** * Check the import type. * BPEL 2.0 currently supports WSDL and XSD import types. * Other importTypes are permitted, but not necessarily * understood. For this we print an informational problem only. * */ @ARule ( date = "10/3/2006", author = "michal.chmielewski@oracle.com", desc = "Check the import type. BPEL 2.0 currently supports WSDL and XSD import types.", sa = 13 , infos="BPELC_IMPORT__IMPORT_TYPE" ) @SuppressWarnings("boxing") public void rule_CheckImportType_4 () { if (fImportType == null) { return ; } IProblem problem; if (mModelQuery.hasSupport(IModelQueryLookups.SUPPORT_IMPORT_TYPE,fImportType)) { // good } else { // This is just a note that says we don't understand it. // It is not an error per BPEL 2.0 spec. problem = createInfo(); problem.fill( "BPELC_IMPORT__IMPORT_TYPE", //$NON-NLS-1$ fImportType, AT_IMPORT_TYPE, toString(mNode.nodeName()), KIND_NODE ); } } /** * The namespace attribute. If set it must match the target * namespace of the imported document. If unset, the imported * document must not have a targetNamesace declared. * */ @ARule( author = "michal.chmielewski@oracle.com", date = "01/15/2007", desc = "Imported namespace, if set, must match", sa = 11 , errors="BPELC_IMPORT__NS1" ) public void rule_CheckNamespaceOfImport_8 () { if (fImportType == null) { return ; } IProblem problem; // look up the import node to produce the facade for the imported document. fImportedNode = mModelQuery.lookup( mNode,IModelQueryLookups.LOOKUP_NODE_IMPORT, "document"); if (isUndefined(fImportedNode)) { return ; } String targetNS = fImportedNode.getAttribute(AT_TARGET_NAMESPACE); if ( isEmpty(fNamespace) == false ) { if (fNamespace.equals( targetNS ) == false) { problem = createError(); problem.fill("BPELC_IMPORT__NS1", //$NON-NLS-1$ toString(mNode.nodeName()), fNamespace, targetNS); } } } /** * Warn if the import cannot happen. */ @ARule( sa = 1234, desc = "Imported node location problem", author = "michal.chmielewski@oracle.com", date = "03/29/2007", errors="BPELC_IMPORT__UNRESOVED" ) public void rule_CheckImportLocation_14 () { IProblem problem ; if (isUndefined(fImportedNode) && isNonEmpty(fLocation)) { // https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813 // https://jira.jboss.org/browse/JBIDE-7478 problem = createError(); problem.fill("BPELC_IMPORT__UNRESOVED", toString(mNode.nodeName()), fImportType, fLocation ); } } /** * "When import has no namespace, the targetNamespace must be empty.", */ @ARule( author = "michal.chmielewski@oracle.com", date = "01/15/2007", desc = "When import has no namespace, the targetNamespace must be empty.", sa = 12 , errors="BPELC_IMPORT__NS2" ) public void rule_CheckNamespaceOfImport_15 () { if (isUndefined(fImportedNode)) { return ; } String targetNS = fImportedNode.getAttribute(AT_TARGET_NAMESPACE); IProblem problem; if (isEmpty(fNamespace)) { if (isEmpty(targetNS) == false) { problem = createError(); problem.fill("BPELC_IMPORT__NS2", //$NON-NLS-1$ toString(mNode.nodeName()), fNamespace, targetNS); } } } /** * Check the WSDL type of imports by running the validators that are hooked onto these * types of nodes. * */ @Override public void end () { super.end(); if (AT_VAL_IMPORT_WSDL.equals(fImportType) == false || isUndefined(fImportedNode) ) { return ; } Runner runner = new Runner(mModelQuery,fImportedNode); addProblems( runner.run() ); } /** End of public rule methods. * * Other methods are support methods for this class to perform its * validation function. * */ }