001: /*
002: * The contents of this file are subject to the terms of the Common Development
003: * and Distribution License (the License). You may not use this file except in
004: * compliance with the License.
005: *
006: * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
007: * or http://www.netbeans.org/cddl.txt.
008: *
009: * When distributing Covered Code, include this CDDL Header Notice in each file
010: * and include the License file at http://www.netbeans.org/cddl.txt.
011: * If applicable, add the following below the CDDL Header, with the fields
012: * enclosed by brackets [] replaced by your own identifying information:
013: * "Portions Copyrighted [year] [name of copyright owner]"
014: *
015: * The Original Software is NetBeans. The Initial Developer of the Original
016: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
017: * Microsystems, Inc. All Rights Reserved.
018: */
019: package org.netbeans.modules.bpel.model.api.support;
020:
021: import java.text.MessageFormat;
022: import org.netbeans.modules.bpel.model.api.BpelEntity;
023: import org.netbeans.modules.bpel.model.api.BpelModel;
024: import org.netbeans.modules.bpel.model.api.ContentElement;
025: import org.netbeans.modules.bpel.model.api.Import;
026: import org.netbeans.modules.xml.xpath.ext.XPathExpression;
027: import org.netbeans.modules.xml.xpath.ext.XPathModel;
028: import org.netbeans.modules.xml.xpath.ext.spi.validation.XPathProblem;
029: import org.netbeans.modules.xml.xpath.ext.spi.validation.XPathValidationContext;
030: import org.netbeans.modules.xml.schema.model.SchemaComponent;
031: import org.netbeans.modules.xml.schema.model.SchemaModel;
032: import org.netbeans.modules.xml.xam.spi.Validator;
033: import org.netbeans.modules.xml.xam.spi.Validator.ResultType;
034: import org.netbeans.modules.xml.xam.spi.Validator.ResultItem;
035: import org.netbeans.modules.xml.xam.Model.State;
036: import org.openide.util.NbBundle;
037:
038: /**
039: * This is an auxiliary class which hold all context objects are required to
040: * validate a BPEL XPath expression. The primary usage target is property alias
041: * objects and theirs query subelement.
042: *
043: * @author nk160297
044: */
045: public class PathValidationContext implements XPathValidationContext {
046:
047: private static EntityTypeNameVisitor etnv = new EntityTypeNameVisitor();
048:
049: private XPathModel myXPathModel;
050: private Validator myValidator;
051: private ValidationVisitor myVVisitor;
052: private BpelEntity myBpelContextActivity;
053: private ContentElement myXpathContentElement;
054:
055: private transient SchemaModel contextModel;
056: private transient SchemaComponent contextComponent;
057:
058: public PathValidationContext(XPathModel xPathModel,
059: Validator validator, ValidationVisitor vVisitor,
060: BpelEntity activity, ContentElement contentElement) {
061: myXPathModel = xPathModel;
062: myValidator = validator;
063: myVVisitor = vVisitor;
064: myBpelContextActivity = activity;
065: myXpathContentElement = contentElement;
066: }
067:
068: public XPathModel getXPathModel() {
069: return myXPathModel;
070: }
071:
072: /**
073: * Returns the BPEL Activity to which the validation is applied.
074: */
075: public BpelEntity getBpelContextActivity() {
076: return myBpelContextActivity;
077: }
078:
079: /**
080: * Returns the immediate owner of the validated XPath expression.
081: */
082: public ContentElement getXPathContentElement() {
083: return myXpathContentElement;
084: }
085:
086: /**
087: * Context is a Schema component which represents current context for
088: * the XPath expression.
089: * <p>
090: * In case of relative location paths, it references to a parent component,
091: * which should be considered as a parent for the first location step element.
092: * <p>
093: * In case of absolute location paths, it references to a global component,
094: * which corresponds to the root location step.
095: */
096: public void setSchemaContextComponent(SchemaComponent context) {
097: contextComponent = context;
098: }
099:
100: public SchemaComponent getSchemaContextComponent() {
101: return contextComponent;
102: }
103:
104: /**
105: * Context model specifies the root schema model.
106: * It is intended to be used to check absolute location paths.
107: */
108: public void setSchemaContextModel(SchemaModel context) {
109: contextModel = context;
110: }
111:
112: public SchemaModel getSchemaContextModel() {
113: return contextModel;
114: }
115:
116: public Validator getValidator() {
117: return myValidator;
118: }
119:
120: public ValidationVisitor getVVisitor() {
121: return myVVisitor;
122: }
123:
124: /**
125: * Adds validation result item in current context.
126: */
127: public void addResultItem(ResultType resultType, String str,
128: Object... values) {
129: addResultItemImpl(null, resultType, str, values);
130: }
131:
132: /**
133: * Adds validation result item in current context.
134: */
135: public void addResultItem(String exprText, ResultType resultType,
136: String str, Object... values) {
137: addResultItemImpl(exprText, resultType, str, values);
138: }
139:
140: public void addResultItem(XPathExpression expr,
141: ResultType resultType, XPathProblem problem,
142: Object... values) {
143: //
144: String exprText = null;
145: if (expr != null) {
146: exprText = expr.getExpressionString();
147: }
148: //
149: if (problem == XPathProblem.PREFIX_REQUIRED_FOR_EXT_FUNCTION) {
150: String msg = NbBundle.getMessage(
151: PathValidationContext.class, problem.toString());
152: addResultItemImpl(exprText, resultType, msg, values);
153: } else {
154: addResultItemImpl(exprText, resultType, problem
155: .getMsgTemplate(), values);
156: }
157: }
158:
159: private void addResultItemImpl(String exprText,
160: ResultType resultType, String template, Object... values) {
161: //
162: String str = template;
163: if (values != null && values.length > 0) {
164: str = MessageFormat.format(str, values);
165: }
166: //
167: ContentElement ce = getXPathContentElement();
168: String ceTypeName = etnv.getTypeName((BpelEntity) ce);
169: str = ceTypeName + ": " + str;
170: //
171: if (exprText == null || exprText.length() == 0) {
172: if (myXPathModel != null) {
173: XPathExpression rootExpr = myXPathModel
174: .getRootExpression();
175:
176: if (rootExpr == null) {
177: return;
178: }
179: exprText = rootExpr.getExpressionString();
180: }
181: }
182: //
183: str = str + " Expression: \"" + exprText + "\"";
184: //
185: ResultItem resultItem = new ResultItem(getValidator(),
186: resultType, (BpelEntity) ce,
187: // myContext.getBpelContextActivity(),
188: str);
189: getVVisitor().getResultItems().add(resultItem);
190: }
191:
192: public boolean isSchemaImported(String soughtNamspace) {
193: assert soughtNamspace != null;
194: //
195: BpelModel model = getBpelContextActivity().getBpelModel();
196: if (model.getState() == State.VALID) {
197: for (Import anImport : model.getProcess().getImports()) {
198: if (Import.SCHEMA_IMPORT_TYPE.equals(anImport
199: .getImportType())) {
200: if (soughtNamspace.equals(anImport.getNamespace())) {
201: return true;
202: }
203: }
204: }
205: }
206: //
207: return false;
208: }
209:
210: }
|