Last active
December 27, 2018 09:22
-
-
Save ruan65/b34fb0679e3f3e4d67157017a46791da to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Licensed Materials - Property of IBM | |
* | |
* (C) COPYRIGHT IBM CORP. 2015 All Rights Reserved | |
* | |
* US Government Users Restricted Rights - Use, duplication or | |
* disclosure restricted by GSA ADP Schedule Contract with | |
* IBM Corp. | |
*/ | |
package com.ibm.maximo.oslc; | |
import java.io.*; | |
import java.net.HttpURLConnection; | |
import java.net.Proxy; | |
import java.net.URL; | |
import java.util.List; | |
import java.util.Map; | |
import java.util.Set; | |
import java.util.logging.ConsoleHandler; | |
import java.util.logging.Handler; | |
import java.util.logging.Level; | |
import java.util.logging.Logger; | |
import javax.json.*; | |
/** | |
* | |
* {@code MaximoConnector} is a Connector between Oslc Client and Maximo Server. | |
* It provides the authentication setting, connect, basic requests and disconnect for Server. | |
* | |
* <p>This object can be created by {@code MaximoConnector} with {@code Options}. | |
* The following code shows how to initial {@code MaximoConnector} using {@code MaximoConnector} and {@code Options}Constructor</p> | |
* <pre> | |
* <code> | |
* MaximoConnector mc = new MaximoConnector(new Options().user(userName) | |
* .password(password).mt(true).lean(false).auth(authMethod) | |
* .host(hostAddress).port(portNum)); | |
* </code> | |
* </pre> | |
* | |
* <p> | |
* The following examples demonstrate how to build a new {@code MaximoConnector}</p> | |
* <pre> | |
* <code> | |
* Options op = new Options(); | |
* MaximoConnector mc = new MaximoConnector(); | |
* mc.options(op); | |
* MaximoConnector mc = new MaximoConnector(Options); | |
* </code> | |
* </pre> | |
* | |
* <p> | |
* The following examples demonstrate how to set authentication, method, cookie for session to {@code MaximoConnector}</p> | |
* <pre> | |
* <code> | |
* mc.setAuth(authMethod); | |
* mc.setMethod(httpConnection,method); | |
* mc.setCookieForSession(httpConnection); | |
* </code> | |
* </pre> | |
* | |
* <p> | |
* The following examples show how to connect, get, create, update, merge, delete and disconnect to Maximo Server by {@code MaximoConnector}. | |
* The properties can be empty</p> | |
* <pre> | |
* <code> | |
* mc.connect(); | |
* JsonObject jo = mc.get(uri); | |
* byte[] docBytes = mc.getAttachmentData(uri); | |
* byte[] docBytes = mc.attachedDoc(uri); | |
* JsonObject jp = mc.getAttachmentMeta(uri); | |
* JsonObject jo = mc.create(uri, jsonObject, properties); | |
* JsonObject jo = mc.createAttachment(uri, data, name, decription, meta); | |
* JsonObject jo = mc.update(uri, jsonObject, properties); | |
* JsonObject jo = mc.merge(uri, jsonObject, properties); | |
* mc.delete(uri); | |
* mc.deleteResource(uri); | |
* mc.deleteAttachment(uri); | |
* mc.disconnect(); | |
* </code> | |
* </pre> | |
* | |
* <p> | |
* The following examples show how to get {@code ResourceSet} or {@code Resource} or {@code Attachment} by {@code MaximoConnector}</p> | |
* <pre><code> | |
* ResourceSet rs = mc.resourceSet(osName); | |
* ResourceSet rs = mc.resourceSet(url); | |
* Resource re = mc.resource(uri); | |
* Attachment att = mc.attachment(uri); | |
* </code></pre> | |
* | |
*/ | |
public class MaximoConnector { | |
public static final Logger logger = Logger.getLogger(MaximoConnector.class.getName()); | |
private Options options; | |
private boolean valid = false; | |
private boolean debug = false; | |
private int lastResponseCode = 0; | |
// private JsonObject jo; | |
private List<String> cookies = null; | |
// private JsonObject version; | |
// private JsonObject userInfo; | |
public static final String HTTP_METHOD_POST = "POST"; | |
public static final String HTTP_METHOD_GET = "GET"; | |
public static final String HTTP_METHOD_PATCH = "PATCH"; | |
public static final String HTTP_METHOD_MERGE = "MERGE"; | |
public static final String HTTP_METHOD_DELETE = "DELETE"; | |
public static final String HTTP_METHOD_BULK = "BULK"; | |
public static final String HTTP_METHOD_SYNC = "SYNC"; | |
public static final String HTTP_METHOD_MERGESYNC = "MERGESYNC"; | |
public String httpMethod = "GET";// by default it is get | |
public MaximoConnector(){ | |
} | |
public MaximoConnector(Options options) { | |
this.options = options; | |
} | |
public ResourceSet resourceSet() { | |
return new ResourceSet(this); | |
} | |
public ResourceSet resourceSet(String osName) { | |
return new ResourceSet(osName, this); | |
} | |
public ResourceSet resourceSet(URL url) throws IOException, OslcException{ | |
String[] strs = url.getPath().split("/"); | |
String osName = null; | |
for(int i = 0;i<strs.length;i++){ | |
if(strs[i].equals("os")){ | |
osName = strs[i+1]; | |
break; | |
} | |
} | |
return new ResourceSet(osName,this); | |
} | |
public Resource resource(String uri, String... properties) throws IOException, OslcException{ | |
return new ResourceSet(this).fetchMember(uri, properties); | |
} | |
public Attachment attachment(String uri, String... properties) throws IOException, OslcException{ | |
return new AttachmentSet(this).fetchMember(uri, properties); | |
} | |
// public byte[] attachedDoc(String uri) throws IOException, OslcException{ | |
// return new AttachmentSet(this).fetchMember(uri).toDoc(); | |
// } | |
public JsonObject attachmentDocMeta(String uri) throws IOException, OslcException{ | |
return new AttachmentSet(this).fetchMember(uri).fetchDocMeta(); | |
} | |
public MaximoConnector options(Options op){ | |
this.options = op; | |
return this; | |
} | |
public String getCurrentURI() { | |
return this.options.getPublicURI(); | |
} | |
public Options getOptions(){ | |
return this.options; | |
} | |
public MaximoConnector debug(boolean isDebug){ | |
debug = isDebug; | |
if(debug){ | |
logger.setLevel(Level.FINE); | |
Handler consoleHandler = new ConsoleHandler(); | |
consoleHandler.setLevel(Level.FINE); | |
logger.addHandler(consoleHandler);; | |
}else{ | |
logger.setLevel(Level.INFO); | |
Handler consoleHandler = new ConsoleHandler(); | |
consoleHandler.setLevel(Level.INFO); | |
logger.addHandler(consoleHandler);; | |
} | |
return this; | |
} | |
public boolean isDebug(){ | |
return debug; | |
} | |
boolean isGET() { | |
return this.httpMethod.equals(HTTP_METHOD_GET); | |
} | |
boolean isPOST() { | |
return this.httpMethod.equals(HTTP_METHOD_POST); | |
} | |
boolean isPATCH() { | |
return this.httpMethod.equals(HTTP_METHOD_PATCH); | |
} | |
boolean isMERGE() { | |
return this.httpMethod.equals(HTTP_METHOD_MERGE); | |
} | |
boolean isDELETE() { | |
return this.httpMethod.equals(HTTP_METHOD_DELETE); | |
} | |
boolean isBULK() { | |
return this.httpMethod.equals(HTTP_METHOD_BULK); | |
} | |
boolean isSYNC() { | |
return this.httpMethod.equals(HTTP_METHOD_SYNC); | |
} | |
boolean isMERGESYNC() { | |
return this.httpMethod.equals(HTTP_METHOD_MERGESYNC); | |
} | |
public boolean isValid(){ | |
return this.valid; | |
} | |
public boolean isLean(){ | |
return this.options.isLean(); | |
} | |
/** | |
* Connect to Maximo Server | |
* | |
* @throws IOException | |
* @throws OslcException | |
*/ | |
public void connect() throws IOException, OslcException { | |
this.connect(null); | |
} | |
/** | |
* Connect to Maximo Server with Proxy | |
* | |
* @throws IOException | |
* @throws OslcException | |
*/ | |
public void connect(Proxy proxy) throws IOException, OslcException { | |
if(isValid()){ | |
throw new OslcException("You are already connected."); | |
} | |
cookies = null; | |
String uri = this.options.getAppURI(); | |
logger.fine(uri); | |
HttpURLConnection con = this.setAuth(uri, proxy); | |
if(!this.options.isFormAuth()){ | |
con = this.setMethod(con, "GET"); | |
} | |
int i = con.getResponseCode(); | |
lastResponseCode = i; | |
if( i == -1 ){ | |
throw new OslcException("Invalid_Request"); | |
} | |
if(i<400){ | |
this.valid = true; | |
cookies = con.getHeaderFields().get("Set-Cookie"); | |
// JsonObject oslcHome = this.get(this.options.getAppURI()); | |
// if(oslcHome!=null){ | |
// this.version(oslcHome); | |
// this.userInfo(oslcHome); | |
// } | |
} | |
if (cookies == null) { | |
InputStream inStream = null; | |
inStream = con.getErrorStream(); | |
if(inStream == null){ | |
inStream = con.getInputStream(); | |
} | |
String str = Util.getStringFromInputStream(inStream); | |
throw new OslcException(str); | |
} | |
} | |
public synchronized JsonObject get(String uri) throws IOException, OslcException { | |
return this.get(uri, null); | |
} | |
public synchronized JsonObject get(String uri, Map<String,Object> headers) throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL | |
.openConnection(); | |
con = this.setMethod(con, "GET"); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
InputStream inStream = null; | |
if (resCode >= 400) { | |
inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
throw new OslcException(obj); | |
} else { | |
inStream = con.getInputStream(); | |
} | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
con.disconnect(); | |
return obj; | |
} | |
/** | |
* | |
* Fetch Group By data | |
* | |
* @param uri | |
* @return JsonArray | |
* @throws IOException | |
* @throws OslcException | |
*/ | |
public synchronized JsonArray groupBy(String uri) throws IOException, OslcException { | |
return this.groupBy(uri, null); | |
} | |
public synchronized JsonArray groupBy(String uri, Map<String,Object> headers) throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL.openConnection(); | |
con = this.setMethod(con, "GET"); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
InputStream inStream = null; | |
if (resCode >= 400) { | |
inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
throw new OslcException(obj); | |
} else { | |
inStream = con.getInputStream(); | |
} | |
JsonReader rdr = Json.createReader(inStream); | |
JsonArray arr = rdr.readArray(); | |
con.disconnect(); | |
return arr; | |
} | |
/** | |
* Load DocumentData | |
* | |
* @throws IOException | |
* @throws OslcException | |
*/ | |
public synchronized byte[] getAttachmentData(String uri) throws IOException, OslcException { | |
return this.getAttachmentData(uri, null); | |
} | |
public synchronized byte[] getAttachmentData(String uri, Map<String,Object> headers) throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
//LOG.isLoggable(Level.info); | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL | |
.openConnection(); | |
con = this.setMethod(con, "GET"); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
InputStream inStream = null; | |
if (resCode >= 400) { | |
inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
throw new OslcException(obj); | |
} else { | |
inStream = con.getInputStream(); | |
} | |
ByteArrayOutputStream bos = new ByteArrayOutputStream(); | |
byte[] buffer = new byte[0xFFFF]; | |
for (int len; (len = inStream.read(buffer)) != -1;) | |
bos.write(buffer, 0, len); | |
bos.flush(); | |
return bos.toByteArray(); | |
} | |
/** | |
* Create new Resource | |
* @param jo | |
* | |
* @throws IOException | |
* @throws OslcException | |
*/ | |
public JsonObject create(String uri,JsonObject jo, String... properties) | |
throws IOException, OslcException { | |
return this.create(uri, jo, null, properties); | |
} | |
public JsonObject create(String uri,JsonObject jo, Map<String,Object> headers, String... properties) | |
throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL | |
.openConnection(); | |
con = this.setMethod(con, "POST", properties); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
OutputStreamWriter writer = new OutputStreamWriter( | |
con.getOutputStream()); | |
writer.write(jo.toString()); | |
writer.flush(); | |
writer.close(); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
InputStream inStream; | |
if (resCode >= 400) { | |
inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
throw new OslcException(obj); | |
} | |
JsonObject obj; | |
if(properties.length == 0){ | |
String href = con.getHeaderField("Location"); | |
if(this.options.isLean()){ | |
obj = Json.createObjectBuilder().add("rdf:resource", href).build(); | |
}else{ | |
obj = Json.createObjectBuilder().add("href", href).build(); | |
} | |
}else{ | |
inStream = con.getInputStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
obj = rdr.readObject(); | |
} | |
return obj; | |
} | |
/** | |
* Create new attachment | |
* @param data | |
* @param name | |
* @param description | |
* @param meta | |
* | |
* @throws IOException | |
* @throws OslcException | |
*/ | |
public JsonObject createAttachment(String uri,byte[] data, String name, | |
String description, String meta) throws IOException, OslcException { | |
return this.createAttachment(uri, data, name, description, meta, null); | |
} | |
public JsonObject createAttachment(String uri,byte[] data, String name, | |
String description, String meta, Map<String, Object> headers) throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL | |
.openConnection(); | |
con = this.setMethod(con, "POST"); | |
con.setRequestProperty("slug", name); | |
con.setRequestProperty("x-document-description", description); | |
con.setRequestProperty("x-document-meta", meta); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
DataOutputStream writer = new DataOutputStream(con.getOutputStream()); | |
if (data.length == 0) { | |
throw new OslcException("data_is_invalid"); | |
} | |
writer.write(data); | |
writer.flush(); | |
writer.close(); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
InputStream inStream; | |
if (resCode >= 400) { | |
inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
throw new OslcException(obj); | |
} | |
JsonObject obj; | |
String href = con.getHeaderField("Location"); | |
if(this.options.isLean()){ | |
obj = Json.createObjectBuilder().add("rdf:resource", href).build(); | |
}else{ | |
obj = Json.createObjectBuilder().add("href", href).build(); | |
} | |
return obj; | |
} | |
/** | |
* Update the Resource | |
* @param jo | |
* @throws IOException | |
* @throws OslcException | |
*/ | |
public synchronized JsonObject update(String uri, JsonObject jo, String... properties) | |
throws IOException, OslcException { | |
return this.update(uri, jo, null, properties); | |
} | |
public synchronized JsonObject update(String uri, JsonObject jo, Map<String,Object> headers, String... properties) | |
throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL | |
.openConnection(); | |
con = this.setMethod(con, "PATCH",properties); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
OutputStreamWriter writer = new OutputStreamWriter( | |
con.getOutputStream()); | |
if (jo.isEmpty()) { | |
throw new OslcException("jo_is_invalid"); | |
} | |
writer.write(jo.toString()); | |
writer.flush(); | |
writer.close(); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
InputStream inStream; | |
if (resCode >= 400) { | |
inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
throw new OslcException(obj); | |
} | |
if(resCode == 204){ | |
return null; | |
} | |
inStream = con.getInputStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
return obj; | |
} | |
public synchronized JsonObject merge(String uri, JsonObject jo, String... properties) | |
throws IOException, OslcException { | |
return this.merge(uri, jo, null, properties); | |
} | |
public synchronized JsonObject merge(String uri, JsonObject jo, Map<String,Object> headers, String... properties) | |
throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL | |
.openConnection(); | |
con = this.setMethod(con, "MERGE",properties); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
OutputStreamWriter writer = new OutputStreamWriter( | |
con.getOutputStream()); | |
if (jo.isEmpty()) { | |
throw new OslcException("jo_is_invalid"); | |
} | |
writer.write(jo.toString()); | |
writer.flush(); | |
writer.close(); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
// String resLine = con.getResponseMessage(); | |
InputStream inStream; | |
if (resCode >= 400) { | |
inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
obj = (JsonObject) obj.get("Error"); | |
throw new OslcException(resCode, obj.get("message").toString()); | |
} | |
if(resCode == 204){ | |
return null; | |
} | |
inStream = con.getInputStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
return obj; | |
} | |
public synchronized JsonArray bulk(String uri, JsonArray ja) | |
throws IOException, OslcException { | |
return this.bulk(uri, ja, null); | |
} | |
public synchronized JsonArray bulk(String uri, JsonArray ja, Map<String,Object> headers) | |
throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL | |
.openConnection(); | |
con = this.setMethod(con, "BULK"); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
OutputStreamWriter writer = new OutputStreamWriter( | |
con.getOutputStream()); | |
if (ja.isEmpty()) { | |
throw new OslcException("jo_is_invalid"); | |
} | |
writer.write(ja.toString()); | |
writer.flush(); | |
writer.close(); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
// String resLine = con.getResponseMessage(); | |
InputStream inStream; | |
if (resCode >= 400) { | |
inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
obj = (JsonObject) obj.get("Error"); | |
throw new OslcException(resCode, obj.get("message").toString()); | |
} | |
if(resCode == 204){ | |
return null; | |
} | |
inStream = con.getInputStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonArray arr = rdr.readArray(); | |
return arr; | |
} | |
public synchronized JsonObject sync(String uri, JsonObject jo, String... properties) | |
throws IOException, OslcException { | |
return this.sync(uri, jo, null, properties); | |
} | |
public synchronized JsonObject sync(String uri, JsonObject jo, Map<String,Object> headers, String... properties) | |
throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL | |
.openConnection(); | |
con = this.setMethod(con, "SYNC",properties); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
OutputStreamWriter writer = new OutputStreamWriter( | |
con.getOutputStream()); | |
if (jo.isEmpty()) { | |
throw new OslcException("jo_is_invalid"); | |
} | |
writer.write(jo.toString()); | |
writer.flush(); | |
writer.close(); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
// String resLine = con.getResponseMessage(); | |
InputStream inStream; | |
if (resCode >= 400) { | |
inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
obj = (JsonObject) obj.get("Error"); | |
throw new OslcException(resCode, obj.get("message").toString()); | |
} | |
if(resCode == 204){ | |
return null; | |
} | |
JsonObject obj; | |
if(properties.length == 0){ | |
String href = con.getHeaderField("Location"); | |
if(this.options.isLean()){ | |
obj = Json.createObjectBuilder().add("rdf:resource", href).build(); | |
}else{ | |
obj = Json.createObjectBuilder().add("href", href).build(); | |
} | |
}else{ | |
inStream = con.getInputStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
obj = rdr.readObject(); | |
} | |
return obj; | |
} | |
public synchronized JsonObject mergeSync(String uri, JsonObject jo, String... properties) | |
throws IOException, OslcException { | |
return this.mergeSync(uri, jo, null, properties); | |
} | |
public synchronized JsonObject mergeSync(String uri, JsonObject jo, Map<String,Object> headers, String... properties) | |
throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL | |
.openConnection(); | |
con = this.setMethod(con, "MERGESYNC",properties); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
OutputStreamWriter writer = new OutputStreamWriter( | |
con.getOutputStream()); | |
if (jo.isEmpty()) { | |
throw new OslcException("jo_is_invalid"); | |
} | |
writer.write(jo.toString()); | |
writer.flush(); | |
writer.close(); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
// String resLine = con.getResponseMessage(); | |
InputStream inStream; | |
if (resCode >= 400) { | |
inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
obj = (JsonObject) obj.get("Error"); | |
throw new OslcException(resCode, obj.get("message").toString()); | |
} | |
if(resCode == 204){ | |
return null; | |
} | |
inStream = con.getInputStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
return obj; | |
} | |
/** | |
* Delete the resource/attachment | |
* @throws IOException | |
* @throws OslcException | |
*/ | |
public void delete(String uri) throws IOException, OslcException { | |
this.delete(uri, null); | |
} | |
public void delete(String uri, Map<String, Object> headers) throws IOException, OslcException { | |
if(!isValid()){ | |
throw new OslcException("The instance of MaximoConnector is not valid."); | |
} | |
String publicHost = this.options.getHost(); | |
if(this.options.getPort()!=-1){ | |
publicHost+= ":" + String.valueOf(this.options.getPort()); | |
} | |
if(!uri.contains(publicHost)){ | |
URL tempURL = new URL(uri); | |
String currentHost = tempURL.getHost(); | |
if(tempURL.getPort()!=-1){ | |
currentHost+= ":" + String.valueOf(tempURL.getPort()); | |
} | |
uri = uri.replace(currentHost, publicHost); | |
} | |
logger.fine(uri); | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = (HttpURLConnection) httpURL | |
.openConnection(); | |
con = this.setMethod(con, "DELETE"); | |
if (headers!=null && !headers.isEmpty() ) { | |
con = this.setHeaders(con, headers); | |
} | |
if (cookies == null) | |
this.connect(); | |
this.setCookiesForSession(con); | |
int resCode = con.getResponseCode(); | |
lastResponseCode = resCode; | |
if (resCode >= 400) { | |
InputStream inStream = con.getErrorStream(); | |
JsonReader rdr = Json.createReader(inStream); | |
JsonObject obj = rdr.readObject(); | |
throw new OslcException(obj); | |
} | |
} | |
public void deleteResource(String uri) throws IOException, OslcException{ | |
logger.fine("Delete the resource by MaximoConnector"); | |
this.delete(uri); | |
} | |
public void deleteAttachment(String uri) throws IOException, OslcException{ | |
logger.fine("Delete the attachment by MaximoConnector"); | |
this.delete(uri); | |
} | |
public static String encode(String userName, String password) | |
throws UnsupportedEncodingException { | |
return (Util.base64Encode((userName | |
+ ":" + password).getBytes("UTF-8"))); | |
} | |
protected HttpURLConnection setAuth(String uri) throws IOException { | |
return this.setAuth(uri, null); | |
} | |
protected HttpURLConnection setAuth(String uri, Proxy proxy) throws IOException { | |
if (this.options.getUser() != null | |
&& this.options.getPassword() != null) { | |
if (options.isBasicAuth()) { | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = null; | |
if(proxy != null){ | |
con = (HttpURLConnection) httpURL.openConnection(proxy); | |
}else{ | |
con = (HttpURLConnection) httpURL.openConnection(); | |
} | |
String encodedUserPwd = encode(this.options.getUser(), | |
this.options.getPassword()); | |
con.setRequestProperty("Authorization", "Basic " | |
+ encodedUserPwd); | |
return con; | |
} else if (options.isMaxAuth()) { | |
URL httpURL = new URL(uri); | |
HttpURLConnection con = null; | |
if(proxy != null){ | |
con = (HttpURLConnection) httpURL.openConnection(proxy); | |
}else{ | |
con = (HttpURLConnection) httpURL.openConnection(); | |
} | |
String encodedUserPwd = encode(this.options.getUser(), | |
this.options.getPassword()); | |
con.setRequestProperty("maxauth", encodedUserPwd); | |
return con; | |
} else if (options.isFormAuth()) { | |
String appURI = uri; | |
// Fix | |
appURI = appURI.replaceFirst("/oslc", ""); | |
// End fix | |
appURI += "/j_security_check"; | |
URL httpURL = new URL(appURI); | |
HttpURLConnection con = null; | |
if(proxy != null){ | |
con = (HttpURLConnection) httpURL.openConnection(proxy); | |
}else{ | |
con = (HttpURLConnection) httpURL.openConnection(); | |
} | |
con.setInstanceFollowRedirects(false); | |
con.setRequestMethod("POST"); | |
con.setRequestProperty("Accept", | |
"text/html,application/xhtml+xml,application/xml"); | |
con.setRequestProperty("Content-Type", | |
"application/x-www-form-urlencoded"); | |
con.setRequestProperty("Connection", "keep-alive"); | |
con.setRequestProperty("x-public-uri", this.options.getPublicURI()); | |
con.setDoOutput(true); | |
StringBuilder content = new StringBuilder(); | |
content.append("j_username=").append(this.options.getUser()); | |
content.append("&j_password=").append( | |
this.options.getPassword()); | |
OutputStream outputStream = con.getOutputStream(); | |
outputStream.write(content.toString().getBytes()); | |
outputStream.close(); | |
return con; | |
} | |
} | |
return null; | |
} | |
protected HttpURLConnection setHeaders(HttpURLConnection con, Map<String, Object> headers) | |
throws IOException, OslcException { | |
Set<Map.Entry<String, Object>> set = headers.entrySet(); | |
for (Map.Entry<String, Object> entry : set) { | |
con.setRequestProperty(entry.getKey(), entry.getValue().toString()); | |
} | |
return con; | |
} | |
protected HttpURLConnection setMethod(HttpURLConnection con, String method, String... properties) | |
throws IOException, OslcException { | |
this.httpMethod = method; | |
if (this.isGET()) { | |
con.setRequestMethod(HTTP_METHOD_GET); | |
con.setRequestProperty("accept", "application/json"); | |
con.setUseCaches(false); | |
con.setAllowUserInteraction(false); | |
con.setRequestProperty("x-public-uri", this.options.getPublicURI()); | |
} else if (this.isPOST()) { | |
con.setRequestMethod(HTTP_METHOD_POST); | |
con.setRequestProperty("Content-Type", "application/json"); | |
con.setDoOutput(true); | |
con.setRequestProperty("x-public-uri", this.options.getPublicURI()); | |
} else if (this.isPATCH()) { | |
con.setRequestMethod(HTTP_METHOD_POST); | |
con.setRequestProperty("Content-Type", "application/json"); | |
con.setDoOutput(true); | |
con.setRequestProperty("x-public-uri", this.options.getPublicURI()); | |
con.setRequestProperty("x-method-override", HTTP_METHOD_PATCH); | |
} else if (this.isMERGE()) { | |
con.setRequestMethod(HTTP_METHOD_POST); | |
con.setRequestProperty("Content-Type", "application/json"); | |
con.setDoOutput(true); | |
con.setRequestProperty("x-public-uri", this.options.getPublicURI()); | |
con.setRequestProperty("x-method-override", HTTP_METHOD_PATCH); | |
con.setRequestProperty("patchtype",HTTP_METHOD_MERGE); | |
} else if (this.isBULK()) { | |
con.setRequestMethod(HTTP_METHOD_POST); | |
con.setRequestProperty("Content-Type", "application/json"); | |
con.setDoOutput(true); | |
con.setRequestProperty("x-public-uri", this.options.getPublicURI()); | |
con.setRequestProperty("x-method-override", HTTP_METHOD_BULK); | |
} else if (this.isSYNC()) { | |
con.setRequestMethod(HTTP_METHOD_POST); | |
con.setRequestProperty("Content-Type", "application/json"); | |
con.setDoOutput(true); | |
con.setRequestProperty("x-public-uri", this.options.getPublicURI()); | |
con.setRequestProperty("x-method-override", HTTP_METHOD_SYNC); | |
} else if (this.isMERGESYNC()) { | |
con.setRequestMethod(HTTP_METHOD_POST); | |
con.setRequestProperty("Content-Type", "application/json"); | |
con.setDoOutput(true); | |
con.setRequestProperty("x-public-uri", this.options.getPublicURI()); | |
con.setRequestProperty("x-method-override", HTTP_METHOD_SYNC); | |
con.setRequestProperty("patchtype",HTTP_METHOD_MERGE); | |
} else if (this.isDELETE()) { | |
con.setRequestMethod(HTTP_METHOD_DELETE); | |
con.setRequestProperty("accept", "application/json"); | |
con.setUseCaches(false); | |
con.setAllowUserInteraction(false); | |
con.setRequestProperty("x-public-uri", this.options.getPublicURI()); | |
} | |
for (String property : properties) { | |
con.setRequestProperty("Properties", property); | |
} | |
return con; | |
} | |
private void setCookiesForSession(HttpURLConnection con) { | |
for (String cookie : cookies) { | |
con.setRequestProperty("Cookie", cookie.split(";", 1)[0]); | |
} | |
} | |
// private MaximoConnector version(JsonObject oslcHome) throws IOException, OslcException{ | |
// JsonObject versionObj = null; | |
// String versionUri = null; | |
// if(oslcHome.containsKey("spi:version")){ | |
// versionObj = oslcHome.getJsonObject("spi:version"); | |
// if(versionObj.containsKey("rdf:resource")){ | |
// versionUri = versionObj.getString("rdf:resource"); | |
// }else if(versionObj.containsKey("href")){ | |
// versionUri = versionObj.getString("href"); | |
// } | |
// }else if(oslcHome.containsKey("version")){ | |
// versionObj = oslcHome.getJsonObject("version"); | |
// if(versionObj.containsKey("href")){ | |
// versionUri = versionObj.getString("href"); | |
// } | |
// } | |
// if(versionUri!=null){ | |
// this.version = this.get(versionUri); | |
// } | |
// return this; | |
// } | |
// | |
// private MaximoConnector userInfo(JsonObject oslcHome) throws IOException, OslcException{ | |
// JsonObject userInfoObj = null; | |
// String userInfoUri = null; | |
// if(oslcHome.containsKey("spi:whoami")){ | |
// userInfoObj = oslcHome.getJsonObject("spi:whoami"); | |
// if(userInfoObj.containsKey("rdf:resource")){ | |
// userInfoUri = userInfoObj.getString("rdf:resource"); | |
// }else if(userInfoObj.containsKey("href")){ | |
// userInfoUri = userInfoObj.getString("href"); | |
// } | |
// }else if(oslcHome.containsKey("whoami")){ | |
// userInfoObj = oslcHome.getJsonObject("whoami"); | |
// if(userInfoObj.containsKey("href")){ | |
// userInfoUri = userInfoObj.getString("href"); | |
// } | |
// } | |
// if(userInfoUri != null){ | |
// this.userInfo = this.get(userInfoUri); | |
// } | |
// return this; | |
// } | |
// | |
// public JsonObject getVersion(){ | |
// return this.version; | |
// } | |
// | |
// public JsonObject getUserInfo(){ | |
// return this.userInfo; | |
// } | |
/** | |
* Get the last response code | |
*/ | |
public int getLastResponseCode() { | |
return lastResponseCode; | |
} | |
/** | |
* Disconnect with Maximo Server | |
* @throws IOException | |
*/ | |
public void disconnect() throws IOException { | |
String logout = this.options.getPublicURI() | |
+ "/logout"; | |
if(this.getOptions().isMultiTenancy()){ | |
logout += "?&_tenantcode=" + this.getOptions().getTenantCode(); | |
} | |
logger.fine(logout); | |
URL httpURL = new URL(logout); | |
// long t1 = System.currentTimeMillis(); | |
HttpURLConnection con = (HttpURLConnection) httpURL.openConnection(); | |
con.setRequestMethod("GET"); | |
this.setCookiesForSession(con); | |
lastResponseCode = con.getResponseCode(); | |
if (lastResponseCode == 401) { | |
logger.fine("Logout"); | |
} | |
this.valid = false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment