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:
020: package org.netbeans.modules.bpel.model.api.support;
021:
022: import java.util.ArrayList;
023: import java.util.Collection;
024: import java.util.List;
025: import org.netbeans.modules.bpel.model.api.BpelEntity;
026: import org.netbeans.modules.bpel.model.api.BpelModel;
027: import org.netbeans.modules.bpel.model.impl.references.SchemaReferenceBuilder;
028: import org.netbeans.modules.xml.xpath.ext.XPathModel;
029: import org.netbeans.modules.xml.xpath.ext.XPathModelHelper;
030: import org.netbeans.modules.xml.xpath.ext.spi.ExternalModelResolver;
031: import org.netbeans.modules.xml.schema.model.SchemaModel;
032:
033: /**
034: *
035: * @author nk160297
036: */
037: public final class XPathModelFactory {
038:
039: /**
040: * This delimiter is used to separate multiple XPath expressions.
041: * The delimiter is used when BPEL mapper graph has a few roots.
042: * The expression with such delimiter will not be processed correctly
043: * by BPEL engine.
044: * It is intended to be used temporary to save unlinked content of a graph.
045: */
046: public static final String XPATH_EXPR_DELIMITER = ";";
047: public static final char XPATH_EXPR_DELIMITER_CHAR = ';';
048:
049: public static final String DEFAULT_EXPR_LANGUAGE = "urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"; // NOI18N
050:
051: /**
052: * Try to create a new XPath model for BPEL.
053: * The BpelEntity is used as the context.
054: *
055: * @param expression text to parse
056: * @param contextEntity BPEL entity which is used as context
057: * @return the new XPath model.
058: */
059: public static XPathModel create(final BpelEntity contextEntity) {
060: assert contextEntity != null : "Trying to create a new BPEL XPath model without a context entity"; // NOI18N
061: XPathModelHelper helper = XPathModelHelper.getInstance();
062: XPathModel model = helper.newXPathModel();
063: //
064: ExNamespaceContext nsContext = contextEntity
065: .getNamespaceContext();
066: model.setNamespaceContext(new BpelXPathNamespaceContext(
067: nsContext));
068: //
069: model.setVariableResolver(new BpelVariableResolver(null,
070: contextEntity));
071: model
072: .setExtensionFunctionResolver(new BpelXpathExtFunctionResolver());
073: //
074: model.setExternalModelResolver(new ExternalModelResolver() {
075: public Collection<SchemaModel> getModels(String modelNsUri) {
076: BpelModel bpelModel = contextEntity.getBpelModel();
077: return SchemaReferenceBuilder.getSchemaModels(
078: bpelModel, modelNsUri);
079: }
080:
081: public Collection<SchemaModel> getVisibleModels() {
082: return null;
083: }
084:
085: public boolean isSchemaVisible(String schemaNamespaceUri) {
086: return false;
087: }
088: });
089: //
090: return model;
091: }
092:
093: public static String[] split(String str) {
094: if (str == null || str.length() == 0) {
095: return EMPTY_STRING_ARRAY;
096: }
097:
098: boolean quotOpen = false;
099: boolean aposOpen = false;
100:
101: int beginIndex = 0;
102:
103: List<String> result = new ArrayList<String>();
104:
105: int stringLength = str.length();
106:
107: for (int i = 0; i < stringLength; i++) {
108: char c = str.charAt(i);
109: if (c == '\'') {
110: if (aposOpen) {
111: aposOpen = false;
112: } else if (!quotOpen) {
113: aposOpen = true;
114: }
115: } else if (c == '\"') {
116: if (quotOpen) {
117: quotOpen = false;
118: } else if (!aposOpen) {
119: quotOpen = true;
120: }
121: } else if (c == XPATH_EXPR_DELIMITER_CHAR) {
122: if (!quotOpen && !aposOpen) {
123: // substring found
124: if (beginIndex < i) {
125: result.add(new String(str.substring(beginIndex,
126: i)));
127: }
128: beginIndex = i + 1;
129: }
130: }
131: }
132:
133: if (beginIndex < stringLength) {
134: result.add(new String(str.substring(beginIndex)));
135: }
136:
137: return (result.isEmpty()) ? EMPTY_STRING_ARRAY : result
138: .toArray(new String[result.size()]);
139: }
140:
141: public static boolean isSplitable(String str) {
142: boolean quotOpen = false;
143: boolean aposOpen = false;
144:
145: int stringLength = str.length();
146:
147: for (int i = 0; i < stringLength; i++) {
148: char c = str.charAt(i);
149: if (c == '\'') {
150: if (aposOpen) {
151: aposOpen = false;
152: } else if (!quotOpen) {
153: aposOpen = true;
154: }
155: } else if (c == '\"') {
156: if (quotOpen) {
157: quotOpen = false;
158: } else if (!aposOpen) {
159: quotOpen = true;
160: }
161: } else if (c == XPATH_EXPR_DELIMITER_CHAR) {
162: if (!quotOpen && !aposOpen) {
163: return true;
164: }
165: }
166: }
167:
168: return false;
169: }
170:
171: private static final String[] EMPTY_STRING_ARRAY = new String[0];
172: }
|