Skip to content

Commit

Permalink
Merge pull request #1522 from GRIDAPPSD/releases/2021.04.0
Browse files Browse the repository at this point in the history
Release of version 2021.04.0
  • Loading branch information
shpoudel committed May 19, 2021
2 parents a2064a2 + 9d440b7 commit c721ad6
Show file tree
Hide file tree
Showing 5 changed files with 503 additions and 186 deletions.
@@ -1,10 +1,17 @@
package gov.pnnl.goss.gridappsd.data;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.StringWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
Expand Down Expand Up @@ -125,17 +132,30 @@ public static void main(String[] args){
// " ?tank c:TransformerTank.PowerTransformer ?pxf."+
// " ?pxf c:IdentifiedObject.name ?key"+
// "} GROUP BY ?key ORDER BY ?key";
//BGPowergridModelDataManagerImpl bg = new BGPowergridModelDataManagerImpl("http://localhost:9999/blazegraph/namespace/kb/sparql");
BGPowergridModelDataManagerImpl bg = new BGPowergridModelDataManagerImpl("http://192.168.99.100:8889/bigdata/namespace/kb/sparql");
bg.endpointNSURL = "http://localhost:8889/bigdata/sparql";
// BGPowergridModelDataManagerImpl bg = new BGPowergridModelDataManagerImpl("http://localhost:9999/blazegraph/namespace/kb/sparql");
// BGPowergridModelDataManagerImpl bg = new BGPowergridModelDataManagerImpl("http://192.168.99.100:8889/bigdata/namespace/kb/sparql");
BGPowergridModelDataManagerImpl bg = new BGPowergridModelDataManagerImpl("http://localhost:8889/bigdata/namespace/kb/sparql");

bg.endpointNSURL = "http://localhost:8889/bigdata/namespace/kb/sparql";
try {
// String query = "select ?s ?p ?o where {?s r:type c:ConnectivityNode. ?s ?p ?o}";
// System.out.println(bg.query("ieee13", query, "JSON"));

// bg.queryObject("ieee13", "_211AEE43-D357-463C-95B9-184942ABE3E5", "JSON");
// System.out.println(bg.queryObjectTypes("_4F76A5F9-271D-9EB8-5E31-AA362D86F2C3", "JSON", "12345", "user"));
// System.out.println(bg.queryModelNameList("12345", "user"));
// System.out.println(bg.queryModel("_4F76A5F9-271D-9EB8-5E31-AA362D86F2C3", "http://iec.ch/TC57/2012/CIM-schema-cim17#PowerTransformer", "?s c:IdentifiedObject.name 't5138260a'", "JSON", "12345", "user"));
System.out.println(bg.queryModelNameList("12345", "user"));
long start = new Date().getTime();
String model = bg.queryModel("_4F76A5F9-271D-9EB8-5E31-AA362D86F2C3", "", "", "XML", "12345", "user");
// String model = bg.queryModel("_503D6E20-F499-4CC7-8051-971E23D0BF79", "", "", "XML", "12345", "user");


FileOutputStream fout = new FileOutputStream(new File("xml_new_full.xml"));
fout.write(model.getBytes());
fout.flush();
fout.close();
long end = new Date().getTime();
System.out.println("Took "+((end-start)/1000));
// System.out.println(bg.queryModel("_4F76A5F9-271D-9EB8-5E31-AA362D86F2C3", "", "", "XML", "12345", "user"));
// System.out.println(bg.queryModelNames("XML"));
// System.out.println(bg.queryModelNamesAndIds("XML", "12345", "user"));

Expand All @@ -154,8 +174,8 @@ public static void main(String[] args){
// // TODO: handle exception
// }
// System.out.println(bg.queryObjectDictByType("JSON", "_4F76A5F9-271D-9EB8-5E31-AA362D86F2C3", "LinearShuntCompensator", null, "12345", "user")); //ieee8500
System.out.println(bg.queryMeasurementDictByObject("JSON", "_4F76A5F9-271D-9EB8-5E31-AA362D86F2C3", null, "_7A02B3B0-2746-EB24-45A5-C3FBA8ACB88E", "12345", "user"));
System.out.println(bg.queryMeasurementDictByObject("JSON", "_4F76A5F9-271D-9EB8-5E31-AA362D86F2C3", "LinearShuntCompensator", null, "12345", "user"));
// System.out.println(bg.queryMeasurementDictByObject("JSON", "_4F76A5F9-271D-9EB8-5E31-AA362D86F2C3", null, "_7A02B3B0-2746-EB24-45A5-C3FBA8ACB88E", "12345", "user"));
// System.out.println(bg.queryMeasurementDictByObject("JSON", "_4F76A5F9-271D-9EB8-5E31-AA362D86F2C3", "LinearShuntCompensator", null, "12345", "user"));

// System.out.println
} catch (Exception e) {
Expand Down Expand Up @@ -267,42 +287,124 @@ public List<String> queryObjectTypeList(String modelId, String processId, String
@Override
public String queryModel(String modelId, String objectType, String filter, String resultFormat, String processId, String username) throws Exception {
String result = null;
ResultSet rs = queryModelResultSet(modelId, objectType, filter, processId, username);
ResultSet rs = queryModelResultSet(modelId, objectType, filter, processId, username, true);
HashSet<String> alreadySeen = new HashSet<String>();
Queue<String> newIds = new PriorityQueue<String>();
List<BGResult> results = new ArrayList<BGResult>();

//Tracks which subjects have been seen already and follows links to pull information on those that haven't been included yet
while(rs.hasNext() || newIds.size()>0){
while(rs.hasNext()){
QuerySolution qs = rs.nextSolution();
String subject = qs.getResource(SUBJECT).getLocalName();
String subjectUri = qs.getResource(SUBJECT).getURI();
String propertyName = qs.getResource(PREDICATE).getURI();

String value = "";
if(qs.get(OBJECT).isLiteral()){
Literal literal = qs.getLiteral(OBJECT);
value = literal.toString();
} else {
Resource resource = qs.getResource(OBJECT);
value = resource.toString();
if(!alreadySeen.contains(value) && !newIds.contains(value)){
newIds.add(value);
}
}
if(!alreadySeen.contains(subjectUri)){
alreadySeen.add(subjectUri);
if(newIds.contains(subjectUri)){
newIds.remove(subjectUri);
}
}
BGResult r = new BGResult(subject, propertyName, value);
results.add(r);
}
if(newIds.size()>0){
//build query with new ids
String newIdQuery = "CONSTRUCT {?s ?p ?o} WHERE { ";

for(int i=0;i<100 && newIds.size()>0; i++){
String id = newIds.poll();
newIdQuery = newIdQuery+"{ ?s ?p ?o . VALUES ?s { <"+id+"> }} UNION";
if(!alreadySeen.contains(id)) {
alreadySeen.add(id);
}

}
newIdQuery = newIdQuery.substring(0,newIdQuery.length()-6);
newIdQuery = newIdQuery+" }";

BlazegraphQueryHandler queryHandler = new BlazegraphQueryHandler(getEndpointURL(modelId), logManager, processId, username);
rs = queryHandler.construct(newIdQuery);



}

}

if(resultFormat.equals(ResultFormat.JSON.toString())){
result = resultSetToJson(rs);
result = resultSetToJson(results);
} else if(resultFormat.equals(ResultFormat.XML.toString())){
result = resultSetToXML(rs);
// ResultSetFormatter.outputAsXML(resultString, rs);
result = resultSetToXML(results);
} else {
//TODO throw error
//TODO throw error??
//logManager.log(new LogMessage(processId, timestamp, logMessage, logLevel, processStatus, storeToDb), username);

//OR JUST DEFAULT TO JSON
result = resultSetToJson(results);
}

//TODO
logStatus("COMPLETE");
logStatus("Generation of queryModel in "+resultFormat+" is complete");

return result;

}
@Override
public ResultSet queryModelResultSet(String modelId, String objectType, String filter, String processId, String username) {
return queryModelResultSet(modelId, objectType, filter, processId, username, false);
}


protected ResultSet queryModelResultSet(String modelId, String objectType, String filter, String processId, String username, boolean multiLevel) {
if(modelId==null){
throw new RuntimeException("queryModel: model id missing");
}

String query = "CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o ";
query = query+". ?s ?p2 <"+getEndpointNS(modelId)+"> ";
if(objectType!=null && objectType.trim().length()>0){
query = query+". ?s rdf:type <"+objectType+"> ";
}
if(filter!=null && filter.trim().length()>0){
if(filter.startsWith(".")){
filter = filter.substring(1);
String query;
if(multiLevel){
query = "CONSTRUCT { ?s ?p ?o . ?o ?p3 ?o3 } WHERE { ?s ?p ?o ";
query = query+". ?s ?p2 <"+getEndpointNS(modelId)+"> OPTIONAL {?o ?p3 ?o3 } ";
if(objectType!=null && objectType.trim().length()>0){
query = query+". ?s rdf:type <"+objectType+"> ";
}
if(filter!=null && filter.trim().length()>0){
if(filter.startsWith(".")){
filter = filter.substring(1);
}
query = query+". "+filter;
}
query = query+"}";
} else {
query = "CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o ";
query = query+". ?s ?p2 <"+getEndpointNS(modelId)+"> ";
if(objectType!=null && objectType.trim().length()>0){
query = query+". ?s rdf:type <"+objectType+"> ";
}
query = query+". "+filter;
if(filter!=null && filter.trim().length()>0){
if(filter.startsWith(".")){
filter = filter.substring(1);
}
query = query+". "+filter;
}
query = query+"}";
}
query = query+"}";
// System.out.println(query);



System.out.println(query);

BlazegraphQueryHandler queryHandler = new BlazegraphQueryHandler(getEndpointURL(modelId), logManager, processId, username);
ResultSet rs = queryHandler.construct(query);
Expand Down Expand Up @@ -529,6 +631,8 @@ protected Element getXMLElementWithPrefix(Document rootDoc, String namespace, St

}



// protected void sendResult(String result, String resultTopic) throws Exception{
// Credentials credentials = new UsernamePasswordCredentials(
// GridAppsDConstants.username, GridAppsDConstants.password);
Expand All @@ -539,6 +643,50 @@ protected Element getXMLElementWithPrefix(Document rootDoc, String namespace, St
// }



protected String resultSetToJson(List<BGResult> results){
JsonArray resultArr = new JsonArray();
String baseUrl = getEndpointNS(null);
HashMap<String, JsonObject> resultObjects = new HashMap<String, JsonObject>();
for(BGResult result: results) {
String subject = result.getSubject();
JsonObject obj = new JsonObject();
if(resultObjects.containsKey(subject)){
obj = resultObjects.get(subject);
} else {
obj.add("id", new JsonPrimitive(subject));
resultObjects.put(subject, obj);
}

String propertyName = result.getProperty();
if(propertyName.startsWith(nsCIM)){
propertyName = propertyName.substring(nsCIM.length());
} else if(propertyName.startsWith(nsRDF)){
propertyName = propertyName.substring(nsRDF.length());
}

String value = result.getObject();

if(value.startsWith(baseUrl+"#")){
value = value.substring(baseUrl.length()+1);
} else if(value.startsWith(nsCIM)){
value = value.substring(nsCIM.length());
} else if(value.startsWith(nsRDF)){
value = value.substring(nsRDF.length());
}
// }
obj.add(propertyName, new JsonPrimitive(value));

}

for(JsonObject obj: resultObjects.values()){
resultArr.add(obj);
}

return resultArr.toString();
}


protected String resultSetToJson(ResultSet rs){
JsonArray resultArr = new JsonArray();
String baseUrl = getEndpointNS(null);
Expand Down Expand Up @@ -587,8 +735,110 @@ protected String resultSetToJson(ResultSet rs){

return resultArr.toString();
}


protected String resultSetToXML(List<BGResult> results) throws Exception {
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);


DocumentBuilder builder =
factory.newDocumentBuilder();
Document rootDoc = builder.newDocument();
Element rootElement = getXMLElementWithPrefix(rootDoc, nsRDF, "RDF");
rootElement.setAttribute("xmlns:cim", nsCIM);
rootElement.setAttribute("xmlns:rdf", nsRDF);
rootDoc.appendChild(rootElement);


String baseUrl = getEndpointNS(null);
HashMap<String, List<Element>> resultObjects = new HashMap<String, List<Element>>();
HashMap<String, String> resultTypes = new HashMap<String, String>();

for(BGResult result: results) {
String subject = result.getSubject();
List<Element> objs = null;
if(resultObjects.containsKey(subject)){
objs = resultObjects.get(subject);
} else {
objs = new ArrayList<Element>();
resultObjects.put(subject, objs);
}

String propertyName = result.getProperty();
String value = result.getObject();

if(propertyName.equals(RDF_TYPE)){
resultTypes.put(subject, value);
} else {
String ns = "";
String localName = propertyName;
if(propertyName.contains("#")){
ns = propertyName.substring(0, propertyName.indexOf("#")+1);
localName = propertyName.substring(propertyName.indexOf("#")+1);
// System.out.println("GOT property NS "+ns+" LOCAL "+localName);
}
Element tmp = getXMLElementWithPrefix(rootDoc, ns, localName);
if(!isValidURI(value)){
tmp.setTextContent(value);
} else {
if(value.startsWith(baseUrl+"#")){
value = value.substring(baseUrl.length());
}
tmp.setAttributeNS(nsRDF, RDF_RESOURCE, value);
}
objs.add(tmp);
}

}

//Build result elements based on types and properties
for(String subject: resultTypes.keySet()){
// Resource subjectRes = resultTypes.get(subject);
String subjectType = resultTypes.get(subject);
String ns = "";
String localName = subjectType;
if(subjectType.contains("#")){
ns = subjectType.substring(0, subjectType.indexOf("#")+1);
localName = subjectType.substring(subjectType.indexOf("#")+1);
}


List<Element> elements = resultObjects.get(subject);
Element element = getXMLElementWithPrefix(rootDoc, ns, localName);
element.setAttributeNS(nsRDF, RDF_ID, subject);
for(Element child: elements){
element.appendChild(child);
}
rootElement.appendChild(element);
}


TransformerFactory tranFactory = TransformerFactory.newInstance();
Transformer transformer = tranFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

StringWriter resultWriter = new StringWriter();
transformer.transform(new DOMSource(rootDoc), new StreamResult(resultWriter));
return resultWriter.toString();
}


protected boolean isValidURI(String url){
/* Try creating a valid URL */
try {
new URL(url).toURI();
return true;
}

// If there was an Exception
// while creating URL object
catch (Exception e) {
return false;
}
}
protected String resultSetToXML(ResultSet rs) throws Exception {
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
Expand Down

0 comments on commit c721ad6

Please sign in to comment.