ModuleData.getPrincipalData returns null in the adapter module development
Hi gurus,
i am doing a test on the adapter module development following an article written by William Li:
http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/f0ac06cf-6ee2-2c10-df98-e17430ca5949?QuickLink=index&overridelayout=true
my problem is after the EJB has been deployed, it seems that the return of inputModuleData.getPrincipalData() is always null which makes the program can not get the xml payload from the framework.
the main process of the example has been simplified like this:
public ModuleData process(ModuleContext moduleContext, ModuleData inputModuleData) throws ModuleException {
Object obj = null;
try {
obj = inputModuleData.getPrincipalData();
Message msg1 = (Message) obj;
XMLPayload xmlpayload = msg1.getDocument();}
catch (Exception e) {
ModuleException me = new ModuleException(e);
throw me;
return inputModuleData;
after deployed, i get the following error in the adapter monitor of RWB: (my JNDI is testtest)
17.02.2012 17:13:44.643 Information Send binary file "test8.xml" from FTP server "10.18.48.150:/encrypt_test/", size 206 bytes with QoS EO
17.02.2012 17:13:44.644 Information MP: processing local module localejbs/CallSapAdapter
17.02.2012 17:13:44.644 Information Application attempting to send an XI message asynchronously using connection File_http://sap.com/xi/XI/System
17.02.2012 17:13:44.645 Information Trying to put the message into the send queue
17.02.2012 17:13:44.648 Information MP: processing local module localejbs/testtest
17.02.2012 17:13:44.648 Error MP: exception caught with cause java.lang.NullPointerException: while trying to invoke the method com.sap.engine.interfaces.messaging.api.Message.getDocument() of an object loaded from local variable 'msg1'
whereas if the code has been changed like this:
public ModuleData process(ModuleContext moduleContext, ModuleData inputModuleData) throws ModuleException {
Object obj = null;
try {
obj = inputModuleData.getPrincipalData();
Message msg1 = (Message) obj;
if (obj != null )
XMLPayload xmlpayload = msg1.getDocument();
catch (Exception e) {
ModuleException me = new ModuleException(e);
throw me;
return inputModuleData;
the file can be read by the file adapter.
i just quite confused that why the return of the getPrincipalData() is null? where is the problem? thanks
Edited by: Stephen Xue on Feb 17, 2012 5:22 AM
I'm gonna reply to myself here. I changed the processing sequence of the adapter modules in the in the FileSender channel so that my module comes first then CallSapAdapter. Then getPrincipalData() contains the message.
Hope this helps someone else.
Similar Messages
-
Retrieving the file name in the adapter module in the sender file adapter
hi,
i need to retrieve the file name, in the adapter module. This module is placed in the sender file channel.
After the file adapter has picked up the file from the file directory, the file is placed in the archived directory.Custom adapter mofule is place in the file shanel. i need to retrieve the file name of the file in the adapter module. Is it possible to retrieve the file name?
Also is it possible to retrieve the archive directory path in module?
Regards,
MeenkashiHi Meenakshi,
I guess you are looking for this
/people/daniel.graversen/blog/2006/10/05/dynamic-configuration-in-adapter-modules
Regards
Suraj -
Value mapping in the adapter module
Hi all...
There was been alot of writing about value mapping in many different ways.
But I have not been able to find help about doing the lookup in the adapter module.
Has anyone tried this?
Regards PeterHi,
In this case you can perfrom a RFC Lookup, but, from an Adapter Module, you would need to use the concept of JRA to do the same.
Amol Joshi has described how he called the Alerts RFC from the adapter module in these blogs and you can apply the same logic for your case as well to trigger the RFC from your module, get the data and then do the needful.
/people/amol.joshi2/blog/2006/11/27/alerts-from-adapter-modules--the-jra-way
/people/amol.joshi2/blog/2006/11/28/alerts-from-adapter-modules--the-jra-way-part-ii
Regards
Bhavesh -
Naming a file in the adapter module
Hi All,
I have written an adapter module that is used in a receiver mail adapter. In my module I am renaming the attachment name to "abc.cpi". The problem is I am getting the output from the adapter as abc.cpi.xml. I tried changing the content type in the adapter module to text/plain that gave me an output as abc.cpi.txt. How can I get only abc.cpi as the name of the attachment using this module?
Thanks
AbinashHi,
This might be help you
http://help.sap.com/saphelp_nw04/helpdata/en/cd/5af7c0c994e24fb0d0088443513de2/frameset.htm
http://help.sap.com/saphelp_nw04/helpdata/en/cd/5af7c0c994e24fb0d0088443513de2/frameset.htm
http://help.sap.com/saphelp_nw04/helpdata/en/14/80243b4a66ae0ce10000000a11402f/frameset.htm
Regards
Agasthuri Doss -
GetContextURL returns null using the default ECM repository
Hello experts,
This is the scenario.
We are using the SAP ECM repositoy for document storage in our BPM proyect. In this case we are using the default configuration and repository location (ecm/default and DefaultUser), but after the upload, when i try to get the document URL with the method getContentURL(), returns null.
The ECM documentarion saids than this condition is expected when using a third party repostiory, but this is not the case.
I appreciate a lot your advices and recomendations,
Best regards!
Julio C. LeyvaHi Vasil,
We didn't resolve this issue by this method, because we are using the default ECM repository witch doesn't support the operation getContextURL() and gets the "null" result. If you are using a different repository maybe works.
Re-checking the API specification, saids:
getContentURL
java.lang.String getContentURL() throws InvalidStateException, RepositoryException Returns a URL that can be used to retrieve the content directly from the respective backend, thus bypassing ECM. Note that this URL might have several restrictions which depend on the connector's backend store, such as a limited lifetime or requiring a user to authenticate with different credentials than the ones used to connect to ECM. Other stores might provide no content URL at all, in which case this method returns null. Applications might want to consider utilizing the ECM WebDAV server to present their users a URL that is located on the same system as ECM.
Finally, you would consider to expose a webservice (EJB Session Bean) witch encapsulates the ECMI implementation and extract your file content as a binary array (encode/decode), sending as the input your path/fileName for lookup in the ECM repository.
Regards! -
Help required in File Adapter Module Development
Hi All,
I am working out a File to File scenario where my source file is in some different format. Please find the below sample:
<Root>
<ID>100</ID>
<NAME>SAP</NAME>
<END-Root>
Before taking this into IS, I need to change the file to a proper XML format. I need to replace "END-" with "/".
<?xml version="1.0" encoding="UTF-8" >
<Root>
<ID>100</ID>
<NAME>SAP</NAME>
</Root>
I think I can achive this by developing Adapter Modules. I am new to Adapter Module development.
Can you please tell me if there are any inbuilt Adapter Modules for this. If not please suggest me some relevant blogs to solve this issue. Thanks in Advance.Hi Phani Kumar
There are more than one ways to do this. As per your timelines and skill set you can decide
1. You can use the XMLAnonymizerBean this is an inbuilt module
Check Stefen's blog
Remove namespace prefix or change XML encoding with the XMLAnonymizerBean
2. You can read this complete file in a single field and then you can create XSLT or Java mapping to parse it in a target XML you desire.
Check these
https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/3823 [original link is broken] [original link is broken] [original link is broken](XSLT mapping)
Java Mapping (Part I) (Java Mapping)
The specified item was not found. (Java Mapping helper DOM)
The specified item was not found. (XML Node into string)
3. You can develop Adapter modules for this
Refer
Check Guides
XI 3.0
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/3bdc14e1-0901-0010-b5a9-a01e29d75a6a
PI 7.0
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/f013e82c-e56e-2910-c3ae-c602a67b918e
PI 7.1
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/00838345-708c-2a10-1199-9514c0b0a91c -
PI 7.1 Adapter Module Development - Identify SOAP Fault Message
Hi Experts,</br>
here's a PI 7.1 Adapter Module Development issue I hope you can help me to resolve. It's about identifying SOAP fault messages.</br>
</br>
Scenario at a glance:</br>
Adapter Modules placed in the modules chain at request and response time in a synchronous Scenario:</br>
- Request: SOAP Axis to RFC </br>
- Response and Fault Response: RFC to SOAP Axis</br>
</br>
The issue is how to identify SOAP fault message in SOAP Axis Adapter Module in the response message:</br>
The client gets SOAP fault messages like the follwong one:</br>
<SOAP:Body>
<SOAP:Fault>
<faultcode>SOAP:Server</faultcode>
<faultstring>Server Error</faultstring>
<detail>
<ns1:exception xmlns:ns1="http://typen.geschaeftsstelle.pab.barmer.de">
<ns1:errortext>bla bla bla ...</ns1:errortext>
</ns1:exception>
</detail>
</SOAP:Fault>
</SOAP:Body>
</br>
</br>
But when trying to access the tags faultcode and/or faultstring in the adapter module via xPath expressions I do not get them. Obviously the SOAP Fault tags are built AFTER the adapter module has been passed. So my question is:</br>
How can I clearly/uniquely detect a SOAP fault response message (and distinguish it from a "normal" response message) in my SOAP Axis Adapter Module?</br>
</br>
I tried it the following way:</br>
</br>
</br>
// Check Message Payload for SOAP Fault Message via xPath expressions</br>
...</br>
// SOAP Fault Code</br>
zv_xPression = zc_constXPattern.replaceFirst("&", "faultcode");</br>
zv_soapFaultCode = XPathAPI.eval(zv_doc, (String) zv_xPression).toString();</br>
// SOAP Fault String</br>
zv_xPression = zc_constXPattern.replaceFirst("&", "faultstring");</br>
zv_soapFaultString = XPathAPI.eval(zv_doc, (String) zv_xPression).toString();</br>
// check for SOAP Fault Message</br>
if (zv_soapFaultCode.equals("") && zv_soapFaultString.equals("")) {</br>
// Create Audit Log entry - NOT a SOAP Fault Message</br>
zv_msgText = zc_constModuleName + " 0190: xPath - OK! This message is NOT a SOAP Fault Message";</br>
zv_audit.addAuditLogEntry(zv_msgKey, AuditLogStatus.SUCCESS, zv_msgText);</br>
zv_faultCheck = false;</br>
}</br>
else {</br>
...</br>
// Create Audit Log entry - SOAP Fault Message</br>
zv_msgText = zc_constModuleName </br>
+ " 0200: xPath - this message is a SOAP Fault Message. " </br>
+ " - Faultcode is: " + zv_soapFaultCode </br>
+ " - Faultstring is: " + zv_soapFaultString; </br>
zv_audit.addAuditLogEntry(zv_msgKey, AuditLogStatus.ERROR, zv_msgText);</br>
...</br>
}</br>
...</br>
</br></br>
But zv_soapFaultCode and zv_soapFaultString are always empty (with other payload tags this coding works fine).</br>
</br>
Any ideas? </br></br>
Thanx very much in advance!</br></br>
Regards,</br>
VolkerHi Alex!
Like already mentioned I solved my problem by identifying the SOAP exception with the messageClass attribute of the PI message header. Acess code:
try {
String zv_msgClass = zv_piMsg.getMessageClass().toString();
} catch (Exception e) {
zv_msgText = zc_constModuleName
+ " E0110: Message processing terminated."
+ " Reason: Error while getting MessageClass "
+ zv_dataSource
+ e;
// create trace and audit log entry (severity ERROR) for exception
zv_location.errorT(ZV_SIGNATURE, zv_msgText);
zv_audit.addAuditLogEntry(zv_msgKey, AuditLogStatus.ERROR, zv_msgText);
ModuleException me = new ModuleException(e);
zv_location.throwing(ZV_SIGNATURE, me);
e.printStackTrace();
throw me;
} // end of try-catch-block
But I do not think this will solve your problem. I am almost sure, that something in your Axis configuration is wrong/missing. If a handler cannot be instatiated then it really may be missing. Have a look at defaultTrace.trc. Maybe you will find more suitable information about the root cause of your problem. Also have a look at NWA under software components and/or application modules if you can find/see your modules.
But there is a general issue when trying to catch PI fault messages. If e.g. the requestor tries to login with wrong userid/pasword, then you will have no chance to catch this kind of error - at least as far as I know. Because in this very early stage of PI message processing no module is called.
One last question: Did you develop your own Adapter or just an adapter module? In the first case: Is your adapter started and healthy? Have a look at RWB -> communication channel monitoring.
Regards,
Volker -
Error while deploying the Adapter Module
Expets,
i am getting below error in communication channel:
Message processing failed. Cause: com.sap.engine.services.jndi.persistent.exceptions.NamingException: Exception during lookup operation of object with name localejbs/WriteExcelFile, cannot resolve object reference. [Root exception is javax.naming.NamingException: Error occurs while the EJB Object Factory trying to resolve JNDI reference Reference Class Name: Type: clientAppName Content: sap.com/WriteExcelEAR Type: interfaceType Content: local Type: ejb-link Content: WriteExcelFile Type: jndi-name Content: WriteExcelFile Type: local-home Content: com.sap.aii.af.lib.mp.module.ModuleLocalHome Type: local Content: com.sap.aii.af.lib.mp.module.ModuleLocal com.sap.engine.services.ejb3.runtime.impl.refmatcher.EJBResolvingException: Cannot start applicationsap.com/WriteExcelEAR; nested exception is: java.rmi.RemoteException: [ERROR CODE DPL.DS.6125] Error occurred while starting application locally and wait.; nested exception is: com.sap.engine.services.deploy.exceptions.ServerDeploymentException: [ERROR CODE DPL.DS.5035] Application [sap.com/WriteExcelEAR] cannot be started. Reason: it has hard reference to resource [com.sap.xi.repository] with type [library], which is not active on the server. Hint: 1) Is referred resource deployed? 2) Is referred resource able to start? at com.sap.engine.services.ejb3.runtime.impl.DefaultContainerRepository.startApp(DefaultContainerRepository.java:315)
I am also getting the same warning when i am deploying the adapter.
Reference list in application-j2ee-engine.xml is as follows:
engine.security.facade
engine.j2ee14.facade
com.sap.aii.af.svc.facade
com.sap.aii.af.ifc.facade
com.sap.aii.af.lib.facade
com.sap.base.technology.facade
com.sap.xi.repository
Kindly help.
Edited by: Priyanka Sharma on Jun 18, 2010 4:29 PMcom.sap.xi.repository reference is not required,, how are you deploying your module on PI server,
You must be using some external library for excel conversion, if external library is present in your deployed file, you don't need to add com.sap.xi.repository reference.
Check:
Is EAR to SDA conversion needed for EJB EAR module
if you opt to use CECLT tool provided with NWDS 7.1, make sure you import SAP EAR File(it will have External library) on your local system. -
This does not happen often but it does happen. We have an application that regular runs WMI queries to collect windows events. However, on a particular machine, on particular events, the windows event description that comes from the Win32_NTLogEvent.Message
field is null. The event does indeed have a description and that can clearly be seen in the Event Viewer.
One particular event that causes the problem is
Event Type: Information
Event Source: MsiInstaller
Event Category: None
Event ID: 1035
Date: 4/21/2010
Time: 8:51:53 AM
User: NT AUTHORITY\SYSTEM
Computer: COMP201002
Description:
Windows Installer reconfigured the product. Product Name: 32 Bit HP BiDi Channel Components Installer. Product Version: 1.1.0.2. Product Language: 1033. Reconfiguration success or error status: 0.
As you can see, the description exists. However, the field returned by WMI is null.
Any way i can diagnose the problem to see what's going on? Is this a WMI bug?Hi markoueis, I suggest you first check these links for troubleshooting WMI as the issue can be caused by WMI on the particular machine:
http://www.microsoft.com/technet/scriptcenter/topics/help/wmi.mspx
How to troubleshoot WMI-related issues in Windows XP SP2
http://support.microsoft.com/kb/875605
You can also try restart WMI service and see the result. If this does not work, you can try the steps in the following article to rebuild repository:
WMI Troubleshooting: The Repository on Vista / Server 2008
http://blogs.technet.com/b/askperf/archive/2008/07/11/wmi-troubleshooting-the-repository-on-vista-server-2008.aspx
Hope this helps!
Please remember to click “Mark as Answer” on the post that helps you, and to click “Unmark as Answer” if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread. -
Adapter Module Development Hashtable entries
Hi I am developing an adapter module, I need to capture the SourceDirectory and Source file Timestamp, I am not able to capture the directory and file time stamp. Is there any way we can Print out the Hashtable entries into the audit log ???
I am using the below code
String fileName = (String) mp.get("FileName");
String Directory = (String) mp.get("SourceDirectory");
String SourceFileTimestamp = (String) mp.get("SourceFileTimestamp");Hi,
>>>String fileName = (String) mp.get("FileName");
>>>String Directory = (String) mp.get("SourceDirectory");
>>>String SourceFileTimestamp = (String) mp.get("SourceFileTimestamp");
this approach works only for filename where did you read that it will work
for SourceDirectory or anything else?
you need to use adapter specific message arrtibutes to get that inside
an adapter module
that's the only way and it works for sure
Regards,
Michal Krawczyk -
Adapter Module Development in PI 7.1
Hi,
I need to develop an adapter module and am using NetWeaver PI 7.1.
1. Should I develop an EJB 2.1 or EJB 3.0 bean?
2. Should I develop a bean that conforms to both standards, if so, how?
Cheers,
EarlenceHi ,
These Links should be good enough for you.
http://www.sdn.sap.com/irj/scn/index;jsessionid=(J2EE3414900)ID1219082550DB01455545497474264448End?rid=/library/uuid/3bdc14e1-0901-0010-b5a9-a01e29d75a6a&overridelayout=true
http://www.sdn.sap.com/irj/scn/weblogs;jsessionid=(J2EE3414900)ID1219082550DB01455545497474264448End?blog=/pub/wlg/10260
http://www.sdn.sap.com/irj/scn/weblogs;jsessionid=(J2EE3414900)ID1219082550DB01455545497474264448End?blog=/pub/wlg/10319
Regards,
Amith. -
Some issues regarding JEE adapter module development in NWDS 7.1
Hi guys,
I'm trying to develop my first AM in NWDS 7.1 and I'm facing some issues which I'd be happy if you would help me out with.
1, I'm going step by step according this document http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/c0b39e65-981e-2b10-1c9c-fc3f8e6747fa&overridelayout=true but I have an information Warning "Classpath entry PI_AF_LIBS/... (all PI AF 7.1 classes) will not be exported or published. Runtime ClassNotFOundExcpetion may result". Why am I getting this if I have checked the checkboxes with these libraries in Project->Preferences->Java Build Path->Order and Export(tab)? If this checked I'd say it will be exported with the project.
2, I need to create an SDA file to deploy the module, because the server is not available directly. So first if I'm not wrong I need to have an EAR file which I can use to create the SDA. But how can I get this EAR file? This document describes only direct way of deployment.
Thanks in advance,
Olian1. The jars need to be referenced in the project build path to enable the compilation of the code
The warning can be overlooked as the jars are present in PI.
2. The EAR Project that gets created (as per the description in the referred document) can be exported to the get the necessary
ear file. -
Getting principal data as null in Adapter Module
Hello Everyone,
I am trying to work with Attachments in my Module.
The Scenario I have configured is that I have a Sender File Adapter, which picks up 2 files one as body and the second as attachment :
https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/1685 [original link is broken] [original link is broken] [original link is broken] [original link is broken]
In my Module I want to put the content of the attachment file into the main payload but the following line of Code returns a null value
Message msg = (Message)moduledata.getPrincipalData();
I can see the data in this case is present as Supplementary Data but the Principal Data in the moduledata is null.
Is this expected behavior in this case / all case where we would have attachments in the payload or something is wrong in the Configurations?
Can somebody clear my doubt as to what is exactly contained in the Principal Data and what is contained in the Supplementary Data ?
Any help will be greatly appreciated.
Best Regards,
KanwaljitHi Kanwaljit,
I haven't tried to pull attachments, but I use the following code successfully to get the XI message. It looks equivalent to what you're doing. Have you already manipulated the message before this point, using another module. Maybe you've swapped the principal and supplementary data?
public ModuleData process(ModuleContext moduleContext, ModuleData inputModuleData)
throws ModuleException {
Object obj = null;
Message msg = null;
try {
obj = inputModuleData.getPrincipalData();
msg = (Message) obj;
} catch (Exception e) {
ModuleException me = new ModuleException(e);
throw me;
I would look in the JavaDocs for the com.sap.aii.af.mp.module.ModuleData class to see what's available. This SAP Help page tells where to find the JavaDocs.
http://help.sap.com/saphelp_nw2004s/helpdata/en/32/43d84072378031e10000000a1550b0/content.htm
Thanks,
J Wolff -
Setting the charset from an adapter module
Hi folks,
I'm trying to set the charset encoding of a payload using an adapter module (I know there is a TextCodepageConverterBean, but I want to set the charset for a message that hasn't one yet). The problem is probably more clear using an example.
I output a UTF-8 flat string from my message mapping to the adapter framework (mail adapter in my case). Afterwards I want to convert this UTF-8 string to an ISO-8859 encoding with the TextCodepageConverterBean. But if I set the charset using the setContentType() function of my TextPayload object the information gets cut away. I'm using the format
setContentType("text/plain;charset=utf-8;name=Test.txt")
. But everything after the first semicolon is dropped. Setting the charset using the MessageTransformBean works, but I want to avoid this by all means, as I need to set the mime type from the adapter module.
This is running on NW2004 with SP 16 and the latest patch.
Any idea, why the MessageTransformBean works and not the setContentType call?This bug will be fixed with SP20.
Regards
Stefan -
Adapter Module Error-Sending excel file as an attachment of the mail
Hi ,
My scenario is as follows
1)I am sending an excel file as an attachment of the mail.I need to read that excel attachment as a payload.
So mail adapter is used in sender side.
To configure this, have used standard PayloadSwapBean module with proper module key.
Next to convert excel to XML another custom adapter module is being used.
Both this adapter module , I configured into the CC of sender mail adapter.
The order in which adapter modules are being used in the sender CC are as follows
1)localejbs/AF_Modules/PayloadSwapBean
2)localejbs/MDPExcelToXMLConversion
3)sap.com/com.sap.aii.adapter.mail.app/XIMailAdapterBean
MDPExcelToXMLConversion-Custom adapter module written to convert excel to xml.
I am getting the following error
exception caught during processing mail message [4899]com.sap.aii.af.lib.mp.module.ModuleException
And also,
no messages in coming MONI of PI.
Pls suggest what to do.
Thanks
AyanShabarish,
Will the ordering in which the adapter modules(In this case there are two-PayloadSwapBean & MDPExcelToXML) are appearing into Module tab of sender adapter matter?
Firstly, what is happenning
1)If I take out the custom adapter module MDPExcelToXML and put only PayloadSwapBean then it is successfully converting mail attachment into the main Payload i.e PayloadSwapBean module is working.
2)Nextly, my local code( i.e java code without including standard Module specific method like ejbActivate(),ejbPassivate(),process() etc etc.)) for MDPExcelToXML is successfuly converting the excel file into the XML file.Then I am making the local code into adapter module specific code and deploying that.
A few question arises here,
Do I need to do any specific configurations here in PI for this particular things.Maybe both the adapter module is clashing with each other.
And also using tracing and logging into my custom adapter module code.Getting the following error,
java.io.IOException: Unable to read entire header; 116 bytes read; expected 512 bytes#
Thanks
Ayan
Maybe you are looking for
-
I, like others that I see on the forum, have a problem with missing characters. I am inserting pdfs into another pdf and while the original pdf displays and prints perfectly, when I insert it into the master document it no longer is correct. I tried
-
Loading InfoObject master data into Cube
Hi Guys, I have a question. I created an InfoObject as a data target and loaded data into that data target. I created a cube and I want to include this infoobject in the cube. Now How do I load data into this cube from the InfoObject.Because the Inf
-
Bridge To Nowhere - Try Xnview
Constant freeze-ups, lock-ups-- and not just of Adobe Bridge either, the darned thing locks up my entire PC about every fourth or fifth time I switch previews of short WMV video clips, or even simply switch the application focus: from Bridge to the D
-
Video, Website and Software incompatibility
Hi Folks! Three questions about incompatibility on my iMac: 1) The following website will not open or allow me to run their website appllication software, https://www4.webcrf.net/nma53032/pfts.dll?PVN=21678 The site is a pharmaceutical research platf
-
HT1449 Why can't I just move the entire iTunes folder?
In reference to the linked article above, why can't I just move the entire iTunes folder and create an alias where it used to be ~/Music/iTunes instead of that tedious process?