Blog Lead Image - Cloud Platform https://www.avioconsulting.com/taxonomy/term/362 en Oracle ICS - Advanced XSLT Mapping in JDeveloper https://www.avioconsulting.com/blog/oracle-ics-advanced-xslt-mapping-jdeveloper <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/oracle-ics-advanced-xslt-mapping-jdeveloper" hreflang="en">Oracle ICS - Advanced XSLT Mapping in JDeveloper</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>While mastering the nuances of Oracle Integration Cloud Service (ICS), I was pushing along through a transformation mapping from a fairly complex source to an equally complex target.  Requirements slowly spiraled from 'simple' mappings to 'can-i-even-do-that' mappings.  ICS provides a decent graphical interface for creating transformations (once you get familiar with it).  It allows for an easy way to map from source to target, as long as you don't need to do anything complicated.</p> <p>If you aren't familiar with ICS, check out another blog on <a href="http://www.avioconsulting.com/blog/testing-my-integration-on-ICS">Getting Your Feet Wet in ICS</a>.</p> <p><img alt="Simple mapping" data-entity-type="file" data-entity-uuid="a7cb94c7-a24f-4501-9172-c7cc44daf2be" src="/sites/default/files/inline-images/SimpleMap.png" /></p> <p>Although possible, it takes nearly 15 clicks (assuming you do it in the correct order) to add an if conditional similar to:</p> <pre> <code class="language-xml">&lt;xsl:if test="string-length($returnCode) &gt; 0"&gt; &lt;tns:Keyword&gt; &lt;xsl:value-of select="$returnCode"/&gt; &lt;/tns:Keyword&gt; &lt;/xsl:if&gt;</code></pre> <p><img alt="Conditional If" data-entity-type="file" data-entity-uuid="9cf0fa42-062c-40b5-8b36-b9d7fae0309b" src="/sites/default/files/inline-images/conditionalIf.png" /></p> <p>It's the complex scenarios and advanced functions that make transformations so powerful, has Oracle actually removed this functionality?</p> <p><strong>Of course not!</strong>  The core libraries that execute a transformation are still there, and the transformations can be edited externally, e.g. in JDeveloper (or whatever xslt editing tool you wish), although it's not entirely intuitive how to make this work.</p> <p>Keep in mind, that although JDeveloper makes it easy to add in complex functionality, I do suggest, to try and keep transformations simple.  More about this later.</p> <h2 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-ButWhyisthisNecessary?">But why is this necessary?</h2> <p>On a recent engagement, I was tasked with merging the response data of two services, into a new enriched request.  Having done this many times in SOA, I didn't think much of it.  </p> <p>I quickly found that the graphical interface on ICS could be a bit jumpy (especially with a large number of payload elements), and not as intuitive as I expected. The graphical interface was functional, but it only intuitively worked for my 'basic' mapping instructions, a source to target.  A conditional 'if' statement requires ~15 clicks, and my requirement called for dozens of 'if' conditions, for most of my mapped attributes.  There has to be a better way, I would've had to spend all day just mapping 'if's!</p> <p>Doing some planning, on how to accomplish the rest of my mapping requirements, I realized I could take advantage of more advanced features in XSLT including the use of variables, selectors, and even templates, but these features don't exist in the graphical interface mapper in ICS (or maybe I couldn't find them).  Although included in the graphical mapper, the if-conditions and choose-when tend to take more effort than necessary.</p> <h2 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-SowhyshouldIeditatransformationoutsideofICS?">So why should I edit a transformation outside of ICS?</h2> <p>There are specific cases where you would want to edit the transformation externally.</p> <ul><li>Some mappings can be done significantly faster in source mode.  These include: <ul><li>'If' conditionals</li> <li>'choose-when-otherwise' conditionals</li> <li>Large sections of similar/repeating segments</li> </ul></li> <li>More advanced functions/transformations can also be implemented, including: <ul><li>Variables</li> <li>Advanced selectors</li> <li>Templates</li> </ul></li> <li>When a transformation has a large schema, the graphical mapper starts to require 'show more' clicks to reveal additional elements, this gets tedious rather quickly.</li> <li>JDeveloper has a decent testing harness to create sample files, and execute the transformation at design time</li> </ul><p><img alt="Mapping from JDeveloper" data-entity-type="file" data-entity-uuid="64eb0b68-e5bf-48b8-9ca7-b48a5ded9efa" src="/sites/default/files/inline-images/JdevMapping.png" /></p> <p> </p> <p><strong>Tip: </strong><em>Editing the transformation <strong>does not</strong> enforce some rules that the graphical mapper would.  These errors can be found after re-importing, or trying to activate an integration.</em></p> <h2 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-Andwhywouldn'tIexternallyedittransformations?">And why wouldn't I externally edit transformations?</h2> <p>While it is simple to edit a transformation outside of the ICS graphical mapper, there are reasons you shouldn't do it.</p> <p>If kept simple, to update a mapping, requires an export of the entire integration, make the changes to the mapping, then a re-import back into ICS.</p> <p>If you choose to use the 'import' function on the transformation (and not the entire integration), it locks that transformation.  Once a mapping is locked (more on this below), ICS enforces some constraints</p> <ul><li>The mapping is no longer able to be viewed or edited from the ICS portal.  This makes it a little more difficult to debug when issues go wrong.</li> <li>It is not easy to add additional sources.  It's easier to create a new mapping action that includes the required sources, then copy the transformation from the source of the original mapping document.  Also, unless the sources were mapped in the same order, the namespace prefixes may have changed.</li> <li>Exporting / Importing tends to wreak havoc on the XML formatting, making it a little more difficult to locate changes.</li> <li>The built-in transformation tester in the graphical UI was convenient, although it didn't allow me to save any source files.</li> </ul><h2 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-AGoldenRule">A Golden Rule</h2> <p>Ok, not golden, but the general rule, <strong>DO NOT</strong> edit mappings outside of ICS unless the mappings are complex and use features not available in the graphical mapper.</p> <p>It is <strong>OK</strong> to use JDeveloper to update a mapping file with large copy/paste sections to save time, and run some external tests, however, if the mapping isn't complicated and doesn't need advanced features, keep it simple.  There is extra overhead when debugging if the mapping file isn't accessible from the graphical ICS mapper.</p> <p>Now, there are some scenarios that do require XSLT features not available from the ICS mapper: variables, advanced selectors, and templates; this allows us to meet those needs as well.</p> <p> </p> <h2 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-Justafewsimplesteps">Just a few simple steps</h2> <p>Oracle has the <a href="https://docs.oracle.com/en/cloud/paas/integration-cloud-service/icsug/importing-map-file-oracle-jdeveloper.html" rel="nofollow">Import/Export documented</a>, but I'll cover what I did to make this work.</p> <p> </p> <h3 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-DesigntheIntegration">Design the integration</h3> <p>So now let's discuss a common flow of how, and when to update the mappings externally.  Follow normal procedure for designing and implementing an integration, but leave the complicated mapping for later.  Create the required connections and appropriate flow of the integration, laying out the different mapping elements.  For the complex transformations, add some basic mappings from any source variables you need (we can fix this transformation later).</p> <p><strong>Tip: </strong><em>It's important to include at least one mapping from each different source so that they are added as a source reference in the XSL.</em></p> <p>In some cases, the mappings start out simple and straightforward and slowly evolve into very complex mappings.</p> <h3 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-ExporttheIntegration">Export the integration</h3> <p>Now that the integration has been designed, we need to export it to get to the source files.  You can manually export an integration from the ICS portal, however, check out the <a href="http://www.avioconsulting.com/blog/avio-ics-maven-plugin" rel="nofollow">AVIO ICS Maven Plugin</a> for a scripted solution (and follow best practices to get the code into source control!).</p> <h4 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-Finding/AccessingtheXSL">Finding / Accessing the XSL</h4> <p>If using the <a href="http://www.avioconsulting.com/blog/avio-ics-maven-plugin" rel="nofollow">AVIO ICS Maven Plugin</a>, the mapping files are going to be exported into <strong>&lt;INTEGRATION&gt;</strong>/<strong>src/main/iar/resources</strong> directory, otherwise, they will be in the exported artifacts under <strong>&lt;INTEGRATION&gt;.iar/icspackage/project/&lt;INTEGRATION&gt;/resources</strong> directory.</p> <p>There isn't a great way to figure out which 'processor' folder the desired transformation is in, however, a search for *.xsl will get you pretty close.  Another trick is to use the "search in files" feature on the name of the request or response object, e.g. "getObjectResponses" where GetObject is the ICS action.  Keep in mind, they are numbered from first added to last, so some assumptions can be made on which folder they are in.  </p> <h4 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-ViewinJDeveloper">View in JDeveloper</h4> <p>Now that we know which transformations we want to edit, let's open them in our favorite IDE, JDeveloper (or other IDE of your choice).</p> <p>Sure, you could open the xslt directly from JDeveloper, however, it is more convenient if we add the source files to a JDeveloper project, then we can utilize more features of the IDE.</p> <p><strong>Tip: </strong><em>This also allows to create sample request xml files, and save them for future debugging!</em></p> <p> </p> <h5 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-CreateanewApplication/Project">Create a new Application / Project</h5> <p>For my latest engagement, I created a new JDeveloper application, that contained a project for each of my integrations.  Just use a plain java project when creating the integration projects. </p> <p>Using a symlink or mklink (windows), create a link from within the project src directory, to the exported integrations resource directory that contains all of the xsl files.  This allows us to keep JDeveloper project artifacts out of the integration source.</p> <p>The below sample assumes the integration export is in the same folder as JDeveloperApplication.</p> <p>Creating Symlink in Linux:</p> <pre> <code class="language-go">:~/exports$ cd JdeveloperApplication/AVIO_FTP_INTEGRATION/src :~/exports/JdeveloperApplication/AVIO_FTP_INTEGRATION/src$ ln -s ../../../AVIO_FTP_INTEGRATION/src/main/iar/resources resources</code></pre> <p>Creating MKLink in Windows:</p> <pre> <code class="language-go">cd JdeveloperApplication\AVIO_FTP_INTEGRATION\src mklink /D win-resources ..\..\..\AVIO_FTP_INTEGRATION\src\main\iar\resources &lt;&lt;===&gt;&gt; D:\exports\AVIO_FTP_INTEGRATION\src\main\iar\resources</code></pre> <p><strong>Tip: </strong><em>The symlink or mklink can be checked into source control.  A mklink is visible under both Linux and Windows.</em></p> <p>Now the resource files are visible in JDeveloper</p> <p><img alt="Project structure" data-entity-type="file" data-entity-uuid="8df3e21e-487a-47aa-b9fe-41721f1b56ca" src="/sites/default/files/inline-images/ProjectStructure_2.png" /></p> <h4 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-MaketheChangestotheXSL">Make the changes to the XSL</h4> <p>As you would a SOA project, open the xsl, and create your advanced transformation.</p> <p class="quote-bg-dark"><strong>Tip:</strong> <em>After exporting from ICS, the transformation is all on a single line.  Use the 'reformat' feature in source mode to organize the transformation.  Occasionally, after reformatting, JDeveloper will need to be restarted to view the transformation in 'design' mode.</em></p> <div class="quote-bg-dark"> </div> <h3 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-ImporttheIntegration">Import the integration</h3> <p>Follow the instructions with the Maven plugin to reimport the integration, or create an archive file manually and import.</p> <p> </p> <h2 id="BLOG-ICSAdvancedXSLTMappinginJDeveloper-Whattoknow,theTipsandTricks">What to know, the Tips and Tricks</h2> <ul><li>After adding functionality that is not available from the graphical mapper, the mapping might show as a 'warning' or 'error', use the Import feature of the mapper to select the correct xsl file and 'Lock' the mapping from editing in ICS.<br /><img alt="Import" data-entity-type="file" data-entity-uuid="be983f6c-88da-4b80-b24d-aa093f1d7825" src="/sites/default/files/inline-images/ImportTransformation.png" /><img alt="Imported Map" data-entity-type="file" data-entity-uuid="cc6dc024-5a29-4f11-9ed5-8ae793825d00" src="/sites/default/files/inline-images/ImportedMap.png" /></li> <li>If possible, try to keep the mappings simple, so that they don't have to be locked.  This allows for a shorter debugging cycle if the mapping can be viewed in the ICS portal.</li> <li>If a map shows 'Warning', it could still work.  Warnings are typically the result of using a variable in the transformation, and ICS isn't sure if it works.  Either ignore these (not ideal), remove the variable, or use the import feature to lock the transformation.</li> <li>The first time you open a xslt in JDeveloper, it will likely be a really long single line.  Use the 'Reformat' feature to make it readable.  In some cases, JDeveloper still won't let you see the 'Design' view, just close and reopen JDeveloper to enable this view.</li> </ul><p> </p> <p> </p> <p> </p> <p> </p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=705&amp;2=comment_node_blog&amp;3=comment_node_blog" token="NaDqoUI0apQ7wfXYJxgwE_7DpDG1GRoSso90cKZuGY4"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/taxonomy/term/365" hreflang="en">Oracle</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Mon, 09 Apr 2018 13:41:51 +0000 Kevin King 705 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/oracle-ics-advanced-xslt-mapping-jdeveloper#comments AVIO Releases an ICS Maven Plugin https://www.avioconsulting.com/blog/avio-releases-ics-maven-plugin <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/avio-releases-ics-maven-plugin" hreflang="en">AVIO Releases an ICS Maven Plugin</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><h1>AVIO Releases an ICS Maven Plugin</h1> <p>Released today, the AVIO ICS Maven plugin has been released to <a href="https://repo.maven.apache.org/maven2/com/avioconsulting/maven/ics-maven-plugin/1.0/">Maven Central</a>.</p> <p><a href="https://docs.oracle.com/en/cloud/paas/integration-cloud-service/index.html">Oracle ICS</a> (Integration Cloud Service) is a cloud platform with a web-based interface used to quickly build integrations between cloud and on-premise applications.</p> <p>The ICS Maven plugin helps make the software development lifecycle simpler by scripting exports, imports, activation and more, allowing developers to easily store their code in source control, and automate the promotion to other cloud environments.</p> <p>Check out <a href="http://www.avioconsulting.com/blog/avio-ics-maven-plugin">http://www.avioconsulting.com/blog/avio-ics-maven-plugin</a> for more details.</p> <p>Source code in GitHub at: <a href="https://github.com/avioconsulting/ics-maven-plugin">https://github.com/avioconsulting/ics-maven-plugin</a></p> <p>To use in your pom, just add the packaging type, and plugin details (See <a href="https://github.com/avioconsulting/ics-maven-plugin">README</a>) :</p> <pre> <code class="language-xml"> &lt;packaging&gt;iar&lt;/packaging&gt; . . . &lt;plugin&gt; &lt;groupId&gt;com.avioconsulting.maven&lt;/groupId&gt; &lt;artifactId&gt;ics-maven-plugin&lt;/artifactId&gt; &lt;version&gt;1.0&lt;/version&gt; &lt;extensions&gt;true&lt;/extensions&gt; &lt;/plugin&gt;</code></pre> <p>Happy Cloud Developing!</p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=704&amp;2=comment_node_blog&amp;3=comment_node_blog" token="Jq8jxAoHsiarU2qubMhd326HOe89xuA99TGAxBzRl2k"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/taxonomy/term/365" hreflang="en">Oracle</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Tue, 27 Mar 2018 19:56:22 +0000 Kevin King 704 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/avio-releases-ics-maven-plugin#comments AVIO ICS Maven Plugin https://www.avioconsulting.com/blog/avio-ics-maven-plugin <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/avio-ics-maven-plugin" hreflang="en">AVIO ICS Maven Plugin</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><h1>AVIO ICS Maven Plugin</h1> <p>I began getting <a href="http://www.avioconsulting.com/blog/testing-my-integration-on-ICS" rel="nofollow">my feet wet</a> (shameless self-advertising) and took in the whole ICS experience.</p> <p>It has been a fun adventure working in ICS, mastering the art of deactivating, editing, fixing, saving, activating, and finally testing... only to curse at a simple forgotten step and repeat the process again.  Some tasks that used to be simple became harder, some tasks that were complicated and confusing became simpler.</p> <h2>What do you mean my changes are lost? (Heavy sigh)</h2> <p><img alt="AVIO Lock Is Lost" data-entity-type="file" data-entity-uuid="73cc7e8e-5a20-4906-87e3-9c42e34d7bfe" src="/sites/default/files/inline-images/AVIO_LockIsLost.png" /></p> <p>Sometimes when making changes to an integration or rearranging a layout, something becomes corrupt and ICS does not activate, or fails to edit properly, or loses my lock! I haven't dug into the root cause, and it easily could be my fault, but my first instinct is to make sure I protect myself in case it happens again.</p> <p>So I began manually exporting the integration after each development accomplishment. I would date these exports and keep them locally on my computer to re-import later if anything went wrong. Eventually, I started expanding them and putting them into source control, which allowed me to monitor changes to files. The process wasn't complicated, but it required too much time and way too many mouse clicks.</p> <h2>Why can't this be done programmatically?</h2> <p>Of course, it can! Oracle has exposed REST APIs to integrate with ICS. There are 2 versions available, <a href="https://docs.oracle.com/en/cloud/paas/integration-cloud-service/icsra/index.html" rel="nofollow">v1</a> and <a href="https://docs.oracle.com/en/cloud/paas/integration-cloud-service/icsrb/index.html" rel="nofollow">v2</a> (click for Oracle Documentation). As a general rule, use v2; however, some features aren't available in v2, and therefore v1 has to be used for some features (for example, activate and deactivate).</p> <p><img alt="REST APIs Version 2" data-entity-type="file" data-entity-uuid="6beeefbd-1cc3-49c8-9acb-19b47388cde8" src="/sites/default/files/inline-images/RESTAPIv2.png" /></p> <p>Soon, it became tedious for me to even use the REST APIs, and so I created a maven plugin to do the work for me.</p> <p> </p> <h2>Enter ics-maven-plugin.</h2> <p>AVIO Consulting has created a maven plugin, aptly named ics-maven-plugin, which is currently available through GitHub at <a href="https://github.com/avioconsulting/ics-maven-plugin" rel="nofollow">https://github.com/avioconsulting/ics-maven-plugin</a>. <s>The plugin will soon be available through Maven Central as well (I'll update when that happens).</s></p> <p>*Update (03-27-2018): This plugin is now available on Maven Central - <a href="https://repo.maven.apache.org/maven2/com/avioconsulting/maven/ics-maven-plugin/1.0/">https://repo.maven.apache.org/maven2/com/avioconsulting/maven/ics-maven-plugin/1.0/</a></p> <p>This new plugin has several features that make the development lifecycle much easier to bear!</p> <p>Keep in mind, none of these goals/phases makes development any simpler, you still have to develop the integrations and connections from the portal, but it does help significantly with the development lifecycle.</p> <p>Also, as a side note, sending messages to my colleagues saying that I had to write a <a href="https://maven.apache.org/developers/mojo-api-specification.html" rel="nofollow">Mojo</a> was mildly entertaining.</p> <h3>Phases</h3> <p>This plugin defines a new packaging type (iar) and hooks into the Maven lifecycle at the following phases:</p> <ul><li>generate-resources <ul><li>By default, this does nothing.</li> <li>If the 'export' property is set to true (-Dexport=true), it will run the 'export' goal and will export the integration defined in the POM file</li> <li>If the 'connection' property is set to the name of a connection (-Dconnection=EBS), a template JSON config file will be created</li> </ul></li> <li>package <ul><li>Runs the 'package' goal, which generates an iar file</li> </ul></li> </ul><h3>Additional individual goals</h3> <p>Additional goals are provided for supporting tasks but are not part of the standard maven lifecycle.</p> <ul><li>activate - Activates an integration</li> <li>deactivate - Deactivates an integration</li> <li>import <ul><li>Deactivates the integration if it is present and active</li> <li>Imports (or updates) the integration (iar file)</li> <li>Generates the connections / lookups / schedule components as necessary</li> <li>Updates the connection properties</li> <li>Activates the integration</li> </ul></li> <li>updateConnection - Updates the connection properties for a specific connection</li> </ul><p>See the <a href="https://github.com/avioconsulting/ics-maven-plugin" rel="nofollow">ics-maven-plugin</a> documentation for the latest functionality and detailed usage instructions.</p> <h3>Exported Project Structure</h3> <p>The exported IAR has a non-standard folder structure.  This plugin moves some folders around and puts them into a more common structure.  Additionally, the folder that contained the version number has been removed.  When the package phase is executed this structure is converted back to the ICS standard structure within the IAR file.</p> <p>Here are the basic folder mappings that occur:</p> <ul><li>icspackage/project/AVIO_FTP_INTEGRATIO_01.00.0000 → src/main/iar</li> <li>icspackage/appinstances → src/main/resources/connections</li> <li>icspackage/dvm → src/main/resources/lookups</li> <li>icspackage/schedule → src/main/resources/schedule</li> </ul><p>Below is an example of an exported integration that would get checked into source control.</p> <p><img alt="Export Folder Structure" data-entity-type="file" data-entity-uuid="f2a3d5a9-d535-4950-b1b6-1f18fee9aedd" src="/sites/default/files/inline-images/FolderStructure.png" /></p> <h2>ICS Development Lifecycle</h2> <p>First design and implement your integration within ICS, adding the invokes and actions as well as configuring your connections. Once you have something working, its time to back it up and save it in source control.</p> <h3>Export</h3> <p>Let's start with the basic function so that a copy of the integration can be stored in source control.</p> <p>The export goal will:</p> <ul><li>Use the API to download an export IAR file</li> <li>Expand the archive file locally</li> <li>Restructure the folders into the standard maven project structure (src/main directories)</li> </ul><p>The exported integration also includes details of dependent artifacts. So now an Integration project will be self-contained, with references to Connections, Lookups, and Schedules.</p> <pre> <code>kevin@kking-lt3:~/code/avio/demos/packages/avio-integration/AVIO_FTP_INTEGRATIO$ mvn generate-resources -Dexport=true -Denv=DEV [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building AVIO_FTP_INTEGRATIO 01.00.0000 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-enforcer-plugin:1.4:enforce (enforce-property) @ AVIO_FTP_INTEGRATIO --- [INFO] [INFO] --- maven-resources-plugin:2.7:copy-resources (copy-project-properties) @ AVIO_FTP_INTEGRATIO --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 2 resources [INFO] [INFO] --- properties-maven-plugin:1.0-alpha-2:read-project-properties (default) @ AVIO_FTP_INTEGRATIO --- [INFO] [INFO] --- ics-maven-plugin:1.0-SNAPSHOT:export (default-export) @ AVIO_FTP_INTEGRATIO --- [INFO] Exporting integration AVIO_FTP_INTEGRATIO_01.00.0000 from https://avioconsultingcloud.integration.us2.oraclecloud.com [INFO] Expanding ICS export, use -Dexpand=false to disable it. Optionally add -Dclean=true to remove existing files before expanding. [INFO] [Integration.exportIntegration] Starting [INFO] [RestUtilities.invokeService] Invoking REST Service [INFO] [RestUtilities.invokeService] Calling GET on https://avioconsultingcloud.integration.us2.oraclecloud.com/icsapis/v2/integrations/{id}/archive [INFO] [RestUtilities.invokeService] Using params: {id=AVIO_FTP_INTEGRATIO|01.00.0000} [INFO] [RestUtilities.invokeService] Service returned 200 in 1533 ms. [INFO] [Integration.expandIar] Decompression for target/AVIO_FTP_INTEGRATIO_01.00.0000.iar has commenced. [INFO] [Integration.expandIar] Decompression for target/AVIO_FTP_INTEGRATIO_01.00.0000.iar has completed. [INFO] [Integration.iarToProjectStructure] Starting, copying from target/iar [INFO] [Integration.iarToProjectStructure] Finished [INFO] [Integration.exportIntegration] Complete [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.042 s [INFO] Finished at: 2018-02-26T14:56:06-06:00 [INFO] Final Memory: 18M/253M [INFO] ------------------------------------------------------------------------</code></pre> <p>At this point, make sure you add the exported files to source control! Keep in mind the plugin also does not identify the differences from a previous version in source control, specifically any removed files.</p> <p>Once exported, this allows for advanced editing of XSLTs within JDeveloper as well.</p> <h3>Import into ICS</h3> <p>Now that the integration code is in source control, let's import it back into our environment or promote it to a new environment.</p> <p>The import goal will now:</p> <ul><li>Deactivate existing integrations</li> <li>Import (new) or update (existing) the integration</li> <li>Create connections and lookups (with configuration updates)</li> <li>Activate the integration</li> </ul><p>Now that saves time and a whole bunch of clicks! Yay!</p> <pre> <code>kevin@kking-lt3:~/code/avio/demos/packages/avio-integration/AVIO_FTP_INTEGRATIO$ mvn initialize ics:import -Denv=DEV [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building AVIO_FTP_INTEGRATIO 01.00.0000 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-enforcer-plugin:1.4:enforce (enforce-property) @ AVIO_FTP_INTEGRATIO --- [INFO] [INFO] --- maven-resources-plugin:2.7:copy-resources (copy-project-properties) @ AVIO_FTP_INTEGRATIO --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 2 resources [INFO] [INFO] --- properties-maven-plugin:1.0-alpha-2:read-project-properties (default) @ AVIO_FTP_INTEGRATIO --- [INFO] [INFO] --- ics-maven-plugin:1.0-SNAPSHOT:import (default-cli) @ AVIO_FTP_INTEGRATIO --- [INFO] Importing integration AVIO_FTP_INTEGRATIO_01.00.0000 to https://avioconsultingcloud.integration.us2.oraclecloud.com [INFO] [Integration.importIntegration] Starting [INFO] [Integration.retrieveIntegrationDetails] Starting [INFO] [RestUtilities.invokeService] Invoking REST Service [INFO] [RestUtilities.invokeService] Calling GET on https://avioconsultingcloud.integration.us2.oraclecloud.com/icsapis/v1/integrations/{integration}/{version} [INFO] [RestUtilities.invokeService] Using params: {integration=AVIO_FTP_INTEGRATIO, version=01.00.0000} [INFO] [RestUtilities.invokeService] Service returned 200 in 1212 ms. [INFO] [Integration.retrieveIntegrationDetails] Complete [INFO] [Integration.importIntegration] Current status: ACTIVATED [INFO] [Integration.deactivate] Starting [INFO] [RestUtilities.invokeService] Invoking REST Service [INFO] [RestUtilities.invokeService] Calling POST on https://avioconsultingcloud.integration.us2.oraclecloud.com/icsapis/v1/integrations/{integration}/{version}/deactivate [INFO] [RestUtilities.invokeService] Using params: {integration=AVIO_FTP_INTEGRATIO, version=01.00.0000} [INFO] [RestUtilities.invokeService] Service returned 200 in 3151 ms. [INFO] [Integration.deactivate] Complete [INFO] [RestUtilities.invokeService] Invoking REST Service [INFO] [RestUtilities.invokeService] Calling PUT on https://avioconsultingcloud.integration.us2.oraclecloud.com/icsapis/v2/integrations/archive [INFO] [RestUtilities.invokeService] Using params: {} [INFO] [RestUtilities.invokeService] Service returned 200 in 624 ms. [INFO] [Integration.importIntegration] Complete [INFO] [Integration.getConnections] Finding connections. [INFO] [Integration.retrieveIntegrationDetails] Starting [INFO] [RestUtilities.invokeService] Invoking REST Service [INFO] [RestUtilities.invokeService] Calling GET on https://avioconsultingcloud.integration.us2.oraclecloud.com/icsapis/v1/integrations/{integration}/{version} [INFO] [RestUtilities.invokeService] Using params: {integration=AVIO_FTP_INTEGRATIO, version=01.00.0000} [INFO] [RestUtilities.invokeService] Service returned 200 in 466 ms. [INFO] [Integration.retrieveIntegrationDetails] Complete [INFO] [Integration.getConnections] Integration AVIO_FTP_INTEGRATIO has 1 unique connections. [INFO] [RestUtilities.invokeService] Invoking REST Service [INFO] [RestUtilities.invokeService] Calling GET on https://avioconsultingcloud.integration.us2.oraclecloud.com/icsapis/v2/connections/{id} [INFO] [RestUtilities.invokeService] Using params: {id=AVIO_FTP} [INFO] [RestUtilities.invokeService] Service returned 200 in 238 ms. [INFO] [Connection.retrieveConnectionDetails] Complete [INFO] Connection AVIO_FTP has status CONFIGURED [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] [RestUtilities.invokeService] Invoking REST Service [INFO] [RestUtilities.invokeService] Calling POST on https://avioconsultingcloud.integration.us2.oraclecloud.com/icsapis/v2/connections/{id} [INFO] [RestUtilities.invokeService] Using params: {id=AVIO_FTP} [INFO] [RestUtilities.invokeService] Service returned 200 in 1166 ms. [INFO] [Connection.updateConnection] Complete [INFO] [Integration.activate] Starting [INFO] [RestUtilities.invokeService] Invoking REST Service [INFO] [RestUtilities.invokeService] Calling POST on https://avioconsultingcloud.integration.us2.oraclecloud.com/icsapis/v1/integrations/{integration}/{version}/activate?enablePayloadTracing={payloadTrace}&amp;enableTracing={enableTrace} [INFO] [RestUtilities.invokeService] Using params: {integration=AVIO_FTP_INTEGRATIO, payloadTrace=true, enableTrace=true, version=01.00.0000} [INFO] [RestUtilities.invokeService] Service returned 200 in 9943 ms. [INFO] [Integration.activate] Complete [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 18.261 s [INFO] Finished at: 2018-02-26T15:01:44-06:00 [INFO] Final Memory: 22M/255M [INFO] ------------------------------------------------------------------------</code></pre> <p> </p> <h2>Conclusion</h2> <p>This plugin now automates some tedious tasks and implements the release process into a CI/CD pipeline.</p> <p>I hope this helps others in their ICS projects!</p> <p> </p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=701&amp;2=comment_node_blog&amp;3=comment_node_blog" token="yc1DkD8jVHcK4v8dTp0EchwD1q_r0Ri4Jt9DMogSoIw"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/taxonomy/term/365" hreflang="en">Oracle</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Fri, 16 Mar 2018 12:53:46 +0000 Kevin King 701 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/avio-ics-maven-plugin#comments The Role of IT in Digital Transformation https://www.avioconsulting.com/blog/it-in-digitaltransformation <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/it-in-digitaltransformation" hreflang="en">The Role of IT in Digital Transformation</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p margin-bottom:="" style=""><span id="cke_bm_78C" style="display: none;"> </span>Prophet recently released Altimeter’s report on their current-year research into the state of digital transformation. <a href="https://sites.prophet.com/altimeter/2017-state-digital-transformation/#.WdaO3jOZOi6">The 2017 State of Digital Transformation Report</a> aggregates data taken from the survey responses of 528 digital transformation leaders and strategists. It reveals some interesting patterns, a few of which we found noteworthy.</p> <h2>IT and CIO/CTO Increasingly Responsible For Digital Transformation</h2> <p>While recent years have seen CMOs most often in charge of digital transformation initiatives (which the authors attribute to the focus on customer experience), this year’s responses indicated that CIOs and CTOs were emerging as executives most likely to lead transformation initiatives.</p> <p>Correspondingly, IT departments edged out marketing departments as the department most frequently reported as leading a company’s digital transformation efforts.</p> <p>The authors connect this trend to a couple of observations.</p> <h3><em>1. All Companies are becoming technology companies</em></h3> <p>The centrality of technology investment and deployment to digital transformation, as well as disruptive technologies on the horizon like AI, machine learning, and IoT, make IT departments the most natural choice for leading transformation initiatives.</p> <h3><em><strong>2. Cross-functional groups have proven the most effective in managing digital transformation</strong></em></h3> <p>Successful digital transformation is enterprise-wide, and CIOs/CTOs most often manage enterprise-wide technology initiatives.</p> <h2>Company Culture Among The Top Barriers To Change</h2> <p>This comes as no surprise. Culture is deeply ingrained. It’s natural that changing it would be one of the biggest challenges of any digital transformation journey. While it’s often taken as a given that digital business transformation begins with people, companies appear to be struggling with making that start effectively.</p> <h2>Empowered Customers Drive Initiatives; Investments In Understanding Them Lag</h2> <p>While “evolving customer behaviors and preferences” was the most frequently reported driver of companies’ digital transformation efforts, fewer than half of those same companies included among their digital transformation initiatives research into digital touch points and the customer journey.</p> <h2>AVIO Consulting: Elevate your business by evolving your IT.</h2> <p>Companies are looking to their IT departments for digital transformation leadership. We equip you to deliver.</p> <h3><strong>Smart, Far-sighted Solutions</strong></h3> <p>An elite team of highly trained experts, we design, build, and deploy modern API-based enterprise solutions that help you clear your immediate hurdle while rendering you more agile, more efficient, and more fit for the Darwinian struggle afoot in the digital landscape.</p> <h3>DevOps Mentorship</h3> <p>Technology in and of itself is not transformative. Digital business transformation is first and foremost a business transformation. And culture change is key to that transformation. According to the authors,</p> <p class="text-align-center"><em>"Company cultures continue as a top impediment to change; affecting support of digital transformation initiatives on all fronts...Without an empowered culture focused on agility and growth, digital transformation and innovation are greatly hampered."</em></p> <p>DevOps is both a philosophy and a way of working. It aims to increase productivity, foster collaboration, and encourage innovation. Two of its core values are culture and sharing.</p> <p>AVIO equips you to you lead the culture change by mentoring you throughout your project and beyond in the DevOps methodologies and Agile Software Development practices we employ to deliver your solution.</p> <h3> </h3> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=686&amp;2=comment_node_blog&amp;3=comment_node_blog" token="PhdBH5xGkdV2VpyR5yShnjgqEfl5EJnvaWgxxOVXLT0"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/digital-transformation" hreflang="en">Digital Transformation</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Thu, 26 Oct 2017 16:31:16 +0000 Jordan Nichols 686 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/it-in-digitaltransformation#comments Docker with AWS Elastic Beanstalk: What's in it for you? https://www.avioconsulting.com/blog/docker-aws-elastic-beanstalk-whats-it-you <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/docker-aws-elastic-beanstalk-whats-it-you" hreflang="en">Docker with AWS Elastic Beanstalk: What&#039;s in it for you?</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p dir="ltr">The Docker revolution was based on the promise to add automation and customizability to both application development cycles and deployments. Microservices, which in Docker words means each container in a cluster performs only one specific task, is in fashion now. However, managing large numbers of containers may become a very complex and time-consuming task in the long run. Enter AWS Elastic Beanstalk.  </p> <p dir="ltr">Elastic Beanstalk service can abstract away several system administration levels, as AWS itself will take care of hardware provisioning and administration, networking, and more. But while running Docker Engine on a local machine, and to some extent exposing some public service to the web, is not necessarily going to be all that difficult. The real power of launching automated clusters of containers is a different story, and particularly if there is a need to launch those clusters into a public cloud like AWS. Technologies such as Ansible, Chef, Puppet, and ECS can help hiding the complexity. Nevertheless, the learning curve for such tools can sometimes be as complex as manually managing clusters.</p> <p dir="ltr">Elastic Beanstalk is a service that accepts your application code as input, and then invisibly embeds the code within a complete network and compute infrastructure. All that is needed is for users to select platform like Java, .NET, Python or Docker, and the service does the rest. This means that the EC2 and database instances, security groups, load balancers, auto scaling and other services the application needs, will be automatically added, integrated, and continuously maintained for you. Elastic Beanstalk can always be used from the web console, but as a developer, perhaps the command window would make more sense. Besides, everything always looks much more interesting from the command window. To be able to do that, the EB CLI needs to be install, which is fairly easy. All that is needed is to have pip, the Python package manager, and from there install the EB CLI. A detailed article on installing EB can be found on <a href="http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install.html">here</a>. Once it is finished, typing EB alone should bring up the help page.</p> <p dir="ltr">From the application root directory, typing "eb init" will initialize a new EB application. Regions, name, platform (Docker and Docker version), as well as SSH access options, will be prompted for the selection. Behind the scenes when you initialize an application locally and push it to AWS, what really happens is AWS creates two entities. A space to hold your application files called a framework, and secondly, it creates an environment, which is the infrastructure automatically created by Beanstalk. This means everything from EC2 instance, a load balancer, auto scaling rules, CloudWatch alarms, and security groups are created as part of the supporting infrastructure, depending on how the questions after the "eb init" were answered. A useful command is eb platform show as it will display some of the platform and environment values that will be used to create subsequent applications.</p> <p dir="ltr">There are three ways to prepare an environment in Beanstalk. Two are primarily based on the version used in the Dockerrun.aws.json. Version 1 is the simplest one; It is used to run single containers and as a result, there is no setup or need for load balancing or auto-scaling. As expected version 2 is designed for multiple container architectures. A very interesting option is the “preconfigured” option. AWS makes Amazon machine images available that are preloaded with fully configured versions of popular deployment profiles on top of Amazon Linux. This is a rather convenient way to get developers a head start in building the application environment.</p> <p dir="ltr">AWS documentation provides a simple, yet popular, example of a pre configured environment. On the folder, the application was initialized, simply create a Dockerfile and copy-paste the details found in the AWS documentation <a href="http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_dockerpreconfig.dockerfile.html">here</a>. Next step is pulling the trigger and executing eb create and the name for the environment i.e. eb create DEV.  That’s it! It's all done. After a good 15 minutes, a pre-configured Docker platform for Glassfish and Python should have been created.The console will show you log messages throughout the creation. But, for curious developers, you can always go to the browser console and see the EC2 and everything that is being created at runtime.</p> <p> </p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=666&amp;2=comment_node_blog&amp;3=comment_node_blog" token="Lzml63Gd5J2X6qXFsFBJDi763u7h360eRrIbxclmLh8"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/digital-transformation" hreflang="en">Digital Transformation</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Tue, 25 Jul 2017 18:18:59 +0000 Daniel Rodriguez 666 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/docker-aws-elastic-beanstalk-whats-it-you#comments Come Visit AVIO at MuleSoft CONNECT 2017 https://www.avioconsulting.com/blog/come-visit-avio-mulesoft-connect-2017 <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/come-visit-avio-mulesoft-connect-2017" hreflang="en">Come Visit AVIO at MuleSoft CONNECT 2017</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p><a href="https://connect.mulesoft.com/">MuleSoft’s 2017 CONNECT</a> is shaping up to be a great one. So many opportunities to gain insights from MuleSoft experts, hands-on learning and networking opportunities, as well as learning about new MuleSoft capabilities. See my <a href="http://www.avioconsulting.com/blog/mulesoft-connect-top-sessions">blog</a> for further details regarding top sessions and workshops at CONNECT.</p> <p>In addition to the sessions and workshops, we invite you to stop by AVIO’s booth to learn about a new tool we are unveiling, OSB conversion accelerator. Leveraging our prior Oracle Service Bus knowledge, along with our MuleSoft expertise, we have developed a tool that converts Oracle Service Bus 11g projects into MuleSoft projects. OSB proxies, business services, message processing components, communication components, and flow control components all can be easily converted into Mule concepts within our tool. Along with this, best practices are adhered to including the Mule project structure, usage and definition of external properties, global connector definitions, and usage of the APIKit SOAP.</p> <p>At our booth, we will have a demo that shows how we convert 4 different real world OSB scenarios into functioning MuleSoft solutions. One of the scenarios comes from an employee on-boarding process in which a SaaS application invokes a REST service exposed in OSB, synchronizing new employee data with on premise applications:</p> <p><img alt="OSB Proxy for MuleSoft Conversion" data-entity-type="file" data-entity-uuid="182432a7-2684-4f76-bfed-7459738bf3b0" height="307" src="/sites/default/files/inline-images/osbproxy.jpg" width="457" /></p> <p>OSB converted into Mule using AVIO's conversion tool:</p> <p><img alt="MuleSoft Flow" data-entity-type="file" data-entity-uuid="68b4cb3a-a865-43f6-9b81-0d4565398a58" height="334" src="/sites/default/files/inline-images/muleflow.jpg" width="366" /></p> <p>Please stop by and chat with us at the AVIO booth or, if your calendar is already full, you can <a href="http://www.avioconsulting.com/mulesoft-connect-migration">schedule a specific time</a> to come by the booth to discuss the conversion process. We’d love the opportunity to meet you and share our new tool with you!</p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=642&amp;2=comment_node_blog&amp;3=comment_node_blog" token="91TgwbB66pmJtrIP87Z-kpfadvf228f-VIlq_lha5zI"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Wed, 05 Apr 2017 17:13:56 +0000 Jennie DeRosa 642 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/come-visit-avio-mulesoft-connect-2017#comments Consuming an Oracle AQ Message within MuleSoft Anypoint https://www.avioconsulting.com/blog/consuming-oracle-aq-message-within-mulesoft-anypoint <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/consuming-oracle-aq-message-within-mulesoft-anypoint" hreflang="en">Consuming an Oracle AQ Message within MuleSoft Anypoint</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>Subscribing to a message from an Oracle AQ queue is not out of the box functionality within Mule, but can be done by following the steps provided in this article.</p> <h2>JMS transport</h2> <p>The first step to get a Mule flow to communicate with AQ is to add the following spring bean configuration:</p> <pre> &lt;spring:beans&gt; &lt;spring:bean id="connFactory" class="oracle.jms.AQjmsFactory" factory-method="getQueueConnectionFactory"&gt; &lt;!-- JDBC URL --&gt; &lt;spring:constructor-arg index="0"&gt; &lt;spring:value&gt;<em>oracle db url</em>&lt;/spring:value&gt; &lt;/spring:constructor-arg&gt; &lt;!-- properties --&gt; &lt;spring:constructor-arg index="1" type="java.util.Properties" value=""&gt; &lt;/spring:constructor-arg&gt; &lt;/spring:bean&gt; &lt;/spring:beans&gt;</pre> <p>As you probably noticed, a reference to the class, oracle.jms.AQjmsFactory is specified. This class which is found in the aqapi.jar provides the ability for Mule to utilize the JMS transport for communication with AQ. Another dependency to be added to the Mule project is the jmscommon.jar (these jars can be found within an Oracle install, such as SOA).</p> <p>With the spring bean configuration set, reference it within the JMS connector attribute, ‘connectionFactory-ref’:</p> <pre> &lt;jms:connector name="OracleAQConnector" <strong> connectionFactory-ref</strong>="connFactory" specification="1.1" username="username" password="password" maxRedelivery="3" doc:name="JMS" numberOfConsumers="1" validateConnections="true"&gt; &lt;reconnect-forever frequency="2000" /&gt; &lt;/jms:connector&gt;</pre> <p>Now you can define your flow to subscribe to the queue using the AQ configuration:</p> <pre> &lt;jms:inbound-endpoint queue="AQ_Name" connector-ref="OracleAQConnector" doc:name="JMS" /&gt;</pre> <p> </p> <h2>Advanced Data Types</h2> <p>Once the JMS configuration is done, running the application may give you a result that is not expected, an error: <em>Payload factory must be specified for destinations with ADT payloads.</em></p> <p>If this is the case, you will need to add some Java code to your Mule application to enable the consumption of advanced data types (ADT). An ADT can be used to define the payload that is placed onto AQ within the Oracle database. This type is much like an object, but in Oracle-speak.</p> <h3>ORADataFactory Implementation</h3> <p>The first Java class to be written implements the ORADataFactory interface, which is used to describe the Oracle data types. Within this class, define the getters and setters for the ADT. This <a href="http://blog.javaforge.net/post/30858904340/oracle-advanced-queuing-spring-custom-types">blog</a> post provides an excellent example of how this is done.</p> <h3>Custom Message Receiver</h3> <p>With the ORADataFactory implemented, it now can be referenced by the next piece of the ADT puzzle. Create a Java class that overrides the default JMS message receiver (org.mule.transport.jms.JmsMessageReceiver or<em> </em>org.mule.transport.jms.MultiConsumerJmsMessageReceiver) and specify this new message receiver class in the JMS connector configuration:</p> <pre> &lt;service-overrides messageReceiver="com.avio.jms.connectorOverride.CustomMessageReceiver" /&gt;</pre> <p>Within this class, reference the ORADataFactory class implemented within the createConsumer method:</p> <pre> this.consumer = ((AQjmsSession)session).createConsumer(dest, selector,   this.currentOraDataFactory,   null, this.connector.isNoLocal());</pre> <h3>Custom Transformer</h3> <p>The last step is to create a custom transformer which will transform the ADT into a POJO, allowing the message to be consumed by Mule. The code snippet below is an example of setting values in the POJO from the ADT fields within a custom transformer class:</p> <pre> AQjmsAdtMessage aqPayload = (AQjmsAdtMessage)message.getPayload();   myPOJO qType = new myPOJO();   try {   AQCustomPayloadObject custPayload = (AQCustomPayloadObject)aqPayload.getAdtPayload();   qType.setValue(custPayload.getADTField);</pre> <p>Reference this new transformer within the JMS inbound endpoint:</p> <pre> &lt;custom-transformer name="QtypeToPOJO" class="com.avio.CustomTransformer" doc:name="Java"/&gt;</pre> <p> </p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <a id="comment-1447"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"> <div>Alex Gorbachev</div> </div> <div class="comment-date"> <div>April 11, 2017</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>Hi Jennie,</p> <p>Thanks for this guide.</p> <p>I created the RAW type queue to avoid complexity of the Object type to start with (i.e. aopid ORADataFactory implementation) because I did hit the issue with ADT payload as you stated. However, I get another issue right now and I'm at loss on how to troubleshoot it.</p> <p><code>2017-04-11 18:23:43,759 [main] INFO  org.mule.transport.jms.JmsConnector - Registering listener: pythian_datahubFlow on endpointUri: jms://Q_AQ_EVENT2<br /> 2017-04-11 18:23:43,808 [main] INFO  org.mule.transport.service.DefaultTransportServiceDescriptor - Loading default inbound transformer: org.mule.transport.jms.transformers.JMSMessageToObject<br /> 2017-04-11 18:23:43,811 [main] INFO  org.mule.transport.service.DefaultTransportServiceDescriptor - Loading default response transformer: org.mule.transport.jms.transformers.ObjectToJMSMessage<br /> 2017-04-11 18:23:43,823 [main] INFO  org.mule.lifecycle.AbstractLifecycleManager - Initialising: 'null'. Object is: MultiConsumerJmsMessageReceiver<br /> 2017-04-11 18:23:43,828 [main] INFO  org.mule.transport.jms.MultiConsumerJmsMessageReceiver - Connecting clusterizable message receiver<br /> 2017-04-11 18:23:47,460 [main] ERROR org.mule.retry.notifiers.ConnectNotifier - Failed to connect/reconnect: jms://Q_AQ_EVENT2. Root Exception was: null. Type: class java.lang.NullPointerException<br /> 2017-04-11 18:23:47,461 [main] INFO  org.mule.retry.policies.SimpleRetryPolicy - Waiting for 2000ms before reconnecting. Failed attempt 1 of unlimited</code></p> <p>Any hints?</p> <p>Thanks,</p> <p>Alex</p></div> </div> </div> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=629&amp;2=comment_node_blog&amp;3=comment_node_blog" token="EnHPGsR7ldI-2_IpxE2aD239LnGYqNK52OT4NYd_UfY"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Wed, 08 Mar 2017 23:38:20 +0000 Jennie DeRosa 629 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/consuming-oracle-aq-message-within-mulesoft-anypoint#comments 3 Keys to Getting Up to Speed with Microservices https://www.avioconsulting.com/blog/3-keys-getting-speed-microservices <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/3-keys-getting-speed-microservices" hreflang="en">3 Keys to Getting Up to Speed with Microservices</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>Is your organization up to speed with microservices? Many people like to think their organizations are getting there, but in case you aren’t here’s some key points on why you should be. Abel Tong, Senior Director of Solutions Marketing at Ciena, argues that developers need to move away from the old, monolithic approach and start breaking down large applications into smaller ones. Tong highlights this concept in his post on LightReading.com, <a href="http://www.lightreading.com/nfv/nfv-elements/getting-up-to-speed-on-microservices-/a/d-id/730154">Getting Up to Speed on Microservices</a>, as he discusses the importance of microservices to an organization.</p> <blockquote> <p><em>Microservices address these challenges by providing a more streamlined development methodology made popular in cloud services, and specifically designed to make applications easier to enhance, maintain and scale as needed. A microservices architecture is crucial for any organizations seeking greater agility to remain competitive.</em></p> </blockquote> <p>As microservices grow into the primary way of building applications, it is important to remember the three point that Tong highlights in this article.</p> <blockquote> <p><strong>1. Microservices can help increase agility, accelerate development, and improve software quality.</strong></p> <p><strong>2. Software developers must rid themselves of the traditional way of thinking and start breaking down     large applications into smaller ones. This way, each individual component can be scaled up, down, or replicated to meet an application's scalability and reliability requirements.</strong></p> <p><strong>3. It takes some education and training, but microservices encourage collaboration across an organization's development and operations team.</strong></p> </blockquote> <p>If you believe that your organization is not up to speed with microservices, we’d be happy to share how AVIO is leveraging the <a href="http://www.avioconsulting.com/technologies/mulesoft-anypoint">MuleSoft Anypoint Platform</a> to help organizations create their own microservices architecture.  </p> <p> </p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=623&amp;2=comment_node_blog&amp;3=comment_node_blog" token="tcApkV52Ko0vKVijMdgKgCgqFt3kztgXHj3kUPtQ0To"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/digital-transformation" hreflang="en">Digital Transformation</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Fri, 24 Feb 2017 16:27:44 +0000 Jordan Nichols 623 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/3-keys-getting-speed-microservices#comments Solving the Innovation Challenge: Microservices https://www.avioconsulting.com/blog/solving-challenges-innovating-microservices <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/solving-challenges-innovating-microservices" hreflang="en">Solving the Innovation Challenge: Microservices</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>Sequoia partner Matt Miller has a Wall Street Journal article, <a href="http://blogs.wsj.com/cio/2015/10/05/innovate-or-die-the-rise-of-microservices/">Innovate or Die: The Rise of Microservices</a>, that discusses how organizations willing to innovate will be the organizations that not only survive, but thrive in the digital economy. However, innovation isn't something that comes naturally, or easily, for many people or organizations. Innovation requires taking risks, delving into the unknown, and the capability to move quickly. Those are not characteristics that many organizations are comfortable with. </p> <p>As Matt mentions, microservices are a key component to the innovation landscape. As a framework to help organizations modularize their systems, reuse IT assets, and increase the speed of application delivery, microservices are quickly becoming a necessity for every organization. Companies such as Facebook, Netflix, Uber, and Amazon have already fully embraced microservices philosophies and are leveraging the operational benefits to stay far ahead of their competition.</p> <p>However, microservices are not an end all be all solution that can quickly be adopted with results immediately seen. As Matt states, there is significant planning to be done and coordination between groups that may have not previously worked together. In order to fully take advantage of a microservices approach, organizations may have to reorganize, realign, or otherwise restructure teams to facilitate changing at the speed of business. </p> <p>Luckily, tools like <a href="http://www.mulesoft.com">Mulesoft Anypoint</a> provide an underlying platform on which to create a microservices architecture. Coupled with containerization software such as Docker, organizations can use Mulesoft Anypoint to quickly build APIs, deploy to the Anypoint cloud, and create a strong microservices architecture that provides significant advantages over traditional SOA and point to point integration approaches. </p> <p>We love talking about microservices, innovation, and digital transformation. Please <a href="http://www.avioconsulting.com/contact">contact us</a> to hear how our clients are accelerating their innovation capabilities and to see how we can help you as well. </p></div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=616&amp;2=comment_node_blog&amp;3=comment_node_blog" token="LgWBYm0trxOKIReQ4K5u0p4ZCKRPsWGT4ZB6Goom2NQ"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/digital-transformation" hreflang="en">Digital Transformation</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Mon, 09 Jan 2017 19:55:28 +0000 Brandon Dean 616 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/solving-challenges-innovating-microservices#comments Enabling Effective Data Stewardship https://www.avioconsulting.com/blog/enabling-effective-data-stewardship <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/enabling-effective-data-stewardship" hreflang="en">Enabling Effective Data Stewardship</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><h3 dir="ltr">The Value of Data</h3> <p dir="ltr">Data is the currency of digital enterprise. The fuel of technology, its influx and exchange power the digital capability to market products, reach and engage customers, manage business operations, and perform countless other functions. And because data is typically retained rather than expended in the process, it accumulates into vast, dynamic stockpiles of granularized digital fact.</p> <p>The intrinsic financial value of these stockpiles can be seen in the goodwill gap between the market values of companies built on data, like Twitter and Uber, and their actual market value. <a href="http://www.forbes.com/sites/howardbaldwin/2015/03/23/drilling-into-the-value-of-data/#3524a1432872">According to Forbes</a>, as of May 2015, Facebook was valued at $200 billion, while United Airlines, a company that owns and operates tangible objects of value, most notably a large fleet of passenger jets, was valued at $34 billion.</p> <p dir="ltr">Beyond its financial valuation, and especially in today’s world of big data and analytics, your data represents as well a latent reserve of potential competitive advantage. Analysis, interpretation, and correlation render raw data into useful information that can guide strategy, drive innovation, enrich customer engagement, and even contribute to the top line. The business value of data is limited only by the ingenuity and insight with which it’s rendered into information.</p> <h3>Enabling The Alchemy of Digital Enterprise</h3> <p>Given the practically limitless potential of data, this ongoing rendering process—from disconnected and uninterpreted facts and figures into usable, illuminative information—deserves the full weight of an organization’s collective creative insight. In order to accomplish this, its people need to be as comfortable and up-close with the data as possible. This requires that data be secure, easily accessible, and usably formatted. Data stewardship involves storing, securing, and formatting data to enable and facilitate the coordinated analytical attention most likely to yield competitively valuable insight. While IT departments have taken the lead in data stewardship, particularly around security and maintenance, it’s a responsibility shared across the entire digital enterprise.</p> <h3>Transforming Our Thinking</h3> <p>Digital transformation entails a change in our thinking, as we reimagine the relationships between people and technology, and the business models through which they interact. This includes a transformed understanding of the value of data and people’s relationships with it. Effective data stewardship flows from a deep organizational understanding of its critical importance, rooted in an informed and committed embrace of the potential breadth and scale of data’s value. Enabling data stewardship starts with fostering an organizational mindset that prioritizes fulfilling the promise of data and with engendering a culture in which everyone is creatively engaged in leveraging it towards competitive advantage.</p> <h3>AVIO</h3> <p>Let <a href="http://www.avioconsulting.com">AVIO Consulting</a> help you leverage your data into a greater competitive advantage by reshaping the way you understand and interact with it. We are digital transformation specialists, and our passion is helping companies like yours become agile, efficient digital enterprises, adept at turning data into information; and information into enlightened strategy, disruptive innovation, and meaningful customer engagement. <a href="http://www.avioconsulting.com/contact">Contact us today.</a></p> <p> </p> <p dir="ltr"> </p> <p> </p> <p> </p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <a id="comment-1087"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"> <div>Melissa</div> </div> <div class="comment-date"> <div>August 18, 2016</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>Thanks, Jordan! I guess I didn't quite catch the transforming effect. What do you mean by organizational understanding? Working on the investigation, I'll need to explain the point thoroughly.</p></div> </div> </div> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=575&amp;2=comment_node_blog&amp;3=comment_node_blog" token="-Tc82GStUP-CcSsqFHOIUD_aIBVFlFaMBH9S53yYOz8"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/digital-transformation" hreflang="en">Digital Transformation</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Fri, 29 Jul 2016 21:33:03 +0000 Jordan Nichols 575 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/enabling-effective-data-stewardship#comments