Exploring MDS Explorer

Recently, I posted about my colleague Olivier’s MDS Explorer tool, which is a great way to get a look inside your MDS repository.  I have been playing around with it a little bit, nothing much really, just some cosmetic stuff, but you might like to take a look at it.

I made it format the documents nicely with proper indentation, and with line numbers and a nicer editor.  It also will warn you if you are about to open a large document so that you know it has not crashed, but that you just have to be patient.  And I added some icons and stuff.  There is even a nice Dora the Explorer picture hiding in there for those who care to look for it Smile

Here is an example of looking at a composite (Arrays).  You can see all the files in the composite on the left hand side, and I have a BPMN process open in the editor pane on the right.  This is connected to a database MDS under BPM 11.1.1.6.  It also allows you to connect to a file-based MDS.

image

Note that you can go ahead and edit the files directly in here and save the changes to MDS – if you are game!

If you want to play with this, you can grab it from my branch in Olivier’s Subversion repository on java.net – it has IDE files for NetBeans 7.2 in that branch.

Posted in Uncategorized | Tagged | 2 Comments

Automating creation of JMS Queues and JmsAdapter plan updates and redeployment

Following on from my recent post on automation of creation of JDBC resources, I am happy to report I now have a script which can be used for JMS Queues!

Again, this is not as wonderful as I would like it to be, but here it is, in case it may help someone.  It is also in Subversion on java.net (may be newer).

# Copyright 2012 Oracle Corporation.
# All Rights Reserved.
#
# Provided on an 'as is' basis, without warranties or conditions of any kind,
# either express or implied, including, without limitation, any warranties or
# conditions of title, non-infringement, merchantability, or fitness for a
# particular purpose. You are solely responsible for determining the
# appropriateness of using and assume any risks. You may not redistribute.
#
# Please refer to https://redstack.wordpress.com/continous-integration for details.
#
# This WLST script can be used as part of a continuous integration build process
# before deploying a SCA composite, to create any necessary JMS Queues
# on the WebLogic Server.
#
# In addition to creating the queue, this script will also update the
# resource adapter and redeploy it.
#
# Parts of this script were adapted from Richard van den Berg's post at
# https://forums.oracle.com/forums/message.jspa?messageID=10131949#10131949

import time

#
# These are the parameters that you need to edit before running this script
#

# admin server url
url                  = 't3://localhost:7001'
# username to connect to the admin server
username             = 'weblogic'
# password to connect to the admin server
password             = 'welcome1'
# the name for the EIS - as defined in the JMS Adapter wizard in JDEV
eisName              = 'eis/wls/redstackQueue'
# the admin or managed server to target where the JmsAdapter is deployed
serverName           = 'soa_server1'
nmServerName         = 'soa_server1'
# the name for the queue
qName               = 'redstackQueue'
# the JNDI name for the queue
jndiName             = 'jms/redstackQueue'
# the JMS Module for the queue
jmsModule            = 'SOAJMSModule'
# the Subdeployment for the queue
jmsSubDeployment     = 'SOASubDeployment'
# the host where node manager is running
nmHost               = 'localhost'
# the port to connect to node manager (5556 is default for plain mode)
nmPort               = '5556'
# the user to connect to node manager
nmUser               = 'weblogic'
# the password to connection to node manager
nmPassword           = 'welcome1'
# the name of the weblogic domain
domain               = 'base_domain'

# don't change these ones
uniqueString         = ''
appName              = 'JmsAdapter'
moduleOverrideName   = appName+'.rar'
moduleDescriptorName = 'META-INF/weblogic-ra.xml'

#
# method definitions
#

def makeDeploymentPlanVariable(wlstPlan, name, value, xpath, origin='planbased'):
  """Create a varaible in the Plan.
  This method is used to create the variables that are needed in the Plan in order
  to add an entry for the outbound connection pool for the new data source.
  """

  try:
    variableAssignment = wlstPlan.createVariableAssignment(name, moduleOverrideName, moduleDescriptorName)
    variableAssignment.setXpath(xpath)
    variableAssignment.setOrigin(origin)
    wlstPlan.createVariable(name, value)

  except:
    print('--> was not able to create deployment plan variables successfully')

