blob: 64bc9b1712a59987573d825a5d425176d713d7cf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.framework.manager.servlet;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.osee.framework.core.enums.CoreTranslatorId;
import org.eclipse.osee.framework.core.message.DatastoreInitRequest;
import org.eclipse.osee.framework.core.server.UnsecuredOseeHttpServlet;
import org.eclipse.osee.framework.core.translation.IDataTranslationService;
import org.eclipse.osee.framework.jdk.core.util.Lib;
import org.eclipse.osee.framework.resource.management.IResource;
import org.eclipse.osee.logger.Log;
import org.eclipse.osee.orcs.OrcsAdmin;
import org.eclipse.osee.orcs.OrcsApi;
import org.eclipse.osee.orcs.OrcsMetaData;
/**
* @author Roberto E. Escobar
*/
public class ConfigurationServlet extends UnsecuredOseeHttpServlet {
private static final long serialVersionUID = -5421308349950133041L;
private final IDataTranslationService translationService;
private final OrcsApi orcsApi;
public ConfigurationServlet(Log logger, IDataTranslationService translationService, OrcsApi orcsApi) {
super(logger);
this.translationService = translationService;
this.orcsApi = orcsApi;
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String servletPath = request.getServletPath();
String urlPath = request.getRequestURI().replace(servletPath, "");
if (urlPath.startsWith("/datastore")) {
OrcsAdmin adminOps = orcsApi.getAdminOps(null);
Callable<OrcsMetaData> callable = adminOps.createFetchOrcsMetaData();
try {
OrcsMetaData metaData = callable.call();
StringWriter writer = new StringWriter();
if (urlPath.contains("schema")) {
writeConfigResource(writer, metaData);
} else {
writeDatabaseInfo(writer, metaData);
writeConfigResource(writer, metaData);
}
sendMessage(response, HttpURLConnection.HTTP_OK, writer.toString(), null);
} catch (Exception ex) {
String message = String.format("Error Fetching OrcsInfo: [%s]\n%s", response.toString(), ex.toString());
sendMessage(response, HttpURLConnection.HTTP_INTERNAL_ERROR, message, ex);
}
} else {
String message = String.format("[%s] not found", request.getRequestURI());
sendMessage(response, HttpURLConnection.HTTP_NOT_FOUND, message, null);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
String servletPath = request.getServletPath();
String urlPath = request.getRequestURI().replace(servletPath, "");
if (urlPath.startsWith("/datastore/initialize")) {
OrcsAdmin adminOps = orcsApi.getAdminOps(null);
Map<String, String> parameters = new HashMap<String, String>();
try {
DatastoreInitRequest data =
translationService.convert(request.getInputStream(), CoreTranslatorId.OSEE_DATASTORE_INIT_REQUEST);
parameters.put("schema.table.data.namespace", data.getTableDataSpace());
parameters.put("schema.index.data.namespace", data.getIndexDataSpace());
parameters.put("schema.user.file.specified.schema.names",
Boolean.toString(data.isUseFileSpecifiedSchemas()));
Callable<OrcsMetaData> callable = adminOps.createDatastore(parameters);
OrcsMetaData metaData = callable.call();
StringWriter writer = new StringWriter();
writeDatabaseInfo(writer, metaData);
writeConfigResource(writer, metaData);
sendMessage(response, HttpURLConnection.HTTP_ACCEPTED, writer.toString(), null);
} catch (Exception ex) {
String message = String.format("Datastore Initialization: [%s]\n%s", response.toString(), ex.toString());
sendMessage(response, HttpURLConnection.HTTP_INTERNAL_ERROR, message, ex);
}
} else {
String message = String.format("[%s] not found", request.getRequestURI());
sendMessage(response, HttpURLConnection.HTTP_NOT_FOUND, message, null);
}
}
private void writeDatabaseInfo(Writer writer, OrcsMetaData metaData) {
Map<String, String> data = metaData.getProperties();
List<String> keys = new ArrayList<String>(data.keySet());
Collections.sort(keys);
try {
writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
writer.write("<datastore>\n");
writer.write("\t<config>\n");
for (String key : keys) {
writer.write(String.format("\t\t<%s>%s</s>\n", key, data.get(key), key));
}
writer.write("\t</config>\n");
writer.write("</datastore>\n");
} catch (Exception ex) {
getLogger().error(ex, "Error transferring data store config properties");
}
}
private void writeConfigResource(Writer writer, OrcsMetaData metaData) {
for (IResource resource : metaData.getConfigurationResources()) {
InputStream inputStream = null;
try {
inputStream = new BufferedInputStream(resource.getContent());
writer.write(Lib.inputStreamToString(inputStream));
} catch (Exception ex) {
getLogger().error(ex, "Error transferring data store config resource");
} finally {
Lib.close(inputStream);
}
}
}
private void sendMessage(HttpServletResponse response, int status, String message, Throwable ex) throws IOException {
response.setStatus(status);
response.setContentType("text/plain");
response.getWriter().write(message);
if (ex != null) {
response.getWriter().write(Lib.exceptionToString(ex));
}
response.getWriter().flush();
response.getWriter().close();
}
}