001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.websvc.rest.codegen.model;
043:
044: import java.io.IOException;
045: import java.net.URL;
046: import java.util.ArrayList;
047: import java.util.List;
048: import javax.xml.parsers.DocumentBuilder;
049: import javax.xml.parsers.DocumentBuilderFactory;
050: import org.netbeans.modules.websvc.rest.RestUtils;
051: import org.netbeans.modules.websvc.rest.codegen.Constants.HttpMethodType;
052: import org.netbeans.modules.websvc.rest.codegen.Constants.MimeType;
053: import org.netbeans.modules.websvc.rest.component.palette.RestComponentData;
054: import org.openide.filesystems.URLMapper;
055: import org.openide.util.Lookup;
056: import org.w3c.dom.Attr;
057: import org.w3c.dom.DOMException;
058: import org.w3c.dom.Document;
059: import org.w3c.dom.Node;
060: import org.w3c.dom.NodeList;
061:
062: /**
063: * Model bean for code generation of JAXWS operation wrapper resource class.
064: *
065: * @author nam
066: */
067: public class WadlComponentBean extends RestComponentBean {
068: private String url;
069: private RestComponentData data;
070: private List<ParameterInfo> inputParams;
071:
072: public WadlComponentBean(RestComponentData data) throws IOException {
073: super (deriveResourceName(data.getService().getName()), null,
074: deriveUriTemplate(data.getService().getName()),
075: new MimeType[] { MimeType.XML },
076: new String[] { "java.lang.String" }, //NOI18N
077: new HttpMethodType[] { HttpMethodType.GET });
078:
079: this .data = data;
080:
081: init();
082: }
083:
084: private void init() throws IOException {
085: inputParams = new ArrayList<ParameterInfo>();
086: List<MimeType> mimeTypes = new ArrayList<MimeType>();
087:
088: try {
089: RestComponentData.Method m = data.getService().getMethods()
090: .get(0);
091: String mName = m.getName();
092: String resourceName = mName.substring(0, mName
093: .lastIndexOf("/")); //NOI18N
094: URL mUrl = new URL(m.getUrl());
095: String resource = mUrl.getPath();
096:
097: if (resource.length() > 0 && resource.charAt(0) == '/') {
098: resource = resource.substring(1);
099: }
100:
101: ClassLoader loader = Lookup.getDefault().lookup(
102: ClassLoader.class);
103: URL t1 = loader.getResource(resource);
104: DocumentBuilderFactory dbf = DocumentBuilderFactory
105: .newInstance();
106: DocumentBuilder db = dbf.newDocumentBuilder();
107: Document doc = db.parse(URLMapper.findFileObject(t1)
108: .getInputStream());
109:
110: this .url = RestUtils.getAttributeValue(doc, "//resources",
111: "base")
112: + RestUtils.getAttributeValue(doc, resourceName,
113: "path"); //NOI18N
114:
115: NodeList resourceNodes = RestUtils.getNodeList(doc,
116: resourceName);
117:
118: if (resourceNodes != null && resourceNodes.getLength() > 0) {
119: Node resourceNode = resourceNodes.item(0);
120: findParams(inputParams, resourceNode);
121: }
122:
123: NodeList httpMethodNodes = RestUtils
124: .getNodeList(doc, mName);
125:
126: if (httpMethodNodes != null
127: && httpMethodNodes.getLength() > 0) {
128: Node httpMethodNode = httpMethodNodes.item(0);
129: Attr href = (Attr) httpMethodNode.getAttributes()
130: .getNamedItem("href"); //NOI18N
131:
132: if (href != null) {
133: String id = href.getValue();
134:
135: if (id.startsWith("#")) { //NOI18N
136: id = id.substring(1);
137: }
138:
139: NodeList gMethodNodes = RestUtils.getNodeList(doc,
140: "//" + httpMethodNode.getNodeName()
141: + "[@id='" + id + "']"); //NOI18N
142:
143: if (gMethodNodes != null
144: && gMethodNodes.getLength() > 0) {
145: httpMethodNode = gMethodNodes.item(0);
146: }
147: }
148:
149: if (httpMethodNode != null) {
150: NodeList childs = httpMethodNode.getChildNodes();
151: if (childs != null) {
152: for (int i = 0; i < childs.getLength(); i++) {
153: Node child = childs.item(i);
154: String childName = child.getNodeName();
155:
156: if (childName.equals("request")) { //NOI18N
157: findParams(inputParams, child);
158: } else if (childName.equals("response")) { //NOI18M
159: findMediaType(child, mimeTypes);
160: }
161: }
162: }
163: }
164: }
165: if (mimeTypes.size() > 0)
166: this .setMimeTypes(mimeTypes
167: .toArray(new MimeType[mimeTypes.size()]));
168: } catch (Exception ex) {
169: throw new IOException(ex.getMessage());
170: }
171: }
172:
173: protected List<ParameterInfo> initInputParameters() {
174: return inputParams;
175: }
176:
177: public String getUrl() {
178: return this .url;
179: }
180:
181: private void findMediaType(Node child, List<MimeType> mimeTypes)
182: throws DOMException {
183: NodeList respChilds = child.getChildNodes();
184: if (respChilds != null) {
185: for (int j = 0; j < respChilds.getLength(); j++) {
186: Node respChild = respChilds.item(j);
187: if (respChild.getNodeName().equals("representation")
188: && respChild.getAttributes() != null) {
189: Attr mediaAttr = (Attr) respChild.getAttributes()
190: .getNamedItem("mediaType");
191: if (mediaAttr != null
192: && mediaAttr.getNodeValue() != null) {
193: String[] mTypes = mediaAttr.getNodeValue()
194: .split(",");
195: for (String m : mTypes) {
196: MimeType mType = MimeType.find(m);
197: if (mType != null) {
198: mimeTypes.add(mType);
199: }
200: }
201: }
202: }
203: }
204: }
205: }
206:
207: private void findParams(List<ParameterInfo> paramInfos, Node child)
208: throws DOMException {
209: NodeList params = child.getChildNodes();
210:
211: if (params != null) {
212: for (int j = 0; j < params.getLength(); j++) {
213: Node param = params.item(j);
214: if (param.getAttributes() != null) {
215: String paramName = null;
216: Class paramType = null;
217: Object defaultValue = null;
218: Node attr = null;
219:
220: if ((attr = param.getAttributes().getNamedItem(
221: "name")) != null) { //NOI18N
222: paramName = attr.getNodeValue(); //NOI18
223: } else {
224: continue;
225: }
226:
227: if ((attr = param.getAttributes().getNamedItem(
228: "type")) != null) { //NOI18N
229: paramType = findJavaType(attr.getNodeValue()); //NOI18N
230:
231: if ((attr = param.getAttributes().getNamedItem(
232: "default")) != null) { //NOI18N
233: defaultValue = getDefaultValue(attr
234: .getNodeValue(), paramType);
235: }
236: }
237:
238: ParameterInfo paramInfo = new ParameterInfo(
239: paramName, paramType);
240: paramInfo.setDefaultValue(defaultValue);
241: paramInfos.add(paramInfo);
242: }
243: }
244: }
245: }
246:
247: private Class findJavaType(String schemaType) {
248: if (schemaType != null) {
249: int index = schemaType.indexOf(":"); //NOI18N
250:
251: if (index != -1) {
252: schemaType = schemaType.substring(index + 1);
253: }
254:
255: if (schemaType.equals("string")) { //NOI18N
256: return String.class;
257: } else if (schemaType.equals("int")) { //NOI18N
258: return Integer.class;
259: }
260: }
261:
262: return String.class;
263: }
264:
265: private Object getDefaultValue(String value, Class type) {
266: if (type == String.class) {
267: return value;
268: } else if (type == Integer.class) {
269: return new Integer(Integer.parseInt(value));
270: }
271:
272: return null;
273: }
274: }
|