Spring Security Flex e Java

9, agosto, 2011 Sem comentários

Ae pessoas. Blz?

Só estou passando aqui para indicar um material que vale muito a pena para quem integra Java e Flex usando Spring é do FlexMania do Fabiel Prestes.

Segue o link

http://experts.adobeconnect.com/p82chnk4h58/

Só uma pequena dica quanto as annotations isso aqui tambem funciona

@Secured ({"ROLE_USER", "ROLE_ADMIN"})
public void save(Contact contact);

Pode passar um array de String (by documentação do Spring Security )

Felipe

Share on Facebook
Categories: Flex, Java Tags:

Flash Builder DataGrid DragEvent

11, maio, 2011 2 comentários

Olá pessoal beleza?

Pois é em ritmo de AudiCup.
Eis que então o pessoal da Audi entrou em contato comigo essa semana para fazer algo em Web 2.0 para cadastrar os times que irão participar da AudiCup.

Segue os links abaixo:
http://www.audi.com/com/brand/en/experience/sponsoring/sportsponsoring/the_audi_cup_2011.html
http://www.audi.com/com/brand/en/experience/sponsoring/sportsponsoring/the_audi_cup_2011/schedule_and_tickets.html

Inter , estaremos contigo ..
Tu és minha paixão !
Não importa o que digam
Sempre levarei comigo
Minha camisa vermelha ..
e a cachaça na mão
O Gigante me espera ..
Para começar a festa !

O exemplo é mais ou menos o que esta abaixo:

Veja o Fonte é simples:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
			   creationComplete="application1_creationCompleteHandler(event)">
	<fx:Declarations>
 
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			import mx.events.CloseEvent;
			import mx.controls.Alert;
			import mx.events.DragEvent;
			import mx.events.FlexEvent;
			import mx.managers.DragManager;
 
			[Bindable]
			private var time:Time;
 
			[Bindable]
			private var times:ArrayCollection;			
 
			[Bindable]
			private var timesConvocados:ArrayCollection=new ArrayCollection();
 
			private function onDrop(event:DragEvent):void {
				if(event.dragSource.formats.toString() == "items,itemsByIndex,caretIndex") {
					var dragList:Array = event.dragSource.dataForFormat('items') as Array;
					var draggedTimes:Time = dragList[0] as Time;
 
					if(draggedTimes.fifa == 'N') {
						Alert.show("Não foi possível adicionar este time!\n\n"+draggedTimes.nome+" não tem mundial de Clubes FIFA!", "AudiCup");
						event.preventDefault();
						event.target.hideDropFeedback(event);
						DragManager.showFeedback(DragManager.NONE);
					}else if(draggedTimes.fifa == 'T') {
						Alert.show("Time Adicionado!\n\n"+draggedTimes.nome+" foi campeão do mundialito de Gentil em 2010!", "AudiCup");
					}else{
						Alert.show("Time Adicionado!\n\n"+draggedTimes.nome+" foi campeão Mundial FIFA!", "AudiCup");
					}
				}
			}	
 
			protected function application1_creationCompleteHandler(event:FlexEvent):void
			{
				times=new ArrayCollection();
				time=new Time();
				time.id=1;
				time.nome="FC Barcelona";
				time.fifa="S";
				times.addItem(time);
 
				time=new Time();
				time.id=2;
				time.nome="SC Internacional de Porto Alegre";
				time.fifa="S";
				times.addItem(time);
 
				time=new Time();
				time.id=3;
				time.nome="FC Bayern";
				time.fifa="S";
				times.addItem(time);
 
				time=new Time();
				time.id=4;
				time.nome="AC Milan";
				time.fifa="S";
				times.addItem(time);
 
				time=new Time();
				time.id=5;
				time.nome="Grêmio de Porto Alegre";
				time.fifa="N";
				times.addItem(time);
 
				time=new Time();
				time.id=6;
				time.nome="SC Juventude de Caxias do Sul";
				time.fifa="N";
				times.addItem(time);				
 
				time=new Time();
				time.id=7;
				time.nome="FC Bãrdei de Marau";
				time.fifa="T";
				times.addItem(time);				
			}
 
		]]>
	</fx:Script>
	<s:Label x="10" y="10" fontSize="14" fontWeight="bold" text="Audi Cup 2011 Meet the best"/>
 
	<mx:DataGrid x="10" y="32" width="250" height="220" dataProvider="{times}"				
				dragEnabled="true" dragMoveEnabled="true" dropEnabled="true">
		<mx:columns>
			<mx:DataGridColumn dataField="nome" headerText="Times disponíveis para a AudiCup"/>
		</mx:columns>
	</mx:DataGrid>
 
	<mx:DataGrid x="268" y="32" width="250" height="220" dataProvider="{timesConvocados}"
				 dragEnabled="true" dragMoveEnabled="true" dropEnabled="true" dragDrop="onDrop(event);">
		<mx:columns>
			<mx:DataGridColumn dataField="nome" headerText="Convoque você mesmo - Arraste Aqui"/>
		</mx:columns>
	</mx:DataGrid>	
