package org.cagrid.gaards.credentials;
import java.io.File;
import java.io.StringReader;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.commons.io.FileUtils;
import org.cagrid.core.common.JAXBUtils;
import org.cagrid.gaards.pki.CertUtil;
import org.cagrid.gaards.pki.KeyUtil;
import org.globus.gsi.GlobusCredential;
public class EncodingUtil {
public static final String CLIENT_WSDD = "client-config.wsdd";
public static final QName X509_CREDENTIAL = new QName(
"http://gaards.cagrid.org/credentials", "X509CredentialDescriptor");
public static final QName DORIAN_USER_CREDENTIAL = new QName(
"http://gaards.cagrid.org/credentials",
"DorianUserCredentialDescriptor");
public static void serialize(File f, X509CredentialDescriptor des)
throws Exception {
String str = serialize(des);
FileUtils.writeStringToFile(f, str);
}
public static String serialize(X509CredentialDescriptor des)
throws Exception {
if (des instanceof DorianUserCredentialDescriptor) {
return serialize(DORIAN_USER_CREDENTIAL, des);
} else {
return serialize(X509_CREDENTIAL, des);
}
}
public static X509CredentialDescriptor deserialize(File f) throws Exception {
String str = FileUtils.readFileToString(f);
return deserialize(str);
}
public static X509CredentialDescriptor encode(GlobusCredential cred)
throws Exception {
return encode(cred, new X509CredentialDescriptor());
}
public static X509CredentialDescriptor encode(GlobusCredential cred,
X509CredentialDescriptor des) throws Exception {
des.setIdentity(cred.getIdentity());
EncodedCertificates list = new EncodedCertificates();
X509Certificate[] chain = cred.getCertificateChain();
if (chain != null) {
List<String> certs = new ArrayList<String>(chain.length);
for (int i = 0; i < chain.length; i++) {
certs.add(CertUtil.writeCertificate(chain[i]));
}
list.getEncodedCertificate().addAll(certs);
}
des.setEncodedCertificates(list);
des.setEncodedKey(KeyUtil.writePrivateKey(cred.getPrivateKey(),
(String) null));
return des;
}
public static X509CredentialDescriptor deserialize(String s)
throws Exception {
if (s.indexOf(DORIAN_USER_CREDENTIAL.getLocalPart()) != -1) {
return JAXBUtils.unmarshal(DorianUserCredentialDescriptor.class,
new StringReader(s));
} else {
return JAXBUtils.unmarshal(X509CredentialDescriptor.class,
new StringReader(s));
}
}
public static String serialize(QName ns, Object o) throws Exception {
return JAXBUtils.marshal(o);
}
public static <T> T deserialize(String s, Class<T> c) throws Exception {
return JAXBUtils.unmarshal(c, new StringReader(s));
}
}