/*
* Copyright 2011 JBoss Inc
*
* 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 org.jbpm.formbuilder.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.DeleteMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.PutMethod;
import org.apache.commons.io.IOUtils;
import org.jbpm.formbuilder.server.xml.AssetDTO;
import org.jbpm.formbuilder.server.xml.PackageDTO;
import org.jbpm.formbuilder.server.xml.PackageListDTO;
public class GuvnorHelper {
public static final String ENCODING = "UTF-8";
private final String baseUrl;
private final String user;
private final String password;
private final String domainName;
private final int portNumber;
public GuvnorHelper(String baseUrl, String user, String password) {
this.baseUrl = baseUrl;
this.user = user;
this.password = password;
int beginIndex = this.baseUrl.indexOf("://") + 3;
int endIndex = this.baseUrl.indexOf("/", beginIndex);
if (endIndex < 0) {
endIndex = this.baseUrl.length();
}
String aux = this.baseUrl.substring(beginIndex, endIndex);
if (aux.contains(":")) {
String[] parts = aux.split(":");
this.domainName = parts[0];
this.portNumber = Integer.valueOf(parts[1]);
} else {
this.domainName = aux;
this.portNumber = 80;
}
}
private HttpClient client = null;
public void setClient(HttpClient client) {
this.client = client;
}
public HttpClient getHttpClient() {
if (client == null) {
return new HttpClient();
}
return client;
}
public GetMethod createGetMethod(String url) {
return new GetMethod(url);
}
public DeleteMethod createDeleteMethod(String url) {
return new DeleteMethod(url);
}
public PutMethod createPutMethod(String url) {
return new PutMethod(url);
}
public PostMethod createPostMethod(String url) {
return new PostMethod(url);
}
public String getPackageNameByContentUUID(String uuid) throws JAXBException, IOException {
HttpClient client = getHttpClient();
GetMethod call = createGetMethod(getRestBaseUrl());
try {
setAuth(client, call);
call.addRequestHeader("Accept", "application/xml");
client.executeMethod(call);
PackageListDTO dto = jaxbTransformation(PackageListDTO.class, call.getResponseBodyAsStream(), PackageListDTO.RELATED_CLASSES);
for (PackageDTO pkg : dto.getPackage()) {
if (uuid.equals(pkg.getMetadata().getUuid())) {
return pkg.getTitle();
}
}
for (PackageDTO pkg : dto.getPackage()) {
for (String url : pkg.getAssets()) {
GetMethod subCall = createGetMethod(url);
try {
subCall.setRequestHeader("Accept", "application/xml");
client.executeMethod(subCall);
AssetDTO subDto = jaxbTransformation(AssetDTO.class, subCall.getResponseBodyAsStream(), AssetDTO.RELATED_CLASSES);
if (subDto.getMetadata().getUuid().equals(uuid)) {
return pkg.getTitle();
}
} finally {
subCall.releaseConnection();
}
}
}
} finally {
call.releaseConnection();
}
return null;
}
@SuppressWarnings("unchecked")
public <T> T jaxbTransformation(Class<T> retType, InputStream input, Class<?>... boundTypes) throws JAXBException, IOException {
String content = IOUtils.toString(input);
StringReader reader = new StringReader(content);
JAXBContext ctx = JAXBContext.newInstance(boundTypes);
Unmarshaller unmarshaller = ctx.createUnmarshaller();
Object obj = unmarshaller.unmarshal(reader);
return (T) obj;
}
public String jaxbSerializing(Object obj, Class<?>... boundTypes) throws JAXBException {
JAXBContext ctx = JAXBContext.newInstance(boundTypes);
Marshaller marshaller = ctx.createMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
return writer.toString();
}
public void setAuth(HttpClient client, HttpMethod method) {
if (notEmpty(this.user) && notEmpty(this.password)) {
client.getParams().setAuthenticationPreemptive(true);
UsernamePasswordCredentials defaultcreds =
new UsernamePasswordCredentials(this.user, this.password);
AuthScope authScope = new AuthScope(this.domainName, this.portNumber, AuthScope.ANY_REALM);
client.getState().setCredentials(authScope, defaultcreds);
}
}
private boolean notEmpty(String s) {
return s != null && !"".equals(s);
}
public String getApiSearchUrl(String pkgName) throws UnsupportedEncodingException {
return new StringBuilder(this.baseUrl).
append("/org.drools.guvnor.Guvnor/api/packages/").
append(URLEncoder.encode(pkgName, ENCODING)).append("/").toString();
}
public String getRestBaseUrl() {
return new StringBuilder(this.baseUrl).append("/rest/packages/").toString();
}
public String getUser() {
return this.user;
}
}