use of org.codice.ddf.platform.util.TemporaryFileBackedOutputStream in project ddf by codice.
the class OpenSearchSource method query.
@Override
public SourceResponse query(QueryRequest queryRequest) throws UnsupportedQueryException {
String methodName = "query";
LOGGER.trace(methodName);
Serializable metacardId = queryRequest.getPropertyValue(Metacard.ID);
SourceResponseImpl response = null;
Subject subject = null;
WebClient restWebClient = null;
if (queryRequest.hasProperties()) {
Object subjectObj = queryRequest.getProperties().get(SecurityConstants.SECURITY_SUBJECT);
subject = (Subject) subjectObj;
}
restWebClient = factory.getWebClientForSubject(subject);
Query query = queryRequest.getQuery();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Received query: " + query);
}
boolean canDoOpenSearch = setOpenSearchParameters(query, subject, restWebClient);
if (canDoOpenSearch) {
InputStream responseStream = performRequest(restWebClient);
response = new SourceResponseImpl(queryRequest, new ArrayList<Result>());
if (responseStream != null) {
response = processResponse(responseStream, queryRequest);
}
} else {
if (StringUtils.isEmpty((String) metacardId)) {
OpenSearchFilterVisitor visitor = new OpenSearchFilterVisitor();
query.accept(visitor, null);
metacardId = visitor.getMetacardId();
}
restWebClient = newRestClient(query, (String) metacardId, false, subject);
if (restWebClient != null) {
InputStream responseStream = performRequest(restWebClient);
Metacard metacard = null;
List<Result> resultQueue = new ArrayList<Result>();
try (TemporaryFileBackedOutputStream fileBackedOutputStream = new TemporaryFileBackedOutputStream()) {
if (responseStream != null) {
IOUtils.copyLarge(responseStream, fileBackedOutputStream);
InputTransformer inputTransformer = null;
try (InputStream inputStream = fileBackedOutputStream.asByteSource().openStream()) {
inputTransformer = getInputTransformer(inputStream);
} catch (IOException e) {
LOGGER.debug("Problem with transformation.", e);
}
if (inputTransformer != null) {
try (InputStream inputStream = fileBackedOutputStream.asByteSource().openStream()) {
metacard = inputTransformer.transform(inputStream);
} catch (IOException e) {
LOGGER.debug("Problem with transformation.", e);
}
}
}
} catch (IOException | CatalogTransformerException e) {
LOGGER.debug("Problem with transformation.", e);
}
if (metacard != null) {
metacard.setSourceId(getId());
ResultImpl result = new ResultImpl(metacard);
resultQueue.add(result);
response = new SourceResponseImpl(queryRequest, resultQueue);
response.setHits(resultQueue.size());
}
}
}
LOGGER.trace(methodName);
return response;
}
use of org.codice.ddf.platform.util.TemporaryFileBackedOutputStream in project ddf by codice.
the class FtpRequestHandler method onRenameStart.
@Override
public FtpletResult onRenameStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
FtpFile fromFtpFile = session.getRenameFrom();
String toFilename = request.getArgument();
if (isDotFile(fromFtpFile.getName())) {
Optional<TemporaryFileBackedOutputStream> tfbosOpt = findTempFileInSession(session, fromFtpFile.getAbsolutePath());
if (!tfbosOpt.isPresent()) {
session.write(new DefaultFtpReply(FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS, "file not found: " + fromFtpFile.getAbsolutePath()));
return FtpletResult.SKIP;
}
try (TemporaryFileBackedOutputStream tfbos = tfbosOpt.get()) {
Subject shiroSubject = (Subject) session.getAttribute(SUBJECT);
if (shiroSubject == null) {
return FtpletResult.DISCONNECT;
}
CreateStorageRequest createRequest = getCreateStorageRequest(toFilename, tfbos);
storeObject(shiroSubject, toFilename, createRequest);
} finally {
removeTempFileFromSession(session, fromFtpFile.getAbsolutePath());
}
}
session.write(new DefaultFtpReply(FtpReply.REPLY_250_REQUESTED_FILE_ACTION_OKAY, "RNTO successful"));
return FtpletResult.SKIP;
}
use of org.codice.ddf.platform.util.TemporaryFileBackedOutputStream in project ddf by codice.
the class FtpRequestHandler method store.
private FtpletResult store(FtpSession session, FtpRequest request, boolean isStoreUnique) throws FtpException, IOException {
LOGGER.debug("Beginning FTP ingest of {}", request.getArgument());
Subject shiroSubject = (Subject) session.getAttribute(SUBJECT);
if (shiroSubject == null) {
return FtpletResult.DISCONNECT;
}
FtpFile ftpFile = null;
String fileName = request.getArgument();
try {
ftpFile = session.getFileSystemView().getFile(fileName);
} catch (FtpException e) {
LOGGER.debug("Failed to retrieve file from FTP session");
}
String requestTypeString = isStoreUnique ? STOU_REQUEST : STOR_REQUEST;
if (ftpFile == null) {
LOGGER.debug("Sending FTP status code 501 to client - syntax errors in request parameters");
session.write(new DefaultFtpReply(FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS, requestTypeString));
throw new FtpException("File to be transferred from client did not exist");
}
DataConnectionFactory connFactory = session.getDataConnection();
if (connFactory instanceof IODataConnectionFactory) {
InetAddress address = ((IODataConnectionFactory) connFactory).getInetAddress();
if (address == null) {
session.write(new DefaultFtpReply(FtpReply.REPLY_503_BAD_SEQUENCE_OF_COMMANDS, "PORT or PASV must be issued first"));
LOGGER.debug("Sending FTP status code 503 to client - PORT or PASV must be issued before STOR");
throw new FtpException("FTP client address was null");
}
}
if (!ftpFile.isWritable()) {
session.write(new DefaultFtpReply(FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN, "Insufficient permissions"));
LOGGER.debug("Sending FTP status code 550 to client - insufficient permissions to write file.");
throw new FtpException("Insufficient permissions to write file");
}
session.write(new DefaultFtpReply(FtpReply.REPLY_150_FILE_STATUS_OKAY, requestTypeString + " " + fileName));
LOGGER.debug("Replying to client with code 150 - file status okay");
if (isDotFile(request.getArgument())) {
DataConnection dataConnection;
try {
dataConnection = connFactory.openConnection();
} catch (Exception e) {
throw new IOException("Error getting the output stream from FTP session", e);
}
dataConnection.transferFromClient(session, addTempFileToSession(session, ftpFile.getAbsolutePath(), new TemporaryFileBackedOutputStream()));
if (isStoreUnique) {
session.write(new DefaultFtpReply(FtpReply.REPLY_125_DATA_CONNECTION_ALREADY_OPEN, "Storing data with unique name: " + fileName));
}
session.write(new DefaultFtpReply(FtpReply.REPLY_226_CLOSING_DATA_CONNECTION, "Closing data connection"));
LOGGER.debug("Sending FTP status code 226 to client - closing data connection");
} else {
try (TemporaryFileBackedOutputStream outputStream = new TemporaryFileBackedOutputStream()) {
DataConnection dataConnection = connFactory.openConnection();
dataConnection.transferFromClient(session, outputStream);
CreateStorageRequest createRequest = getCreateStorageRequest(fileName, outputStream);
List<Metacard> storedMetacards = storeObject(shiroSubject, fileName, createRequest);
if (isStoreUnique && !storedMetacards.isEmpty()) {
String ids = storedMetacards.stream().map(Metacard::getId).collect(Collectors.joining(","));
session.write(new DefaultFtpReply(FtpReply.REPLY_125_DATA_CONNECTION_ALREADY_OPEN, "Storing data with unique name: " + ids));
}
session.write(new DefaultFtpReply(FtpReply.REPLY_226_CLOSING_DATA_CONNECTION, "Closing data connection"));
LOGGER.debug("Sending FTP status code 226 to client - closing data connection");
} catch (FtpException fe) {
throw new FtpException("Failure to create metacard for file " + fileName, fe);
} catch (Exception e) {
throw new IOException("Error getting the output stream from FTP session", e);
} finally {
session.getDataConnection().closeDataConnection();
}
}
return FtpletResult.SKIP;
}
use of org.codice.ddf.platform.util.TemporaryFileBackedOutputStream in project ddf by codice.
the class RegistryTransformer method transform.
@Override
public Metacard transform(InputStream inputStream, String id) throws IOException, CatalogTransformerException {
MetacardImpl metacard;
try (TemporaryFileBackedOutputStream fileBackedOutputStream = new TemporaryFileBackedOutputStream()) {
try {
IOUtils.copy(inputStream, fileBackedOutputStream);
} catch (IOException e) {
throw new CatalogTransformerException("Unable to transform from CSW RIM Service Record to Metacard. Error reading input stream.", e);
} finally {
IOUtils.closeQuietly(inputStream);
}
try (InputStream inputStreamCopy = fileBackedOutputStream.asByteSource().openStream()) {
metacard = (MetacardImpl) unmarshal(inputStreamCopy);
} catch (ParserException e) {
throw new CatalogTransformerException("Unable to transform from CSW RIM Service Record to Metacard. Parser exception caught", e);
} catch (RegistryConversionException e) {
throw new CatalogTransformerException("Unable to transform from CSW RIM Service Record to Metacard. Conversion exception caught", e);
}
if (metacard == null) {
throw new CatalogTransformerException("Unable to transform from CSW RIM Service Record to Metacard.");
} else if (StringUtils.isNotEmpty(id)) {
metacard.setAttribute(Metacard.ID, id);
}
String xml;
try (Reader reader = fileBackedOutputStream.asByteSource().asCharSource(Charsets.UTF_8).openStream()) {
xml = CharStreams.toString(reader);
}
metacard.setAttribute(Metacard.METADATA, xml);
metacard.setTags(Collections.singleton(RegistryConstants.REGISTRY_TAG));
} catch (IOException e) {
throw new CatalogTransformerException("Unable to transform from CSW RIM Service Record to Metacard. Error using file-backed stream.", e);
}
return metacard;
}
use of org.codice.ddf.platform.util.TemporaryFileBackedOutputStream in project ddf by codice.
the class RESTEndpoint method generateMetacard.
private Metacard generateMetacard(MimeType mimeType, String id, InputStream message, String transformerId) throws MetacardCreationException {
Metacard generatedMetacard = null;
List<InputTransformer> listOfCandidates = mimeTypeToTransformerMapper.findMatches(InputTransformer.class, mimeType);
List<String> stackTraceList = new ArrayList<>();
LOGGER.trace("Entering generateMetacard.");
LOGGER.debug("List of matches for mimeType [{}]: {}", mimeType, listOfCandidates);
try (TemporaryFileBackedOutputStream fileBackedOutputStream = new TemporaryFileBackedOutputStream()) {
try {
if (null != message) {
IOUtils.copy(message, fileBackedOutputStream);
} else {
throw new MetacardCreationException("Could not copy bytes of content message. Message was NULL.");
}
} catch (IOException e) {
throw new MetacardCreationException("Could not copy bytes of content message.", e);
}
Iterator<InputTransformer> it = listOfCandidates.iterator();
if (StringUtils.isNotEmpty(transformerId)) {
BundleContext bundleContext = getBundleContext();
Collection<ServiceReference<InputTransformer>> serviceReferences = bundleContext.getServiceReferences(InputTransformer.class, "(id=" + transformerId + ")");
it = serviceReferences.stream().map(bundleContext::getService).iterator();
}
while (it.hasNext()) {
InputTransformer transformer = it.next();
try (InputStream inputStreamMessageCopy = fileBackedOutputStream.asByteSource().openStream()) {
generatedMetacard = transformer.transform(inputStreamMessageCopy);
} catch (CatalogTransformerException | IOException e) {
List<String> stackTraces = Arrays.asList(ExceptionUtils.getRootCauseStackTrace(e));
stackTraceList.add(String.format("Transformer [%s] could not create metacard.", transformer));
stackTraceList.addAll(stackTraces);
LOGGER.debug("Transformer [{}] could not create metacard.", transformer, e);
}
if (generatedMetacard != null) {
break;
}
}
if (generatedMetacard == null) {
throw new MetacardCreationException(String.format("Could not create metacard with mimeType %s : %s", mimeType, StringUtils.join(stackTraceList, "\n")));
}
if (id != null) {
generatedMetacard.setAttribute(new AttributeImpl(Metacard.ID, id));
} else {
LOGGER.debug("Metacard had a null id");
}
} catch (IOException e) {
throw new MetacardCreationException("Could not create metacard.", e);
} catch (InvalidSyntaxException e) {
throw new MetacardCreationException("Could not determine transformer", e);
}
return generatedMetacard;
}
Aggregations