/*
* Copyright 2012 SAP AG
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sap.research.connectivity.gw;
import java.io.StringWriter;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.odata4j.consumer.behaviors.OClientBehaviors;
import org.odata4j.edm.EdmAssociationEnd;
import org.odata4j.edm.EdmDataServices;
import org.odata4j.edm.EdmEntitySet;
import org.odata4j.edm.EdmNavigationProperty;
import org.odata4j.edm.EdmProperty;
import org.odata4j.jersey.consumer.ODataJerseyConsumer;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class MetadataRetriever {
public static void main(String[] args) {
String url = args[0];
String user = args[1];
String pass = args[2];
String http_proxy_host = null;
String http_proxy_port = null;
int noOfArguments = args.length;
if (noOfArguments == 3){
http_proxy_host = "";
http_proxy_port = "";
}else if (noOfArguments == 5){
http_proxy_host = args[3];
http_proxy_port = args[4];
}
System.setProperty("https.proxyHost", http_proxy_host);
System.setProperty("https.proxyPort", http_proxy_port);
ODataJerseyConsumer ODataConsumer = ODataJerseyConsumer.newBuilder(url).setClientBehaviors(OClientBehaviors.basicAuth(user,pass)).build();
try {
EdmDataServices metad = ODataConsumer.getMetadata();
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("entities");
doc.appendChild(rootElement);
for(EdmEntitySet es: metad.getEntitySets()){
Element entity = doc.createElement("entity");
rootElement.appendChild(entity);
Attr nameAttr = doc.createAttribute("name");
nameAttr.setValue(es.getName());
entity.setAttributeNode(nameAttr);
List<String> keys = es.getType().getKeys();
for (EdmProperty ep : es.getType().getProperties())
{
Element entityField = doc.createElement("entityfield");
entity.appendChild(entityField);
Element fieldName = doc.createElement("fieldname");
fieldName.appendChild(doc.createTextNode(ep.getName()));
entityField.appendChild(fieldName);
Element fieldType = doc.createElement("fieldtype");
String remoteFieldType = ep.getType().getFullyQualifiedTypeName();
remoteFieldType = (remoteFieldType.toLowerCase().startsWith("edm.")) ? remoteFieldType.substring(4) : remoteFieldType;
fieldType.appendChild(doc.createTextNode(remoteFieldType));
entityField.appendChild(fieldType);
Element key = doc.createElement("key");
String text = null;
if (keys.contains(ep.getName())){
text = "true";
} else {
text = "false";
}
key.appendChild(doc.createTextNode(text));
entityField.appendChild(key);
}
for (EdmNavigationProperty navProp : es.getType().getNavigationProperties()) {
Element navPropertyXMLNode = doc.createElement("navproperty");
entity.appendChild(navPropertyXMLNode);
Element relationship = doc.createElement("relationship_id");
relationship.appendChild(doc.createTextNode(navProp.getRelationship().getName()));
navPropertyXMLNode.appendChild(relationship);
Element navName = doc.createElement("navpath");
navName.appendChild(doc.createTextNode(navProp.getName()));
navPropertyXMLNode.appendChild(navName);
Element fromNode = doc.createElement("end1");
EdmAssociationEnd end1 = navProp.getRelationship().getEnd1();
fromNode.appendChild(doc.createTextNode(end1.getType().getName()));
navPropertyXMLNode.appendChild(fromNode);
Element toNode = doc.createElement("end2");
EdmAssociationEnd end2 = navProp.getRelationship().getEnd2();
toNode.appendChild(doc.createTextNode(end2.getType().getName()));
navPropertyXMLNode.appendChild(toNode);
Attr multiplicity1 = doc.createAttribute("multiplicity");
multiplicity1.setValue(end1.getMultiplicity().getSymbolString());
fromNode.setAttributeNode(multiplicity1);
Attr multiplicity2 = doc.createAttribute("multiplicity");
multiplicity2.setValue(end2.getMultiplicity().getSymbolString());
toNode.setAttributeNode(multiplicity2);
}
}
StringWriter out = new StringWriter();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(doc), new StreamResult(out));
System.out.print(out.toString());
System.out.flush();
} catch (ParserConfigurationException pce) {
pce.printStackTrace(System.out);
} catch (TransformerException tfe) {
tfe.printStackTrace(System.out);
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}