Refactor default abs sender (#272)

* refactor-default-abs-sender: move all returns to `try` scope

- it makes clear that return would not happen if some exception has been thrown

* refactor-default-abs-sender: extract `sendHttpPostRequest` method

* refactor-default-abs-sender: inline usage of `sendHttpPostRequest` in most occurrences

* refactor-default-abs-sender: extract creation of `HttpPost` with configuration to method

* refactor-default-abs-sender: rearrange code to ease up refactoring

* refactor-default-abs-sender: extract `sendMethodRequest` method

* refactor-default-abs-sender: move temporary file names to variables

* refactor-default-abs-sender: extract files downloading to separate methods

* refactor-default-abs-sender: extract creation of `Runnable` for async file download to method

* refactor-default-abs-sender: extract `assertParamNotNull` method

* refactor-default-abs-sender: rename `tryToDownloadToTemporaryFile` method
This commit is contained in:
Roman Golyshev 2017-07-20 23:28:59 +03:00 committed by Ruben Bermudez
parent 8b977fa851
commit cbcfab5d1e

View File

@ -89,102 +89,45 @@ public abstract class DefaultAbsSender extends AbsSender {
throw new TelegramApiException("Parameter file can not be null"); throw new TelegramApiException("Parameter file can not be null");
} }
String url = File.getFileUrl(getBotToken(), filePath); String url = File.getFileUrl(getBotToken(), filePath);
java.io.File output; String tempFileName = Long.toString(System.currentTimeMillis());
try { return downloadToTemporaryFileWrappingExceptions(url, tempFileName);
output = java.io.File.createTempFile(Long.toString(System.currentTimeMillis()), ".tmp");
FileUtils.copyURLToFile(new URL(url), output);
} catch (MalformedURLException e) {
throw new TelegramApiException("Wrong url for file: " + url);
} catch (IOException e) {
throw new TelegramApiRequestException("Error downloading the file", e);
}
return output;
} }
public final java.io.File downloadFile(File file) throws TelegramApiException { public final java.io.File downloadFile(File file) throws TelegramApiException {
if(file == null){ assertParamNotNull(file, "file");
throw new TelegramApiException("Parameter file can not be null");
}
String url = file.getFileUrl(getBotToken()); String url = file.getFileUrl(getBotToken());
java.io.File output; String tempFileName = file.getFileId();
try { return downloadToTemporaryFileWrappingExceptions(url, tempFileName);
output = java.io.File.createTempFile(file.getFileId(), ".tmp");
FileUtils.copyURLToFile(new URL(url), output);
} catch (MalformedURLException e) {
throw new TelegramApiException("Wrong url for file: " + url);
} catch (IOException e) {
throw new TelegramApiRequestException("Error downloading the file", e);
}
return output;
} }
public final void downloadFileAsync(String filePath, DownloadFileCallback<String> callback) throws TelegramApiException { public final void downloadFileAsync(String filePath, DownloadFileCallback<String> callback) throws TelegramApiException {
if(filePath == null || filePath.isEmpty()){ if(filePath == null || filePath.isEmpty()){
throw new TelegramApiException("Parameter filePath can not be null"); throw new TelegramApiException("Parameter filePath can not be null");
} }
if (callback == null) { assertParamNotNull(callback, "callback");
throw new TelegramApiException("Parameter callback can not be null"); String url = File.getFileUrl(getBotToken(), filePath);
} String tempFileName = Long.toString(System.currentTimeMillis());
exe.submit(getDownloadFileAsyncJob(filePath, callback, url, tempFileName));
exe.submit(new Runnable() {
@Override
public void run() {
String url = File.getFileUrl(getBotToken(), filePath);
try {
java.io.File output = java.io.File.createTempFile(Long.toString(System.currentTimeMillis()), ".tmp");
FileUtils.copyURLToFile(new URL(url), output);
callback.onResult(filePath, output);
} catch (MalformedURLException e) {
callback.onException(filePath, new TelegramApiException("Wrong url for file: " + url));
} catch (IOException e) {
callback.onException(filePath, new TelegramApiRequestException("Error downloading the file", e));
}
}
});
} }
public final void downloadFileAsync(File file, DownloadFileCallback<File> callback) throws TelegramApiException { public final void downloadFileAsync(File file, DownloadFileCallback<File> callback) throws TelegramApiException {
if(file == null){ assertParamNotNull(file, "file");
throw new TelegramApiException("Parameter file can not be null"); assertParamNotNull(callback, "callback");
} String url = file.getFileUrl(getBotToken());
if (callback == null) { String tempFileName = file.getFileId();
throw new TelegramApiException("Parameter callback can not be null"); exe.submit(getDownloadFileAsyncJob(file, callback, url, tempFileName));
}
exe.submit(new Runnable() {
@Override
public void run() {
String url = file.getFileUrl(getBotToken());
try {
java.io.File output = java.io.File.createTempFile(file.getFileId(), ".tmp");
FileUtils.copyURLToFile(new URL(url), output);
callback.onResult(file, output);
} catch (MalformedURLException e) {
callback.onException(file, new TelegramApiException("Wrong url for file: " + url));
} catch (IOException e) {
callback.onException(file, new TelegramApiRequestException("Error downloading the file", e));
}
}
});
} }
// Specific Send Requests // Specific Send Requests
@Override @Override
public final Message sendDocument(SendDocument sendDocument) throws TelegramApiException { public final Message sendDocument(SendDocument sendDocument) throws TelegramApiException {
if(sendDocument == null){ assertParamNotNull(sendDocument, "sendDocument");
throw new TelegramApiException("Parameter sendDocument can not be null");
}
sendDocument.validate(); sendDocument.validate();
String responseContent;
try { try {
String url = getBaseUrl() + SendDocument.PATH; String url = getBaseUrl() + SendDocument.PATH;
HttpPost httppost = new HttpPost(url); HttpPost httppost = configuredHttpPost(url);
httppost.setConfig(requestConfig);
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody(SendDocument.CHATID_FIELD, sendDocument.getChatId(), TEXT_PLAIN_CONTENT_TYPE); builder.addTextBody(SendDocument.CHATID_FIELD, sendDocument.getChatId(), TEXT_PLAIN_CONTENT_TYPE);
@ -214,30 +157,20 @@ public abstract class DefaultAbsSender extends AbsSender {
HttpEntity multipart = builder.build(); HttpEntity multipart = builder.build();
httppost.setEntity(multipart); httppost.setEntity(multipart);
try (CloseableHttpResponse response = httpclient.execute(httppost)) { return sendDocument.deserializeResponse(sendHttpPostRequest(httppost));
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
}
} catch (IOException e) { } catch (IOException e) {
throw new TelegramApiException("Unable to send document", e); throw new TelegramApiException("Unable to send document", e);
} }
return sendDocument.deserializeResponse(responseContent);
} }
@Override @Override
public final Message sendPhoto(SendPhoto sendPhoto) throws TelegramApiException { public final Message sendPhoto(SendPhoto sendPhoto) throws TelegramApiException {
if(sendPhoto == null){ assertParamNotNull(sendPhoto, "sendPhoto");
throw new TelegramApiException("Parameter sendPhoto can not be null");
}
sendPhoto.validate(); sendPhoto.validate();
String responseContent;
try { try {
String url = getBaseUrl() + SendPhoto.PATH; String url = getBaseUrl() + SendPhoto.PATH;
HttpPost httppost = new HttpPost(url); HttpPost httppost = configuredHttpPost(url);
httppost.setConfig(requestConfig);
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody(SendPhoto.CHATID_FIELD, sendPhoto.getChatId()); builder.addTextBody(SendPhoto.CHATID_FIELD, sendPhoto.getChatId());
@ -267,30 +200,20 @@ public abstract class DefaultAbsSender extends AbsSender {
HttpEntity multipart = builder.build(); HttpEntity multipart = builder.build();
httppost.setEntity(multipart); httppost.setEntity(multipart);
try (CloseableHttpResponse response = httpclient.execute(httppost)) { return sendPhoto.deserializeResponse(sendHttpPostRequest(httppost));
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
}
} catch (IOException e) { } catch (IOException e) {
throw new TelegramApiException("Unable to send photo", e); throw new TelegramApiException("Unable to send photo", e);
} }
return sendPhoto.deserializeResponse(responseContent);
} }
@Override @Override
public final Message sendVideo(SendVideo sendVideo) throws TelegramApiException { public final Message sendVideo(SendVideo sendVideo) throws TelegramApiException {
if(sendVideo == null){ assertParamNotNull(sendVideo, "sendVideo");
throw new TelegramApiException("Parameter sendVideo can not be null");
}
sendVideo.validate(); sendVideo.validate();
String responseContent;
try { try {
String url = getBaseUrl() + SendVideo.PATH; String url = getBaseUrl() + SendVideo.PATH;
HttpPost httppost = new HttpPost(url); HttpPost httppost = configuredHttpPost(url);
httppost.setConfig(requestConfig);
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody(SendVideo.CHATID_FIELD, sendVideo.getChatId()); builder.addTextBody(SendVideo.CHATID_FIELD, sendVideo.getChatId());
@ -329,30 +252,20 @@ public abstract class DefaultAbsSender extends AbsSender {
HttpEntity multipart = builder.build(); HttpEntity multipart = builder.build();
httppost.setEntity(multipart); httppost.setEntity(multipart);
try (CloseableHttpResponse response = httpclient.execute(httppost)) { return sendVideo.deserializeResponse(sendHttpPostRequest(httppost));
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
}
} catch (IOException e) { } catch (IOException e) {
throw new TelegramApiException("Unable to send video", e); throw new TelegramApiException("Unable to send video", e);
} }
return sendVideo.deserializeResponse(responseContent);
} }
@Override @Override
public final Message sendVideoNote(SendVideoNote sendVideoNote) throws TelegramApiException { public final Message sendVideoNote(SendVideoNote sendVideoNote) throws TelegramApiException {
if(sendVideoNote == null){ assertParamNotNull(sendVideoNote, "sendVideoNote");
throw new TelegramApiException("Parameter sendVideoNote can not be null");
}
sendVideoNote.validate(); sendVideoNote.validate();
String responseContent;
try { try {
String url = getBaseUrl() + SendVideoNote.PATH; String url = getBaseUrl() + SendVideoNote.PATH;
HttpPost httppost = new HttpPost(url); HttpPost httppost = configuredHttpPost(url);
httppost.setConfig(requestConfig);
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody(SendVideoNote.CHATID_FIELD, sendVideoNote.getChatId()); builder.addTextBody(SendVideoNote.CHATID_FIELD, sendVideoNote.getChatId());
@ -386,30 +299,20 @@ public abstract class DefaultAbsSender extends AbsSender {
httppost.setEntity(multipart); httppost.setEntity(multipart);
try (CloseableHttpResponse response = httpclient.execute(httppost)) { return sendVideoNote.deserializeResponse(sendHttpPostRequest(httppost));
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
}
} catch (IOException e) { } catch (IOException e) {
throw new TelegramApiException("Unable to send video note", e); throw new TelegramApiException("Unable to send video note", e);
} }
return sendVideoNote.deserializeResponse(responseContent);
} }
@Override @Override
public final Message sendSticker(SendSticker sendSticker) throws TelegramApiException { public final Message sendSticker(SendSticker sendSticker) throws TelegramApiException {
if(sendSticker == null){ assertParamNotNull(sendSticker, "sendSticker");
throw new TelegramApiException("Parameter sendSticker can not be null");
}
sendSticker.validate(); sendSticker.validate();
String responseContent;
try { try {
String url = getBaseUrl() + SendSticker.PATH; String url = getBaseUrl() + SendSticker.PATH;
HttpPost httppost = new HttpPost(url); HttpPost httppost = configuredHttpPost(url);
httppost.setConfig(requestConfig);
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody(SendSticker.CHATID_FIELD, sendSticker.getChatId()); builder.addTextBody(SendSticker.CHATID_FIELD, sendSticker.getChatId());
@ -436,16 +339,10 @@ public abstract class DefaultAbsSender extends AbsSender {
HttpEntity multipart = builder.build(); HttpEntity multipart = builder.build();
httppost.setEntity(multipart); httppost.setEntity(multipart);
try (CloseableHttpResponse response = httpclient.execute(httppost)) { return sendSticker.deserializeResponse(sendHttpPostRequest(httppost));
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
}
} catch (IOException e) { } catch (IOException e) {
throw new TelegramApiException("Unable to send sticker", e); throw new TelegramApiException("Unable to send sticker", e);
} }
return sendSticker.deserializeResponse(responseContent);
} }
/** /**
@ -456,16 +353,11 @@ public abstract class DefaultAbsSender extends AbsSender {
*/ */
@Override @Override
public final Message sendAudio(SendAudio sendAudio) throws TelegramApiException { public final Message sendAudio(SendAudio sendAudio) throws TelegramApiException {
if(sendAudio == null){ assertParamNotNull(sendAudio, "sendAudio");
throw new TelegramApiException("Parameter sendAudio can not be null");
}
sendAudio.validate(); sendAudio.validate();
String responseContent;
try { try {
String url = getBaseUrl() + SendAudio.PATH; String url = getBaseUrl() + SendAudio.PATH;
HttpPost httppost = new HttpPost(url); HttpPost httppost = configuredHttpPost(url);
httppost.setConfig(requestConfig);
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody(SendAudio.CHATID_FIELD, sendAudio.getChatId()); builder.addTextBody(SendAudio.CHATID_FIELD, sendAudio.getChatId());
if (sendAudio.isNewAudio()) { if (sendAudio.isNewAudio()) {
@ -504,16 +396,10 @@ public abstract class DefaultAbsSender extends AbsSender {
httppost.setEntity(multipart); httppost.setEntity(multipart);
try (CloseableHttpResponse response = httpclient.execute(httppost)) { return sendAudio.deserializeResponse(sendHttpPostRequest(httppost));
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
}
} catch (IOException e) { } catch (IOException e) {
throw new TelegramApiException("Unable to send sticker", e); throw new TelegramApiException("Unable to send sticker", e);
} }
return sendAudio.deserializeResponse(responseContent);
} }
/** /**
@ -525,16 +411,11 @@ public abstract class DefaultAbsSender extends AbsSender {
*/ */
@Override @Override
public final Message sendVoice(SendVoice sendVoice) throws TelegramApiException { public final Message sendVoice(SendVoice sendVoice) throws TelegramApiException {
if(sendVoice == null){ assertParamNotNull(sendVoice, "sendVoice");
throw new TelegramApiException("Parameter sendVoice can not be null");
}
sendVoice.validate(); sendVoice.validate();
String responseContent;
try { try {
String url = getBaseUrl() + SendVoice.PATH; String url = getBaseUrl() + SendVoice.PATH;
HttpPost httppost = new HttpPost(url); HttpPost httppost = configuredHttpPost(url);
httppost.setConfig(requestConfig);
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody(SendVoice.CHATID_FIELD, sendVoice.getChatId()); builder.addTextBody(SendVoice.CHATID_FIELD, sendVoice.getChatId());
if (sendVoice.isNewVoice()) { if (sendVoice.isNewVoice()) {
@ -566,30 +447,20 @@ public abstract class DefaultAbsSender extends AbsSender {
HttpEntity multipart = builder.build(); HttpEntity multipart = builder.build();
httppost.setEntity(multipart); httppost.setEntity(multipart);
try (CloseableHttpResponse response = httpclient.execute(httppost)) { return sendVoice.deserializeResponse(sendHttpPostRequest(httppost));
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
}
} catch (IOException e) { } catch (IOException e) {
throw new TelegramApiException("Unable to send voice", e); throw new TelegramApiException("Unable to send voice", e);
} }
return sendVoice.deserializeResponse(responseContent);
} }
@Override @Override
public Boolean setChatPhoto(SetChatPhoto setChatPhoto) throws TelegramApiException { public Boolean setChatPhoto(SetChatPhoto setChatPhoto) throws TelegramApiException {
if(setChatPhoto == null){ assertParamNotNull(setChatPhoto, "setChatPhoto");
throw new TelegramApiException("Parameter setChatPhoto can not be null");
}
setChatPhoto.validate(); setChatPhoto.validate();
String responseContent;
try { try {
String url = getBaseUrl() + SetChatPhoto.PATH; String url = getBaseUrl() + SetChatPhoto.PATH;
HttpPost httppost = new HttpPost(url); HttpPost httppost = configuredHttpPost(url);
httppost.setConfig(requestConfig);
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody(SetChatPhoto.CHATID_FIELD, setChatPhoto.getChatId()); builder.addTextBody(SetChatPhoto.CHATID_FIELD, setChatPhoto.getChatId());
@ -601,16 +472,10 @@ public abstract class DefaultAbsSender extends AbsSender {
HttpEntity multipart = builder.build(); HttpEntity multipart = builder.build();
httppost.setEntity(multipart); httppost.setEntity(multipart);
try (CloseableHttpResponse response = httpclient.execute(httppost)) { return setChatPhoto.deserializeResponse(sendHttpPostRequest(httppost));
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
}
} catch (IOException e) { } catch (IOException e) {
throw new TelegramApiException("Unable to set chat photo", e); throw new TelegramApiException("Unable to set chat photo", e);
} }
return setChatPhoto.deserializeResponse(responseContent);
} }
// Simplified methods // Simplified methods
@ -622,21 +487,11 @@ public abstract class DefaultAbsSender extends AbsSender {
@Override @Override
public void run() { public void run() {
try { try {
method.validate(); String responseContent = sendMethodRequest(method);
String url = getBaseUrl() + method.getMethod(); try {
HttpPost httppost = new HttpPost(url); callback.onResult(method, method.deserializeResponse(responseContent));
httppost.setConfig(requestConfig); } catch (TelegramApiRequestException e) {
httppost.addHeader("charset", StandardCharsets.UTF_8.name()); callback.onError(method, e);
httppost.setEntity(new StringEntity(objectMapper.writeValueAsString(method), ContentType.APPLICATION_JSON));
try (CloseableHttpResponse response = httpclient.execute(httppost)) {
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
try {
callback.onResult(method, method.deserializeResponse(responseContent));
} catch (TelegramApiRequestException e) {
callback.onError(method, e);
}
} }
} catch (IOException | TelegramApiValidationException e) { } catch (IOException | TelegramApiValidationException e) {
callback.onException(method, e); callback.onException(method, e);
@ -648,27 +503,76 @@ public abstract class DefaultAbsSender extends AbsSender {
@Override @Override
protected final <T extends Serializable, Method extends BotApiMethod<T>> T sendApiMethod(Method method) throws TelegramApiException { protected final <T extends Serializable, Method extends BotApiMethod<T>> T sendApiMethod(Method method) throws TelegramApiException {
method.validate();
String responseContent;
try { try {
String url = getBaseUrl() + method.getMethod(); String responseContent = sendMethodRequest(method);
HttpPost httppost = new HttpPost(url); return method.deserializeResponse(responseContent);
httppost.setConfig(requestConfig);
httppost.addHeader("charset", StandardCharsets.UTF_8.name());
httppost.setEntity(new StringEntity(objectMapper.writeValueAsString(method), ContentType.APPLICATION_JSON));
try (CloseableHttpResponse response = httpclient.execute(httppost)) {
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8);
}
} catch (IOException e) { } catch (IOException e) {
throw new TelegramApiException("Unable to execute " + method.getMethod() + " method", e); throw new TelegramApiException("Unable to execute " + method.getMethod() + " method", e);
} }
}
return method.deserializeResponse(responseContent); private <T> Runnable getDownloadFileAsyncJob(T fileIdentifier, DownloadFileCallback<T> callback, String url, String tempFileName) {
//noinspection Convert2Lambda
return new Runnable() {
@Override
public void run() {
try {
callback.onResult(fileIdentifier, downloadToTemporaryFile(url, tempFileName));
} catch (MalformedURLException e) {
callback.onException(fileIdentifier, new TelegramApiException("Wrong url for file: " + url));
} catch (IOException e) {
callback.onException(fileIdentifier, new TelegramApiRequestException("Error downloading the file", e));
}
}
};
}
private java.io.File downloadToTemporaryFileWrappingExceptions(String url, String tempFileName) throws TelegramApiException {
try {
return downloadToTemporaryFile(url, tempFileName);
} catch (MalformedURLException e) {
throw new TelegramApiException("Wrong url for file: " + url);
} catch (IOException e) {
throw new TelegramApiRequestException("Error downloading the file", e);
}
}
private java.io.File downloadToTemporaryFile(String url, String tempFileName) throws IOException {
java.io.File output = java.io.File.createTempFile(tempFileName, ".tmp");
FileUtils.copyURLToFile(new URL(url), output);
return output;
}
private <T extends Serializable, Method extends BotApiMethod<T>> String sendMethodRequest(Method method) throws TelegramApiValidationException, IOException {
method.validate();
String url = getBaseUrl() + method.getMethod();
HttpPost httppost = configuredHttpPost(url);
httppost.addHeader("charset", StandardCharsets.UTF_8.name());
httppost.setEntity(new StringEntity(objectMapper.writeValueAsString(method), ContentType.APPLICATION_JSON));
return sendHttpPostRequest(httppost);
}
private String sendHttpPostRequest(HttpPost httppost) throws IOException {
try (CloseableHttpResponse response = httpclient.execute(httppost)) {
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
return EntityUtils.toString(buf, StandardCharsets.UTF_8);
}
}
private HttpPost configuredHttpPost(String url) {
HttpPost httppost = new HttpPost(url);
httppost.setConfig(requestConfig);
return httppost;
} }
protected String getBaseUrl() { protected String getBaseUrl() {
return options.getBaseUrl() + getBotToken() + "/"; return options.getBaseUrl() + getBotToken() + "/";
} }
private void assertParamNotNull(Object param, String paramName) throws TelegramApiException {
if (param == null) {
throw new TelegramApiException("Parameter " + paramName + " can not be null");
}
}
} }