2003-10-03 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / data / DefaultWsdlHelpGenerator.aspx
1 <%@ Import Namespace="System.Collections" %>
2 <%@ Import Namespace="System.IO" %>
3 <%@ Import Namespace="System.Xml.Serialization" %>
4 <%@ Import Namespace="System.Xml" %>
5 <%@ Import Namespace="System.Xml.Schema" %>
6 <%@ Import Namespace="System.Web.Services.Description" %>
7 <%@ Import Namespace="System" %>
8 <%@ Import Namespace="System.Globalization" %>
9 <%@ Import Namespace="System.Resources" %>
10 <%@ Import Namespace="System.Diagnostics" %>
11 <%@ Assembly name="System.Web.Services" %>
12 <%@ Page debug="true" %>
13
14 <html>
15 <script language="C#" runat="server">
16
17 ServiceDescriptionCollection descriptions;
18 XmlSchemas schemas;
19
20 string WebServiceName;
21 string WebServiceDescription;
22 string PageName;
23
24 string DefaultBinding;
25
26 string CurrentOperationName;
27 string CurrentOperationBinding;
28 string OperationDocumentation;
29 ArrayList InParams;
30 ArrayList OutParams;
31
32 void Page_Load(object sender, EventArgs e)
33 {
34         descriptions = (ServiceDescriptionCollection) Context.Items["wsdls"];
35         schemas = (XmlSchemas) Context.Items["schemas"];
36
37         ServiceDescription desc = descriptions [0];
38         Service service = desc.Services[0];
39         WebServiceName = service.Name;
40         DefaultBinding = desc.Bindings[0].Name;
41         WebServiceDescription = service.Documentation;
42         
43         CurrentOperationName = Request.QueryString["op"];
44         CurrentOperationBinding = Request.QueryString["bnd"];
45         if (CurrentOperationName != null) BuildOperationInfo ();
46
47         PageName = HttpUtility.UrlEncode (Path.GetFileName(Request.Path), Encoding.UTF8);
48
49         ArrayList list = new ArrayList ();
50         foreach (ServiceDescription sd in descriptions)
51                 list.AddRange (sd.Bindings);
52
53         BindingsRepeater.DataSource = list;
54         Page.DataBind();
55 }
56
57 void BuildOperationInfo ()
58 {
59         InParams = new ArrayList ();
60         OutParams = new ArrayList ();
61         
62         Binding binding = FindBinding (CurrentOperationBinding);
63         PortType portType = descriptions.GetPortType (binding.Type);
64         Operation oper = FindOperation (portType, CurrentOperationName);
65         
66         OperationDocumentation = oper.Documentation;
67         if (OperationDocumentation == null || OperationDocumentation == "")
68                 OperationDocumentation = "No additional remarks";
69         
70         foreach (OperationMessage opm in oper.Messages)
71         {
72                 if (opm is OperationInput)
73                         BuildParameters (InParams, opm);
74                 else if (opm is OperationOutput)
75                         BuildParameters (OutParams, opm);
76         }
77
78         InputParamsRepeater.DataSource = InParams;
79         OutputParamsRepeater.DataSource = OutParams;
80 }
81
82 void BuildParameters (ArrayList list, OperationMessage opm)
83 {
84         Message msg = descriptions.GetMessage (opm.Message);
85         if (msg.Parts.Count > 0 && msg.Parts[0].Name == "parameters")
86         {
87                 MessagePart part = msg.Parts[0];
88                 XmlSchemaComplexType ctype;
89                 if (part.Element == XmlQualifiedName.Empty)
90                 {
91                         ctype = (XmlSchemaComplexType) schemas.Find (part.Type, typeof(XmlSchemaComplexType));
92                 }
93                 else
94                 {
95                         XmlSchemaElement elem = (XmlSchemaElement) schemas.Find (part.Element, typeof(XmlSchemaElement));
96                         ctype = (XmlSchemaComplexType) elem.SchemaType;
97                 }
98                 XmlSchemaSequence seq = ctype.Particle as XmlSchemaSequence;
99                 if (seq == null) return;
100                 
101                 foreach (XmlSchemaObject ob in seq.Items)
102                 {
103                         Parameter p = new Parameter();
104                         p.Description = "No additional remarks";
105                         
106                         if (ob is XmlSchemaElement)
107                         {
108                                 XmlSchemaElement selem = GetRefElement ((XmlSchemaElement)ob);
109                                 p.Name = selem.Name;
110                                 p.Type = selem.SchemaTypeName.Name;
111                         }
112                         else
113                         {
114                                 p.Name = "Unknown";
115                                 p.Type = "Unknown";
116                         }
117                         list.Add (p);
118                 }
119         }
120         else
121         {
122                 foreach (MessagePart part in msg.Parts)
123                 {
124                         Parameter p = new Parameter ();
125                         p.Description = "No additional remarks";
126                         p.Name = part.Name;
127                         if (part.Element == XmlQualifiedName.Empty)
128                                 p.Type = part.Type.Name;
129                         else
130                         {
131                                 XmlSchemaElement elem = (XmlSchemaElement) schemas.Find (part.Element, typeof(XmlSchemaElement));
132                                 p.Type = elem.SchemaTypeName.Name;
133                         }
134                         list.Add (p);
135                 }
136         }
137 }
138
139 XmlSchemaElement GetRefElement (XmlSchemaElement elem)
140 {
141         if (!elem.RefName.IsEmpty)
142                 return (XmlSchemaElement) schemas.Find (elem.RefName, typeof(XmlSchemaElement));
143         else
144                 return elem;
145 }
146
147 Binding FindBinding (string portName)
148 {
149         Service service = descriptions[0].Services[0];
150         foreach (Port port in service.Ports)
151                 if (port.Name == portName)
152                         return descriptions.GetBinding (port.Binding);
153         return null;
154 }
155
156 Operation FindOperation (PortType portType, string name)
157 {
158         foreach (Operation oper in portType.Operations)
159                 if (oper.Name == name) return oper;
160         return null;
161 }
162
163 string FormatBindingName (string name)
164 {
165         if (name == DefaultBinding) return "Methods";
166         else return "Methods for binding<br>" + name;
167 }
168
169 class Parameter
170 {
171         string name;
172         string type;
173         string description;
174
175         public string Name { get { return name; } set { name = value; } }
176         public string Type { get { return type; } set { type = value; } }
177         public string Description { get { return description; } set { description = value; } }
178 }
179
180 </script>
181
182 <head>
183     <style type="text/css">
184                 BODY { font-family: Arial; margin-left: 20px; margin-top: 20px; font-size: x-small}
185                 TABLE { font-size: x-small }
186                 .title { color:dimgray; font-family: Arial; font-size:20pt; font-weight:900}
187                 .operationTitle { color:dimgray; font-family: Arial; font-size:15pt; font-weight:900}
188                 .method { font-size: x-small }
189                 .bindingLabel { font-size: x-small; font-weight:bold; color:darkgray; line-height:8pt; display:block; margin-bottom:3px }
190                 .label { font-size: x-small; font-weight:bold; color:darkgray }
191                 .paramTable { font-size: x-small }
192                 .paramTable TR { background-color: gainsboro }
193                 .smallSeparator { height:3px; overflow:hidden }
194                 .panel { background-color:whitesmoke; border: solid 1px silver; border-top: solid 1px silver  }
195                 A:link { color: black; }
196                 A:visited { color: black; }
197                 A:active { color: black; }
198                 A:hover { color: blue }
199     </style>
200 </head>
201
202 <body>
203 <div class="title" style="margin-left:20px">
204 <span class="label">Web Service</span><br>
205 <%=WebServiceName%>
206 </div>
207 <table border="0" width="100%" cellpadding="15px" cellspacing="15px">
208 <tr valign="top"><td width="150px" class="panel">
209 <a class="method" href='<%=PageName%>'>Overview</a><br>
210 <div class="smallSeparator"></div>
211 <a class="method" href='<%=PageName + "?wsdl"%>'>Service Description</a>
212 <div class="smallSeparator"></div>
213 <a class="method" href='<%=PageName + "?code=cs"%>'>C# proxy</a>
214 <br><br>
215         <asp:repeater id="BindingsRepeater" runat=server>
216                 <itemtemplate name="itemtemplate">
217                         <span class="bindingLabel"><%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%></span>
218                         <asp:repeater id="OperationsRepeater" runat=server datasource='<%# ((Binding)Container.DataItem).Operations %>'>
219                                 <itemtemplate>
220                                         <a class="method" href="<%#PageName%>?op=<%#DataBinder.Eval(Container.DataItem, "Name")%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#DataBinder.Eval(Container.DataItem, "Name")%></a>
221                                         <div class="smallSeparator"></div>
222                                 </itemtemplate>
223                         </asp:repeater>
224                         <br>
225                 </itemtemplate>
226         </asp:repeater>
227
228 </td><td class="panel">
229
230 <% if (CurrentOperationName == null) {%>
231         <p class="label">Web Service Overview</p>
232         <%#WebServiceDescription%>
233 <%} else {%>
234         <span class="operationTitle"><%#CurrentOperationName%></span>
235         <br><br>
236         <span class="label">Input Parameters</span>
237         <% if (InParams.Count == 0) { %>
238                 <br>No input parameters<br>
239         <% } else { %>
240                 <table class="paramTable" cellspacing="1" cellpadding="5">
241                 <asp:repeater id="InputParamsRepeater" runat=server>
242                         <itemtemplate>
243                                 <tr>
244                                 <td width="150"><%#DataBinder.Eval(Container.DataItem, "Name")%></td>
245                                 <td width="150"><%#DataBinder.Eval(Container.DataItem, "Type")%></td>
246 <!--                            <td><%#DataBinder.Eval(Container.DataItem, "Description")%></td>-->
247                                 </tr>
248                         </itemtemplate>
249                 </asp:repeater>
250                 </table>
251         <% } %>
252         <br>
253         
254         <% if (OutParams.Count > 0) { %>
255         <span class="label">Output Parameters</span>
256                 <table class="paramTable" cellspacing="1" cellpadding="5">
257                 <asp:repeater id="OutputParamsRepeater" runat=server>
258                         <itemtemplate>
259                                 <tr>
260                                 <td width="150"><%#DataBinder.Eval(Container.DataItem, "Name")%></td>
261                                 <td width="150"><%#DataBinder.Eval(Container.DataItem, "Type")%></td>
262 <!--                            <td><%#DataBinder.Eval(Container.DataItem, "Description")%></td> -->
263                                 </tr>
264                         </itemtemplate>
265                 </asp:repeater>
266                 </table>
267         <br>
268         <% } %>
269         <span class="label">Remarks</span>
270         <br><%#OperationDocumentation%>
271 <%}%>
272 <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
273 </td>
274 <td withd="20px"></td>
275 </tr>
276
277 </table>
278 </body>
279 </html>