def main():

  print ' Copyright 2012 Oracle Corporation. '
  print ' All Rights Reserved. '
  print ''
  print ' Provided on an ''as is'' basis, without warranties or conditions of any kind, '
  print ' either express or implied, including, without limitation, any warranties or '
  print ' conditions of title, non-infringement, merchantability, or fitness for a '
  print ' particular purpose. You are solely responsible for determining the '
  print ' appropriateness of using and assume any risks. You may not redistribute.'
  print ''
  print ' Please refer to https://redstack.wordpress.com/continous-integration for details.'
  print ''
  print ' This WLST script can be used as part of a continuous integration build process'
  print ' before deploying a SCA composite, to create any necessary JMS queues'
  print ' on the WebLogic Server.'
  print ''
  print ' In addition to creating the queue, this script will also update the '
  print ' resource adapter and redeploy it.'
  print ''
  print ' !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!!'
  print ''
  print ' This script will make changes to your WebLogic domain.  Make sure you know '
  print ' what you are doing.  There is no support for this script.  If something bad '
  print ' happens, you are on your own!  You have been warned.'

  #
  # generate a unique string to use in the names
  #

  uniqueString = str(int(time.time()))

  #
  # Create a JDBC Data Source.
  #

  try:
    print('--> about to connect to weblogic')
    connect(username, password, url)
    print('--> about to create a queue ' + qName)
    edit()
    startEdit()
    cd('/JMSSystemResources/' + jmsModule + '/JMSResource/' + jmsModule)
    cmo.createQueue(qName)
    cd('/JMSSystemResources/' + jmsModule + '/JMSResource/' + jmsModule + '/Queues/' + qName)
    set('JNDIName', jndiName)
    set('SubDeploymentName', jmsSubDeployment)
    save()
    print('--> activating changes')
    activate()
    print('--> done')

#
# update the deployment plan
#
    print('--> about to update the deployment plan for the DbAdapter')
    startEdit()
    planPath = get('/AppDeployments/JmsAdapter/PlanPath')
    appPath = get('/AppDeployments/JmsAdapter/SourcePath')
    print('--> Using plan ' + planPath)
    plan = loadApplication(appPath, planPath)
    print('--> adding variables to plan')

    makeDeploymentPlanVariable(plan, 'ConnectionInstance_eis/wls/' + qName + '_JNDIName_' + uniqueString, eisName, '/weblogic-connector/outbound-resource-adapter/connection-definition-group/[connection-factory-interface="oracle.tip.adapter.jms.IJmsConnectionFactory"]/connection-instance/[jndi-name="' + eisName + '"]/jndi-name')
    makeDeploymentPlanVariable(plan, 'ConfigProperty_ConnectionFactoryLocation' + uniqueString, eisName, '/weblogic-connector/outbound-resource-adapter/connection-definition-group/[connection-factory-interface="oracle.tip.adapter.jms.IJmsConnectionFactory"]/connection-instance/[jndi-name="' + eisName + '"]/connection-properties/properties/property/[name="ConnectionFactoryLocation"]/value')
    print('--> saving plan')
    plan.save();
    save();
    print('--> activating changes')
    activate(block='true');
    cd('/AppDeployments/JmsAdapter/Targets');
    print('--> redeploying the JmsAdapter')
    print(appName, planPath)
    redeploy(appName, planPath, targets=cmo.getTargets());
    print('--> done')

  except:
    print('--> something went wrong, bailing out')
    stopEdit('y')
    raise SystemExit

  #
  # disconnect from the admin server
  #

  print('--> disconnecting from admin server now')
  disconnect()

  #
  # Restart the managed server using the node manager.
  #

  try:
    print('--> about to restart server ' + nmServerName)
    nmConnect(nmUser, nmPassword, nmHost, nmPort, domain)
    print('--> stopping server...')
    nmKill(nmServerName)
    print('--> starting server')
    nmStart(nmServerName)
    print('--> done')
    nmDisconnect()

  except:
    print('--> was not able to restart server successfully')

