3
* ====================================================================
4
* Licensed to the Apache Software Foundation (ASF) under one
5
* or more contributor license agreements. See the NOTICE file
6
* distributed with this work for additional information
7
* regarding copyright ownership. The ASF licenses this file
8
* to you under the Apache License, Version 2.0 (the
9
* "License"); you may not use this file except in compliance
10
* with the License. You may obtain a copy of the License at
12
* http://www.apache.org/licenses/LICENSE-2.0
14
* Unless required by applicable law or agreed to in writing,
15
* software distributed under the License is distributed on an
16
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17
* KIND, either express or implied. See the License for the
18
* specific language governing permissions and limitations
20
* ====================================================================
23
* @file org_apache_subversion_javahl_util_SubstLib.cpp
24
* @brief Implementation of the native methods in the Java class SubstLib
29
#include "../include/org_apache_subversion_javahl_util_SubstLib.h"
31
#include "jniwrapper/jni_stack.hpp"
32
#include "jniwrapper/jni_array.hpp"
33
#include "jniwrapper/jni_string.hpp"
34
#include "jniwrapper/jni_string_map.hpp"
35
#include "jniwrapper/jni_io_stream.hpp"
38
#include "NativeStream.hpp"
39
#include "Utility.hpp"
43
#include "svn_subst.h"
45
#include "svn_private_config.h"
50
build_keywords_common(Java::Env env, const SVN::Pool& pool,
51
jbyteArray jkeywords_value, jlong jrevision,
52
jstring jurl, jstring jrepos_root_url,
53
jobject jdate, jstring jauthor)
55
const Java::ByteArray keywords_value(env, jkeywords_value);
56
const Java::String url(env, jurl);
57
const Java::String repos_root_url(env, jrepos_root_url);
58
const Java::String author(env, jauthor);
60
const Java::ByteArray::Contents keywords_contents(keywords_value);
61
svn_string_t* keywords_string = keywords_contents.get_string(pool);
62
const char* revision = (jrevision < 0 ? NULL
63
: apr_psprintf(pool.getPool(),
65
apr_uint64_t(jrevision)));
66
const Java::String::Contents url_contents(url);
67
const Java::String::Contents root_url_contents(repos_root_url);
68
const Java::String::Contents author_contents(author);
70
apr_hash_t* kw = NULL;
72
svn_subst_build_keywords3(
74
keywords_string->data,
77
root_url_contents.c_str(),
78
(jdate ? JNIUtil::getDate(jdate) : 0),
79
author_contents.c_str(),
85
translate_stream_common(Java::Env env, const SVN::Pool& pool,
87
jbyteArray jeol_marker, jboolean jrepair_eol,
88
jobject jkeywords, jboolean juse_keywords,
89
jboolean jexpand_keywords,
90
jbyteArray jkeywords_value, jlong jrevision,
91
jstring jurl, jstring jrepos_root_url,
92
jobject jdate, jstring jauthor)
94
apr_hash_t* const keywords =
96
? JavaHL::Util::make_keyword_hash(env, jkeywords, pool)
97
: build_keywords_common(
98
env, pool, jkeywords_value, jrevision,
99
jurl, jrepos_root_url, jdate, jauthor));
101
const Java::ByteArray eol_marker(env, jeol_marker);
102
svn_string_t* const eol_str =
103
Java::ByteArray::Contents(eol_marker).get_string(pool);
104
return svn_subst_stream_translated(stream,
106
svn_boolean_t(jrepair_eol),
108
svn_boolean_t(jexpand_keywords),
111
} // anoymous namespace
114
JNIEXPORT jobject JNICALL
115
Java_org_apache_subversion_javahl_util_SubstLib_buildKeywords(
116
JNIEnv* jenv, jobject jthis,
117
jbyteArray jkeywords_value, jlong jrevision,
118
jstring jurl, jstring jrepos_root_url,
119
jobject jdate, jstring jauthor)
121
typedef Java::Map<Java::ByteArray, jbyteArray> ByteArrayMap;
123
SVN_JAVAHL_JNI_TRY(SubstLib, buildKeywords)
125
const Java::Env env(jenv);
127
// Using a "global" request pool since we don't keep a context with
128
// its own pool around for these functions.
131
apr_hash_t* const kw = build_keywords_common(
132
env, pool, jkeywords_value, jrevision,
133
jurl, jrepos_root_url, jdate, jauthor);
135
ByteArrayMap keywords(env, jint(apr_hash_count(kw)));
136
for (apr_hash_index_t* hi = apr_hash_first(pool.getPool(), kw);
137
hi; hi = apr_hash_next(hi))
141
apr_hash_this(hi, &rkey, NULL, &rval);
143
svn_string_t* const val = static_cast<svn_string_t*>(rval);
144
keywords.put(static_cast<const char*>(rkey),
145
Java::ByteArray(env, val->data, jsize(val->len)));
147
return keywords.get();
149
SVN_JAVAHL_JNI_CATCH;
154
JNIEXPORT jobject JNICALL
155
Java_org_apache_subversion_javahl_util_SubstLib_translateInputStream(
156
JNIEnv* jenv, jobject jthis,
157
jobject jsource, jbyteArray jeol_marker, jboolean jrepair_eol,
158
jobject jkeywords, jboolean juse_keywords, jboolean jexpand_keywords,
159
jbyteArray jkeywords_value, jlong jrevision,
160
jstring jurl, jstring jrepos_root_url,
161
jobject jdate, jstring jauthor)
163
SVN_JAVAHL_JNI_TRY(SubstLib, translateInputStream)
165
const Java::Env env(jenv);
167
// We'll allocate the stream in the bound object's pool.
168
std::auto_ptr<JavaHL::NativeInputStream>
169
translated(new JavaHL::NativeInputStream());
170
svn_stream_t* source = Java::InputStream::get_global_stream(
171
env, jsource, translated->get_pool());
173
translated->set_stream(translate_stream_common(
174
env, translated->get_pool(), source,
175
jeol_marker, jrepair_eol,
176
jkeywords, juse_keywords, jexpand_keywords,
177
jkeywords_value, jrevision,
178
jurl, jrepos_root_url, jdate, jauthor));
179
const jobject jtranslated = translated->create_java_wrapper();
180
translated.release();
183
SVN_JAVAHL_JNI_CATCH;
188
JNIEXPORT jobject JNICALL
189
Java_org_apache_subversion_javahl_util_SubstLib_translateOutputStream(
190
JNIEnv* jenv, jobject jthis,
191
jobject jdestination, jbyteArray jeol_marker, jboolean jrepair_eol,
192
jobject jkeywords, jboolean juse_keywords, jboolean jexpand_keywords,
193
jbyteArray jkeywords_value, jlong jrevision,
194
jstring jurl, jstring jrepos_root_url,
195
jobject jdate, jstring jauthor)
197
SVN_JAVAHL_JNI_TRY(SubstLib, translateInputStream)
199
const Java::Env env(jenv);
201
// We'll allocate the stream in the bound object's pool.
202
std::auto_ptr<JavaHL::NativeOutputStream>
203
translated(new JavaHL::NativeOutputStream());
204
svn_stream_t* destination = Java::OutputStream::get_global_stream(
205
env, jdestination, translated->get_pool());
207
translated->set_stream(translate_stream_common(
208
env, translated->get_pool(), destination,
209
jeol_marker, jrepair_eol,
210
jkeywords, juse_keywords, jexpand_keywords,
211
jkeywords_value, jrevision,
212
jurl, jrepos_root_url, jdate, jauthor));
213
const jobject jtranslated = translated->create_java_wrapper();
214
translated.release();
217
SVN_JAVAHL_JNI_CATCH;