package org.teiid.designer.runtime;
import static org.teiid.designer.runtime.DqpPlugin.PLUGIN_ID;
import static org.teiid.designer.runtime.DqpPlugin.Util;
import java.io.FileOutputStream;
import java.util.Collection;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.teiid.core.designer.util.Base64;
import org.teiid.core.designer.util.StringUtilities;
import org.teiid.designer.runtime.spi.ITeiidJdbcInfo;
import org.teiid.designer.runtime.spi.ITeiidServer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class TeiidServerRegistryWriter implements TeiidServerRegistryConstants {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder;
Document doc;
Element root;
TeiidServerManager teiidServerManager;
// Default server needs to get passed in because getDefaultServer() does a state check and when storeServers() is called
// The state will not be STARTED
ITeiidServer defaultServer;
boolean doDebug;
public TeiidServerRegistryWriter(
TeiidServerManager teiidServerManager,
ITeiidServer defaultServer,
boolean doDebug) {
super();
this.teiidServerManager = teiidServerManager;
this.defaultServer = defaultServer;
this.doDebug = doDebug;
}
public void storeServers(Collection<ITeiidServer> teiidServers ) throws TransformerFactoryConfigurationError {
try {
docBuilder = factory.newDocumentBuilder();
doc = docBuilder.newDocument();
// create root element
root = doc.createElement(SERVERS_TAG);
doc.appendChild(root);
Collection<ITeiidServer> servers = teiidServers;
for (ITeiidServer teiidServer : servers) {
storeServer(teiidServer);
}
DOMSource source = new DOMSource(doc);
StreamResult resultXML = new StreamResult(new FileOutputStream(teiidServerManager.getStateFileName()));
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); //$NON-NLS-1$ //$NON-NLS-2$
transformer.transform(source, resultXML);
} catch (Exception e) {
IStatus status = new Status(IStatus.ERROR, PLUGIN_ID,
Util.getString("errorSavingServerRegistry", teiidServerManager.getStateFileName())); //$NON-NLS-1$
Util.log(status);
}
}
private void storeServer(ITeiidServer teiidServer) throws Exception {
Element serverElement = doc.createElement(SERVER_TAG);
root.appendChild(serverElement);
if( doDebug ) System.out.println( " >>> SAVING SERVER INFO");
{ // Server Version
setAttribute(serverElement, SERVER_VERSION, teiidServer.getServerVersion().toString());
}
{ // Host
setAttribute(serverElement, HOST_ATTR, teiidServer.getHost());
}
{ // Parent Server Id
setAttribute(serverElement, PARENT_SERVER_ID, teiidServer.getParent().getId());
}
{ // CUSTOM LABEL
if (!StringUtilities.isEmpty(teiidServer.getCustomLabel())) {
setAttribute(serverElement, CUSTOM_LABEL_ATTR, teiidServer.getCustomLabel());
}
}
storeTeiidAdminInfo(teiidServer, serverElement);
storeTeiidJdbcInfo(teiidServer, serverElement);
if ((defaultServer != null) && (defaultServer.equals(teiidServer))) {
serverElement.setAttribute(DEFAULT_ATTR, Boolean.toString(true));
}
}
private void storeTeiidAdminInfo(ITeiidServer teiidServer, Element serverElement) throws Exception {
Element adminElement = doc.createElement(ADMIN_TAG);
serverElement.appendChild(adminElement);
if( doDebug ) System.out.println( " ADMIN INFO");
setAttribute(adminElement, PORT_ATTR, teiidServer.getTeiidAdminInfo().getPort());
setAttribute(adminElement, USER_ATTR, teiidServer.getTeiidAdminInfo().getUsername());
/* The token of the password is saved to file while the password is saved in the eclipse secure storage
* Saving the token ensures that its possible to find the password again.
*/
String passToken = teiidServer.getTeiidAdminInfo().getPassToken();
if (passToken != null) {
setAttribute(adminElement, PASSWORD_ATTR, Base64.encodeBytes(passToken.getBytes("UTF-8"))); //$NON-NLS-1$
}
setAttribute(adminElement, SECURE_ATTR, Boolean.toString(teiidServer.getTeiidAdminInfo().isSecure()));
}
private void storeTeiidJdbcInfo(ITeiidServer teiidServer, Element serverElement) throws Exception {
Element jdbcElement = doc.createElement(JDBC_TAG);
serverElement.appendChild(jdbcElement);
if( doDebug ) System.out.println( " JDBC INFO");
// Check if actual port is cached, else set to default
String actualPort = teiidServerManager.getJdbcPortManager().getPort(teiidServer, false);
if( actualPort == null ) {
actualPort = ITeiidJdbcInfo.DEFAULT_PORT;
}
setAttribute(jdbcElement, JDBC_PORT_ATTR, actualPort);
// check for port override
String overridePort = teiidServerManager.getJdbcPortManager().getPort(teiidServer, true);
if( overridePort != null ) {
setAttribute(jdbcElement, JDBC_PORT_OVERRIDE_ATTR, overridePort);
}
setAttribute(jdbcElement, JDBC_USER_ATTR, teiidServer.getTeiidJdbcInfo().getUsername());
/* The token of the password is saved to file while the password is saved in the eclipse secure storage
* Saving the token ensures that its possible to find the password again.
*/
String passToken = teiidServer.getTeiidJdbcInfo().getPassToken();
if (passToken != null)
setAttribute(jdbcElement, JDBC_PASSWORD_ATTR, Base64.encodeBytes(passToken.getBytes("UTF-8"))); //$NON-NLS-1$
setAttribute(jdbcElement, JDBC_SECURE_ATTR, Boolean.toString(teiidServer.getTeiidJdbcInfo().isSecure()));
}
private void setAttribute(Element element, String key, String value) {
element.setAttribute(key, value);
if( doDebug) System.out.println(" Set Server Attribute = " + key + " value = " + value);
}
}