/*******************************************************************************
* 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.vprop;
import javax.xml.namespace.QName;
import org.eclipse.bpel.validator.model.ARule;
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.NodeNameFilter;
import org.eclipse.bpel.validator.rules.CValidator;
/**
*
* <vprop:propertyAlias propertyName="QName"
messageType="QName"?
part="NCName"?
type="QName"?
element="QName"?>
<vprop:query queryLanguage="anyURI"?>?
queryContent
</vprop:query>
</vprop:propertyAlias>
*
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
*/
@SuppressWarnings( {"nls","boxing"} )
public class PropertyAlias extends CValidator {
/** Parent nodes */
static public IFilter<INode> PARENTS = new NodeNameFilter( WSDL_ND_DEFINITIONS );
protected String fTypeName;
protected String fElementName;
protected String fPropertyName;
protected String fMessageTypeName;
protected String fMessagePartName;
protected String fDuplicateKey = null;
/**
* Start performing link checks.
*/
@Override
public void start () {
super.start();
fPropertyName = mNode.getAttribute( WSDL_AT_PROPERTY_NAME );
}
/**
* Rule to check the name of the link.
*/
@ARule(
sa = 0,
desc = "Check the QName of the property for this propertyAlias",
author = "michal.chmielewski@oracle.com",
date = "02/15/2007"
)
public void rule_CheckQName_1 () {
// if (mChecks.checkQName(mNode, fPropertyName, WSDL_AT_PROPERTY_NAME) == false) {
// disableRules();
// }
}
/**
* A <vprop:propertyAlias> element MUST use one of the three following
* combinations of attributes:
*
* 1. both messageType and part
* 2. type
* 3. element
*/
@ARule(
sa = 20,
desc = "Either the type or element attributes MUST be present or messageType AND part.",
author = "michal.chmielewski@oracle.com",
date = "02/17/2007",
tag = "pass1",
errors="BPELC_PROPERTY__UNSET"
)
public void rule_CheckPropertyAliasDefinition_10 () {
fMessageTypeName = mNode.getAttribute(AT_MESSAGE_TYPE);
fMessagePartName = mNode.getAttribute(AT_PART);
fTypeName = mNode.getAttribute(AT_TYPE);
fElementName = mNode.getAttribute(AT_ELEMENT);
IProblem problem;
QName nn = mNode.nodeName();
if (isNonEmpty(fMessageTypeName) && isNonEmpty(fMessagePartName)) {
// good
fDuplicateKey = nn + "/messageType/" + fMessageTypeName + "/" + fMessagePartName + "/" + fPropertyName;
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813
// https://jira.jboss.org/browse/JBIDE-7107
// sheesh! fix a typo
} else if (isEmpty(fMessageTypeName) && isEmpty(fMessagePartName) ) {
if (isEmpty(fTypeName) && isNonEmpty(fElementName)) {
// good, element name
fDuplicateKey = nn + "/element/" + fElementName + "/" + fPropertyName;
} else if (isNonEmpty(fTypeName) && isEmpty(fElementName)) {
// good, type name
fDuplicateKey = "propertyAlias/type/" + fTypeName + "/" + fPropertyName;
} else {
problem = createError();
problem.fill("BPELC_PROPERTY__UNSET",
toString(mNode.nodeName()),
AT_TYPE,
AT_ELEMENT,
0);
}
} else {
problem = createError();
problem.fill("BPELC_PROPERTY__UNSET",
toString(mNode.nodeName()),
AT_MESSAGE_TYPE,
AT_PART,
1);
}
}
/**
* Static analysis MUST detect property usages where propertyAliases for the
* associated variable's type are not found in any WSDL definitions directly
* imported by the WS-BPEL process.
*
*/
@ARule(
sa = 21,
desc = "Check types of property aliases",
author = "michal.chmielewski@oracle.com",
date = "03/18/2007",
errors="BPELC__UNRESOLVED_ATTRIBUTE,BPELC_MSG__PART"
)
public void rule_ChceckPropertyAliasTypes_13 () {
if (isEmpty(fDuplicateKey)) {
return ;
}
IProblem problem;
INode typeNode = null;
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813
// https://jira.jboss.org/browse/JBIDE-7107
if (isNonEmpty(fMessageTypeName) && isNonEmpty(fMessagePartName)) {
// good
INode msgType = mModelQuery.lookup(mNode.rootNode(),
IModelQueryLookups.LOOKUP_NODE_MESSAGE_TYPE,fMessageTypeName);
if (isUndefined(msgType)) {
problem = createError();
problem.fill("BPELC__UNRESOLVED_ATTRIBUTE",
toString(mNode.nodeName()),
AT_MESSAGE_TYPE,
KIND_NODE,
fMessageTypeName
);
} else {
typeNode = mModelQuery.lookup(msgType,
IModelQueryLookups.LOOKUP_NODE_TYPE_OF_PART,fMessagePartName);
if (isUndefined(typeNode)) {
problem = createError();
problem.fill("BPELC_MSG__PART",
toString(mNode.nodeName()),
fMessagePartName,
fMessageTypeName
);
}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813
// https://jira.jboss.org/browse/JBIDE-7107
// reversed type and element...
// wow, Michal must have been tired when he was writing this ;)
} else if (isNonEmpty(fTypeName)) {
// good, type name
typeNode = mModelQuery.lookup(mNode.rootNode(),
IModelQueryLookups.LOOKUP_NODE_XSD_TYPE, fTypeName);
if (isUndefined(typeNode)) {
problem = createError();
problem.fill("BPELC__UNRESOLVED_ATTRIBUTE",
toString(mNode.nodeName()),
AT_TYPE,
KIND_NODE,
fTypeName
);
}
} else if (isNonEmpty(fElementName) ) {
// good, element name
typeNode = mModelQuery.lookup(mNode.rootNode(),
IModelQueryLookups.LOOKUP_NODE_XSD_ELEMENT, fElementName);
if (isUndefined(typeNode)) {
problem = createError();
problem.fill("BPELC__UNRESOLVED_ATTRIBUTE",
toString(mNode.nodeName()),
AT_ELEMENT,
KIND_NODE,
fElementName
);
}
}
// Set the type of property alias as derived so far.
if (isDefined(typeNode)) {
setValue("type",typeNode);
}
}
/**
* A WS-BPEL process definition MUST NOT be accepted for processing if it
* defines two or more propertyAliases for the same property name and
* WS-BPEL variable type.
*
*/
@ARule(
sa = 22,
desc = "Detect duplicate propertyAlias definitions",
author = "michal.chmielewski@oracle.com",
date = "03/20/2007",
errors="BPELC__DUPLICATE"
)
public void rule_CheckDuplicatePropertyAlias_25 () {
if (isEmpty(fDuplicateKey)) {
return;
}
IProblem problem;
if (containsValueKey(fParentNode,fDuplicateKey)) {
problem = createError();
problem.fill("BPELC__DUPLICATE",
toString(mNode.nodeName()),
fPropertyName);
return ;
}
setValue(fParentNode, fDuplicateKey,true);
}
/**
* End of public rule methods.
*
* Other methods are support methods for this class to perform its
* validation function.
*
*/
}