#
#  this is the main entry point
#

main()

Enjoy!

Posted in Uncategorized | Tagged , , , , , | 1 Comment

Automating creation of JDBC Data Sources and DbAdapter plan updates and redeployment

That’s a long title… anyway, as part of the desire to have a fully automated continuous integration environment for SOA and BPM, there is another bridge that we need to cross.

SOA/BPM Composites can contain dependencies on resources in the runtime environment, like JDBC Data Sources and JMS Queues for example.  This poses a challenge for us, as we need to ensure that these resources exist, are properly configured, and are available before we attempt to run our SCA Tests in our composite.

So this means we need a way to automate the creation of these resources, so that we can do this as part of our build process.

This post presents a first step in that direction – a WLST script that can automate the process for JDBC.  I say ‘first step’ for a couple of reasons:

  • It only handles JDBC, nothing else yet,
  • It is a bit delicate – I am not really happy with the error handling (which is almost non-existent, but you have to excuse me on that point, this is my very first Python program ever), and
  • I have not made it handle parameters yet, or integrated it into Maven, although this should just be ‘a small matter of programming’ as the saying goes.

It also implements a restart of the managed server, and I am not 100% sure we actually need to do that.

Anyway, here it is in all its glory – also available from Subversion on java.net (may be newer):

# Copyright 2012 Oracle Corporation.
# All Rights Reserved.
#
# Provided on an 'as is' basis, without warranties or conditions of any kind,
# either express or implied, including, without limitation, any warranties or
# conditions of title, non-infringement, merchantability, or fitness for a
# particular purpose. You are solely responsible for determining the
# appropriateness of using and assume any risks. You may not redistribute.
#
# Please refer to https://redstack.wordpress.com/continous-integration for details.
#
# This WLST script can be used as part of a continuous integration build process
# before deploying a SCA composite, to create any necessary Java EE data sources
# on the WebLogic Server.
#
# In addition to creating the data source, this script will also update the
# resource adapter and redeploy it.
#
# Parts of this script were adapted from Richard van den Berg's post at
# https://forums.oracle.com/forums/message.jspa?messageID=10131949#10131949

import time

#
# These are the parameters that you need to edit before running this script
#

# admin server url
url                  = 't3://localhost:7001'
# username to connect to the admin server
username             = 'weblogic'
# password to connect to the admin server
password             = 'welcome1'
# the name for the EIS - as defined in the DB Adapter wizard in JDEV
eisName              = 'eis/db/myDS'
# the admin or managed server to target where the DbAdapter is deployed
serverName           = 'soa_server1'
nmServerName         = 'soa_server1'
# the name for the data source
dsName               = 'myDS'
# the JNDI name for the data source
jndiName             = 'jbdc/myDS'
# the database url for the data source
dbUrl                = 'jdbc:oracle:thin:@localhost:1521:orcl'
# the database user
dbUser               = 'mark'
# the database password
dbPassword           = 'welcome1'
# the database driver to use
dbDriver             = 'oracle.jdbc.xa.client.OracleXADataSource'
# the host where node manager is running
nmHost               = 'localhost'
# the port to connect to node manager (5556 is default for plain mode)
nmPort               = '5556'
# the user to connect to node manager
nmUser               = 'weblogic'
# the password to connection to node manager
nmPassword           = 'welcome1'
# the name of the weblogic domain
domain               = 'base_domain'

# don't change these ones
uniqueString         = ''
appName              = 'DbAdapter'
moduleOverrideName   = appName+'.rar'
moduleDescriptorName = 'META-INF/weblogic-ra.xml'

#
# method definitions
#

def makeDeploymentPlanVariable(wlstPlan, name, value, xpath, origin='planbased'):
  """Create a varaible in the Plan.
  This method is used to create the variables that are needed in the Plan in order
  to add an entry for the outbound connection pool for the new data source.
  """

  try:
    variableAssignment = wlstPlan.createVariableAssignment(name, moduleOverrideName, moduleDescriptorName)
    variableAssignment.setXpath(xpath)
    variableAssignment.setOrigin(origin)
    wlstPlan.createVariable(name, value)

  except:
    print('--> was not able to create deployment plan variables successfully')

def main():

  print ' Copyright 2012 Oracle Corporation. '
  print ' All Rights Reserved. '
  print ''
  print ' Provided on an ''as is'' basis, without warranties or conditions of any kind, '
  print ' either express or implied, including, without limitation, any warranties or '
  print ' conditions of title, non-infringement, merchantability, or fitness for a '
  print ' particular purpose. You are solely responsible for determining the '
  print ' appropriateness of using and assume any risks. You may not redistribute.'
  print ''
  print ' Please refer to https://redstack.wordpress.com/continous-integration for details.'
  print ''
  print ' This WLST script can be used as part of a continuous integration build process'
  print ' before deploying a SCA composite, to create any necessary Java EE data sources'
  print ' on the WebLogic Server.'
  print ''
  print ' In addition to creating the data source, this script will also update the '
  print ' resource adapter and redeploy it.'
  print ''
  print ' !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!!'
  print ''
  print ' This script will make changes to your WebLogic domain.  Make sure you know '
  print ' what you are doing.  There is no support for this script.  If something bad '
  print ' happens, you are on your own!  You have been warned.'

  #
  # generate a unique string to use in the names
  #

  uniqueString = str(int(time.time()))

  #
  # Create a JDBC Data Source.
  #

  try:
    print('--> about to connect to weblogic')
    connect(username, password, url)
    print('--> about to create a data source ' + dsName)
    edit()
    startEdit()
    cmo.createJDBCSystemResource(dsName)
    cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName)
    cmo.setName(dsName)
    cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDataSourceParams/' + dsName)
    set('JNDINames',jarray.array([String(jndiName)], String))
    cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName)
    cmo.setUrl(dbUrl)
    cmo.setDriverName(dbDriver)
    cmo.setPassword(dbPassword)
    cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCConnectionPoolParams/' + dsName)
    cmo.setTestTableName('DUAL')
    cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName + '/Properties/' + dsName)
    cmo.createProperty('user')
    cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName + '/Properties/' + dsName + '/Properties/user')
    cmo.setValue(dbUser)
    cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDataSourceParams/' + dsName)
    cmo.setGlobalTransactionsProtocol('TwoPhaseCommit')
    cd('/JDBCSystemResources/' + dsName)
    set('Targets',jarray.array([ObjectName('com.bea:Name=' + serverName + ',Type=Server')], ObjectName))
    save()
    print('--> activating changes')
    activate()
    print('--> done')

#
# update the deployment plan
#
    print('--> about to update the deployment plan for the DbAdapter')
    startEdit()
    planPath = get('/AppDeployments/DbAdapter/PlanPath')
    appPath = get('/AppDeployments/DbAdapter/SourcePath')
    print('--> Using plan ' + planPath)
    plan = loadApplication(appPath, planPath)
    print('--> adding variables to plan')
    makeDeploymentPlanVariable(plan, 'ConnectionInstance_eis/DB/' + dsName + '_JNDIName_' + uniqueString, eisName, '/weblogic-connector/outbound-resource-adapter/connection-definition-group/[connection-factory-interface="javax.resource.cci.ConnectionFactory"]/connection-instance/[jndi-name="' + eisName + '"]/jndi-name')
    makeDeploymentPlanVariable(plan, 'ConfigProperty_xADataSourceName_Value_' + uniqueString, eisName, '/weblogic-connector/outbound-resource-adapter/connection-definition-group/[connection-factory-interface="javax.resource.cci.ConnectionFactory"]/connection-instance/[jndi-name="' + eisName + '"]/connection-properties/properties/property/[name="xADataSourceName"]/value')
    print('--> saving plan')
    plan.save();
    save();
    print('--> activating changes')
    activate(block='true');
    cd('/AppDeployments/DbAdapter/Targets');
    print('--> redeploying the DbAdapter')
    redeploy(appName, planPath, targets=cmo.getTargets());
    print('--> done')

  except:
    print('--> something went wrong, bailing out')
    stopEdit('y')
    raise SystemExit

  #
  # disconnect from the admin server
  #

  print('--> disconnecting from admin server now')
  disconnect()

  #
  # Restart the managed server using the node manager.
  #

  try:
    print('--> about to restart server ' + nmServerName)
    nmConnect(nmUser, nmPassword, nmHost, nmPort, domain)
    print('--> stopping server...')
    nmKill(nmServerName)
    print('--> starting server')
    nmStart(nmServerName)
    print('--> done')
    nmDisconnect()

  except:
    print('--> was not able to restart server successfully')

#
#  this is the main entry point
#

main()

To use this script, you need to go edit those parameters at the top of the program, save it somewhere, e.g. createDS.py, and then run it with WLST, for example:

cd /your/fmwhome/wlserver_10.3/common/bin/
wlst.sh /path/to/createDS.py

Please let me know if you have any success, or comments, I would love to hear them.

I must also acknowledge the following folks from whom I borrowed code and ideas: Richard van den Berg and Michel Schildmeijer and in turn those who they borrowed from, and so on.

Posted in Uncategorized | Tagged , , , , , | 3 Comments

Making Coherence play nice in your test environment

This issue has popped up a couple of times for me recently, so I thought I would do a quick post on it.

When you are running a number of Fusion Middleware environments in the same IP subnet, as you might be in a test environment for example, the default Coherence startup parameters can cause you some issues.

A quick and easy way to avoid these issues, is to change the Coherence clusterport setting, and add the Coherence ttl setting, as shown in the example below.  You can do this by updating the EXTRA_JAVA_PROPERTIES variable in the setDomainEnv.sh script inside your domain’s bin directory.

EXTRA_JAVA_PROPERTIES="${EXTRA_JAVA_PROPERTIES}
  -Dsoa.archives.dir=${SOA_ORACLE_HOME}/soa
  -Dsoa.oracle.home=${SOA_ORACLE_HOME}
  -Dsoa.instance.home=${DOMAIN_HOME}
  -Djava.net.preferIPv4Stack=true
  -Dweblogic.security.SSL.ignoreHostnameVerification=true
  -Dhttp.nonProxyHosts=localhost|10.240.37.80|slc01ats|*.oracle.com
  -Dtangosol.coherence.clusteraddress=227.7.7.9
  -Dtangosol.coherence.clusterport=9838
  -Dtangosol.coherence.ttl=0
  -Dtangosol.coherence.log=jdk
  -Djavax.xml.soap.MessageFactory=oracle.j2ee.ws.saaj.soap.MessageFactoryImpl
  -Dweblogic.transaction.blocking.commit=true
  -Dweblogic.transaction.blocking.rollback=true
  -Djavax.net.ssl.trustStore=${WL_HOME}/server/lib/DemoTrust.jks"
export EXTRA_JAVA_PROPERTIES

Ideally, you want to set tangosol.coherence.clusterport to a different value for each separate cluster.  Set tangosol.coherence.ttl to 0 as shown above.

Posted in Uncategorized | Tagged , , | Leave a comment

What happened to oracle-validated?

I am not a big fan of renaming things for the sake of renaming things, and to be fair, I am not sure that this is a case of that, but the much loved oracle-validated package that existed on Oracle (Enterprise) Linux up to version 5 has now got a new name. 

I don’t particularly like the new name, since it implies that this package is only useful for installing the Oracle Database 11gR2, and that is not really the case – this package is also very useful to install before you attempt to install many Fusion Middleware products on Linux, so I must say that I like the old name better.

