PhaseListener doesn't return image
Hi Experts,
I have a JackRabbit content repository in my web application which contains some of the images that need to be rendered.
In order to do this I decided to map a URL pattern to a PhaseListener, which will on receiving such a request load the image and return it with the HTTP response.
In other words, if the URL is http://domain.com/images?path=name.jpg the PhaseListener will intercept that and return an image from the JackRabbit content repository. My problem is, even though everything seems fine, I keep on receiving a 404 error. My code is as follow:
public class ImagePhaseListener implement PhaseListener {
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
public void beforePhase(PhaseEvent event) {
// Nothing to do
public void afterPhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
String viewID = facesContext.getViewRoot().getViewId();
if (viewID.startsWith("/image/") {
serveResource(facesContext);
private void serveResource(FacesContext facesContext) {
Map<String, String> requestMap = facesContext.getExternalContext().getRequestParameterMap();
String path = requestMap.get("path");
// Get the stream from JackRabbit - this works fine
InputStream imageStream = getImageStream(path);
// Write the response - this doesn't throw any exception, but doesn't seem to work either
HttpServletResponse servletResponse = (HttpServletResponse)facesContext.getExternalContext().getResponse();
servletResponse.setContentType("image/jpeg");
try {
int streamLength = imageStream.available();
servletResponse.setContentLength(streamLength);
while (streamLength > 0) {
servletResponse.getOutputStream().write(imageStream.read());
--streamLength;
servletResponse.getOutputStream().flush();
catch (IOException exception) {
// Log error
finally {
try {
servletResponse.getOutputStream().close();
imageStream.close();
catch (IOException exception) {
// Log error
facesContext.responseComplete();
// More code ...
}I used my debugger to step through this and everything works fine - no exceptions nothing. The inputstream is loaded correctly and contains the correct number of bytes. Here is my HTTP headers:
GET /Resources/images?path=test.jpg HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.3) Gecko/2008111716 Gentoo Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
HTTP/1.x 404 Not Found
X-Powered-By: Servlet/2.5, JSF/1.2
Server: Sun Java System Application Server 9.1_02
Content-Type: text/html
Content-Length: 1028
Date: Wed, 26 Nov 2008 14:25:32 GMTI have no idea why this won't work - any and all help is appreciated.
Btw, what's the best way to write from an InputStream to the Response's OutputStream?
Thank you,
Ristretto
Thanks IoboEsa and BalusC,
BalusC - the reason I tried to get this to work with a JSF PhaseListener is because this would give me easy access to a managed bean containing the user information. I see in your article you recommend passing an ID attribute encrypted by MD5 for authentication, but if this information can be obtained from a JSF bean so much the better, don't you think? I guess I'll try the servlet approach and just construct the FacesContext manually
Thanks,
Ristretto
Similar Messages
-
MII doesn't return images from copied projects
We are using MII 12.2.6.44 and when I make a copy of the existing project, the images cannot be found on the copy. But I'm sure, that they are on the given path, I receive the message:
404 Not Found
SAP NetWeaver Application Server
Error: Requested file /path/path/someimage.png does not exist.
SAP Technology Troubleshooting Guide
Details:
No details available.
Sometimes I have to wait hours to have the pictures loaded, sometimes it is not recovered after days... Is there some "flush" function or something, that I could invoke? Because it is very annoyinghi,
unfortunately this didn't solve my problem, I right-mouse-clicked on the "Web" tab on the "WEB" directory, then "Publish", but I still don't see the icons
EDIT: it works in IE, but not works in FF
EDIT2: okay, maybe I have to restart the browser thankx -
SQL Query (PL/SQL Function Body returning SQL query) doesn't return any row
I have a region with the following type:
SQL Query (PL/SQL Function Body returning SQL query).
In a search screen the users can enter different numbers, separated by an ENTER.
I want to check these numbers by replacing the ENTER, which is CHR(13) || CHR(10) I believe, with commas. And then I can use it like this: POD IN (<<text>>).
It's something like this:
If (:P30_POD Is Not Null) Then
v_where := v_where || v_condition || 'POD IN (''''''''||REPLACE(''' || :P30_POD || ''', CHR(13) || CHR(10), '','')||'''''''''')';
v_condition := ' AND ';
End If;
But the query doesn't return any rows.
I tried to reproduce it in Toad:
select * from asx_worklistitem
where
POD IN (''''||REPLACE('541449200000171813'||CHR(13) || CHR(10)||'541449206006341366', CHR(13) || CHR(10), ''',''')||'''')
==> This is the query that does't return any rows
select (''''||REPLACE('541449200000171813'||CHR(13) || CHR(10)||'541449206006341366', CHR(13) || CHR(10), ''',''')||'''')
from dual;
==> This returns '541449200000171813','541449206006341366'
select * from asx_worklistitem
where pod in ('541449200000171813','541449206006341366');
==> and when I copy/paste this in the above query, it does return my rows.
So why does my first query doesn't work?
Doe anyone have any idea?
Kind regards,
Geert
Message was edited by:
ZorryThanks for the help.
I made it work, but via the following code:
If (:P30_POD Is Not Null) Then
v_pods := REPLACE(:P30_POD, CHR(13) || CHR(10));
v_where := v_where || v_condition || 'POD IN (';
v_counter := 1;
WHILE (v_counter < LENGTH(v_pods)) LOOP
v_pod := SUBSTR(v_pods, v_counter, 18);
IF (v_counter <> 1) THEN
v_where := v_where || ',';
END IF;
v_where := v_where || '''' || v_pod || '''';
v_counter := v_counter + 18;
END LOOP;
v_where := v_where || ')';
v_condition := ' AND ';
End If;But now I want to make an update of all the records that correspond to this search criteria. I can give in a status via a dropdownlist and that I want to update all the records that correspond to one of these POD's with that status.
For a region you can build an SQL query via PL/SQL, but for a process you only have a PL/SQL block. Is the only way to update all these records by making a loop and make an update for every POD that is specified.
Because I think this will have a lot of overhead.
I would like to make something like a multi row update in an updateable report, but I want to specify the status from somewhere else. Is this possible? -
IDoc Transport Acknowledge doesn't return to PI 7.0 automatically
Hi all,
I realized an Integration scenario in which PI 7.0 generates custom IDocs messages (like MBGMCR) and send them to a SAP system (4.6 C). In particular there are the scenario steps:
1. BPM -> IDoc msg
2. IDoc msg transport ACK -> BPM
3. BPM -> JDBC updating
When SAP receive IDocs must send back to PI the related Transport Acknoledgement in order to complete the Integration Scenario with JDBC updating.
So I observe that, if I don't refresh IDoc messages on SXMB_MONI, the Transport ACK doesn't return back from SAP to PI and the BPM remains pending.
Any ideas?
Thanks in advance,
GBHi Gaurav,
could you please tell me which are these parameters:
- partner number (for the receiver)
- partner type (for the receiver)
- partner role (for the receiver)
In my scenario PI 7.0 sends IDocs to R/3 so the receiver (written in the point 3 of the link you sent me) should be R/3.
It's right?
I'm unable to find the Parner Role. In which transaction can I found it?
Thanks,
GB -
Finder doesn't show image dimensions
Hi!
I have a problem with image dimensions in Finder. Finder doesn't show image dimension info in preview column and Get Info window. But when I open in Preview app I can see dimensions in Get Info window. How to solve this problem. If I want to sort images by dimension, I can't do that. Because Finder doesn't know image dimensions. You can see images below.Terence Devlin wrote:
That's because the Finder is a file manager and works from file metadata. The data you're seeking is about the file contents. You need to use a Photo Manager or Browser.
There is someone who can sort images by dimensions and see dimensions in list view. Also if Finder will not show image dimensions, why give me "Dimensions" and "Resolution" option to select in list view.
VikingOSX wrote:
Launch a Finder window. Press command+J, and set Show Item Info. Now the image dimensions will show below each image icon. If it is a movie, then the duration of the movie is shown.
I have done this. But doesn't show information. -
Hi,
I've made a scenario using XI 3.0. I use a file adapter with an inbound synchronous interface to send a xml file to XI. XI consumes a function from CRM using a RFC adapter and an outbound synchronous interface. I've setted "Best Effort" as quality of service too.
The xml file arrives correctly to CRM and CRM returns the BAPI result to XI correctly too. The problem is XI doesn't return the xml file which it should, that's to say, the xml file sent by XI isn't in the specified target directory (using an inbound synchronous interface and a XI adapter).
Could someone explain me what happens?
Thanks in advance,
Samantha.Hi Samantha,
bad news: File Adapter is always asynchronous, cant get any response. And if you use an interface to send data it is an outbound interface.
To realize your business logic you must use BPM like
file (outbound asynchronous) -> BP (abstract asynchronous)
BP (abstract synchronous) <-> CRM (inbound synchronous)
BP (abstract asynchronous) -> file (inbound asynchronous)
Regards,
Udo -
Doesn't return true value .........
Hi All,
please check the following code.
password (originalPassword) from the database is : xyz
password (password) from the login page is : xyz
when I try for equality for the password :
if(originalPassword.equalsIgnoreCase(password)) {
it doesn't return true value while the password is same that is : xyz ?
I an stuck in the problem.
Please look into the code and solve my problem.
Thanks
public boolean verifyPassword(String username, String password) {
String originalPassword=null;
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://sqlserver:1433","harish","harish");
PreparedStatement pstmt = con.prepareStatement("select password from registration where username='"+username+"'");
//ResultSet rs = pstmt.getResultSet();
ResultSet rs = pstmt.executeQuery();
if(rs.next()) {
originalPassword=rs.getString(1);
pstmt.close();
if(originalPassword.equalsIgnoreCase(password)) {
return true;
} else {
return false;
} catch (Exception e){
System.out.println("Exception: verifyPassword="+e);
return false;
Harish PathakAre you sure there's no space before or after "xyz"? Try adding some debug output to your code:
if(originalPassword.equalsIgnoreCase(password)) {
//foo
} else {
System.out.println("<" + password + "> does not match <" + originalPassword + ">");
} -
Query with subquery containing group clause doesn't return any rows - WHY ?
Hi,
My query doesn't return any values :
select g1.NTRX from gtrx g1
where exists
(SELECT b.cfunctrx, b.cpro1trx, b.nmsgitrx, b.nmrc, b.ncrd, b.namtstrx,
b.dltimtrx, b.nrtrftrx,count(*)
FROM gtrxacq a, gtrx b
WHERE a.ntrx = b.ntrx AND a.acq_bus_date = (SELECT curr_bus_date -1
FROM gmbr
WHERE nmbr = 0)
and g1.NTRX=b.NTRX
GROUP BY b.cfunctrx,
b.cpro1trx,
b.nmsgitrx,
b.nmrc,
b.ncrd,
b.namtstrx,
b.dltimtrx,
b.nrtrftrx
HAVING COUNT (*) > 1);
but such query returns some number of rows :
SELECT b.cfunctrx, b.cpro1trx, b.nmsgitrx, b.nmrc, b.ncrd, b.namtstrx,
b.dltimtrx, b.nrtrftrx,count(*)
FROM gtrxacq a, gtrx b
WHERE a.ntrx = b.ntrx AND a.acq_bus_date = (SELECT curr_bus_date -1
FROM gmbr
WHERE nmbr = 0)
/*and g1.NTRX=b.NTRX*/
GROUP BY b.cfunctrx,
b.cpro1trx,
b.nmsgitrx,
b.nmrc,
b.ncrd,
b.namtstrx,
b.dltimtrx,
b.nrtrftrx
HAVING COUNT (*) > 1
AND when i put results from query above into query :
select g1.NTRX from gtrx g1
where
g1.CFUNCTRX= 200 and g1.CPRO1TRX= 000 and g1.NMSGITRX= 1240 and
g1.NMRC= '000000000000675' and g1.NCRD= 405671**********
and g1.NAMTSTRX=14.26 and g1.DLTIMTRX=to_date('07/08/2008 15:07:02','MM/DD/YYYY HH24:MI:SS')
and g1.NRTRFTRX= '000414598393';
it returns values.
what is wrong ?
Best Regards Arkadiusz Masnybut such query returns some number of rows :
/*and g1.NTRX=b.NTRX*/Add b.NTRX into group by and recheck. -
Click on a cell in formula doesn't return value, only text. why?
When doing a simple formula like =c4-c5 in one of my sheets, when i click on the cell, it doesn't return the value, only text.
What setting do i have enabled/disabled?
thanks
hamdogHI Hamdog,
What you are seeing is the formula that is in that cell.
The setting you have turned on is the first one in the bottom section of the General page of Numbers Preferences. In the English versions, it looks like this:
With the checkbox unchecked (as mine is), the formula would read:
=L10-P10
Column L is labeled "Tips", Column P is labeled "Lenka", Row 10 is labeled "9. 2. 2013"
To Copy and Paste the result, 462, click (once) on the cell and Copy, then click (once) on the cell where you want to paste the result and go Edit > Paste Values. This should be the seventh item (not including the separator line) in the Edit menu.
Regards,
Barry
Regards,
Barry -
The same selection doesn't return the same result in 2 identical systems
Hi,
After a copy we have 2 systems with same data.
In a program the same selection doesn't returns the same result, it seems that the sort is different.
I have checked indexes but they are ok in both systems.
Here is the selection:
SELECT but000~partner
INTO TABLE lt_partner
*UP TO 50 ROWS
FROM but000
JOIN but020
ON but020partner = but000partner
JOIN adrc
ON adrcaddrnumber = but020addrnumber
JOIN but100
ON but100partner = but000partner
WHERE but020~addr_valid_from LE '20100727000000'
AND but020~addr_valid_to GE '20100727000000'.
Is there a customizing point to define how the database must be sorted ?
Thanks.
Edited by: julien schneerberger on Jul 27, 2010 4:18 PMHi,
Thank you for your answer.
Result is the same and I don't sort data after the selection.
Do you think the system copy has "broke" the records order in database ?
If it is the case it will be impossible to reproduce the same sort, is it right ?
Edited by: julien schneerberger on Jul 27, 2010 5:19 PM
Edited by: julien schneerberger on Jul 27, 2010 5:20 PM -
Disco Report doesn't return data for a responsibilty
Hi Guys,
We have a report, we have shared with XXX Tax Manager. When we login through XXX Tax Manager, it doesn`t return data. But when we do similer with XXX Payables Manager, report runs fine and return data?
Can any one help me on this.
Note: Both Responsibility have access to the Business Area.
Thanks,
NickPlease find the below query:
SELECT /*+ NOREWRITE */
o101613.expense_account_num AS e264170,
o271954.description AS e271961, o271954.po_number AS e272013,
o271954.project AS e272033, o271954.task AS e272035,
o271954.expenditure_type AS e272036, o272183.amount AS e275461,
(o272183.gl_date) AS e275566, (o272183.invoice_date) AS e275578,
o272183.invoice_id AS e275580, o275448.invoice_id AS e275581,
o272183.invoice_number AS e275584,
o272183.self_assessed_flag AS e275674,
o272183.ship_to_location_code AS e275681, o272183.state AS e275685,
o272183.tax_amount AS e275695,
o272183.tax_jurisdiction_code AS e275698,
o272183.tax_rate AS e275700, o272183.vendor_name AS e275720,
o272183.vendor_number AS e275723, (o278494.gl_date) AS e278500,
o278494.liability_account AS e278501
FROM apfg_ap_invoices o101612,
apfg_ap_invoice_distributions o101613,
apps.ap_invoice_lines_v o271954,
(SELECT ap.invoice_id, aps.vendor_name, aps.segment1 vendor_number,
ap.invoice_num invoice_number, ap.invoice_date, ap.gl_date,
apl.amount amount, zxl.tax_amt tax_amount,
zxr.percentage_rate tax_rate, zxl.tax_jurisdiction_code,
apl.ship_to_location_code, zxl.self_assessed_flag,
hzg.geography_element2_code state, apl.line_number
FROM ap.ap_suppliers aps,
ap.ap_invoices_all ap,
zx.zx_lines zxl,
apps.ap_invoice_lines_v apl,
zx.zx_rates_b zxr,
zx.zx_jurisdictions_tl zxj,
zx.zx_jurisdictions_b zxb,
ar.hz_geographies hzg
WHERE aps.vendor_id = ap.vendor_id
AND ap.invoice_id = zxl.trx_id
AND zxl.trx_id = apl.invoice_id
AND zxl.trx_line_number = apl.line_number
AND zxl.entity_code = 'AP_INVOICES'
AND zxl.event_class_code = 'STANDARD INVOICES'
AND zxl.self_assessed_flag = 'Y'
--AND zxr.tax_rate_code = zxl.tax_rate_code
AND zxr.tax_rate_id = zxl.tax_rate_id
AND zxj.tax_jurisdiction_id = zxl.tax_jurisdiction_id
AND zxb.tax_jurisdiction_id = zxj.tax_jurisdiction_id
AND zxb.zone_geography_id = hzg.geography_id
AND zxl.tax_amt <> 0
AND apl.line_type_lookup_code IN
('ITEM', 'FREIGHT', 'MISCELLANEOUS')
AND apl.line_source IN
('HEADER MATCH',
'MANUAL LINE ENTRY',
'IMPORTED',
'CHRG ITEM MATCH'
AND ap.cancelled_date IS NULL
ORDER BY aps.vendor_name, ap.invoice_num) o272183,
apps.ap_invoices_v o275448,
(SELECT xte.source_id_int_1 invoice_id, gcc.code_combination_id,
xte.transaction_number, xal.accounting_date gl_date,
gcc.segment1
|| '.'
|| gcc.segment2
|| '.'
|| gcc.segment3
|| '.'
|| segment4
|| '.'
|| segment5
|| '.'
|| segment6
|| '.'
|| segment7 liability_account
FROM xla.xla_transaction_entities xte,
xla.xla_ae_headers xah,
xla.xla_ae_lines xal,
gl.gl_code_combinations gcc
WHERE 1 = 1
AND xte.entity_id = xah.entity_id
AND xte.application_id = xah.application_id
AND xah.ae_header_id = xal.ae_header_id
AND xal.accounting_class_code = 'SELF_ASSESSED_TAX_LIAB'
AND xal.code_combination_id = gcc.code_combination_id) o278494
WHERE ( (o101612.invoice_id = o101613.invoice_id(+))
AND ( o101613.invoice_id = o271954.invoice_id
AND o101613.invoice_line_number = o271954.line_number
AND ( o272183.invoice_id = o271954.invoice_id
AND o272183.line_number = o271954.line_number
AND (o272183.invoice_id = o275448.invoice_id)
AND (o278494.invoice_id = o275448.invoice_id)
AND (o101613.dist_line_type_code IN
('ITEM', 'FREIGHT', 'MISCELLANEOUS'')')
AND (o101612.invoice_number = :"Invoice Number ")
AND ((o272183.gl_date) <= :"Ending GL DATE")
AND ((o272183.gl_date) >= :"Beginning GL DATE")
ORDER BY o271954.project ASC, o272183.invoice_number ASC;
It does not contain any security profiles, only contains view that might be not returning data.
thanks -
Entering URL in address bar causes spinning beach ball...doesn't return
entering URL in address bar causes spinning beach ball. Safari then doesn't return and I have to force quit. This happens every time I try to type a url. It only
does this on one account on the computer and not another on same computer.
Under library preference I dragged the internet pref pane into trash. This did not help. I also dragged the system user perference pane com.apple.safari.plist as well into the trash but also did not fix the problem.
I can not drag the internet pref pane from the trash back to the library folder. Will this cuase any problems?Glad you took the next step. My next suggestion was going to be the History file, which too is in the Safari folder. Sounds like that was the culprit.
Thanks for the and Aloha from Big Island. -
When I open Firefox, it doesn't return me to where I was before.
When I open Firefox, it doesn't return me to where I was before and when it crashes, i don't get get a dialog box asking me to return to your previous page or to start a fresh one.
What can I do?What do you have set in Options > General > When Firefox starts:? Do you have multiple sessionstore files in the profile? If so, it would be best to delete all of them and start over with collecting tabs.
-
I'm using Ora 9.2.0.1.0 (both server and client the same version)
When i'm calling OCIStmtExecute (with an INSERT command, 1 row, no threading) the function doesn't return. It causes about 30% cpu usage on the client. I've already checked all parameter handles - they're all ok. It insn't the first sql command in my app, all previous calls of OCIStmtExecute were successfull.
Any ideas / hints, how to find the reason for this ?
Thanks,
DanielHi Adrian,
executing the inserts manually is a difficult task, because there are about 4000 rows inserted before the error occurs ... ;-) But the behaviour is really reproducible.
I'm using Keeptool's Hora 5 to maintain the db, so now I can't say the source of this information. But when I take a look into the 'Sessions' tab during the hanging OCIStmtExecute, the concerned session's status (event waits) is something like 'SQL*Net break/waiting for reset' or something like this. I don't now the meaning of this message. Tommorow I will post the exact message. But as mentioned before, I don't know the view which Hora takes this message from.
Daniel -
Re: Web SDK Returning Images
Hi Brendan,
Regarding your question on returning images...
At 09:18 AM 5/2/97 U, Brendan Duddridge wrote:
Mail*Link® SMTP Web SDK Returning Images
Hi,
Why on earth does the Web SDK 1.1 allow you to return BinaryData objectsto the web page if there's no way to display them? I can understand why it
lets you return image files stored on disk somewhere, but I can't
understand what the BinaryData version of AssignBinaryResponse method is
used for if not for retrieving images from a database. No one seems to
know what internal format graphic images are stored in when they're stored
as blobs in the database and then read into ImageData objects. I'm still
trying to figure out the MIME type used for BinaryData images read in from
a database.
>
Has anyone ever used AssignBinaryResponse with BinaryData and MimeType asparameters instead of FileName and MimeType as parameters?
>
Help would be greatly appreciated. Thanks,
Brendan DuddridgeOne of the reasons we added binary object support to the WebSDK update 1.1.A
is to allow applications (that make binaries available to end users) to
store the binary files on a machine other than the web server. These
binary files may be images, executables, or whatever.
The intention is to have the application read the binary files into a
binarydata object and passing the contents of that object to the requesting
browser. If in your case, you want your generated html page to use various
images, you would want to read the files into binarydata objects to retain
the data format of your file. You wouldn't read your image files into a
Forte ImageData because the image format (jpeg, gif,bmp) would be translated
to the internal Forte format (ImageData objects are meant to be used with
Forte clients, rather than WEB clients).
Regards,
Peter W. Pang
Forte Technical Support
Technical Support Direct
Hotline: 510-451-5400 | Tel: 510-869-3437
FAX: 510-869-2010 |
MailTo:[email protected] | <a
href="MailTo:[email protected]">MailTo:[email protected]</a>
WWW: http://www.forte.com |
---------------------------------------------------------What is your Traget System?
If ABAP proxy--Follow beloa appraoch
option 1: develop two sync interfaces
Option 2: Develop Receiver response proxy structure and this structure should hold two proxy responses and write proxy logic to send response in one shot.
in this case one interface enough.
Regards,
Raj
Maybe you are looking for
-
Mail won't open. It then says quit and rebuild and won't do that. How to fix?
So I try to open mail but it hangs. Then gives the option to quit or quit and rebuild. It will quit but when I quit and rebuild it hangs and then just shuts off without doing anything. Not quite sure what to do. Any help would be great. Steve
-
How to make Fields mandatory in service entry sheet
Dear Experts, I need to make "Quality of Service" and "Service Timeliness" fields mandatory for user entry in VENDOR EVALN tab during Service Entry Sheet. Kindly help..
-
Anyone know of Acrobat 8 training on forms and interactivity (not beginner)
Does anyone know of any good professional training videos for Mac users? I've been searching for some really good online videos (free or paid, as long as they are good!) particularly for creating complex forms with lots of interactivity. Most of the
-
How to stop the system to ask for a password
How to make the system from asking for a password for every installation???
-
dear sirs i use this code in tree but it give me error SELECT 1 NODE_STATE, LEVEL NODE_DEPTH, location_name NODE_LABEL, decode(level,1,'OPEN',' ') NODE_ICON, location_no NODE_VALUE FROM stk_locations where stk_no = :TRNH9.stk_no and (:v_trtype = 2) a