<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>marcuscavalcanti.net &#187; ALBPM</title>
	<atom:link href="http://www.marcuscavalcanti.net/blog/tag/albpm/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcuscavalcanti.net/blog</link>
	<description>Software, tecnologia e etc.</description>
	<lastBuildDate>Sun, 22 Jan 2012 21:18:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Gerando pacotes do ALBPM com Maven e Ant</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/11/30/gerando-pacotes-do-albpm-com-maven-e-ant/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/11/30/gerando-pacotes-do-albpm-com-maven-e-ant/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 15:00:39 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[Ant]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[OracleBPM]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1251</guid>
		<description><![CDATA[O Maven é um framework da Apache que possui muitas utilidades, uma delas é a geração de pacotes das aplicações sem que seja necessário uma IDE para realizar tal trabalho, isso é muito útil para que toda a equipe possa gerar um pacote da aplicação sem que seja necessário ter todo o projeto configurado em [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://maven.apache.org/" target="_blank" style="text-decoration: underline">Maven</a> é um framework da <a href="http://www.apache.org/" target="_blank" style="text-decoration: underline">Apache</a> que possui muitas utilidades, uma delas é a geração de pacotes das aplicações sem que seja necessário uma IDE para realizar tal trabalho, isso é muito útil para que toda a equipe possa gerar um pacote da aplicação sem que seja necessário ter todo o projeto configurado em sua máquina, dessa forma fica-se independente de IDE e máquinas.</p>
<p>Outra utilidades do Maven é o gerenciamento de dependências da aplicação, pois uma vez que sua aplicação use outras bibliotecas, não se faz por necessário incluir os devidos JARs no repositório da aplicação, basta apenas informar isso no Maven e deixar que ele se encarregue de encontrar essas bibliotecas e baixar para sua máquina.</p>
<p>No caso do <a href="http://download.oracle.com/docs/cd/E13165_01/albsi/docs60/index.html" target="_blank" style="text-decoration: underline">ALBPM</a> (Aqualogic BPM), temos um cenário um pouco diferente, pois no final das contas tudo que é gerado são arquivos XML com as informações dos seus processos, então nesse caso usamos o Maven apenas para geração de pacotes. No ALBPM, um pacote nada mais é que o diretório da aplicação compactado (zipado) com uma extensão específica, no caso *.exp, deve-se considerar ainda a exclusão de alguns diretórios na geração do pacote, pois esses diretórios são gerados em tempo de compilação pela engine do ALBPM. Baseado nisso, criei uma configuração do Maven que será responsável pela geração de pacote de um projeto no ALBPM.</p>
<p>Usei ainda uma integração do Maven com o <a href="http://ant.apache.org/" target="_blank" style="text-decoration: underline">Ant</a>, através de um <a href="http://maven.apache.org/plugins/maven-antrun-plugin/" target="_blank" style="text-decoration: underline">plugin específico</a> do Maven, onde o Ant será responsável por realizar algumas rotinas bem específicas, como renomear o arquivo gerado e apagar diretórios que não serão usados.</p>
<p>Vale ressaltar que eu testei essa rotina apenas para o ALBPM na versão 6.*, no caso da versão 5.*, acho que não deve mudar muita coisa, mas a extensão do pacote gerada é diferente, portanto será necessário algumas adaptações para que essa rotina funcione também nessa versão. No caso das versões já com a Oracle como responsável pelo produto (<a href="http://www.oracle.com/us/technologies/bpm/bpm-suite/index.htm" target="_blank" style="text-decoration: underline">OracleBPM</a>), essa rotina também deverá funcionar sem problemas.</p>
<h3>Criando o POM do Maven</h3>
<p>Como nosso projeto do ALBPM possui apenas um único módulo, será necessário a criação apenas de um único arquivo *.pom, que no caso será o responsável por incluir os plugins que serão usados, além de chamar um arquivo com algumas tasks do Ant. Dessa forma, o arquivo POM fica assim:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="xml"><ol><li class="li1"><pre class="de1"><span class="sc3"><span class="re1">&lt;project</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://maven.apache.org/POM/4.0.0&quot;</span></span></pre></li><li class="li1"><pre class="de1"><span class="sc3">	<span class="re0">xmlns:xsi</span>=<span class="st0">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span></pre></li><li class="li1"><pre class="de1"><span class="sc3">	<span class="re0">xsi:schemaLocation</span>=<span class="st0">&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;</span><span class="re2">&gt;</span></span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;modelVersion<span class="re2">&gt;</span></span></span>4.0.0<span class="sc3"><span class="re1">&lt;/modelVersion<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;groupId<span class="re2">&gt;</span></span></span>com.b2w<span class="sc3"><span class="re1">&lt;/groupId<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;artifactId<span class="re2">&gt;</span></span></span>ControleOrcamento<span class="sc3"><span class="re1">&lt;/artifactId<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;packaging<span class="re2">&gt;</span></span></span>pom<span class="sc3"><span class="re1">&lt;/packaging<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;version<span class="re2">&gt;</span></span></span>1.0<span class="sc3"><span class="re1">&lt;/version<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;name<span class="re2">&gt;</span></span></span>ControleOrcamento Project<span class="sc3"><span class="re1">&lt;/name<span class="re2">&gt;</span></span></span>	</pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;properties<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;packageName<span class="re2">&gt;</span></span></span>ControleOrcamento<span class="sc3"><span class="re1">&lt;/packageName<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;packageDirectory<span class="re2">&gt;</span></span></span>package<span class="sc3"><span class="re1">&lt;/packageDirectory<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;packageExtension<span class="re2">&gt;</span></span></span>exp<span class="sc3"><span class="re1">&lt;/packageExtension<span class="re2">&gt;</span></span></span>		</pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;/properties<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;build<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	   	<span class="sc3"><span class="re1">&lt;plugins<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	   		<span class="sc3"><span class="re1">&lt;plugin<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;artifactId<span class="re2">&gt;</span></span></span>maven-assembly-plugin<span class="sc3"><span class="re1">&lt;/artifactId<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;executions<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">					<span class="sc3"><span class="re1">&lt;execution<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;id<span class="re2">&gt;</span></span></span>assemble-zip<span class="sc3"><span class="re1">&lt;/id<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;phase<span class="re2">&gt;</span></span></span>install<span class="sc3"><span class="re1">&lt;/phase<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;goals<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">							<span class="sc3"><span class="re1">&lt;goal<span class="re2">&gt;</span></span></span>attached<span class="sc3"><span class="re1">&lt;/goal<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;/goals<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">					<span class="sc3"><span class="re1">&lt;/execution<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;/executions<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;configuration<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">                                       <span class="sc3"><span class="re1">&lt;appendAssemblyId<span class="re2">&gt;</span></span></span>false<span class="sc3"><span class="re1">&lt;/appendAssemblyId<span class="re2">&gt;</span></span></span>   </pre></li><li class="li1"><pre class="de1">					<span class="sc3"><span class="re1">&lt;finalName<span class="re2">&gt;</span></span></span>${packageName}<span class="sc3"><span class="re1">&lt;/finalName<span class="re2">&gt;</span></span></span>                 </pre></li><li class="li1"><pre class="de1">					<span class="sc3"><span class="re1">&lt;descriptors<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;descriptor<span class="re2">&gt;</span></span></span>assembly-descriptor.xml<span class="sc3"><span class="re1">&lt;/descriptor<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">					<span class="sc3"><span class="re1">&lt;/descriptors<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;/configuration<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;/plugin<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">      		<span class="sc3"><span class="re1">&lt;plugin<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;groupId<span class="re2">&gt;</span></span></span>org.apache.maven.plugins<span class="sc3"><span class="re1">&lt;/groupId<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;artifactId<span class="re2">&gt;</span></span></span>maven-antrun-plugin<span class="sc3"><span class="re1">&lt;/artifactId<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;executions<span class="re2">&gt;</span></span></span>									</pre></li><li class="li1"><pre class="de1">					<span class="sc3"><span class="re1">&lt;execution<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;id<span class="re2">&gt;</span></span></span>rename-package<span class="sc3"><span class="re1">&lt;/id<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;phase<span class="re2">&gt;</span></span></span>install<span class="sc3"><span class="re1">&lt;/phase<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;configuration<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">							<span class="sc3"><span class="re1">&lt;tasks<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">								<span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;package_name&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${packageName}&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;/property<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">								<span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;package_extension&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${packageExtension}&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;/property<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">								<span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;package_directory&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${packageDirectory}&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;/property<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">								<span class="sc3"><span class="re1">&lt;ant</span> <span class="re0">antfile</span>=<span class="st0">&quot;maven-setup.xml&quot;</span> <span class="re2">&gt;</span><span class="re1">&lt;/ant<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">							<span class="sc3"><span class="re1">&lt;/tasks<span class="re2">&gt;</span></span></span>							</pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;/configuration<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;goals<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">							<span class="sc3"><span class="re1">&lt;goal<span class="re2">&gt;</span></span></span>run<span class="sc3"><span class="re1">&lt;/goal<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">						<span class="sc3"><span class="re1">&lt;/goals<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">					<span class="sc3"><span class="re1">&lt;/execution<span class="re2">&gt;</span></span></span>					</pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;/executions<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;/plugin<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	    <span class="sc3"><span class="re1">&lt;/plugins<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;/build<span class="re2">&gt;</span></span></span>  	</pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;repositories<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;repository<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;id<span class="re2">&gt;</span></span></span>default<span class="sc3"><span class="re1">&lt;/id<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;name<span class="re2">&gt;</span></span></span>Internal<span class="sc3"><span class="re1">&lt;/name<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;url<span class="re2">&gt;</span></span></span>http://intranet/archiva/repository/internal<span class="sc3"><span class="re1">&lt;/url<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;/repository<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;repository<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;id<span class="re2">&gt;</span></span></span>ideais<span class="sc3"><span class="re1">&lt;/id<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;name<span class="re2">&gt;</span></span></span>Ideais<span class="sc3"><span class="re1">&lt;/name<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;url<span class="re2">&gt;</span></span></span>http://intranet/archiva/repository/ideais<span class="sc3"><span class="re1">&lt;/url<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;/repository<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;repository<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;id<span class="re2">&gt;</span></span></span>thirdparty<span class="sc3"><span class="re1">&lt;/id<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;name<span class="re2">&gt;</span></span></span>Thirdparty Artifacts<span class="sc3"><span class="re1">&lt;/name<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;url<span class="re2">&gt;</span></span></span>http://intranet/archiva/repository/thirdparty<span class="sc3"><span class="re1">&lt;/url<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;/repository<span class="re2">&gt;</span></span></span>	</pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;/repositories<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="sc3"><span class="re1">&lt;/project<span class="re2">&gt;</span></span></span></pre></li></ol></div></div></div></div></div></div></div>


<p>A idéia aqui não estar explicando o que é um POM, sua estrutura, como funciona, etc, a idéia é apenas mostrar como criar um POM com o intuito de gerar pacotes do ALBPM.</p>
<h3>Explicando o POM utilizado</h3>
<p>No começo do nosso POM temos algumas informações obrigatórias que o Maven exige, portanto acho que não vale a pena citá-las, dessa forma partindo para a declaração das propriedades (
<properties></properties>), nós temos:</p>
<p>packageName &#8211; Nome do diretório da aplicação<br />
packageDirectory &#8211; Diretório onde deverá ser gerado o pacote<br />
packageExtension &#8211; Extensão do pacote a ser gerado</p>
<p>Na parte da declaração de plugins, nós declaramos os dois plugins que utilizaremos: maven-assembly-plugin (será o responsável por gerar o arquivo compactado, excluir os diretórios não desejados, etc) e maven-antrun-plugin (será o responsável por fazer algumas tarefas pontuais como renomear o arquivo compactado e deletar os diretórios não utilizados e que são gerados pelo plugin anterior).</p>
<p>No caso do plugin maven-assembly-plugin, associamos ainda um descriptor, que é um arquivo XML que contém todas as rotinas que esse plugin deverá executar e que possui o seguinte conteúdo:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="xml"><ol><li class="li1"><pre class="de1"><span class="sc3"><span class="re1">&lt;assembly<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;formats<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;format<span class="re2">&gt;</span></span></span>zip<span class="sc3"><span class="re1">&lt;/format<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;/formats<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;includeBaseDirectory<span class="re2">&gt;</span></span></span>false<span class="sc3"><span class="re1">&lt;/includeBaseDirectory<span class="re2">&gt;</span></span></span>	</pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;fileSets<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;fileSet<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;directory<span class="re2">&gt;</span></span></span>${basedir}/${packageName}<span class="sc3"><span class="re1">&lt;/directory<span class="re2">&gt;</span></span></span>		  			  	</pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;filtered<span class="re2">&gt;</span></span></span>true<span class="sc3"><span class="re1">&lt;/filtered<span class="re2">&gt;</span></span></span>			</pre></li><li class="li1"><pre class="de1">		  	<span class="sc3"><span class="re1">&lt;excludes<span class="re2">&gt;</span></span></span>		  		</pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;exclude<span class="re2">&gt;</span></span></span>**/.svn/**<span class="sc3"><span class="re1">&lt;/exclude<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;exclude<span class="re2">&gt;</span></span></span>**/fuego.portal.jar/**<span class="sc3"><span class="re1">&lt;/exclude<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;exclude<span class="re2">&gt;</span></span></span>**/build/**<span class="sc3"><span class="re1">&lt;/exclude<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">				<span class="sc3"><span class="re1">&lt;exclude<span class="re2">&gt;</span></span></span>**/system/**<span class="sc3"><span class="re1">&lt;/exclude<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		  	<span class="sc3"><span class="re1">&lt;/excludes<span class="re2">&gt;</span></span></span>		  	</pre></li><li class="li1"><pre class="de1">		<span class="sc3"><span class="re1">&lt;/fileSet<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;/fileSets<span class="re2">&gt;</span></span></span>	</pre></li><li class="li1"><pre class="de1"><span class="sc3"><span class="re1">&lt;/assembly<span class="re2">&gt;</span></span></span></pre></li></ol></div></div></div></div></div></div></div>


<p>No conteúdo acima, especificamos no elemento<br />
<formats> o formato do arquivo a ser gerado, no caso um zip. No elemento <includeBaseDirectory> informamos ao plugin que não queremos que ele inclua o diretório base no arquivo zip a ser gerado. No elemento <fileSets> definimos uma série de regras que o arquivo a ser zipado deverá obedecer: no primeiro elemento (<directory>) informamos qual diretório deverá ser zipado, repare que nesse caso usamos os valores das propriedades definido no arquivo POM do Maven. No segundo elemento, no caso <filtered>, informamos que NÃO queremos que o plugin inclua os diretórios que não possuem arquivos, ou seja, não queremos diretórios em branco. No terceiro elemento (<excludes>), informamos ao plugin quais são os diretórios e arquivos que NÃO devem ser incluídos no arquivo zip a ser gerado, nesse caso não queremos incluir nenhum diretório/arquivo do SVN, não queremos incluir o JAR fuego.portal, assim como não queremos incluir os diretórios build e system, pois eles são gerados pela IDE em tempo de compilação e não são necessários para nosso pacote.</p>
<h3>Explicando o arquivo Ant</h3>
<p>No nosso POM, declaramos o plugin maven-antrun-plugin, que será o plugin responsável por executar tasks do Ant.</p>
<p>Ainda no arquivo POM, definimos algumas propriedades que o arquivo Ant deverá conhecer, ou seja, ele irá herdar as propriedades que definimos no POM, bem como definimos qual é o arquivo XML que conterá as taks do Ant a serem executadas, no nosso caso esse arquivo é o maven-setup.xml.</p>
<p>O arquivo maven-setup.xml conterá duas rotinas: uma que é renomear o zip gerado, para ao invés de possuir a extensão .zip, possuir a extensão .exp (propriedade definida no POM e herdada no arquivo Ant), e outra rotina deverá ser remover o diretório target, que é gerado pelo maven-assembly-plugin e que no nosso caso não teria nenhuma utilidade. Dessa forma o conteúdo do nosso arquivo Ant ficou assim:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="xml"><ol><li class="li1"><pre class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span></pre></li><li class="li1"><pre class="de1"><span class="sc3"><span class="re1">&lt;project</span> <span class="re0">name</span>=<span class="st0">&quot;mavensetup&quot;</span> <span class="re0">default</span>=<span class="st0">&quot;setup&quot;</span><span class="re2">&gt;</span></span></pre></li><li class="li1"><pre class="de1">	<span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;setup&quot;</span><span class="re2">&gt;</span></span></pre></li><li class="li1"><pre class="de1">			<span class="sc3"><span class="re1">&lt;echo</span> <span class="re0">level</span>=<span class="st0">&quot;info&quot;</span><span class="re2">&gt;</span></span>Renomeando o pacote para ${package_name}.${package_extension}<span class="sc3"><span class="re1">&lt;/echo<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		  	<span class="sc3"><span class="re1">&lt;move</span> <span class="re0">file</span>=<span class="st0">&quot;target/${package_name}.zip&quot;</span> <span class="re0">tofile</span>=<span class="st0">&quot;${package_directory}/${package_name}.${package_extension}&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;/move<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		  	<span class="sc3"><span class="re1">&lt;echo</span> <span class="re0">level</span>=<span class="st0">&quot;info&quot;</span><span class="re2">&gt;</span></span>Apagando o diretorio /target<span class="sc3"><span class="re1">&lt;/echo<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">		  	<span class="sc3"><span class="re1">&lt;delete</span> <span class="re0">dir</span>=<span class="st0">&quot;target&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;/delete<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1">  	<span class="sc3"><span class="re1">&lt;/target<span class="re2">&gt;</span></span></span></pre></li><li class="li1"><pre class="de1"><span class="sc3"><span class="re1">&lt;/project<span class="re2">&gt;</span></span></span></pre></li></ol></div></div></div></div></div></div></div>


<p>Repare, que no arquivo Ant usamos as propriedades definidas no nosso POM do Maven e usamos ainda o elemento <echo> para termos informação do que o Ant está fazendo.</p>
<h3>Resumindo</h3>
<p>Usando apenas 3 arquivos (pom.xml, assembly-descriptor.xml, maven-setup.xml) nós temos nosso pacote do ALBPM sendo gerado pelo Maven e pronto para ser deployado na versão enterprise do ALBPM.</p>
<p>Agora basta apenas um <em>mvn install</em> na linha de comando para geração do pacote.</p>
<h3>Mais informações</h3>
<p><a href="http://maven.apache.org/guides/getting-started/index.html" target="_blank" style="text-decoration: underline">Começando com o Maven</a></p>
<p><a href="http://maven.apache.org/plugins/maven-assembly-plugin/" target="_blank" style="text-decoration: underline">Maven Assembly Plugin</a></p>
<p><a href="http://maven.apache.org/plugins/maven-antrun-plugin/" target="_blank" style="text-decoration: underline">Maven AntRun Plugin</a></p>
<p><a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html" target="_blank" style="text-decoration: underline">Maven Lifecycle</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/11/30/gerando-pacotes-do-albpm-com-maven-e-ant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando PAPI para criar e recuperar instância de processos no ALBPM/OracleBPM</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/09/02/usando-papi-para-criar-e-recuperar-instancia-de-processos-no-albpmoraclebpm/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/09/02/usando-papi-para-criar-e-recuperar-instancia-de-processos-no-albpmoraclebpm/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 17:06:40 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[BPMS]]></category>
		<category><![CDATA[OracleBPM]]></category>
		<category><![CDATA[PAPI]]></category>
		<category><![CDATA[PAPI-WS]]></category>
		<category><![CDATA[ProcessService]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1144</guid>
		<description><![CDATA[O PAPI (Process API) é uma API do ALBPM/OracleBPM que permite que se possa interagir diretamente com a engine de execução de processos da ferramenta, e dentre outras coisas é possível: criar instâncias, recuperar instâncias, realizar buscas, abortar instâncias, enviar notificações, auditar uma instância, etc. Ou seja, é muito importante sabermos que essa API existe [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://download.oracle.com/docs/cd/E12483_01/albsi60/papi/index.html" style="text-decoration: underline" target="_blank">PAPI (<em>Process</em> API)</a> é uma API do ALBPM/OracleBPM que permite que se possa interagir diretamente com a <em>engine</em> de execução de processos da ferramenta, e dentre outras coisas é possível: criar instâncias, recuperar instâncias, realizar buscas, abortar instâncias, enviar notificações, auditar uma instância, etc. </p>
<p>Ou seja, é muito importante sabermos que essa API existe e principalmente sabermos como usá-la. Existem duas maneiras de usá-la: externa e internamente. Externamente isso pode ser feito usando o <a href="http://download.oracle.com/docs/cd/E12483_01/albsi60/papi/papi_ws/c_Head_PAPI_WS.html" style="text-decoration: underline" target="_blank">PAPI-WS</a>, que são serviços expostos pelo próprio ALBPM para que se possa usar o PAPI, porém um pouco limitado. Outra opção é usando a <a href="http://download.oracle.com/docs/cd/E12483_01/albsi60/papi/papi/c_Structure_of_a_Java_PAPI_Application.html" style="text-decoration: underline" target="_blank">JAVA API</a>, que é mais completa. Dentro do ALBPM usamos diretamente a Java API através do Catálogo de API&#8217;s da ferramenta.</p>
<h3>Criando e Recuperando Instâncias de Processos</h3>
<p>Fiz um exemplo de código bem simples no ALBPM para poder apresentar como criar instâncias e recuperar instâncias de processos. Seguem os dois exemplos com os respectivos comentários:</p>
<p><strong>Criando Instâncias</strong><br />
Para criar instâncias é muito simples, basta usarmos o método create da API ProcessInstance, passando como parâmetros o ID do processo (sempre com &#8220;/&#8221; na frente), os argumentos de incialização (caso existam), e o nome do método de inicialização, que pode ser visto através da opção &#8220;<em>argument mapping</em>&#8221; do evento de inicialização. Segue o código:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw3">String</span> processCreateResult <span class="sy0">=</span> create<span class="br0">&#40;</span>processId <span class="sy0">:</span> <span class="st0">&quot;/Teste&quot;</span>, arguments <span class="sy0">:</span> <span class="kw2">null</span>, argumentsSetName <span class="sy0">:</span> <span class="st0">&quot;BeginIn&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li></ol></div></div></div></div></div></div></div>


<p><strong>Recuperando Instâncias</strong><br />
Para recuperar instâncias também é muito simples, mas devemos ter atenção com a autenticação no DirectoryService onde o projeto correspondente a instância a ser recuperada está <em>deployado</em>.</p>
<p>Esse passo é necessário, pois para recuperar instâncias é usada outra API, no caso a API <a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/standard_components/Fuego/Papi/ProcessService/ProcessService_component.html"  style="text-decoration: underline" target="_blank">ProcessService</a> e para tal precisamos autenticar no DirectoryService antes de tentar recuperar a instância de fato.</p>
<p>Para autenticação no DirectoryService, usamos o método connectTo da API ProcessService, e esse método espera 3 parâmetros: A URL do DirectoryService (pode-se usar as constantes como no exemplo abaixo), o usuário e a senha. O usuário e a senha devem possuir a <em>role</em> onde a atividade de criação da instância está associada.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><ol><li class="li1"><pre class="de1"><span class="br0">&#40;</span>ProcessService<span class="br0">&#41;</span>.<span class="me1">connectTo</span><span class="br0">&#40;</span>url <span class="sy0">:</span> Fuego.<span class="me1">Server</span>.<span class="me1">directoryURL</span>, user <span class="sy0">:</span> <span class="st0">&quot;tester&quot;</span>, password <span class="sy0">:</span> <span class="st0">&quot;tester&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">businessProcess <span class="sy0">=</span> <span class="br0">&#40;</span>ProcessService<span class="br0">&#41;</span>.<span class="me1">getProcess</span><span class="br0">&#40;</span>process <span class="sy0">:</span> <span class="st0">&quot;/Teste&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Agora para visualizar o resultado, basta o seguinte código:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><ol><li class="li1"><pre class="de1">logMessage<span class="br0">&#40;</span><span class="st0">&quot;-------------------------------------------------------------------&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">logMessage<span class="br0">&#40;</span><span class="st0">&quot;Instância do Processo Criado: &quot;</span><span class="sy0">+</span>processCreateResult<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">logMessage<span class="br0">&#40;</span><span class="st0">&quot;Referência da Instância Recuperada: &quot;</span><span class="sy0">+</span>businessProcess<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">logMessage<span class="br0">&#40;</span><span class="st0">&quot;-------------------------------------------------------------------&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li></ol></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/09/02/usando-papi-para-criar-e-recuperar-instancia-de-processos-no-albpmoraclebpm/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Download de projeto BPM para iniciantes no ALBPM (ou OracleBPM)</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/05/12/download-de-projeto-bpm-para-iniciantes-no-albpm-ou-oraclebpm/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/05/12/download-de-projeto-bpm-para-iniciantes-no-albpm-ou-oraclebpm/#comments</comments>
		<pubDate>Tue, 12 May 2009 21:55:40 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[BPMS]]></category>
		<category><![CDATA[OracleBPM]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=956</guid>
		<description><![CDATA[Hoje fiz uma apresentação sobre BPM e o BPMS Aqualogic BPM (ou OracleBPM) na empresa que eu trabalho, o objetivo era mostrar o que é BPM para quem não conhece e principalmente apresentar a solução BPMS citada em um projeto piloto. Para apresentação, criei um projeto piloto &#8220;empréstimo bancário&#8221; onde é possível mostrar os conceitos [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje fiz uma apresentação sobre BPM e o BPMS Aqualogic BPM (ou OracleBPM) na empresa que eu trabalho, o objetivo era mostrar o que é BPM para quem não conhece e principalmente apresentar a solução BPMS citada em um projeto piloto.</p>
<p>Para apresentação, criei um projeto piloto &#8220;empréstimo bancário&#8221; onde é possível mostrar os conceitos mais básicos do ALBPM. Como imagino existirem mais pessoas com tal necessidade, irei disponibilizar o download do projeto, bem como o script SQL necessário para criação da tabela usada no projeto.</p>
<p>Os tópicos abordados na apresentação foram:</p>
<p><em>- O que é BPM e BPMS?</p>
<p>- BPMN</p>
<p>- BPM(s) não é arrastar e soltar figurinhas </p>
<p>- Workspace</p>
<p>- Processo</p>
<p>- Screenflow</p>
<p>- Atividades (Globais (Global Creation e Global), Automáticas, Interativas, Grab/Joins/Split)</p>
<p>- Transições</p>
<p>- BPM OBjects, Instance Variables, Local Variables, Project Variables</p>
<p>- Argumentos / Argument Mapping</p>
<p>- Business Parameters e Business Rules</p>
<p>- Exceções</p>
<p>- Grupos</p>
<p>- Connectors</p>
<p>- Logs (Log Viewer), Problems View, Variables View e Outline View</p>
<p>- Componentes (Catálogo)</p>
<p>- Organization (Roles, Usuários)</p>
<p>- Presentations e JSP</p>
<p>- External Resources</p>
<p>- Geração de &#8220;pacote&#8221; (.exp)</p>
<p>- SVN</em></p>
<p><a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/BPM_piloto/Piloto.exp" style="text-decoration: underline" target="_blank">Download do projeto.</a></p>
<p><a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/BPM_piloto/piloto.sql" style="text-decoration: underline" target="_blank">Download do script SQL.</a></p>
<p>PS: O projeto não disponibiliza todos os tópicos abordados e citados acima, mas quase todos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/05/12/download-de-projeto-bpm-para-iniciantes-no-albpm-ou-oraclebpm/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Oracle BPM com JSP e Ajax</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/23/oraclebpm-com-jsp-e-ajax/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/23/oraclebpm-com-jsp-e-ajax/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 18:54:57 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OracleBPM]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=750</guid>
		<description><![CDATA[Nos projetos de BPM que tenho participado utilizando o Oracle BPM como solução BPMS, dificilmente faço o uso de presentations, é muito mais comum eu optar em utilizar páginas JSP como camada de apresentação dos meus processos. Isso se dá pelo fato de que as presentations são bastante limitadas, e quando se faz por necessário [...]]]></description>
			<content:encoded><![CDATA[<p>Nos projetos de BPM que tenho participado utilizando o Oracle BPM como solução BPMS, dificilmente faço o uso de <em>presentations</em>, é muito mais comum eu optar em utilizar páginas <a href="http://pt.wikipedia.org/wiki/JavaServer_Pages" target="_blank" style="text-decoration: underline">JSP</a> como camada de apresentação dos meus processos. Isso se dá pelo fato de que as <em>presentations</em> são bastante limitadas, e quando se faz por necessário ter interfaces mais elaboradas e customizadas, o JSP passa a ser a melhor opção.</p>
<p>Usando JSP, um novo leque de opções passou a existir e uma dessas opções passou a ser a possibilidade de usar Ajax. Ajax, para quem nunca ouviu falar, não é uma linguagem, uma API, tão pouco um framework, Ajax é o acrônimo de <strong><em>Asynchronous Javascript And XML</em></strong> e nada mais é que um conjunto de técnicas usadas para criar aplicações web interativas (<a href="http://en.wikipedia.org/wiki/Rich_Internet_application" target="_blank" style="text-decoration: underline">RIA</a>). Um dos pilares do Ajax é permitir comunicação assíncrona entre cliente e servidor utilizando requisições <a href="http://pt.wikipedia.org/wiki/HTTP" target="_blank" style="text-decoration: underline">HTTP</a>.</p>
<p>O Oracle BPM oferece uma maneira bem interessante de usar Ajax nas páginas JSP, mesmo não sendo nativa e também não tendo nada a respeito dizendo na documentação, é possível fazer a integração da camada de apresentação de um processo BPM com o próprio processo de uma maneira bem tranquila.</p>
<p>Para exemplificar isso melhor, criei um projeto bem simples no Oracle BPM, que na verdade só serve para mostrar como funciona essa integração entre páginas JSP e métodos dentro de um BPM Object através de Ajax.</p>
<h3>Primeiros passos</h3>
<p>Para começar, criei um BPM Object bem simples, que possui 3 atributos: name (String), mail (String), documents (String[]). Os dois primeiros atributos, que representam o nome e o email de alguém, são do tipo String e o terceiro atributo, que no caso representa os documentos de uma pessoa, é do tipo Array de String. Chamei esse objeto de: <strong>BpmObject</strong>.</p>
<p>Nesse mesmo objeto (BpmObject), criei ainda um método, esse método será responsável por retornar os documentos de um usuário. Na verdade esse é o método que irei chamar via requisição Ajax através de uma página JSP. O nome desse método ficou definido como <strong>getDocuments()</strong>.</p>
<p>No futuro precisarei alterar esse objeto, mas eu explico depois.</p>
<h3>Criando a página JSP</h3>
<p>No Oracle BPM, para informar que a apresentação de determinado BPM Object deva se dar por meio de uma página JSP, se faz por necessário a utilização de <em>Screenflows</em>. <em><a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/studio/modules/screenflows/c_What_is_a_Screenflow.html" target="_blank" style="text-decoration: underline">Screenflow</a></em> é um fluxo semelhante ao de um processo normal, mas a principal diferença é que o mesmo é executado por um participante único, ou seja, dentro de um <em>Screenflow</em> não existem <em><a href="http://vishals.blogspot.com/2007/09/lanes-and-pools.html" target="_blank" style="text-decoration: underline">lanes</a></em>.</p>
<p>Após ter criado um processo normal, apenas com uma atividade do tipo <em>Global Creation</em> (para criar uma instância do processo) e também com uma <em>Interactive Activity</em> (para apontar para o <em>Screenflow</em>), parti para criação do <em>Screenflow</em> de fato. O <em>Screenflow</em> em questão, será tão simples quanto o processo no qual ele está associado, no caso contará apenas com uma única atividade do tipo <em>Interactive Component Call</em>, que será a responsável por &#8220;chamar&#8221; uma página JSP associando-a ao BPM Object criado no passo anterior.</p>
<p>Para chamar uma página JSP, se faz por necessária associar um BPM Object a mesma, então nesse caso criei um váriavel de instância do tipo BpmObject (o mesmo criado no primeiro passo) e dei o seu nome de <strong>bpmObject</strong>. Após isso, criei uma página JSP dentro de: <strong>/projetoBPM/webRoot/customJSP/ajaxPage.jsp</strong>.</p>
<p>O nome da página em questão é <strong>ajaxPage.jsp</strong>, e por enquanto ela irá possuir o seguinte código:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><ol><li class="li1"><pre class="de1"><span class="sy0">&lt;%</span>@ page session<span class="sy0">=</span><span class="st0">&quot;true&quot;</span><span class="sy0">%&gt;</span></pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;%</span>@ taglib uri<span class="sy0">=</span><span class="st0">&quot;http://java.sun.com/jstl/core&quot;</span> prefix<span class="sy0">=</span><span class="st0">&quot;c&quot;</span><span class="sy0">%&gt;</span></pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;%</span>@ taglib uri<span class="sy0">=</span><span class="st0">&quot;http://fuego.com/jsp/ftl&quot;</span> prefix<span class="sy0">=</span><span class="st0">&quot;f&quot;</span><span class="sy0">%&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;</span>html xmlns<span class="sy0">=</span><span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span><span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;</span>head<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">        <span class="sy0">&lt;</span>title<span class="sy0">&gt;</span>Teste Ajax<span class="sy0">/</span>title<span class="sy0">&gt;</span>        </pre></li><li class="li1"><pre class="de1">        <span class="sy0">&lt;</span>script type<span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> src<span class="sy0">=</span><span class="st0">&quot;&lt;f:webResources relativePath='js/prototype-1.6.0.3.js'/&gt;&quot;</span><span class="sy0">&gt;&lt;/</span>script<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;/</span>head<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;</span>body leftmargin<span class="sy0">=</span><span class="st0">&quot;0&quot;</span> topmargin<span class="sy0">=</span><span class="st0">&quot;0&quot;</span><span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    Teste Ajax</pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;</span>br<span class="sy0">/&gt;&lt;</span>br<span class="sy0">/&gt;</span></pre></li><li class="li1"><pre class="de1">    Nome<span class="sy0">:</span> <span class="sy0">&lt;</span>c<span class="sy0">:</span>out value<span class="sy0">=</span><span class="st0">&quot;${bpmObject.nome}&quot;</span> <span class="sy0">/&gt;</span> </pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;</span>br<span class="sy0">/&gt;&lt;</span>br<span class="sy0">/&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;</span>div id<span class="sy0">=</span><span class="st0">&quot;teste&quot;</span><span class="sy0">&gt;&lt;/</span>div<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;/</span>body<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;/</span>html<span class="sy0">&gt;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Então, relembrando os passos até aqui:</p>
<p>1) Criação de BPM Object com 3 atributos e um método;<br />
2) Criação de processo com uma atividade do tipo <em>Global Creation</em> e outra do tipo <em>Interactive Activity</em>;<br />
3) Criação de <em>Screenflow</em>;<br />
4) Associação (<em>Implementation Type</em>) da <em>Interactive Activity</em> do processo ao <em>Screenflow</em> criado;<br />
5) Criação de atividade do tipo <em>Interactive Component Call</em> no <em>Screenflow</em>;<br />
6) Criação de váriavel de instância no <em>Screenflow</em> com o tipo sendo o mesmo do BPM Object que foi criado no primeiro passo;<br />
7) Definição do <em>Implementation Type</em> da <em>Interactive Component Call</em> como <em>BPM Object Interactive Call</em>;<br />
8) Associação do BPM Object criado como váriavel de instância da <em>Interactive Component Call</em> do <em>Screenflow</em>;<br />
9) Definição da página ajaxPage.jsp como <em>JSP Presentation</em> da <em>Interactive Component Call</em> do <em>Screenflow</em>.</p>
<p>Feito os passos acima, a estrutura do processo está pronta para criação da página JSP que irá fazer a requisição via Ajax a um método do BPM Object que foi criado no primeiro passo.</p>
<h3>Fazendo a requisição Ajax e explicando alguns components da <em>taglib</em> do Oracle BPM</h3>
<p>Para criação do mecanismo que irá fazer a requisição Ajax, se faz por necessário a utilização da <em>taglib</em> do Oracle BPM, sem ela não seria possível usar Ajax, ou então seria bastante árduo fazer tal integração.</p>
<p>Por exemplo, para incluir a biblioteca <a href="http://www.prototypejs.org/" target="_blank" style="text-decoration: underline">Prototype</a>, que no caso será a responsável por fazer o &#8220;trabalho sujo&#8221; e criar o objeto XMLHttpRequest para fazer a requisição assíncrona, utilizei a <em>tag</em> <strong>f:webResources</strong> (linha 10). Esta <em>tag</em> inclui os <em>resources</em> inclusos no projeto BPM, sem que seja necessário informar explicitamente o <em>context path</em> da aplicação para inclusão de imagens, CSS ou Javascripts.</p>
<p>Outra <em>tag</em> importante é a <strong>f:invokeUrl</strong>, que no caso irá gerar a URL para execução de um método dentro de um BPM Object. Dessa forma, a página JSP precisa ser alterada, pois agora irá contar com uma função Javascript que irá fazer a chamada via Ajax ao método <strong>getDocuments()</strong> do BPM Object criado no primeiro passo, retornando o <em>output</em> do método para div <strong>teste</strong>.</p>
<p>Página JSP alterada:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><ol><li class="li1"><pre class="de1"><span class="sy0">&lt;%</span>@ page session<span class="sy0">=</span><span class="st0">&quot;true&quot;</span><span class="sy0">%&gt;</span></pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;%</span>@ taglib uri<span class="sy0">=</span><span class="st0">&quot;http://java.sun.com/jstl/core&quot;</span> prefix<span class="sy0">=</span><span class="st0">&quot;c&quot;</span><span class="sy0">%&gt;</span></pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;%</span>@ taglib uri<span class="sy0">=</span><span class="st0">&quot;http://fuego.com/jsp/ftl&quot;</span> prefix<span class="sy0">=</span><span class="st0">&quot;f&quot;</span><span class="sy0">%&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;!</span>DOCTYPE html <span class="kw1">PUBLIC</span> <span class="st0">&quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;</span> <span class="st0">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;</span><span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;</span>html xmlns<span class="sy0">=</span><span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span><span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;</span>head<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">        <span class="sy0">&lt;</span>title<span class="sy0">&gt;</span>Teste Ajax<span class="sy0">/</span>title<span class="sy0">&gt;</span>        </pre></li><li class="li1"><pre class="de1">        <span class="sy0">&lt;</span>script type<span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> src<span class="sy0">=</span><span class="st0">&quot;&lt;f:webResources relativePath='js/prototype-1.6.0.3.js'/&gt;&quot;</span><span class="sy0">&gt;&lt;/</span>script<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">        <span class="sy0">&lt;</span>script<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">        function callAjaxMethod <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		var bpmUrl	<span class="sy0">=</span><span class="st0">'&lt;f:invokeUrl var=&quot;bpmObject&quot; methodName=&quot;getDocuments&quot; /&gt;'</span><span class="sy0">;</span>		</pre></li><li class="li1"><pre class="de1">		<span class="kw1">return</span> bpmUrl<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span>        </pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw1">new</span> Ajax.<span class="me1">Updater</span><span class="br0">&#40;</span><span class="st0">'teste'</span>, callAjaxMethod<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">        <span class="sy0">&lt;/</span>script<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;/</span>head<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;</span>body leftmargin<span class="sy0">=</span><span class="st0">&quot;0&quot;</span> topmargin<span class="sy0">=</span><span class="st0">&quot;0&quot;</span><span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    Teste Ajax</pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;</span>br<span class="sy0">/&gt;&lt;</span>br<span class="sy0">/&gt;</span></pre></li><li class="li1"><pre class="de1">    Nome<span class="sy0">:</span> <span class="sy0">&lt;</span>c<span class="sy0">:</span>out value<span class="sy0">=</span><span class="st0">&quot;${bpmObject.nome}&quot;</span> <span class="sy0">/&gt;</span> </pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;</span>br<span class="sy0">/&gt;&lt;</span>br<span class="sy0">/&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;</span>div id<span class="sy0">=</span><span class="st0">&quot;teste&quot;</span><span class="sy0">&gt;&lt;/</span>div<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    <span class="sy0">&lt;/</span>body<span class="sy0">&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="sy0">&lt;/</span>html<span class="sy0">&gt;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Repare que foi criada a função JS <strong>callAjaxMethod</strong>. Abaixo dessa função existe ainda a função JS <strong><a href="http://www.prototypejs.org/api/ajax/updater" target="_blank" style="text-decoration: underline">Ajax.Updater</a></strong>, que no caso é uma função da biblioteca Prototype que irá fazer a chamada ao método do BPM Object, retornando seu <em>output</em> para a div <strong>teste</strong>.</p>
<h3>Criando um <em>output</em> para o método getDocuments do BPM Object</h3>
<p>Finalmente essa é a última parte desse pequeno tutorial. Agora a única coisa que falta é criar um <em>output</em> para o método do BPM Object que irá ser chamado via requisição Ajax.</p>
<p>Antes de mais nada, preciso dizer algo a respeito da <em>tag</em> <strong>f:invokeUrl</strong>, pois para ela funcionar corretamente existem algumas peculiariades. </p>
<p>Para um método de um BPM Object ser reconhecido por esta <em>tag</em>, ele deve ter uma das quatro assinaturas abaixo:</p>
<ul>
<li>methodName(Fuego.Net.HttpRequest request, Fuego.Net.HttpResponse response)</li>
<li>methodName(java.util.Map requestParameters, java.util.Map requestHeaders)</li>
<li>methodName(java.util.Map requestParameters)</li>
<li>methodName()</li>
</ul>
<p>No caso, eu optei por utilizar a primeira opção, pois para usar a função <strong>Ajax.Updater</strong> da Prototype, eu preciso escrever diretamente no <em>output</em> do método, ao invés de setar as informações necessárias através dos seus atributos.</p>
<p>Em virtude disso, o método <strong>getDocuments</strong> do objeto <strong>BpmObject</strong> agora passará a ter a seguinte assinatura:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><pre class="de1">getDocuments<span class="br0">&#40;</span>Fuego.<span class="me1">Net</span>.<span class="me1">HttpRequest</span> request, Fuego.<span class="me1">Net</span>.<span class="me1">HttpResponse</span> response<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>Agora, finalmente o código do método <strong>getDocuments</strong>, que ficará da seguinte maneira:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw3">String</span> doc <span class="sy0">:</span> documents<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">    response.<span class="me1">bodyTextContent</span><span class="br0">&#40;</span>arg1 <span class="sy0">:</span> doc<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>No código acima, estou percorrendo o atributo <strong>documents</strong> (array) e imprimindo no <em>output</em> todos os documentos definidos para aquele atributo, dessa forma, quando a função <strong>callAjaxMethod</strong> é chamada na página JSP, ela automaticamente chama (assincronamente) este método contido dentro do BPM Object, imprimindo todos os documentos definidos para dentro da div com o ID <strong>teste</strong>.</p>
<h3>Conclusão</h3>
<p>Utilizando os recursos corretos do Oracle BPM, como sua taglib e seus componentes, não é muito difícil fazer uma tela de apresentação mais interativa usando Ajax. No exemplo acima, foi criado um projeto bem simples, apenas para ilustrar, com o intuito de mostrar a atualização do conteúdo de uma div feita assincronamente através de uma requisição Ajax. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/23/oraclebpm-com-jsp-e-ajax/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Algumas observações e dicas sobre o Oracle/Aqualogic BPM Enterprise</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/04/algumas-observacoes-e-dicas-sobre-o-oracle-aqualogic-bpm-enterprise/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/04/algumas-observacoes-e-dicas-sobre-o-oracle-aqualogic-bpm-enterprise/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 06:34:17 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[Aqualogic]]></category>
		<category><![CDATA[Deploy]]></category>
		<category><![CDATA[Enterprise]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OracleBPM]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=441</guid>
		<description><![CDATA[Desde a última sexta-feira até hoje ao final do dia, podemos dizer que passei um certo sofrimento tentando fazer o deploy de um projeto no Oracle BPM Enterprise, só que a minha situação é um pouco atípica, pois no ambiente de homologação e produção do cliente, a versão que está sendo utilizada da distribuição enterprise [...]]]></description>
			<content:encoded><![CDATA[<p>Desde a última sexta-feira até hoje ao final do dia, podemos dizer que passei um certo sofrimento tentando fazer o <em>deploy</em> de um projeto no Oracle BPM Enterprise, só que a minha situação é um pouco atípica, pois no ambiente de homologação e produção do cliente, a versão que está sendo utilizada da distribuição <em>enterprise</em> ainda é a 6.04, ou seja, Aqualogic BPM Enterprise e não Oracle BPM Enterprise (mais recente).</p>
<p>Há cerca de um mês atrás eu havia <a href="http://www.marcuscavalcanti.net/blog/2009/02/03/diferencas-entre-versoes-do-aqualogic-bpm-para-oracle-bpm-studio/" target="_blank" style="text-decoration: underline">falado sobre isso</a>, lembra? Resumidamente o que eu havia dito é que apesar de saber que a versão no cliente ainda era a 6.04, eu havia tomado a decisão de usar a versão nova do Oracle BPM Studio, pois em relação a ferramenta pouca coisa havia mudado e o que havia mudado não impactaria no arquivo gerado a ser <em>deployado</em> nas distribuições <em>enterprise</em>. Inclusive o pessoal da Oracle havia me confirmado isso em um workshop que eu havia ido.</p>
<p>Como o <a href="http://pt.wikipedia.org/wiki/Cluster" target="_blank" style="text-decoration: underline"><em>cluster</em></a> lá do meu trabalho onde está (estava) rodando a versão 6.04 da distribuição <em>enterprise</em> estava muito instável, resolvi fazer a instalação em outra máquina. Foi aí que começou a minha própria <a href="http://pt.wikipedia.org/wiki/Via_Crucis"  target="_blank" style="text-decoration: underline">Via Crucis</a>. Um detalhe importante é que eu nunca havia feito a instalação da distribuição <em>enterprise</em>, portanto era uma experiência totalmente nova para mim.</p>
<p>A distribuição <em>enterprise</em> do ALBPM possui alguns conceitos um pouco diferentes da versão usada para desenvolvimento (Studio), a começar pelo conceito de <em>directory service</em> e pelas outras aplicações que vem agregadas juntas a instalação. Dentre as aplicações que me interessavam estavam apenas o <em>process administrator</em>, <em>workspace</em> e <em>process engine</em>. Tinha ainda o PAPI Web Services, que pode ser muito importante dentro de um projeto BPM, mas como eu não precisaria integrar outros projetos com o meu projeto BPM, então o PAPI-WS nesse caso não seria necessário, pelo menos não naquele <em>directory service</em> atual. <em>Directory Service</em> é onde ficam guardadas as informações referentes a usuários, <em>roles</em>, grupos, <em>resources</em> externos e outras informações que fazem parte de um projeto no BPM, além também dessas aplicações já citadas. Não necessariamente cada projeto deve ter o seu próprio <em>directory service</em>, na verdade N projetos podem compartilhar o mesmo. Outro ponto importante diz respeito a <em>process execution engine</em>, pois cada <em>directory service</em> possui a sua própria <em>engine</em>, ou até mesmo mais de uma, mas apenas uma engine cadastrada pode estar &#8220;rodando&#8221;. Uma <em>engine</em> está associada a um servidor de aplicações e no meu caso está associada a uma instância do <a href="http://www.oracle.com/us/products/middleware/application-server/weblogic-suite/index.html"  target="_blank" style="text-decoration: underline">weblogic</a>, pois foi essa a versão que eu havia escolhido no ato do download.</p>
<p>Sinceramente, apesar de já ter escutado comentários de que a distribuição <em>enterprise</em> (<= 6.*) era um pouco irregular e que possuia algumas peculiaridades, eu não sabia que seria tão árdua a sua instalação. O primeiro problema que eu encontrei foi na criação de um <em>directory service</em>, nesse ponto, através de uma tela do tipo wizard, a instalação solicita as informações do banco de dados onde serão gravadas as informações do <em>directory service</em>, no meu caso eu escolhi como banco de dados o Oracle (<a href="http://www.oracle.com/technology/products/database/xe/index.html"  target="_blank"  style="text-decoration: underline">Oracle-XE</a>). Nessa mesma tela, a configuração solicita qual o nome do <a href="http://www.oracle.com/technology/obe/2day_dba/schema/schema.htm" target="_blank"  style="text-decoration: underline">Schema</a> onde serão criadas as tabelas e eu aconselho fortemente deixar essa opção em branco, pois além dela ser opcional, o negócio só funcionou depois que eu a deixei em branco. Em uma das minhas tentativas mal sucedidas eu até havia criado o schema &#8220;na mão&#8221;, mas mesmo assim não funcionou. Primeiro problema resolvido, nome dos schemas deixados em branco e tudo ok.</p>
<p>O segundo problema talvez tenha sido o pior de resolver. Depois de informar todos os dados necessários para a configuração viria a tela de progresso e conclusão da criação do <em>directory service</em>, nesse momento só resta aguardar até que a ferramenta termine o processo de criação. Mas para o meu azar o processo nunca conseguia ser concluído, pois sempre antes de chegar em 100% o processo me mostrava a mensagem: <em><strong>failed!</strong></em> Tentei mais algumas vezes e após tantos insucessos resolvi verificar os <em>logs</em> e ver qual era o erro. O <em>log</em> nesse caso ajudou e não ajudou, pois no <em>log</em> a informação principal do erro é que uma exceção havia sido disparada quando o JAR de algum EJB estava tentando ser gerado pela instalação. Pesquisei, pesquisei, pesquisei e nada&#8230; resolvi então falar com um amigo de trabalho que tinha comentado que a instalação da distribuição <em>enterprise</em> era meio caótica. Ele pediu para eu ver o <em>stack-trace</em> todo da exceção. Após reparar bem o <em>stack-trace</em> percebi que o mesmo continha uma frase que terminava com <em>&#8220;too many open files&#8221;</em> e informei sobre a mensagem para esse amigo, ele então me disse que esse problema não tinha relação com o JAR do EJB, na verdade o problema estava ocorrendo, pois o SO (Ubuntu) estava tentando abrir mais de 1024 arquivos ao mesmo tempo durante a instalação e que eu precisaria mudar algumas configurações padrões do SO (file descriptor) para resolver esse problema, isso no caso seria um <a href="http://e-docs.bea.com/wls/docs100/perform/OSTuning.html" target="_blank" style="text-decoration: underline" class="broken_link"><em>OS tuning</em></a>. Mudanças feitas e não deu outra: o diretório foi criado com sucesso!</p>
<p>O próximo problema ocorria ao tentar <em>startar</em> a <em>process execution engine</em>. Sempre que eu tentava inicializar a <em>engine</em> a mensagem de status nunca se modificava, não informava nem que estava inicializada e nem que estava parada. Após bater bastante cabeça com isso, fui até o manual de instalação e verifiquei que um dos pré-requisitos era que a versão do Weblogic fosse a 9.2 e no meu caso eu estava usando a 10.0 ou 10.3. Na verdade esse problema ocorreu mais em razão de um vacilo meu do que qualquer outra coisa. Instalei a versão 9.2, criei outro diretório novamente e agora eu conseguia <em>startar</em> a <em>engine</em> sem problemas.</p>
<p>Acho que tive também alguns problemas de versão de <a href="http://java.com/pt_BR/download/faq/jvm.xml" target="_blank"  style="text-decoration: underline">JVM</a>, no caso <a href="http://en.wikipedia.org/wiki/JRockit" target="_blank"  style="text-decoration: underline">JRockit</a>, mas isso foi tranquilo de resolver, porque o erro era bem evidente.</p>
<p>Instalação concluída, fui tentar finalmente fazer o <em>deploy</em> de um projeto e&#8230; mais problemas! Fazer o <em>deploy</em> eu até conseguia, mas ao tentar executar os processos um erro estranho ocorria e verificando o <em>log</em> percebi que alguns arquivos do projeto não estavam sendo encontrados. Para mim nada poderia explicar aquilo a não ser problemas de versão, pois como eu já citei, a versão de desenvolvimento que eu estava usando era diferente da versão da distribuição <em>enterprise</em>. Resolvi então tentar abrir o projeto em uma versão de ambiente de desenvolvimento igual a da distribuição <em>enterprise</em> com o intuito de gerar o arquivo a ser <em>deployado</em> em versões iguais. Ao abrir o projeto em uma versão mais antiga não tive nenhum problema, o ALBPM Studio conseguiu detectar todos os processos, <em>screenflows</em>, <em>resources</em> e etc, mas ao tentar executar o processo comecei a ter alguns problemas. Após alguns <em>debugs</em>, percebi que alguns métodos da API de Java (<em>Component Catalog</em>) simplesmente não existiam, ou, não funcionavam nessa versão mais antiga (ALBPM Studio 6.04) e que provavelmente esse poderia ser o mesmo problema que ocorria na distribuição <em>enterprise</em>. Isso de certa forma fazia com que a minha teoria de que não haviam mudanças consideráveis entre as versões ALBPM e OracleBPM caísse por terra.</p>
<p>Fiz os ajustes no projeto na versão mais antiga da ferramenta, gerei um arquivo de <em>deploy</em> novo e fui novamente tentar rodar o projeto na distribuição <em>enterprise</em>. Mesmo problema! A essa hora minha paciência estava esvaindo-se, mas eu precisava conseguir <em>deployar</em> o projeto de qualquer jeito. Resolvi, só por desencargo de consciência, baixar a distribuição <em>enterprise</em> em sua versão mais atual, no caso já como Oracle BPM Enterprise 10g3. Baixei, fiz a instalação &#8211; que por sinal foi muito mais tranquila &#8211; e tentei fazer o deploy do projeto e executá-lo. Para minha surpresa (ou não) foi de primeira! Consegui executar o projeto direitinho na versão nova da distribuição <em>enterprise</em>, o que me faz concluir que a versão 6.04 (ou <) é realmente problemática ou então o impacto entre versões Oracle (Oracle BPM) x BEA (Aqualogic BPM) é realmente considerável.</p>
<h3>Dicas Finais</h3>
<ul>
<li>Caso use a distribuição <em>enterprise</em> na versão 6 (ou <) use o Weblogic 9.2 e não 10.0 (ou >);</li>
<li>Não esqueça de mudar as configurações (<em>file descriptor</em>) do seu SO para permitir que ele consiga abrir mais de 1024 arquivos simultaneamente;</li>
<li>Na criação de um <em>directory service</em>, deixei que a ferramente crie um schema para você no banco de dados, portanto deixe a opção em branco;</li>
<li>Verificar possíveis incompatibilidades entre versões de JVM;</li>
<li>É necessário sempre inicializar a instância do Weblogic antes de inicializar o Admin Center do BPM;</li>
<li>Caso não consiga <em>startar</em> a sua <em>engine</em> e tudo pareça estar correto, tente acessar o console do weblogic e dar <em>unlock</em> no usuário <strong>FuegoWeblogicDeployer</strong>, pois quando uma engine tenta ser inicializada várias vezes e não consegue, esse usuário fica travado;</li>
<li>Caso algum erro ocorra no <em>Process Administrator</em> ou então no <em>Workspace</em>, tente ver o código fonte da página HTML, pois em muitas vezes o erro (detalhado) fica oculto dentro de comentários.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/04/algumas-observacoes-e-dicas-sobre-o-oracle-aqualogic-bpm-enterprise/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Diferenças entre versões do Aqualogic BPM para Oracle BPM Studio</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/02/03/diferencas-entre-versoes-do-aqualogic-bpm-para-oracle-bpm-studio/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/02/03/diferencas-entre-versoes-do-aqualogic-bpm-para-oracle-bpm-studio/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 22:04:22 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[Aqualogic]]></category>
		<category><![CDATA[BEA]]></category>
		<category><![CDATA[BPMS]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OracleBPM]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=240</guid>
		<description><![CDATA[Sei que estou devendo um post falando de um exemplo real de um processo de negócio sendo executado por uma ferramenta BPMS, mas enquanto esse post não vem irei falar sobre algo relacionado, mais especificamente sobre as diferenças que notei até agora entre o Aqualogic BPM 6.03, ainda com a BEA Systems como mantenadora e [...]]]></description>
			<content:encoded><![CDATA[<p>Sei que estou devendo um post falando de um exemplo real de um processo de negócio sendo executado por uma ferramenta BPMS, mas enquanto esse post não vem irei falar sobre algo relacionado, mais especificamente sobre as diferenças que notei até agora entre o Aqualogic BPM 6.03, ainda com a BEA Systems como mantenadora e o Oracle BPM Studio 10.3, que passou a ser o novo nome do Aqualogic BPM após a aquisição da BEA pela Oracle.</p>
<h3>O início</h3>
<p>Ao iniciar o projeto que estou atualmente, confesso que fiquei no impasse de &#8220;qual versão usar?&#8221;, pois o BPM Server (enterprise) de produção ainda é o 6, ou seja, Aqualogic. Paralelo a isso, comecei a ter alguns problemas com a versão 6.03 do Aqualogic BPM Studio na minha máquina, pois como tenho dois <em>localhost</em> (alias) apontando para o mesmo IP local (127.0.0.1), ao subir a engine um erro com a mensagem &#8220;server has exited&#8221; começou a ocorrer e com isso não conseguia &#8220;startar&#8221; a ferramenta. Pesquisando no Google, vi no falecido fórum da BEA, uma thread dizendo que para resolver esse problema bastaria eu  comentar uma das linhas que apontam para o meu IP local no arquivo de hosts do meu SO. Fiz o procedimento e&#8230; nada! Ainda nessa mesma thread, havia outro comentário informando que na versão nova (Oracle) a engine estava mais esperta e resolvia esses tipos de problemas, foi a partir disso que resolvi usar a nova versão, ainda meio que ressabiado.</p>
<h3>O problema e a segurança</h3>
<p>Mas aí surge um novo problema: a incompatibilidade entre versões. Meu ambiente de desenvolvimento usa a versão nova e o meu ambiente de produção usa a versão mais antiga, será que com isso terei problemas em fazer deploy? A princípio não deveria ocorrer problema algum, pois na verdade o que mudou foi basicamente a skin da ferramenta, o workspace (skin também) e a engine que ficou mais esperta. Nesse meio tempo, por coinciência, tive um treinamento de BPM aqui no RJ com o pessoal da Oracle e ao perguntar pra eles se esse problema poderia se concretizar, fui respondido que não, apesar de nunca terem feito esse teste. Confirmaram ainda, que realmente quase nada havia mudado de uma versão para outra. Foi o suficiente para eu ter segurança na minha decisão.</p>
<h3>A realidade</h3>
<p>Mas no decorrer do projeto, tenho percebido que o buraco é um pouco mais embaixo hehe, nada que comprometa o desenvolvimento, mas alguns cuidados precisam ser tomados e como estou passando pela experiência, acho válido relatar para quem possar vir a passar pelas mesmas situações que eu. Só gostaria de ressaltar, que os testes que tenho feito não são os ideais, pois o que estou testando é o projeto sendo executado no Studio BPM na versão Oracle (nova) e também no Aqualogic (antiga), mas ainda não tentei fazer deploy em uma versão enterprise, pois ainda estou sem ambiente para isso, quando tiver esses testes, atualizo esse post.</p>
<p>Abaixo irei enumerar as diferenças que notei até agora com suas devidas observações.</p>
<p><strong>Controle de Versão</strong><br />
Na versão 6.03 (Aqualogic), a ferramenta ainda não possuia um controle de versão embutido para SVN, se fazia por necessário instalar um plugin (Subversive) para ter essa funcionalidade, agora isso já vem de graça! Essa sem dúvida foi uma melhoria muito positiva na qual não tive problema algum entre as versões.</p>
<p><strong>Connectors</strong><br />
O BPM Studio, em ambas as versões, tem uma coisa muito legal chamada <em>connectors</em>. Com os <em>connectors</em> é possível criar um atalho para determinada atividade sem ter que puxar uma <em>transition</em> para a mesma, isso é muito bom para ajudar na organização do processo, pois com isso evita-se que um monte de <em>transitions</em> fiquem entrelaçadas deixando o processo uma verdadeira zona.</p>
<p>Com <em>connectors</em> comecei a ter alguns problemas, pois processos que possuiam <em>connectors</em> na versão nova simplesmente não funcionavam na versão antiga. Pior do que isso, processos com <em>connectors</em> na versão nova não abrim na versão antiga! Não consegui descobrir o motivo, a única conclusão que cheguei é que geralmente o problema ocorria com <em>connectors</em> que <em>linkavam</em> para uma atividade final (End) do processo.</p>
<p>Conclusão: não uso mais.</p>
<p><strong>Instanciar Variáveis</strong><br />
Esse foi um comportamento que eu sinceramente prefiro da versão antiga, pois acho mais correto.</p>
<p>O que ocorre é que algumas variáveis de instância eu não preciso instanciar, então em um array de BPMObject eu consigo ter algo do tipo:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><pre class="de1">bpmObject<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">nome</span> <span class="sy0">=</span> <span class="st0">&quot;Marcus Cavalcanti&quot;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Ou seja, não precisei instanciar aquele índice corrente do array. Já na versão antiga isso não funciona, obviamente ocorre um NullPointerException, então para resolver isso eu preciso fazer:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><pre class="de1">bpmObject<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw1">new</span> MeuBpmObject<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
bpmObject<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">nome</span> <span class="sy0">=</span> <span class="st0">&quot;Marcus Cavalcanti&quot;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Eu prefiro a segunda opção, mais conservadora. Sinceramente não sei como e porque a primeira opção funciona na versão nova, pois não deveria.</p>
<p><strong>Activity x Transitions</strong><br />
Uma mudança simples, mas muito significativa ocorreu nessa nova versão. Toda vez que uma atividade é adicionada ou removida, automaticamente o layout se ajusta e na maioria das vezes bagunçando as transitions entre uma atividade e outra. Agora na nova versão existe a possibilidade de habilitar/desabilitar esse &#8220;recurso&#8221;. É muito simples, basta ir em:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="text"><pre class="de1">Window &gt; BPM Preferences &gt; Activity &gt; General</pre></div></div></div></div></div></div></div>


<p>Seguido os passos acima, basta apenas desmarcar o último checkbox. Fichinha!</p>
<p><strong>Gráficos e Skin</strong><br />
Nossa&#8230; esse foi um avanço e tanto! Na versão para Linux os ícones ficavam horrorosos! Ficavam sem transparência por causa do PNG, então ficava aquele fundo preto e era horrível, além do mais os ícones agora estão bem mais trabalhados e bonitinhos :)</p>
<p>O Workspace foi outra coisa que mudou, achei a nova skin bem melhor e funcional, parece que cabem mais informações.</p>
<h3>Conclusão</h3>
<p>Conforme dito no começo, mudanças em relação a <em>features</em> não existem de uma versão para outra, mas percebi algumas pequenas mudanças ao executar o mesmo projeto em versões diferentes, o que pode trazer pequenos problemas.</p>
<p>Acredito que a principal questão seja em relação a diferença entre versões de desenvolvimento e enterprise, mas esses testes ainda não possuo e assim que possuir atualizo esse post. Da mesma forma, se surgirem novas diferenças entre as &#8220;versões Studio&#8221;, esse espaço será atualizado.</p>
<p>PS: se alguém tiver percebido mais algum comportamento estranho, fique a vontade para compartilhar, os comentários estão aí pra isso!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/02/03/diferencas-entre-versoes-do-aqualogic-bpm-para-oracle-bpm-studio/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