But, you can’t stop progress!

Anyway, the new name is as follows:

oracle-rdbms-server-11gR2-preinstall

You should install this package (using yum) before you try to install any Fusion Middleware products on Oracle Linux – it will save you a lot of trouble.  You can find more information about the package here.

Also, in case you were not aware, there is now a public yum repository for Oracle Linux – you can find config files and details here.

Posted in Uncategorized | Tagged | Leave a comment

Getting Oracle artifacts into a Maven environment

If you want to build an application to run on the Fusion Middleware platform, you may find that you want to use some Oracle provided JAR files in your build process.  These may be things like API’s (interfaces) that are needed to compile, or client libraries that need to be bundled into the deployable application, or perhaps tools that are needed during build time, e.g. WLST or appc.

If you are using Maven to manage your build, it would be ideal to be able to use Maven coordinates to reference these Oracle artifacts, just like you do for any other kind of dependency.  But Oracle does not provide POM files for these artifacts – so what can we do?

Maven provides the ability to load any artifact into a Maven repository and to give it a set of coordinates.  This means that you can easily add the Oracle provided artifacts to your own Maven repository, or to a shared repository in your environment (e.g. a Maven Repository Manager) so that they can be used by yourself and other developers.

Maven will even generate the POM file for you, so all you need to do is create the coordinates.  Normally coordinates follow the same reverse URL scheme that Java packages uses, but it might be a good idea not to use com.oracle in this case – as it is possible that Oracle might one day release their own POMs, and then you could have some name clashes.  So it is probably better to use a different name, you might add ‘custom’ for example.

Suppose you want to add the wlthint3client.jar into your Maven environment, and give it the following coordinates:

  • groupId: custom.com.oracle
  • artifactId: wlthint3client
  • versionId: 10.3.6

You could use a command like this (which would be entered all on one line):

mvn install:install-file 
    -Dfile=/fmwhome/wlserver_10.3/server/lib/wlthint3client.jar
    -DgeneratePom=true
    -DgroupId=custom.com.oracle
    -DartifactId=wlthint3client
    -DversionId=10.3.6
    -Dpackaging=jar

This will install the JAR into your local Maven repository.  You can use a different goal to install into a remote repository (like a Maven Repository Manager for example).  In this command you either need to give the repository URL in the url property, or specify the repositoryId the matches the repository definition in your Maven settings.xml.

mvn deploy:deploy-file
    -Dfile=/fmwhome/wlserver_10.3/server/lib/wlthint3client.jar
    -DgeneratePom=true
    -DrepositoryId=internal
    -DgroupId=custom.com.oracle
    -DartifactId=wlthint3client
    -DversionId=10.3.6
    -Dpackaging=jar

After running these commands, you will have this artifact in your Maven repository and you will be able to use it like any other artifact.  For example, to include it in a project as a dependency, you can just refer to it using its coordinates:

<dependency>
  <groupId>custom.com.oracle</groupId>
  <artifactId>wlthint3client</artifactId>
  <version>10.3.6</version>
  <packaging>jar</packaging>
</dependency>

Armed with this knowledge you could go and create POMs for any Oracle (or other) artifacts that you want to use in your build.  You could also create dependency hierarchies between them if you wanted or needed to.

Posted in Uncategorized | Tagged | 1 Comment

Maven Repository Managers

In this post I just want to share a couple of thoughts on Maven Repository Managers – what they are, and why you would want to use one.  Let’s start out with a couple of definitions:

A Maven Repository is a collection of artifacts and metadata stored in a defined hierarchy.  It could be as simple as just a collection of files in a file system with a particular directory structure, or on a simple web server.  This might work well for a single developer’s local repository (in the case of the files), or for read only artifacts (in the case of the web server) but it is not so ideal for a group of developers who are both consuming and producing artifacts.

A Maven Repository Manager is a piece of software that allows you to host and manage a number of Maven Repositories.  Why would you want more than one?  Usually people like to keep their work in progress in a separate repository to their completed artifacts – perhaps they have different backup policies or access controls.  Also, you can use a Maven Repository Manager as a proxy for external Maven Repositories (like Maven Central for example).  This allows you to cache artifacts and share them among your developers – reducing the build times and reducing your download costs too.  It is also handy if you need to be able to build without a connection to the Internet.

image

The diagram above shows the relationship between the various repositories.  Maven Central is the main repository.  It contains mostly free and open source artifacts.  It is basically read only to the normal Maven user.  There are also other Maven repositories on the Internet that hold both open source and commercial artifacts.

The box labeled ‘Internal Repository Manager’ represents a Maven Repository Manager deployed inside an organization.  Each developer will also have their own local repository.

There are a number of open source and commercial products available that can act as the Maven Repository Manager.  Here are a few of the common ones:

Typically you would set up a number of repositories, for example you might have repositories for:

  • Mirrors/proxies/caches of external repositories like Maven Central, java.net, etc.,
  • Artifacts that are being developed by your organization, this is often called a ‘snapshot’ repository, and
  • Finished artifacts that were developed by your organization, this is often called an ‘internal’ repository.

You may also want to create a repository that holds artifacts that developers can use as dependencies when working on projects.  If you want to keep tight control over the artifacts that can be used, for example to ensure your project does not use third party components with incompatible license terms, or to ensure everyone is using the same version of an important dependency, then forcing dependencies to come from your internal repository is a good approach to exercise this control.

When you are using continuous integration, you may end up with a lot of builds going on, and the built artifacts will typically be stored in your snapshot repository.  This can lead to a large amount of data in a fairly short time, even in a relatively modest development organization.  So snapshot maintenance is important.  Most of the Maven Repository Managers will allow you to configure how many snapshot versions of an artifact to keep, and will automatically purge old snapshots to conserve space.

Posted in Uncategorized | Tagged | Leave a comment

MDS Explorer -or- What is in my MDS?

My colleague Olivier LeDiouris has published a utility that allows you to connect to your MDS and see what is inside there, as well us uploading and downloading contents.  You might like to take a look at it over on java.net.

Posted in Uncategorized | Tagged , | Leave a comment

BAM design pointers

Hello,

I have blogged about some BAM best practices here..

Hope that helps.

Posted in Uncategorized | Leave a comment

BPMN process editor problems in 11.1.1.6

A small number of people have been seeing an error when using the BPMN process editor in JDeveloper 11.1.1.6 (PS5).  The symptom is a NullPointerException, as seen in the log, an example below, and a dialog box telling you an unexpected error has occurred (see image below).

If you hit this issue, you should log a service request with Oracle Support and ask for a patch for bug number 13088538.  You will need to provide details about your JDeveloper environment, versions of plugins, etc.


Performing action Save[ from oracle.bpm.fusion.studio.editor.ProcessEditor ]
 Invoking command: [ from oracle.bpm.fusion.studio.editor.ProcessEditor ]
 Performing action Rebuild BoundaryEvents.jpr[ from oracle.bpm.fusion.studio.editor.ProcessEditor ]
 Invoking command: modify adf-config for soa
 Invoking command: [ from oracle.bpm.fusion.studio.editor.ProcessEditor ]
 Invoking command:
 Invoking command:
 Invoking command:
 Invoking command:
 Uncaught exception
 java.lang.NullPointerException
   net.miginfocom.layout.Grid.addLinkIDs()
   net.miginfocom.layout.Grid.<init>()
   net.miginfocom.swing.MigLayout.checkCache()
   net.miginfocom.swing.MigLayout.getSizeImpl()
   net.miginfocom.swing.MigLayout.preferredLayoutSize()
   o.bpm.ui.layout.MigLayout.preferredLayoutSize(MigLayout.java:114)

Posted in Uncategorized | Tagged , | 3 Comments