</s:Application>
package
{
	[Bindable]
	public class Time
	{
		public var id:Number;
		public var nome:String;
		public var fifa:String;
 
		public function Time()
		{
		}
	}
}

Felipe Borella.

Share on Facebook
Categories: Flex Tags:

Flash Builder 4.5 Eclipse

6, maio, 2011 Sem comentários

Opa.

Fiz alguns testes com o Flash Builder 4.5 e fiquei impressionado com o desenvolvimento para mobile. Show de bola mesmo.
Bom para instalar o Eclipse juntamente com o Flash Builder é fácil.

Depois do Flash Builder instalado va ate a página http://kb2.adobe.com/cps/890/cpsid_89021.html que é bem fácil a instalação.

Tradução é +- isso:

Flash Builder 4,5 suporta a instalação de um plugin para o Eclipse uma instância existente. Para fazer isso:

Navegue até o local de instalação instalado o Flash Builder e abra a pasta Utilitários.
Execute o executável do Adobe Flash Builder 4,5 Plug-in Utility.exe.
Selecione o idioma e clique em OK.
Selecione o local de instalação do Flash Builder, se solicitado.
Selecione a pasta do Eclipse para o qual deseja Flash Builder 4.5 para ser conectado e clique em Avançar. (Nota: A cópia do Eclipse deve ser versão 3.6.1 ou posterior, de 32 bits e deve conter uma pasta chamada “dropins”)
Reveja a pré-instalação de resumo e clique em Install
Após a instalação, é recomendável que você edite o arquivo eclipse.ini para a instância do Eclipse, para que ele inclui as seguintes definições:

-Vmargs-Xms256m-Xmx512m-XX: MaxPermSize = 256m-XX: PermSize = 64m

E isso ai

Felipe.

Share on Facebook
Categories: Flex, iOS, Iphone, Tablet Tags:

Spring @Transactional Transações Java

5, maio, 2011 2 comentários

E ai pessoal blza?
Uma coisa que as vezes eu vejo por ai são aplicações sem o uso do controle de transações. Descobri a poucos dias que isso pode ser tornar uma dor de cabeça para o desenvolvedor. Então se você usa o Spring ( que é o meus caso ) basta incluir no seu ApplicationContext essa tag abaixo:

<tx:annotation-driven transaction-manager="transactionManager"/>

Depois nos seus services basta fazer isso:

@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)

Isso pode evitar alguns indesejáveis problemas no banco de dados, inconsistências e até mesmo a quedra do servidor ( apache tomcat, jboos etc ).

ps – Esse controle de aplicação aplica-se para outros, não apenas no Spring ( veja a documentação )

Att
Felipe

Share on Facebook
Categories: Java Tags:

ArrayCollection XML FileReference Flex

7, abril, 2011 3 comentários

Opa.

Resolvi criar este post pois ja havia feito isso para trabalho de faculdade, então, compratilhando o conhecimento adquirido.

Segue abaixo aplicação e os fonte com as explicações:
Clique em Listar e depois salvar.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
	backgroundColor="white">
 
	<mx:Script>
		<![CDATA[
			import mx.rpc.xml.SimpleXMLEncoder;
			import mx.utils.ObjectUtil;
			import mx.controls.Alert;
			import mx.collections.ArrayCollection;
 
			private var fr:FileReference;
			private static const FILE_TYPES:Array=[new FileFilter("Arquivo XML", "*.xml")];
			private static const DEFAULT_FILE_NAME:String="trabalho.xml";			
			[Bindable]
			public var arr:ArrayCollection=new ArrayCollection(
					[{id:1, nome:"Felipe Borella", cidade:"Marau"},
					{id:2, nome:"Mario Junior", cidade:"Rio de Janeiro"},
					{id:3, nome:"Bãrdei Futebol Clube", cidade:"Marau"},
					{id:4, nome:"Janderson Futebol Clube", cidade:"Rio de Janeiro"}]);
 
			private function iniciar():void
			{
				var xml:XML=objectToXML(arr.source);
				txt1.text=ObjectUtil.toString(arr.source);
				txt2.text=xml.toXMLString();
			}
 
 
			private function objectToXML(obj:Object):XML
			{	
				var qName:QName=new QName("pessoa");
				var xmlDocument:XMLDocument=new XMLDocument();
				var simpleXMLEncoder:SimpleXMLEncoder=new SimpleXMLEncoder(xmlDocument);
				var xmlNode:XMLNode=simpleXMLEncoder.encodeValue(obj, qName, xmlDocument);
				var xml:XML=new XML(xmlDocument.toString());
				trace(xml.toXMLString());
				return xml;
			}
 
			private function onLoadFileClick():void
			{
				//cria a instancia do FileReference
				fr=new FileReference();
				//adiciona o evento para a escuta quando o arquivo for selecionado 
				fr.addEventListener(Event.SELECT, onFileSelect);
				//adiciona o evento para a escuta quando o arquivo for cancelado
				fr.addEventListener(Event.CANCEL, onCancel);
				//abri somente arquivos XML
				fr.browse(FILE_TYPES);
			}
 
			//chamado quando o usuario seleciona o arquivo
			private function onFileSelect(e:Event):void
			{
				//quando o arquivo for carregado dispara a escuta da funcao onLoadComplete
				fr.addEventListener(Event.COMPLETE, onLoadComplete);
				// adiciona a escuta quando acontece erro ao carregar arquivo
				fr.addEventListener(IOErrorEvent.IO_ERROR, onLoadError);
				//carrega o conteudo do arquivo
				fr.load();
			}
 
			//Chamado quando o usuario cancela
			private function onCancel(e:Event):void
			{
				trace("File Browse Canceled");
				fr=null;
			}
 
			//chama completa o arquivo carregado
			private function onLoadComplete(e:Event):void
			{
				//recupera os dados do arquivo como um byte array
				var data:ByteArray=fr.data;
				//le o arquivo como uma string e coloca em um text area
				txt2.text=data.readUTFBytes(data.bytesAvailable);
				//limpa a instancia do arquivo tipo filereference
				fr=null;
			}
 
			//quando ocorrer erros ao carregar
			private function onLoadError(e:IOErrorEvent):void
			{
				trace("Error loading file : " + e.text);
			}
 
			//chamadoquando o usuario digita no textarea
			private function onInputChange():void
			{
				//habilita o botao se ha texto para salvar
				saveButton.enabled=(txt2.text.length > 0);
			}
 
			//chamado quando o usuario clica o botao de carregar
			private function onSaveClick():void
			{
				//criando instancia de File Reference
				fr=new FileReference();
 
				//escuta para falha quando foi salvo
				fr.addEventListener(Event.COMPLETE, onFileSave);
 
				//escuta  para quando cancelar
				fr.addEventListener(Event.CANCEL, onCancel);
 
				//escuta para quando ha erros no salvar
				fr.addEventListener(IOErrorEvent.IO_ERROR, onSaveError);
 
				//abre a caixa para saber onde salvar o XML usando o nome default
				fr.save('<?xml version="1.0" encoding="UTF-8"?>\n'+txt2.text, DEFAULT_FILE_NAME);
			}
 
			//chamado quando o arquivo for salvo
			private function onFileSave(e:Event):void
			{
				trace("File Saved");
				fr=null;
				Alert.show('Salvo com sucesso');
			}
 
			//chamado se o usuario cancela a caixa de dialogo
			private function onCance2l(e:Event):void
			{
				Alert.show('Arquivo cancelado', 'Sistema');
				fr=null;
			}
 
			//chamado se ocorrer erro enquanto salva o arquivo
			private function onSaveError(e:IOErrorEvent):void
			{
				Alert.show('Erro '+ e.text);
				fr=null;
			}					
		]]>
	</mx:Script>
 
	<mx:DataGrid x="10" y="10" dataProvider="{arr}" width="299">
		<mx:columns>
			<mx:DataGridColumn headerText="Nome" dataField="nome"/>
			<mx:DataGridColumn headerText="Cidade" dataField="cidade"/>			
		</mx:columns>
	</mx:DataGrid>
	<mx:Button id="saveButton" x="412" y="130" label="Salvar" click="onSaveClick()"/>
	<mx:TextArea id="txt1" x="10" y="175" width="228" height="231" editable="false"/>
	<mx:TextArea id="txt2" x="246" y="175" width="228" height="231" editable="false"/>
	<mx:Button x="346" y="130" label="Listar" click="iniciar()"/>
 
</mx:Application>

Valeu ai!

Felipe
Marau-RS

Share on Facebook
Categories: Flex Tags: