lotto jps

Lotto jps

lotto jps What Color Are You Today Our City. Lane women 39 s amp men 39 s clothing offering thousands of tthe latest women 39 s fashion at W. Check the belly in the last hour of cooking. Filters are modules that allow you to specify the kind of numbers you want to play. More in Lifestyle Justin Bieber files 20 million defamation lawsuit over sexual misconduct claims Title Nonpublic Educational Options Author beverly. hora local. jps Dproc namenode Dproc datanode Dproc JobTracker Dproc TaskTracker You can easily find German people making roll up cigarettes right on the street. 37 annually. Feb 12 2019 FNB 39 s clients can play the Lotto via the bank 39 s online and cellphone platforms as well as through the banking app. El premio mayor ser de 30 millones de colones anunciaron las autoridades. Lotto Social is a ready made syndicate service that gives players more ways to win in the EuroMillions and other world lotteries More lines means Mar 25 2019 Tips and ideas for gifts activities and celebrations for Teacher Appreciation week held the first week of May each school year. AMBO TERNO QUATERNA CINQUINA AL LOTTO CON LA DATA DI NASCITA 12 SETTEMBRE Il miglior sito di oroscopi giornaliero settimanale mensile annuale online gratis 1 AMBO TERNO QUATERNA CINQUINA WITH THE DATE OF BIRTH SEPTEMBER 12 The best site for horoscopes daily weekly monthly yearly online free Localotto. This has allowed me to bring solutions to disgruntled customers because as a Meter Reader we re always considered the face of the company as well as the eyes and ears of the company . Page TransparencySee More. El premio se vendi en el Resultado Lotto Jps We Give You 5 Tips On How To Win The Lottery. With executives having over 25 years of experience we offer easy access to playing lotteries for people all over the world in a convenient fun and secure environment. 8 1 7 7 9 1. Resultados de loter a y chances de Costa Rica manden la palabra SUERTE AL numero 3377 si su nuevos tiempos y 3 monazos 17 de octubre 2020 jps lotto jps lotto 17 de octubre 2020 pr ximos sorteos nuevos tiempos y 3 monazos 19 de octubre 2020 jps jps chances 20 de octubre 2020 loteria popular lotto jps lotto 21 de octubre 2020 loteria nacional 25 de octubre resultados de otras fechas en el men superior. While it may be called a mini lottery the great prizes and incredible winning odds are anything but small Contact Lotto. Nuevamente un gran premio de la Junta de Protecci n Social JPS qued en San Carlos. CT. F. The sales of the lottery close at 20 30 hours 8 30 PM every day. Lotto Results Archive 2017. ticket 400022015 red deer ab Lotto JPS Loteria JPS La Junta de Protecci n Social fue creada en el a o 1845 y actualmente realiza sorteos de 6 juegos diferentes Chances JPS Loteria Nacional JPS Lotto JPS Nuevos Tiempos Medio Dia Nuevos Tiempos Noche Pitazo JPS y Tiempos. There are lots of share available in each group because of the unusualy large jackpot. General Inquiries info gov. To view a current list of all available positions at the U. Find Your Nearest Cignall Store. S. Season with sea salt thyme and oil. Peninsula Fair is a family friendly convenient centre located on Anzac Avenue Kippa Ring Queensland. H. cr. WJTV Jackson Public Schools will host a Fall KINGSTON Jamaica Supreme Ventures welcomed its first Lotto winner for 2018 today when W Morris came forward with a winning ticket for draw 1450 won on Wednesday February 28. 1935 1940 Ford Chassis Frame Street Rod Rat Rod Parts Hot Rod Vintage Car Custom My Software Downloads Best Software 4 Download search downloads free software downloads best software shareware demo and trialware 08 18 2020 . Quit Now Find a Store Government of Newfoundland and Labrador Confederation Building P. 16 pp. com is a brand new lottery website offering the lotto players from around the world to bet on the internationally popular lottery results. RESULTADO LOTTO JPS. The agent also has to post a cash bond of P500 000 or pay a surety bond of P5 795. Division 3 La Junta de Protecci n Social presenta 2 nuevos juegos m s f ciles de jugar y ganar En m s de 1. JPS recognizes that the charging infrastructure is an important part of the support system needed to drive the growth of e mobility in Jamaica and has been taking the initial steps to get this Mini Lotto was launched by Takarakuji Japan 39 s national lottery on 13 April 1999. Lotto und der Eurojackpot Alles rund um Zahlen Quoten und Gewinne Woche f r Woche begeben sich Millionen Deutsche an die Lottoscheine und versuchen ihr Gl ck auf den Jackpot. Stephan The expected value and variance of the reciprocal and other negative powers of a positive Bernoullian variate Annals of Mathematical Statistics vol. 3 pp. Oct 17 2017 Sometimes abbreviated as Serial No. Acumulado para este sorteo. Facebook is showing information to help you better understand the nbsp LOTERIA COSTA RICA 26 DE AGOSTO RESULTADOS LOTTO JPS NUEVOS TIEMPOS 3 MONAZOS. For more details visit the National Lottery website. Loter a Electr nica de Puerto Rico Resultados de La Loter a Electr nica Pega 2 Pega 3 Pega 4 Loto Revancha y Los Resultados del Ivuloto Aqu . Community. Aug 04 2018 A group of bank employees in California became instant millionaires thanks to lottery tickets they purchased on a whim. Particip con los mismos 5 n meros elegidos del 00 al 40 o como Gallo Tapado. This site is optimized for Explorer 4. Egal ob Sie bereits Lotto Gewinner sind oder es noch wer d e n wollen In unseren Lotto Tipps finden Sie wertvolle Ratgeber Themen rund ums Thema Lotto geheimnisse und Tipp Strategien ob man einen Lotto gewinn versteuern muss wie man mit einem gro en Gewinn umgeht und vieles mehr. Good luck and happy new year. Redacci n La Junta nbsp Web site created using create react app. com A Shanghai man spent over 950 000 on lottery tickets. 5 million grant intended to help make the election run safely and securely has yet to be approved by the Hinds County Board of Supervisors amid concerns that some vendors could have been handpicked to benefit an elected official. Lotto de Costa Rica Lotto de Costa Rica. The document has moved here. Av. Jessica Ann Johnson n e Simpson born July 10 1980 is an American singer actress fashion designer and author. Lightweight sports cars handmade in Hethel England. Lotto Texas . To connect with Loter a y Chances Costa Rica JPS join Facebook today. You need to always confirm the official winning numbers on the Con lotto vos tambi n pod s ser uno de los m s de 340 millonarios que ya lo tienen todo El Rey de la TICA Numeros Probables Loteria quot Nuevos Tiempos quot JPS. c. . ps aux grep java awk 39 print 12 39 END. View at Google Scholar F. Check the winning numbers of the South Africa daily lotto lottery here. Ver m s de Loter a y Chances Costa Rica JPS en Facebook. Hace 20 horas Compruebe los ltimos resultados de Lotto JPS para el dia 21 10 2020 de la Loteria de Costa Rica. Un vecino de Ciudad Quesada se gan el acumulado de 197 millones con el Lotto. Leeds is a vibrant contemporary city situated in the heart of the UK. Whether you re thinking of buying your first home or putting your children in the best school possible it helps to have a plan so you can reach your goals in the best way possible. See more ideas about Teacher appreciation week Teacher appreciation Teacher. 2 million jackpot winning Hot Lotto ticket sold in Oklahoma in 2011 has been connected to a former security official of a multi state lottery vendor accused of rigging lotteries in four Aug 01 2020 I bought a California Super Lotto Plus ticket of 4 7 9 21 39 Mega 17 to see if I can win the 1st California Super Lotto Plus jackpot and the 2nd in a row everyone for just this one draw only for Play the biggest lotteries in the world from the comfort of home for a chance at winning huge jackpot prizes. 181 188 1993. com General information about Costa Rica Lotto. amaica Public Service Company Limited JPS is an integrated electric utility company and the sole distributor of electricity in Jamaica. The name changed to Lotto in May 2002 and the game was updated. La utilizaci n de la informaci n de este sitio es de riesgo exclusivo para el usuario. Resultados del Lo to Plus Desquite Sale o sale Tradicional y Yapa. Para la venta que comenz ayer se emitieron m s de un mill n de billetes. But playing on the app won 39 t increase your odds of winning the bank says. Baulkham Hills NSW 2153 Blacktown NSW 2148. You can see the winning lottery numbers for that date including the Bonus Ball. Almacen Familiar Calle 102A. Highlights info row image. Packs Cartons Roll Your Own Filters amp Paper 39 s Available. Premios del Lotto RevanchaDesglose de premios . Compruebe aqu los n meros ganadores del sorteo del Lotto de Costa Rica realizado el mi rcoles 14 de octubre del 2020 a las 19 30 Hrs. Apr 22 2020 Daily Lotto is one of the popular lotteries of South Africa. com Jackson MS. We re shipping worldwide every day. 31 Jul 2020 LEIDSA tu nica Loto La F brica de Millonarios Loter a Electr nica Lotto JPS 2048 S bado 18 de Julio de 2020 Premios del Lotto nbsp 21 Mar 2019 todos nuestros sorteos. From 2005 to 2008 My Super Sweet 16 chronicled several rich privileged kids as they planned their ultimate birthday or Quincea era celebration. Watch later. Mi 21 OCT 2020 Revancha 01 23 nbsp 5 Sep 2020 Sorteo Lotto Y Lotto Revan. Place the belly in a 160 C for 23 hours. N. 50 61 Sep 25 2020 JPS to host football showcase on Saturday Sports. Division 2 61 542 000 9 winners of 6 838 000 each. 15. We have been serving patrons of Wayne County PA for more than 40 years and we would love to welcome you for dinner at 920 Main St Honesdale PA 18431. The Lottery Centre is an industry leader in online gaming providing a one stop location to play the world s most lucrative lotteries. LOTTO COSTA RICA. Shop For Cigarettes Online Now. We are Mobile Phone Repair Center in Camberwell Australia for all your mobile phone repair needed. JPS customer services offices in Corporate Area closed after COVID 19 case 7 29 pm H Wilson is the latest winner of Supreme Ventures 39 Lotto and has scored a jackpot of 33 million. The Company is engaged in the generation transmission and distribution of electricity and also purchases power from a number of Independent Power Producers. Loter a y Chances Costa Rica JPS is on Facebook. April 8 4 00 pm 6 00 pm JPS Emenes Building Training Rm. Information at Your Fingertips Payment amp Billing Options We know your time is valuable and that is why we offer you several quick convenient and secure ways to make payments and receive your bill so you save on time and money. Sprinkle the herbs over the belly. This is Costa Rica based lottery game that was launched in May 2013 or 7 years 3 months and 30 days ago. Teachers and parents say cases continue to pop up and at least one staff member has been hospitalized. We are selling all Prepaid sim card such as Telstra Optus Vodafone Lebara Mobile Lyca Mobile Amaysim Travel Sim. Please contact the support team with any enquiries regarding the lotteries included on the website. Division 3 88 122 900 111 winners of Enjoy the videos and music you love upload original content and share it all with friends family and the world on YouTube. Se suspende indefinidamente el programa Rueda de la nbsp 25 Nov 2018 Lotto aport m s de 13 mil millones a la JPS en los ltimos tres a os Se ampl an las opciones de n meros a escoger. Localotto. quot You must assist us in cleaning up this dignified body. The live draw was held in Jamaica and broadcast live on Television Jamaica TVJ at 8 30 p. Just pick 6 numbers from 54. Dice the black pudding and fry in a little oil. Joe Tests of uniformity for sets of lotto numbers Statistics and Probability Letters vol. Ticket sales are not available during Draw Break from 10 02 10 15 p. com legit operation is secured by the license issued by UK Gambling Commission providing along the localized offers such as syndications for the UK market. Buyo Asistente de Direcci n. com Jul 12 2020 This article was co authored by Ara Oghoorian CFA CFP CPA. My Super Sweet Sixteen See All the Lavish Surprises Reginae Carter airs her star studded birthday bash on mTVs beloved series. This database is available for inquiries and review of the public record maintained by the Registry of Joint Stock Companies. Ltd. Bienvenido a Lotto. Jul 27 2018 Tonight 39 s Powerball jackpot stands at a guaranteed R140 million the biggest in SA 39 s 18 year Lotto history. At 47 million the Lotto Texas jackpot eclipses the 34 million and 32 million offered by Powerball and Mega Millions respectively. E. It is a great starting place for any lotto Jan 22 2018 quot I am asking that if you see some of the other JPs acting inappropriately dishonestly or taking money to the work please let the custos know so we can decommission those JPs quot Chuck said less than 24 hours before the state of emergency was announced. TuAzar La revista del azar. Draws were initially held every week on a Saturday before a Wednesday draw was introduced on 5th February 1997. Copy link. Scarfalloto 39 s Towne House Diner and Restaurant is locally owned and operated. Jamaica Public Service Company Limited JPS is an integrated electric utility company and the sole distributor of nbsp . Track Lotto lottery results and winning numbers as well as see the latest lottery news on all your favorite Costa Rica lottery games with our mobile lottery app Lotto Texas incredible run of rollovers has continued in recent weeks leading it to become the biggest jackpot in the United States at the current time. Free Delivery over 100. In order to activate your account you must have an Activation Key. Learn how to play the lottery online right here Approved lotto agents must pay P10 000 as installation fee which goes to the telecommunications carrier and a processing fee of P1 700 which goes to PCSO. Loter a y Chances Costa Rica JPS San Jos . Ara Oghoorian is a Certified Financial Accountant CFA Certified Financial Planner CFP a Certified Public Accountant CPA and the Founder of ACap Advisors amp Accountants a boutique wealth management and full service accounting firm based in Los Angeles California. Oct 19 2020 WLBT News WLBT. disclaims all liability for information provided within Lottery Insider Lotus Cars For the Drivers. Sorteo. With the largest range of second hand Lotus cars across the UK find the right car for you. In addition special services for air cargo containers and post. N 2061 Lot. Shuttles nbsp 3 days ago Our Corporate Profile. Este es el app oficial de la Junta de Protecci n Social y lo pone a su disposici n para que consulte los resultados de las loterias costarricenses. As Election Day draws closer a spending plan for a 1. The collection of Lotto Works shoes designed for injury prevention is the product of tireless research into innovative materials the use of advanced technologies in shoe construction and a vast knowledge of the sports sector acquired after more than 40 years in the field. For the pork belly rub the belly with oil and season with sea salt. John 39 s NL A1B 4J6. com www. 14. JPS 2020 . Place the pork chops on an oven tray. com is an AutoLotto Inc. Jul 20 2016 A Jamaican has hit the 250 million Super Lotto jackpot. russell Subject Jon Peterson Special Need Scholarship Keywords 2017 2018 FACT Sheet Created Date Find Lotus used cars for sale on Auto Trader today. Select a draw date for even more information including a full prize breakdown. You can win exciting CASH prizes just by matching 2 3 4 or 5 numbers from a field of 35. JUEGO E050 EL 7 DE LA SUERTE Lotto JPS 2072 Mi rcoles 14 de Octubre de 2020 Premios del Lotto JPSDesglose de premios . The Lotto 649 jackpot rolled to 36 million for the January 2 draw. LOTTO DRAW PG 10 12 20 1 05 PM today and she was also cut off from class because there was no electricity flow needs to step up their game and also JPS Revisa los resultados actuales de Lotto Activo la loter a de animalitos en Venezuela. Lane. A digital care provider that supports type 2 diabetes hypertension self management and supports those struggling with anxiety and depression. Info. nbsp RESULTADOS. 16 no. JPS. Mission in Jamaica and to apply online please visit Electronic Recruitment Application ERA All applications must be submitted through ERA to be considered. Lotto JPS 17 de octubre 2020 Comprue be su resultado en una oficina comercial de la Loteria Organizadora. Posted Sep 25 2020 01 39 PM CDT Updated Sep 25 2020 06 15 PM CDT. Or call 1 800 522 4700. lokakuuta kello 13. lynda houseman and wayne windross 1 000 cash. p. Good Afternoon Ladies Our October lottery tickets were sent out according to what you had for the July tickets. We cover all types of regional sports politics market and other news online. 04 09 37 Acceso a Facebook Acceso a Youtube Acceso a Twitter. S bado 30 de Marzo del 2019 JPS Duration 15 20. All prizes are paid in one lump sum payment even the top prize. Taking their cues from the original styles of the 70s and 80s these sneakers fuse contemporary design with a sporty nostalgic feel. 933 851 likes 21 626 talking about this 507 were here. Dooc said that about 78 branches of SSS will extend its daily operations for two hours for the month of February from 5 pm to 7 pm. El significado de los n meros Loter as y Quinielas LA NACION Compre boletos para las mejores loter as del mundo en theLotter. I am a God fearing man who enjoys playing or watching any sport and I appreciate people for who they are and strongly believe that everyone has a unique purpose to Jul 31 2015 Haha get it you pronounce Scathach as quot Sca Ha quot so it sounds like Sky High okay yeah that was bad. jps. Camberwell Lotto amp Mobile is Australia official TattsLotto Outlet. China 2011 Peking Opera Facial Mask2nd Issue Gold And Silver Coins Set Any of my search term words All of my search term words Find results in Content titles and body Content titles only Any of my search term words All of my search term words Find results in Content titles and body Content titles only Las loter as de Costa Rica est n gestionadas por la Junta de Protecci n Social JPS la Junta de Protecci n Social es una instituci n aut noma que tambi n dedica su actividad al desarrollo de programas de bienestar social y filantr picos. Cuatro aciertos paga Tres aciertos paga Dos aciertos paga Calcular premios. Home Lotto Tipps Lotto Tipps. Iniciar sesi n Olvidaste tu cuenta o. Current Compassionate Evidence Based Care. A serial number allows a company to identify a product and get additional information about it for replacement or to find compatible parts. jps a180 1 ih w 5 amp a. China 2011 1046. PREMIOS ESPECIALES. Track parcels shipments with companies like UPS DHL TNT and FedEx. La Junta de Protecci n Social presenta 2 nuevos juegos m s f ciles de jugar y ganar En m s de 1. Lotto JPS Loteria JPS La Junta de Protecci n Social fue creada en el a o 1845 y actualmente realiza sorteos de 6 juegos diferentes Chances JPS Loteria Nacional JPS Lotto JPS Nuevos Tiempos Medio Dia Nuevos Tiempos Noche Pitazo JPS y Tiempos. Si deseas m s informaci n por favor visite www. Buy lottery tickets safely and securely here May 20 2016 SIMBA Hi I m Simbarashe Nkrumah I was born and raised in Zimbabwe and I have been living in Jamaica for approximately 14 years. ltimo sorteo del Loto Plus del S bado 17 de octubre de 2020. com Lotto Costa Rica results may be found there as well by the way. Feb 02 2018 Method. 94 Went over to a buddy 39 s place yesterday to get a case from him and he has a huge guitar collection including 4 JP6s and a JP7. Sorteo 2072 Vigente hasta Lunes 14 de Diciembre 2020. Moved Permanently. Find a job in Idaho and learn about employee rights and laws. This is just a sample and the book explains all of Smart Luck 39 s successful methods of number selection in great detail with examples of patterns shown throughout. With over 160 stores across Australia and our huge range online whether it be a classic personalised zippo or the latest must have products amp accessories. I saved these two lines in a file named jps and stored it in the hadoop bin directory with execute permissions Here is the result of the script hduser localhsot . UK Lotto History. Sorteo de quinielas transmitido a las 7 de la noche en santo domingo republica dominicana se compone por 5 sorteos que son quiniela loteka megachance mega chance repartidera el extra y mega lotto se puede considerar que la loteria loteka es una a mixta por los diversos sorteos que ofrece al p blico en general. You will get latest updates of news every 24 hours only at samoanews. JPS working to serve you better. Post Office jobs now available. Lotto Plus 2 20 43 16 17 36 27 Bonus 31. Please adjust your screen accordingly. net la principal p gina web en la que puedes ver los ltimos resultados de los sorteos de loter a de todo el mundo incluyendo a Mega Millions y Powerball de Estados Unidos Euromillones y Mega Sena. You may receive gifts and inheritances up to a set value over your lifetime before having to pay CAT. If you do not have an Activation Key please contact your child s school. View Saturday Lotto results for draw 1895 on 18 09 1999 Mar 14 2017 Method. Tiempos N 17082. En resultadosorteo. The Home of the World 39 s Most Exquisite Teacup Pomeranians for Sale. Place in an 180c oven and roast for 15 minutes. La JPS podr a modificar estos d as y los horarios previo aviso C mo se hace el sorteo de Lotto La Junta de Protecci n Social JPS efectuar un sorteo aleatorio que eligir autom ticamente 5 n meros entre el 0 y el 36 que formar n la combinaci n ganadora. Horario de Atenci n L V de 9 00am a 5 00pm. Box 8700 St. 5 million from last week 39 s R110 million jackpot. Anamaria Colors Calle 151 40. View the Lotto results for Wednesday 6th January 2016 below. Lotto JPS Costa Rica is currently available only in Costa Rica. Discover this season 39 s must have looks amp product trends. Take Five is a national campaign offering straight forward impartial advice that helps prevent email phone based and online fraud particularly where criminals impersonate trusted organisations. Apr 21 2020 Overview. Loka er fyrir s lu Lott klukkan 18 40 laugard gum. puntomax. Jan 15 2018 JPS says flu cases diagnosed at the hospital rose to 341 in January approaching December s surge of 408 cases. Winning The Lottery Is A Dream That Everyone Has At Some Point In Their Lives. Shipping and Receiving Clerk Administrative Officer Customer Service Representative and more on Indeed. Lottery. Sep 16 2020 Lotto Plus 2 3 9 11 18 38 40 Bonus Ball 17 . ca Happy Plugs is a Swedish fashion tech brand that brings stylish headphones to the world. As for their support service Junta de Protecci n Social JPS provides the following contact details a phone number 2522 2000 and an email email protected The operator s main office is situated in San Jos . Costa Rica suspends lottery vendors subsidy The Costa Rican Social Protection Board JPS has confirmed that the temporary subsidy to support its lottery vendors has been suspended despite their request to extend it indefinitely. While I still don 39 t dig the headstock every one of the JPs played like butter and made me want to come home and sell most of my guitars to buy a JP. May 08 2019 Brake failure is being blamed for an accident that severely injured a nurse at John Peter Smith Hospital in Fort Worth earlier this year according to a report released Wednesday by the Texas We would like to show you a description here but the site won t allow us. compact emmanuelle 19h jps 23191102230 100 jps 683 2 2 jps 683 Loteria Nacional JPS 18 de octubre 2020 Compruebe su resultado en una oficina comercial de la Loteria Organizadora. 19 34 3monazos lotto lotto revancha nuevos tiempos Resultados Loteria Electr nica de Costa Rica Noviembre 2019 Gana dinero todos los d as con la Loter a Electr nica y los sorteo Nuevos Tiempos y 3 Monazos en sus dos horarios al mediodia y en la noche Play online lottery and take a chance to win big jackpots with great international lotteries. SA Daily Lotto results for Tuesday April 22 2020. 0 amp above and a monitor resolution of 1280 x 1024. 06 07 20 30 35. Debemos recordar que el principal objetivo de la JPS es incrementar nuestros recursos para poder impactar de manera nbsp 21 Mar 2020 2 The return of the lottery of the withdrawn draws will take place on Monday March 23 2020 at the time and places communicated by the JPS. Junta de Protecci n Social 175 a os de hacer el bien Lotto Works COLLECTION 2019. 09 070 M xico D. Comprobar Resultados de Lotto de la Junta de Protecci n Social. Primera Suerte. Over the last three years the bank has paid out almost R810 million in winnings. Jun 25 2017 Para saber si sus boletos de loter a nuevos tiempos son ganadores dir jase a cualquier Punto Max en el pa s. NUEVOS TIEMPOS LOTTO JPS 26 DE SEPTIEMBRE 2020. Junta de Protecci n Social 26 609 views Junta de Protecci n Social Oficial San Jos Costa Rica. Para ver resultados de sorteos anteriores use el bot n que se encuentra al final de la p gina. The lotto program on this site is composed of a series of filters statistics a generator a verifier and a chances calculator. Official website of Lotus Cars. Share. TRANSMISI N Conoce los resultados y combinaciones ganadoras de todos los sorteos y loter as Loter a Nacional la Primitiva la Bonoloto el Gordo la Quiniela el Quinigol Euromillones el cuponazo la qu ntuple plus la Lototurf el cup n de la ONCE y los sorteos de Loter a de Navidad y la Loter a del Ni o en EL PA S Loter a de Navidad 2020 comprueba los n meros premiados en el sorteo de Navidad. 000 establecimientos de la red de Puntos Max en todo el pa s encontrar s Nuevos Tiempos y Lotto. The Costa Rican Social Protection Board JPS has announced that the National Lottery draws and July chances will undergo a date change according to the latest regulations of the national government to deal with the pandemic. Love 1800. Play Texas original jackpot game Lotto Texas. Samoa News covers news from American Samoa Samoa and the Pacific region. The cost for one share in the first 4 groups is 10. Mission in Jamaica. 1935 1940 Ford 2900. Division Prize Pool Winners Division 1 Jackpotted No Winners Division 2 62 948 400 6 winners of 10 491 400 each. 13 of these years I have been employed to JPS. Thibodeaux Cafeteria Pre K Registration April 15 4 00 pm 6 00 pm JPS Administration Building Rooms 1701 1709 BR Pre K Registration April 17 9 00 am 11 00 am JPS Administration Building Let 39 s figure out your finances together. cr o llame a nuestro servicio al cliente 4100 2300. CAT is a tax on gifts and inheritances. President and Chief Executive officer Emmanuel F. company. Lotto Nicaragua Resultados Despu s de Cada Sorteo La JPS de Costa Rica modifica el reglamento del Lotto quot Con estos cambios se anuncia la evoluci n que la Junta impulsar en esta loter a esperen m s cambios anticip Esmeralda Britton Gonz lez izq. The lottery quickly rose to popularity and became a staple for Japanese lottery enthusiasts. RESULTADO LOTTO JPS The Lottery Creates Millionaires Over Night Simply Out Of Playing A Random Numbers Game Www Virginia Lottery Pick3 Pick4 Results Com The IDB JPS Foundation electric mobility project will definitely support JPS plans to roll out public charging stations across the island. A o de Ju rez 131 Iztapalapa Col. 31 430 likes 356 talking about this. Supreme Ventures Limited SVL announced that the Super Lotto Jackpot for Tuesday night 39 s draw has been hit. La Junta de Protecci n Social JPS es una instituci n que ha velado desde sus Jul 25 2013 All these games of chance are produced distributed and managed by the Social Protection Council Junta de Protecci n Social or JPS whose mission is to help strengthen the social welfare in Costa Rica generating resources to transfer to state and non state institutions and social organizations for the benefit of the most vulnerable groups through the efficient management of National Lotteries and other games of chance. Sorteo N Tiempos Reventados 18162 3 Monazos 588 Lotto y Lotto Revancha 2072. 112 King Street Alexandria VA 22314 p 703 739 1124 f 703 739 1125. UK Lotto has undergone a number of changes over the years since it was launched as the National Lottery in November 1994. Toda la informaci n de la Loter a de Navidad pedrea el gordo lugares agraciados widget del sorteo I work for NSW is the jobs site for NSW Government featuring thousands of opportunities across the sector. presidenta de la JPS. Lotto Lottery Results. 23 Nov 2018 Si usted suele adquirir la loter a Lotto de la Junta de Protecci n Social JPS preste atenci n porque las reglas del juego variar n y habr un nbsp 20 Mar 2020 JPS devolver dinero a personas que ya adquirieron fracciones para ese sorteo. 14 10 20. net vas a poder nbsp sorteos de 6 juegos diferentes Chances JPS Loteria Nacional JPS Lotto JPS Nuevos Tiempos Medio Dia Nuevos Tiempos Noche Pitazo JPS y Tiempos. If you would like more or didn t receive any please contact Trina Morris. Resultados de la Loteria Nacional de Panama SORTEO DOMINICAL SORTEO INTERMEDIO O MIERCOLITO GORDITO DEL ZODIACO Omada is a 16 week online program that fits seamlessly into your life so you can lose weight and lower your risk of disease without taking time away from the things you love. JACKSON Miss. Granjas San Antonio C. . Ingres para ver el ultimo resultado de Lotto JPS hoy Loteria de Costa Rica Sorteo Lotto JPS resultados. For more details and to confirm the numbers visit the National Lottery website. Lotto 1973 FC ACD 2013 caberlotto Visit Loop Jamaica for trusted breaking news and video and top stories across Jamaica The Caribbean and World news including entertainment sports politics and more. Junta de Protecci n Social Oficial 14. From world class theatres a thriving shopping scene and two of the UK 39 s leading universities there 39 s so much to experience. net. The U. a Junta de Protecci n Social JPS de Costa Rica lanz Lotto Raspa un juego de loter a instant nea que entregar m s de 315 millones de colones en premios. Below are free lotto tips to help you play the game smarter and win the lottery taken from Gail Howard 39 s lotto book Lottery Master Guide. Love Secret Ring 2005 X Mas limited Second Hand We are your one stop shop for gas propane groceries lotto fishing supplies and a wide assortment of beverages including kegs. Copyright Cignall Cignall promotes the responsible selling of tobacco products. Jackpot. Garland Resident Wins 1M After Buying Prizewinning Lotto Ticket At 1 Star Thank you for your interest in employment with the U. As for their support service Junta de Protecci n Social JPS provides the following contact details a phone number 2522 2000 and an email email protected The operator s main office is situated in San Psalms Used In Witchcraft Faux Hebrew Font Generator 7 Book Of Moses Money Spell Chrysler Japan Retail Ltd. 00. All usted puede comprobar su boleto autom ticamente y redimir sus ganancias. Fecha Detalle N meros Ganadores Acumulados Ganados. 2 Pre K Registration Eastbank April 9 4 00 pm 6 00 pm Myrtle C. SA Daily lotto is held every night at 9 pm SAST. As Baylor faculty members our physicians are at the forefront of obstetric and gynecologic care every day conducting research educating the next generation of specialists and advocating for women on national and international health initiatives. Lotto es el juego de azar m s popular de Costa Rica y se sortea todos los mi rcoles y s bados a las 7 30 p. LottoPlus 077824 Lottito 959107 Ver Boletin. The game play format wasn t changing since Costa Rica Lotto was launched. This is my JPS scirpt for open JDK bin bash. Lotto Costa Rica results may be found there as well by the way. The 11 workers at a San Jose Wells Fargo split the largest single jackpot jps norton polo shirt ron haslam embroidered. SN or S N a serial number is a unique number used for identification and inventory purposes. This is a widely popular lottery but it has still always been known as Lotto JPS Costa Rica. 225 024 likes 1 799 talking about this 1 was here. m. Anderson Carrera 92B. However our valet parking and shuttle services have been suspended until further notice. United States 1979 Calendar with American holidays. The cost per share in the fifth group C1 is 21. It can be explained by an extremely expensive price of a cigarette. Lotto JPS numbers Select total numbers and the range low to high enter your choice of numbers zodiac sign lucky charm any numbers to exclude and hit Generate My Lottery Numbers. What are your financial life goals It s different for all of us. O. Shop W. A total of 5 groups are buying tickets for the draw. Mi 21 OCT 2020 Lotto 22 2 3 28 35 39 . Juegos de azar. Four people two from the Western Cape each walked away with R27. Tiempos N 18084 y 3Monazos N 510 del 05 09 2020. Feb 21 2018 Now the employers and members can pay their contribution through the Automated Tellering System ATS on Saturdays. Retail Sold in 10A amp 10B Olive Street BAULKHAM HILLS NSW 2153 Find out more at commercialVIEW. Gradual resumption of activities Parking is still free. NUEVOS TIEMPOS 26 DE SEPTIEMBRE Compartimos los resultados de la LOTERIA DE COSTA RICA DEL 26 DE SEPTIEMBRE 2020 Sorteos de la Junta de Protecci n Social JPS Loter a de Costa Rica que se realiza el d a S BADO 26 DE SEPTIEMBRE DE 2020 Lotto Nuevos Tiempos y 3 Monazos. The Rules Of Surviving A Breakup. Interplay Multimedia Pty. Cash Five . JPS. Everyone has been dumped or dumped someone but there is a formula for success in this game to make sure both parties survive the ego bruise. quot Nov 26 2015 The best part about working at JPS is conducting field work as it enables me to interact with our customers. Ll manos ahora 01 55 2581 Lotto. Yearly calendar showing months for the year 1979. 2007 2014 Sierra Silverado 2500 3500 Chrome Tailgate Handle Cover W cam key Hole. Mission in Jamaica provides equal opportunity and fair and Tiempos y lotto S bado 20 junio. A continuaci n le brindaremos toda la informaci n sobre c mo funciona este juego c mo ganar y m s. Lotto viene hoy con 2 acumulados y m s premios Por 1000 colones jugas Lotto y Lotto Revancha y as tenes doble oportunidad de ganar. Participe comprando en l nea boletos oficiales de loter a desde su pa s y gane en grande Lotto Costa Rica results Lotto Costa Rica numbers. horario local. 13 Lotto Results for Wednesday 6th January 2016. Calendars online and print friendly for any year and month 2007 2014 Sierra . Buy Tobacco Online from Australia 39 s Largest Tobacconist. Major stores include Kmart Coles Best amp Less and Hoyts Cinema. Lotto Revancha. You can get the lottery ticket from a nearby lottery outlet. nl. Sorteo N 2395 s bado 17 de octubre del 2020. Division Prize Pool Winners Division 1 205 133 400 3 winners of 68 377 800 each. www. this has seen better days and does have a hole in the back at the bottom see pic but otherwise considering its age its in fairly good condition i have had this since the 80s when i was a marshall at brands hatch but now needs to go to a good home instead of being in a draw the label says its a small i have measured it from armpit to armpit and Peaster ISD not reporting COVID 19 cases to parents state officials or requiring masks. F. Sep 09 2020 FEMA is a team of federal leaders who support people and communities by providing experience perspective and resources in emergency management. NUEVOS TIEMPOS 16 DE SEPTIEMBRE LOTTO 2020 Punto Max Loteria Costa Rica JPS Junta Protecci n Social Numeros ganadores Monazos nbsp All the latest National Lottery news articles and exclusive insight for the independent retail sector. Click here for more details. Looking for a Lotus Esprit Find your ideal Lotus Esprit from top dealers and private sellers in your area with PistonHeads Classifieds. As one of the largest specialist retailers of tobacco and related products with 255 stores across the country FREECHOICE is the right choice for you. go. The lottery is operated by Junta de Protecci n Social JPS . Lotto. Jul 29 2020 Daily Lotto South Africa 39 s results for July 29 2020 will be out at 9 15 PM SAST. Lotto Revancha. It 39 s the show you love to hate watch . Resultados Lotto JPS del S bado 26 de Septiembre de 2020 de Costa Rica. MyChart will be unavailable from 2am to 4am Wednesday December 11th 2019 for scheduled maintenance. El servicio provee los resultados de loter a nacional chances y tiempos impresos. Lotto Texas offers multi million dollar jackpots with drawings every Wednesday and Saturday at 10 12 p. 04 09 13 Information on responsible gaming and problem gaming is available here. Und das seit mittlerweile mehr als 60 Jahren. Lotto Leggenda Timeless icons. 2 days ago A 1. Service Nova Scotia and Municipal Relations owns it and is responsible for its storage and maintenance. SA daily lotto results today will be announced at 9 15 pm. Feb 28 2019 Sorteo Lotto y Lotto Revancha N 1916 Lot. Fatal Shooting In Fayetteville Nc 72v 42ah Lithium Ebike Battery For 3000w 5000w Electric Scooter Bicycle Motor Lg See Price 72v 42ah Motor Battery 72v Electric 3000w Lg Lithium For Bicycle Scooter Ebike 42ah 5000w For 72v Bicycle Scooter 3000w Ebike Lg 42ah Battery Lithium Electric 5000w Motor Resultados del Lotto de Costa Rica. Comercial para la Junta de Protecci n Social Versi n Lotto Agencia Jotabequ Productora Corte A Dir. The winning numbers were 01 15 17 24 28 and Super Ball 05. After performing in church choirs as a child Simpson signed with Columbia Records in 1997 at age 16. There s also a table beneath showing a full prize breakdown including the number of winners in each category the prize per winner and the prize fund amount. RJR 94 FM Say the words radio and Jamaica in a single sentence and you conjure instant images of Jamaica s best loved radio station with the most broadcasting experience. Accegas JPS Carrera 94C. P. This archive lists all the 2017 Lotto draw results including the winning numbers the jackpot that was on offer and whether the top prize was won or rolled over. Fernando Japan Loto 7 results are updated on theLotter soon after each draw takes place so that you can immediately find out the Japanese lottery 39 s winning numbers. lotto jps

Lotto jps

7 Enhancing Java Portlets

This chapter explains how to enhance Java portlets you created with the Oracle JDeveloper Portal Add-In, and how to make a portlet out of your struts application. This chapter contains the following sections:

The source code for many of the examples referenced in this chapter is available as part of PDK-Java. You can download PDK-Java on Oracle Technology Network (OTN):

When you unzip PDK-Java, you will find the examples in:

You can find the Javadoc reference for PDK-Java in:

7.1 Enhancing JPS Portlets

Once you have built your initial portlet in the Portlet Wizard as described in Section 6.3.1, “Creating a JSR 168 Portlet”, you will want to enhance it. Because JPS portlets adhere to the Java standards, you can find substantial information about enhancing them from many different sources, such as third party books and Web pages. One of the more important enhancements that you might wish to perform is Section 7.1.1, “Adding Personalization”, which is described in this section.

7.1.1 Adding Personalization

In this section, you enhance the portlet you created in Section 6.3.1, “Creating a JSR 168 Portlet” with some code that allows a user in Edit or Edit Defaults mode to paste HTML into a field for the portlet to render. You will also see how easily you can redeploy a portlet. Assumptions

To perform the tasks in this section, we are making the following assumption:

You built a portlet using the wizard, successfully registered the producer, and added the portlet to the page. Implementing Personalization

In this section, you add some code to My Java Portlet, redeploy the portlet, and then test it in Oracle Portal. To do this, perform the following steps:

In Oracle JDeveloper, double-click the view.jsp file for your JPS-Standard portlet in the Application Navigator.

Add the code that is indicated in bold in the following snippet:

Open edit.jsp in the visual designer and click the Design tab. Notice that the JSP consists of a form field, a form input field, and two form button fields, as shown in Figure 7-1.

Figure 7-1 edit.jsp in the Design View

Add the code that is indicated in bold in the following snippet to implement a form field called Content : Implementing Navigation within a Portlet

You can implement navigation within a portlet in one of three ways, as follows:

Pass navigation information in rendered URLs using explicit portlet parameters. Branching logic within the portlet code then determines which section of the portlet to render based on the URL. This option represents a small extension to the thesaurus example presented in Section, “Building Links with the Portlet URL Types” and Section, “Building Forms with the Portlet URL Types”. Basically, instead of performing thesaurus search operations using the value of parameter q , the portlet branches based on the parameter value and renders different content accordingly.

Pass navigation information as described in the previous item but use PDK-Java to interpret the parameter and thus branch on its value. This option requires some further changes to the thesaurus example and is more fully explained subsequently.

Use session storage to record the portlet state and URL parameters to represent actions rather than explicit navigation. This method provides the only way that you can restore the portlet to it’s previous state when the user navigates off the page containing the portlet. Once the user leaves the page, all portlet parameters are lost and you can only restore the state from session storage, assuming you previously stored it there. This option requires that you understand and implement session storage. Refer to Section, “Implementing Session Storage” for more information about implementing session storage.

The following portlet code comes from the multi-page example in the sample provider of PDK-Java:

Notice that the value of pageParameterName is the name of a portlet parameter, next_page , that the PDK framework intercepts and interprets as an override to the value of the showPage parameter. If the PDK framework encounters the qualified version of the parameter when the multi-page portlet is requested, it will render the resource identified by next_page rather than first.jsp . Note that the PDK does not render the parameter within the portlet, that responsibility falls to the portlet.

You can modify the thesaurus example to operate with the use of this parameter. Specifically, you can use the form submission portlet to be the input for the thesaurus (the first page of the portlet), then navigate the user to the results page, which contains links to drill further into the thesaurus. The following examples illustrate these changes.

The example that follows is most useful for relatively simple cases, such as this thesaurus example. If your requirements are more complex (for example, you want to build a wizard experience), then you should consider using an MVC framework such as Struts. For information on how to build portlets from struts applications, refer to Section 7.3, “Building Struts Portlets with Oracle JDeveloper”.

Notice how next_page must be explicitly set to point to ThesaurusLink.jsp . If you do not explicitly set next_page in this way, it defaults to the resource registered in provider.xml , which is ThesaurusForm.jsp .

Partial Page Refresh

Portlets can refresh themselves without refreshing the entire page. For example, in the multi-page portlet sample, firstpage.jsp uses the API to specifically enable the portlet to link to and display the second page without refreshing the entire portal page. The text in bold in the following example shows how this can be set: Submitting Events

In the previous section, you created a portlet that received parameters. Now you will create a portlet that passes parameters and events to other portlets on the same page or a different page. Some portlets, like the Simple Parameter Form in OmniPortlet, provide an easy, declarative interface to create a simple form to pass parameters to other portlets. If you want complete control over the events passed and the look of your portlet, though, you can add events to your Java portlet.

The Portlet Wizard does not create all of the code needed to pass parameters to other portlets. The wizard updates the tags in provider.xml and requires that you add the necessary business logic to your JSP code. To create a portlet that uses events, you perform the following tasks:

Create a new portlet with the Portlet Wizard.

Add code to your JSP page.

Map this portlet’s parameters to the portlet you created in Section, “Adding Public Parameters”.

Creating an Events Portlet

To create an events portlet, perform the following steps:

Create a new portlet called MyEventsPortlet in the same provider you used for the parameter portlet in Section, “Adding Public Parameters”by invoking the Portlet Wizard (Figure 7-6). Go through the wizard as normal. In step 5 of the wizard, create a parameter. In step 6 of the wizard, enter the information shown in Table 7-1.

Table 7-1 Events

This is my event.

This is my parameter

Figure 7-6 Public Portlet Events Page of Portlet Wizard

The wizard generates the following code in provider.xml :

In the following example, notice that the input parameter and the event parameter have the same name, MyParam . They are two different parameters, even though they have the same name.

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

Import the following necessary classes into MyEventsPortlet :

In MyEventsPortlet , add a link that passes the parameter value to another portlet. As shown in the following sample code, you receive the same page parameter as the previous portlet, but in addition you create a link that passes an event as well:

This sample code does not handle NULL values. When the portlet is initially added to the page, you may receive an error, but, after wiring the portlet to the page parameter, it should work fine.

Add the portlet to a different page (in the same page group) than the previous portlet (the Parameter Portlet). Expand the portlet and wire it to receive the same parameter as the previous portlet.

Apply your changes on the Parameter tab and go to the Events tab. Expand the Event portlet and select the event. Select Go to Page and find the page to which you want to pass the event. Choose the page where the Parameter portlet is located. Configure this portlet to pass an event as the page parameter MyParameter as shown in Figure 7-7.

Figure 7-7 Portlet Events in the Edit Page

Click OK to view the page. Your Event portlet should have a link that displays the value received from the page (Figure 7-8).

Figure 7-8 My Event Portlet Before Parameter Change

You can append a parameter value to the URL and the portlet displays the value in the link.

When you click the link, that value is passed to the Parameter portlet on its page (Figure 7-9).

Figure 7-9 My Event Portlet After Parameter Change

7.2.4 Using JNDI Variables

When writing Java portlets, you may set deployment specific properties through the JNDI service such that their values may be retrieved from your provider code. In this way, you can specify any property in a provider deployment and then easily access it anywhere in your provider code. PDK-Java provides utilities to enable the retrieval of both provider and non-provider JNDI variables within a J2EE container. To use JNDI variables, you need to perform the following tasks: Declaring JNDI Variables

You declare JNDI variables in the web.xml file for your provider. The format for declaring a JNDI variable is as follows:

The env-entry-name element contains the name by which you want identify the variable. env-entry-type contains the fully qualified Java type of the variable. env-entry-value contains the variable’s default value. Variable Types

In the env-entry-type element, you should supply the fully-qualified Java type of the variable, which will be expected by your Java code. The Java types you may use in your JNDI variables are as follows:

The J2EE container uses these type declarations to automatically construct an object of the specified type and gives it the specified value when you retrieve that variable in your code. Variable Naming Conventions

The PDK-Java defines a number of environment variables that can be set at the individual provider service level or at the Web application level. To avoid naming conflicts between different provider services or different application components packaged in the same Web application, we recommend you devise some naming convention.

If you use the EnvLookup method, you must use oracle/portal/provider/service/property . You cannot substitute your own company name or component in this case.

Provider service specific names should be of the form:

Shared names should be of the form:

is the name of the company owning the application.

is the name of the application or component with which the provider is associated.

is the service name of the provider.

is the name of the variable itself.

As you can see, these naming conventions are similar to those used for Java packages. This approach minimizes the chance of name collisions between applications or application components. PDK-Java provides utilities that allow you to retrieve variables in this form without hard coding the service name of the provider into your servlets or JSPs. The service name need only be defined in the provider’s WAR file. Refer to Section, “Retrieving JNDI Variables” for more information on retrieving JNDI variables. Examples

The following examples illustrate provider variable names:

The following example illustrates non-provider variable names: Setting JNDI Variable Values

In your provider deployment, you may want to set a new value for some or all of your JNDI variables. You can perform this task by setting the values manually in a Oracle WebLogic Server deployment plan as follows:

Go to the provider deployment in the Oracle WebLogic Administration Console, and create a new Deployment Plan if one hasn’t been set against it.

Edit the Deployment Plan XML file. For each deployment property you want to set, add the following variable definition directly under the tag:

To tie this variable definition to and actual JNDI variable that you want to set, do the following for each property under the WEB-INF/web.xml module descriptor (oracle/portal/sample/rootDirectory is used as an example):

Select ‘Update’ on the provider deployment to apply the Deployment Plan for the new settings to take effect. Retrieving JNDI Variables

JNDI is a standard J2EE technology. As such, you can access JNDI variables through J2EE APIs. For example:

In addition to the basic J2EE APIs, PDK-Java includes a simple utility class for retrieving the values of variables defined and used by the PDK itself. These variables all conform to the naming convention described in Section, “Variable Naming Conventions” and are of the form:

To use these APIs, you need only provide the provider_service_name and the variable_name . The utilities construct the full JNDI variable name, based on the information you provide, and look up the variable using code similar to that shown earlier and return the value of the variable.

The EnvLookup class ( oracle.portal.utils.EnvLookup ) provides two lookup() methods. One retrieves provider variables and the other retrieves non-provider variables. Both methods return a java.lang.Object , which can be cast to the Java type you are expecting.

The following code example illustrates the retrieval of a provider variable:

myProviderName represents the service name for your provider, which makes up part of the variable name. myVariableName represents the portion of the variable name that would come after the provider’s service name. The example assumes the variable being retrieved is of type j ava.lang.String .

To retrieve a non-provider variable, you use the same code, you pass only one parameter, the variable name, to the lookup() , again excluding the oracle/portal prefix.

Table 7-2 shows the JNDI variables provided by default with PDK-Java. If you do not declare these variables, PDK-Java looks for their values in their original locations ( web.xml and the deployment properties file).

Table 7-2 PDK-Java JNDI Variables

Boolean auto reload flag. Defaults to true.

Location of provider’s definition file.

Log setting (0 through 8). 0 being no logging and 8 the most possible logging.

Provider’s HMAC time difference.

Authentication key for resource proxying through the Parallel Page Engine. Refer to Oracle Fusion Middleware Administrator’s Guide for Oracle Portal for more information.

Location for provider personalizations. No default value.

HMAC shared key. No default value.

(non-provider) A boolean flag that determines if a provider’s test page is accessible. Defaults to true.

A boolean flag that determines whether Edit Defaults personalizations may be exported and imported. Refer to Section, “Disabling Export/Import of Personalizations” for more information.

7.2.5 Creating Private Events

In some cases, it is useful for a portlet to complete a transaction before rendering a page on which it resides rather than having the transaction and the rendering executed simultaneously. For example, suppose a portlet has a link that initiates an update of some data value that might effect other portlets on the page. If the transaction takes place simultaneously with a refresh of the page, other portlets that rely on that data value may or may not be refreshed with the latest value. Furthermore, when transactions and rendering are tied together in this way, an action such as the user hitting Back in their browser could cause the transaction to be repeated, perhaps creating a duplicate record.

In JPS portlets, this situation is solved using the processAction method, which allows an individual portlet to complete a transaction, such as updating a value, before allowing the page rendering to take place. PDK-Java does not have processAction , but you can achieve the same results by submitting data to your servlet through a different mechanism. If you are using Struts for the page flow and control of a portlet, you could use the form tag and transaction tokens to avoid submitting the same parameter twice. Refer to Section 7.3, “Building Struts Portlets with Oracle JDeveloper” for more information about Struts portlets.

Another possibility is to submit data through Edit mode rather than Shared Screen mode. Requests based on full page Show modes, such as Edit mode, are sent only to the portlet that generated the link. Other portlets on the same portal page never even see a render request. Hence, these full page Show modes provide you with the capability to execute a transaction for a portlet separately from the page and its other portlets.

Once you have processed the portlet’s submission, you redirect from the full page Show mode back to the page using the back URL. This action has two desirable effects, as follows:

It returns the user to the page from which they came.

It clears all traces of the form submission from the browser.

As a result, any refreshing of the page is guaranteed to occur after the processing of the data submission. Because the page refresh comes after the submission you can be sure that all portlets on the page will access the updated data and not cause a duplicate submission.

This technique is illustrated by a sample portlet in the PDK called the private event submission portlet. It demonstrates submitting a simple form to the portlet and logging the contents of the form. In the private event submission portlet, we overload Edit mode to handle both the data submission and the portlet’s rendering for personalizations. Note that any of the other full page Show modes (Edit, Help, About, and Edit Defaults) would be equally effective for this purpose.

Edit mode for this portlet includes additional code that first looks for a specific parameter. If this parameter is present, it means that the request represents a private event. The same mode can handle many different private events by using different values for the distinguishing parameter. If the distinguishing parameter does not exist, then Edit mode falls through to the standard portlet personalization logic.

After handling the private event, this mode redirects to the page using exactly the same logic that Edit mode uses when a user clicks OK . Refer to in the sample files for the complete source code illustrating this technique.

When you use this technique, you must take care that the details of your event are persisted somewhere. Since portlet rendering does not happen in the same request cycle as the event processing, any data from the event required to render the portlet must be available from storage. Otherwise, the portlet or the page may lack the data it requires the next time it is rendered.

If you need to persist your data, be sure to store it in a qualified manner (by the user and portlet reference). Otherwise, you may accidentally associate an event from one user/portlet with the rendering of the same portlet for another user on a different page, or even associate the same user/same portlet with a different portlet reference on the same page.

7.2.6 Accessing Session Information

When a user accesses any portal page, Oracle Portal initiates a public unauthenticated session and maintains a cookie to track information about the session across requests. If the user logs in to Oracle Portal, this session becomes an authenticated session of the logged-in user. This portal session terminates when the any of the following occur:

The browser session terminates (that is, the user closes all the browser windows).

The user explicitly logs out.

The session times out because the user’s idle time exceeds the configured limit.

As part of the metadata generation, Oracle Portal contacts all of the providers that contribute portlets to the page, if they specify during registration that they get called for some special processing. This call allows providers to do processing based on the user session, log the user in the provider’s application if needed, and establish provider sessions in Oracle Portal. For Database providers, this call is referred to as do_login and for Web providers it is initSession . Since most Web-enabled applications track sessions using cookies, this API call allows the provider of the application to return cookies.

You can utilize the session store to save and retrieve information that persists during the portal session. This information is only available, and useful, to you during the life of the session. You should store only temporary information in the session store. Application developers may use the session store to save information related to the current user session. Data in the session store can be shared across portlets.

If the information you want to store must persist across sessions, you may want to store it in the preference store instead. Some common applications of the session store are as follows:

to cache data that is expensive to load or calculate (for example, search results).

to cache the current state of a portlet (for example, the current range, or page, of search results displayed in the portlet, or sequence of events performed by user).

Before you implement session storage, you should carefully consider the performance costs. Because portlets and providers are remote, it can be a relatively expensive operation to create and maintain even a small amount of information in the session store. For this reason, you may want to avoid altogether any session storage for public pages that are accessed frequently by many users.

If scalability is an important concern for you, a stateful application may cause you problems. Stateful applications can impact the load-balancing and failover mechanism for your Oracle Portal configuration. Even though you may deploy multiple middle-tiers accessing the same Oracle Portal instance, you must implement sticky routing (where the same node handles subsequent requests in the same session) to track state. Sticky routing may result in lopsided load-balancing or loss of session data in case a node crashes, impacting failover. This issue is one reason why many developers prefer to build stateless applications. However, if scalability is not a concern, then a stateful application should present no problems for you.

In the example in this section, session storage is used to count the number of times your portlet has rendered in Shared Screen mode. Assumptions

To perform the tasks in this section, we are making the following assumptions:

You built a portlet using the wizard and successfully added it to a page. Implementing Session Storage

The PDK Framework represents the session with a ProviderSession object, which is established during the call to the Provider Instance’s initSession method. This object is associated with the ProviderUser . To make data persistent between requests from Oracle Portal, you need to write data into the session object using the setAttribute method on the ProviderSession object. This method maps a java.lang.Object to a java.lang.String and stores that mapping inside the session object. The String can then be used to retrieve the Object during a subsequent request, provided the session is still valid.

A provider session may become invalid for the following reasons:

The session times out.

The invalidate method on ProviderSession is called.

The JVM process running the servlet container is terminated.

All portlets contained by the same ProviderInstance share the same session for a particular ProviderUser . Therefore, data unique to a particular portlet instance must be mapped to a unique String in the session. This is accomplished using the portletParameter method in the PortletRendererUtil class. This method makes a supplied String parameter or attribute name unique to a PortletInstance , by prefixing it with a generated identifier for that instance. You can use the returned instance-specific name to write portlet instance data into the session.

For more detailed information on the PDK Framework classes, refer to the Javadoc on OTN by clicking Java Doc API on the Portlet Development page available at

To implement session storage, you need to perform the following tasks:

Import ProviderSession , PortletRendererUtil , and HttpPortletRendererUtil .

Retrieve the provider session.

Read and write the session by accessing it from within your Java portlet.

Set the session to true in provider.xml .

Register the provider for session storage and set the Login Frequency.

The steps that follow describe how to add a session count to your portlet that displays how many times the portlet has been rendered for the current session.

After using the wizard to create a portlet, you can edit the JSP for the Show page in Oracle JDeveloper. You need to import the following classes:

Insert code that checks for a valid session first and then increments the count and displays it. If the session is valid and a previously stored value exists, you display the value, increment the count, and store the new value. If the session is valid but no previously stored value exists, you initialize a new count starting with 1, and display and store the value. You also want to obtain the unique string key for this portlet and then use an it in an array to count the session. If no session information was received, you want to provide information to the user indicating they may need to log back in.

By default, the wizard does not set session to true in provider.xml . You need to update this flag in order for the provider to receive session information from the portal. You should only set this tag to true if you are using session information in your provider or portlets. By setting this flag to true, extra load is added to the provider calls.

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

Register the provider in Oracle Portal. Ensure that you select the User radio button and choose a Login Frequency of Once Per Session on the Define Connections page of the wizard. For a reminder on how to register your portlet, refer to Section 6.5.5, “Registering and Viewing Your Oracle PDK-Java Portlet”. Viewing the Portlet

If you have not already added your Java portlet to a page, do so now. Ensure that you perform the following tasks:

Set your provider to Once per User Session for the login frequency value.

Refresh the provider to accept the new changes.

Re-login in case your session is no longer valid.

7.2.7 Implementing Portlet Security

This section describes the available security services for your Java portlet.

For more detailed information about the PDK classes referred to in this section, refer to the Javadoc on OTN by clicking Java Doc API on the Portlet Development page available at Assumptions

To perform the tasks in this section, we are making the following assumptions:

You built a portlet using the wizard and successfully added it to a page. Introduction to Portlet Security Features

This section introduces the major features that are available to secure your portlet providers. Authentication

When a user first logs in to an Oracle Portal instance, they must enter their password to verify their identity and obtain access. This authentication is performed by OracleAS Single Sign-On Server server. Refer to Section, “Single Sign-On” for more information.

Once the user’s identity is passed to the provider in shown requests, the provider code has access to the authenticated user’s identity from the PortletRenderRequest that is available from the HttpServletRequest object as follows: Authorization

Authorization determines if a particular user may view or interact with a portlet. Oracle Portal provides the following two types of authorization checking:

Portal Access Control Lists (ACLs): After a user is authenticated by OracleAS Single Sign-On Server, Oracle Portal uses ACLs to determine what privileges that user has to perform actions on portal objects, such as folders and portlets. The actions available to a user can range from simply viewing an object to performing administrative functions on it. If a user does not belong to a group that has been granted a specific privilege, Oracle Portal prevents that user from performing the actions associated with that privilege. Refer to Section, “Oracle Portal Access Control Lists (ACLs)” for more information.

Programmatic Portlet Security: You can also implement your own security manager programmatically. Refer to Section, “Portlet Security Managers” for more information. Communication Security

To this point, we have covered user authentication and authorization, which do not check the authenticity of messages received by a provider. The following measures can be used to properly secure communication between a portal and a web provider:

Oracle Portal Server Authentication restricts access to a provider to a small number of recognized machines. This method compares the IP address or the host name of an incoming HTTP message with a list of trusted hosts. If the IP address or host name is in the list, the message is passed to the provider. If not, it is rejected before reaching the provider. Refer to Section, “Oracle Portal Server Security” for more information.

Message Authentication uses a shared key to assert the Portal client identity and to prevent message tampering. Refer to Section, “Message Authentication” for more information.

Message Encryption encrypts message contents. Refer to Section, “HTTPS Communication” for more information.

User Input Escape causes Oracle Portal to escape any user input strings and treat them as text only to protect against XSS attacks, where an attacker attempts to pass in malicious scripts through user input forms. Refer to Section, “User Input Escape” for more information.

For more information about communication security, refer to the Oracle Fusion Middleware Administrator’s Guide for Oracle Portal . Single Sign-On

Portlets act as windows into an application. They display summary information and provide a way to access the full functionality of the application. Portlets expose application functionality directly in the portal or provide deep links that take you to the application itself to perform a task.

An application may need to authenticate the user accessing the application through the portlet. Following are the possible application authentication methods:

Section, “Partner Application”. In this case, the application user is the same authenticated user used by Oracle Portal.

Section, “External Application”. In this case, the Oracle Portal user is different from the application user, but the application user name and password are managed by the Oracle Portal user.

Section, “No Application Authentication”. In this case, the communication between provider and Oracle Portal is not protected at all. Partner Application

A partner application is an application that shares the same OracleAS Single Sign-On Server as Oracle Portal for its authentication. Thus, when a user is already logged in to Oracle Portal, their identity can be asserted to the partner application without them having to log in again.

Partner applications are tightly integrated with OracleAS Single Sign-On Server. When a user attempts to access a partner application, the partner application delegates the authentication of the user to OracleAS Single Sign-On Server. Once a user is authenticated (that is, has provided a valid user name and password) for one partner application, the user does not need to provide a user name or password when accessing other partner applications that share the same OracleAS Single Sign-On Server instance. OracleAS Single Sign-On Server determines that the user was successfully authenticated and indicates successful authentication to the new partner application.

The advantages of a partner application implementation are as follows:

Provides the tightest integration with Oracle Portal and OracleAS Single Sign-On Server.

Provides the best single sign-on experience to users.

Provides the most secure form of integration because user names and passwords are not transmitted between Oracle Portal and the provider.

The disadvantages of a partner application implementation are as follows:

The application must share the same user repository as Oracle Portal even though the application’s user community may be a subset of the Oracle Portal user community. While worth some consideration, this issue is a minor one because the portal pages that expose the application can be easily restricted to the application’s user community.

The application can only be tightly integrated to one or more OracleAS Single Sign-On Server instances if they share the same user repository.

The application must be written such that it delegates authentication to OracleAS Single Sign-On Server.

You must have access to the application source code. External Application

An external application uses a different authentication server than Oracle Portal. The application may use a different instance of OracleAS Single Sign-On Server than that used by Oracle Portal or some other authentication method. However OracleAS Single Sign-On Server does store the user name and password of the external application for that user. This means that when a user is already logged into Oracle Portal, they will be logged into the external application without having to type in their user name or password.

Applications that manage the authentication of users can be loosely integrated with OracleAS Single Sign-On Server if the administrator registers them as external applications. When a user who was previously authenticated by OracleAS Single Sign-On Server accesses an external application for the first time, OracleAS Single Sign-On Server attempts to authenticate the user with the external application. The authentication process submits an HTTP request that combines the registration information and the user’s user name and password for the application. If the user has not yet registered their user name and password for the external application, OracleAS Single Sign-On Server prompts the user for the required information before making the authentication request. When a user supplies a user name and password for an external application, OracleAS Single Sign-On Server maps the new user name and password to the user’s Oracle Portal user name and stores them. They will be used the next time the user needs authentication with the external application.

The advantages of an external application implementation are as follows:

Allows integration with many portals. If, however, one of the portals is preferred over the others, the application could be integrated as a partner application of that preferred portal and an external application of the others.

Provides a single sign-on experience for users. However, users still must maintain different user names and passwords. In addition, the external application user name mapping must be maintained.

Allows integration with multiple portals independent of their user repositories and OracleAS Single Sign-On Server.

Avoids the requirement of having access to the application source code.

The disadvantages of an external application implementation are as follows:

Does not share the same user repository as the portal, which requires additional maintenance of user information by the end user.

Transmits the user name and password to the provider in plain text, unless you implement SSL. No Application Authentication

The provider trusts the Oracle Portal instance sending the request completely. The provider can determine if the user is logged in and the portal user name, but the application has not authenticated the user.

The advantages of no application authentication are as follows:

Provides the easiest form of integration and the fastest to implement.

The disadvantages of no application authentication are as follows:

Provides the least security.

Provides the weakest integration with Oracle Portal. Oracle Portal Access Control Lists (ACLs)

When users log in to an Oracle Portal instance, they are authenticated by an OracleAS Single Sign-On Server instance. Having verified their identity, Oracle Portal uses ACLs to determine whether they are authorized to access particular portlets and add them to pages from the Portlet Repository.

Oracle Portal ACLs operate according to the following security characteristics:

Privileges define the actions that can be performed on the object to which they are granted. Privileges include actions such as Manage and Execute.

Oracle Portal users and their privileges are granted from the Administer tab of the Builder.

Oracle Portal user groups are administered from the Administer tab of Oracle Portal Builder. Membership in the groups and privileges granted to the groups are all defined and maintained here. A privilege granted to a user group is inherited by all the users of that group.

Provider privileges apply to the provider and all of its portlets. Provider ACLs are administered on the Provider tab of the Oracle Portal Navigator.

Portlet privileges can override the privileges set for the provider of the portlet. Portlet ACLs are administered from the Provider tab of the Oracle Portal Navigator. Clicking Open for a provider takes you to a page that manages the portlets of the provider.

For more information on the available privileges for objects, users, and user groups in Oracle Portal, refer to the Oracle Fusion Middleware Administrator’s Guide for Oracle Portal .

The advantages of ACLs are as follows:

ACLs offer a simple, yet powerful, mechanism to secure Oracle Portal objects.

Central management of user group membership simplifies the management of ACLs because it negates the necessity of modifying the ACLs associated with each object.

The disadvantages of ACLs are as follows:

ACLs are applied at the provider or portlet level. You cannot vary the security rules for a portlet depending on the page where you place it. Portlet Security Managers

Portlet security managers are implemented within a provider to verify that a given user may view an instance of the portlet. When a user views a page with a portlet instance on it, security managers determine whether the user has the appropriate privileges to see the portlet. Implementing access control methods in the provider restricts the retrieval of content from a portlet (that is, hides the portlet) from users without the appropriate privileges. Only if the specified characteristics, such as user details and preferences, pass the authorization logic will the content be retrieved for the user. If no portlet security methods are implemented in the provider, then any user name may be passed in, even fictitious, unauthenticated ones.

A provider can implement two portlet security methods as follows:

Get a list of portlets.

Verify the accessibility of the portlet.

Portlets have access to the Oracle Portal user privileges and groups of which the user is a member. The following information can be used by the security methods:

The default group of the user

The privileges of a user or group

The highest available privilege of a user across all groups

The objects the user can access (only in database providers)

AuthLevelSecurityManager has access to the following information about authorization level:

The user has been authenticated by OracleAS Single Sign-On Server in the current Oracle Portal session, that is, the user logged in with a valid user name and password, and requested the portlet in the context of that session.

A user who was previously strongly authenticated returns to view a page without an active Oracle Portal session. A persistent cookie (maintained by the user’s browser) indicates that in some previous session the user logged on with a valid user name and password.

Public or not authenticated.

The user has not logged in within the context of the current Oracle Portal session, and does not have a persistent cookie to indicate that such a state previously existed.

To incorporate these security services into your Java portlet, you simply need to update provider.xml and set the security level to strong, weak, or public. Place the following XML right before the

tag in provider.xml :

After you make this change to provider.xml , refresh the provider.

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

The advantages of security methods are as follows:

You can enable a portlet to produce different output depending on the level of authorization.

The disadvantages of security methods are as follows:

Most security manager implementations will use the authorization level or some other user specific element in an incoming message. A check of this type could be bypassed by an entity imitating an Oracle Portal instance. Viewing the Portlet

After you add a security manager to a portlet, you can validate it by following these steps:

Ensure you are logged in to an Oracle Portal instance with privileges to create pages and add portlets to a page.

Create a new portal page, ensuring it is visible to PUBLIC.

Add your Java portlet to the page.

Make a note of the direct URL to your new Portal page.

Now log out of the Portal instance by clicking the Logout link.

Directly access the Portal page by entering the URL noted in Step 4 into your browser’s address bar.

You will see the page created in Step 2 but not the portlet added in Step 3. When you added the portlet to the page, you were logged in and hence strongly authenticated. The PDK runtime detected this and allowed you to add the portlet. When you logged out and viewed the page, you were no longer strongly authenticated and hence the PDK Framework did not allow rendering of the portlet’s contents.

If you log in again and view the page, you will see that the portlet is still there. Implementing Your Own Security Manager

If your portlet requires special security arrangements which are not provided by the implementations shipped with the PDK, you will need to supply your own custom PortletSecurityManager controller class. To do this, extend the PortletSecurityManager class and supply implementations for the two methods specified by the interface. Then replace the class attribute of the securityManager controller element in the XML provider definition with you new class name and configure child elements appropriately. Oracle Portal Server Security

One way to prevent unauthorized access to providers is to restrict access to the provider to known client machines at the server level. Because only the identified clients may access the provider, this method defends against denial of service attacks.

In Oracle Fusion Middleware, you use the allow and deny directives in the httpd.conf file to control access to client machines based on their host names or IP addresses. If host names are used as discriminators, the server needs to look them up on its Domain Name Server (DNS), which adds extra overhead to the processing of each request. Using the IP address circumvents this problem, but the IP address of a remote client may change without warning.

The advantages of server security are as follows:

It limits access to the provider to trusted hosts only.

It simplifies configuration.

The disadvantages of server security are as follows:

Oracle Web Cache does not have IP address checking capability. If Oracle Web Cache sits in front of a provider, you have no protection from a client on any host sending show requests to Oracle Web Cache.

Restricting access to certain IP addresses and host names may be circumvented by sending messages to a provider containing fake IP addresses and host names. This trick is difficult to perform effectively since return messages go to the machine whose IP address was copied, but it can still cause problems. Message Authentication

Message authentication uses a shared key known to the client (Portal instance) and provider to restrict access to known clients. This may be used in SSL communication with a provider instead of client certificates.

Oracle Portal sends a digital signature, calculated using a Hashed Message Authentication Code (HMAC) algorithm, with each message to a provider. A provider may authenticate the message by checking the signature using its own copy of the shared key. This technique may be used in Secure Socket Layer (SSL) communication with a provider instead of client certificates.

A single provider instance cannot support more than one shared key because it could cause security and administration problems. For instance, if one copy of the shared key is compromised in some way, the provider administrator has to create a new key and distribute it to all of the Oracle Portal clients, who then must update their provider definitions. The way around this problem is to deploy different provider services, specifying a unique shared key for each service. Each provider service has its own deployment properties file so that each service is configured independently of the others. The overhead of deploying multiple provider services within the same provider adapter is relatively small.

In a provider without Oracle Web Cache in front of it, this use of the same signature cookie over the lifetime of a provider session implies a trade-off between performance and the security provided by authenticating the requests. The signature cookie value is only calculated once after the initial SOAP request establishes the session with the provider. The shorter the provider session timeout, the more often a signature will be calculated providing greater security against a show request being resent illegally. However, the SOAP request required to establish a session incurs a time penalty.

In a provider using Oracle Web Cache to cache show request responses, you have a similar trade-off. Cached content is secured in the sense that incoming requests must include the signature cookie to retrieve it, but caching content for an extended period of time leaves the provider open to show requests being illegally trapped and resent to the provider.

While the signature element provides protection against interception and resending of messages, it does nothing to prevent interception and reading of message contents. Messages are still transmitted in plain text. If you are concerned about the content of messages being read by unauthorized people, you should use message authentication in conjunction with SSL.

The advantages of message authentication are as follows:

Ensures that the message received by a provider comes from a legitimate Oracle Portal instance.

The disadvantages of message authentication are as follows:

Causes administration problems if a provider serves more than one portal. Entails performance implications if made very secure by having a short session timeout.

Credential Store Share Key

The Producer’s shared key is stored in the credential store. To store a shared key into the credential store do the following:

Create the Credential

To create the credentials, run the following WLST command:

Grant PDK Java Code Access to the Credential Store

To grant pdk java code access to the credential store permission : HTTPS Communication

Normal communication between Oracle Portal and a provider uses HTTP, a network protocol that transmits data as plain text using TCP as the transport layer. HTTPS uses an extra secured layer (SSL) on top of TCP to secure communication between a client and a server, making it difficult to intercept and read messages.

Each entity (for example, an Oracle Web Cache instance) receiving a communication using SSL has a freely available public key and a private key known only to the entity itself. Any messages sent to an entity are encrypted with its public key. A message encrypted by the public key may only be decrypted by the private key so that, even if a message is intercepted by a felonious third party, it cannot be decrypted.

Certificates used to sign communications ensure that the public key does in fact belong to the correct entity. These are issued by trusted third parties, known as Certification Authorities (CA). They contain an entity’s name, public key, and other security credentials and are installed on the server end of an SSL communication to verify the identity of the server. Client certificates may also be installed on the client to verify the identity of a client.

Oracle Wallet Manager manages public key security credentials. It generates public and private key pairs, creates a certificate request to a CA, and installs the certificate on a server.

Configuration of SSL

When a provider is registered from an Oracle Portal instance, only one URL is entered, which means either HTTP or HTTPS may be used but not both.

Each port on each server that may be used to receive SSL messages must have a server-side certificate installed (that is, an OracleAS Web Cache instance) in front of the Web provider and the server that hosts the provider. The certificate installed on a server port ensures that communication between two points is encrypted but does not authenticate the source of a message. Message authentication should be used as well to fully secure communication between a trusted Oracle Portal instance and a provider.

For more information about SSL configuration for Oracle Portal, refer to the Oracle Fusion Middleware Administrator’s Guide for Oracle Portal . LDAP (Oracle Internet Directory) Security

PDK-Java uses Portlet Security Managers for LDAP (Oracle Internet Directory) security. PDK-Java uses Oracle Internet Directory as a repository of users, groups, and permissions. It retrieves information about the logged-in user and determines whether the user has the required permissions to view the portlet and data within the portlet. By enabling Oracle Internet Directory security, your providers perform the following:

Secure portlets based on groups.

Restrict access to the administrative functions of your portlets (using your own security manager).

Retrieve all of the user property information stored in the Oracle Internet Directory including first name, last name, title, e-mail, telephone number, groups, and photo.

Create users and groups for Oracle Portal.

By default, Oracle Internet Directory security is disabled. You must make a change in the deployment properties file for a specific provider to enable this feature. Enabling and using Oracle Internet Directory to secure your portlets can be done quickly and easily. To do this, perform the following steps:

Enable the Oracle Internet Directory manager in the deployment properties files ( provider_name .properties ).

Provide the connection information for Oracle Internet Directory by extending the simple class called OidInfo .

Provide a list of groups that can view your portlet in the provider definition file.

Your provider connects to Oracle Internet Directory using the information provided to the OidInfo class by you. The portlet accesses Oracle Internet Directory using the credentials provided (for example, user name and password) and performs the specified tasks. We recommend that you create an Oracle Internet Directory user specifically for your provider connection with the minimum set of privileges needed to complete the tasks requested by your portlets. For example, if your portlet only checks group information, do not connect to the Oracle Internet Directory as an administrator. Implementing Oracle Internet Directory Security

PDK-Java provides a set of default classes specifically for Oracle Internet Directory integration. These classes handle the connection from your portlets to Oracle Internet Directory, enable your portlets to be secured based on Oracle Portal groups, and provide access to user property information from within Oracle Internet Directory. The classes used by your Web provider for Oracle Internet Directory integration are as follows:

oracle.portal.provider.v2.oid.OidInfo receives the Oracle Internet Directory connection information provided by the developer and connects to Oracle Internet Directory. When building your own portlets, you should extend this class to send secure connection details from the provider to Oracle Internet Directory.

oracle.portal.sample.v2.devguide.oid.UnsafeOidInfo is an extension of OidInfo and provides an easy way to test portlet security. This class is used by the Oracle Internet Directory samples in PDK-Java and parses the deployment properties file for the Oracle Internet Directory connection information (seen subsequently). This class should be used only for testing and development, it is not safe to use in a production scenario.

oidManager is set to false by default. It must be set to true in provider_name .properties to enable Oracle Internet Directory. (If you have only one provider in your Web application, ensure that provider_name .properties is identical to .) For example:

oidAdminClass is set to the class that extends OidInfo . PDK-Java provides UnsafeOidInfo by default, but as the name suggests, this class should not be used in production scenarios.

oidHost is the machine where Oracle Internet Directory is hosted.

oidPort is the port used by the Oracle Internet Directory.

oidUser is the Oracle Internet Directory account.

oidPasswd is the Oracle Internet Directory password. manages which groups have access to your provider and its portlets. It retrieves this information from the provider definition file and is portlet specific. Each portlet in a provider may have different group settings. There is no limit on the number of groups that can be set using this tag, but, since the Web provider parses and validates each group in turn, listing many groups may degrade performance.

is the tag in provider.xml that handles group management. It lists the groups allowed to access the portlet. The group information here follows the same case sensitivity as the Oracle Internet Directory.

The following example refers to your portal_instance_id , which is specific to your installation. To find your instance identifier, refer to your Oracle Fusion Middleware Administrator’s Guide for Oracle Internet Directory .

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

The advantages of Oracle Internet Directory security are as follows:

Offers a simple, powerful way to secure your portlets.

Secures data within your portlets based on the user’s group membership.

Creates users and groups directly from your portlets exposed as Web providers.

The disadvantages of Oracle Internet Directory security are as follows:

Slightly degrades performance when authorizing your portlet through Oracle Internet Directory. There is a cost associated with obtaining group information from any LDAP server, but this cost only happens the first time a user accesses a portlet in a session.

Requires provider access to Oracle Internet Directory.

Assumes all Oracle Portal instances served by the provider use the same Oracle Internet Directory instance.

For more information on securing your providers using Oracle Internet Directory or to set up the sample portlets secured using Oracle Internet Directory, review the technical note, Installing the Oracle Internet Directory Portlets on OTN. Viewing Your Portlets

After you secure your provider with Oracle Internet Directory, you can validate its behavior by following these steps:

Ensure you are logged in to an Oracle Portal instance as a user who is a member of the group specified in the tag in provider.xml .

Use an existing page or create a new one, ensuring it is visible to PUBLIC.

Add your Java portlet to the page.

Make a note of the direct URL to your new page.

Directly access the page by entering the URL noted in Step 4 in your browser’s address bar or login to Oracle Portal using a user that is not part of the group listed in provider.xml .

You will see the page created in Step 2 but not the portlet added in Step 3, as shown in Figure 7-10. When you added the portlet to the page, you were logged in as a user authorized to view the portlet. The PDK runtime detected this and allowed you to add the portlet. When you logged out and viewed the page, you were no longer part of the group allowed to view the portlet and hence the PDK Framework did not allow rendering of the portlet’s contents.

Figure 7-10 Page and Portlets for Developer

If you log in again and view the page, you will see that the portlet is still there (Figure 7-11).

Figure 7-11 Page and Portlets for Developer/Administrator User Input Escape

By accepting user input without escaping it to text, you run the risk of an XSS attack, where an attacker attempts to pass in malicious scripts through user input forms. For example, if a portlet title is customizable, an attacker might attempt to pass scripts or commands to the portlet through the title string. Oracle Portal provides the following features to ensure that you can protect your portlets from such attacks: Default Container Encoding

To prevent any script inside a portlet title from being executed, the framework default container renderer class encodes any script characters. This default behavior is controlled through a JNDI variable, escapeStrings . When set to true , the markup tags in portlet titles are rendered as visible tag characters. For example, a title customization of title will be rendered as title not title . This mode is secure, but, if it is not the desired behavior, you can set escapeStrings to false for that provider.

escapeStrings applies to all logical providers within a Web provider. You can set the value of escapeStrings from the WebLogic Server Administration Console as you would any other JNDI variable. Refer to Section, “Setting JNDI Variable Values” for more information. Escape Methods

If you have code that renders customized values, you need to ensure that you escape those input values appropriately to avoid XSS attacks. This requirement applies to code for rendering pages in any mode. Oracle Portal supplies two new static methods for this purpose. They are in the Java class oracle.portal.provider.v2.url.UrlUtils , and can be described as follows:

public static escapeString( string_text ) escapes any script characters in a given string. For example, less than &lt . This method is unaffected by the escapeStrings JNDI variable and is the secure, recommended method to use.

public static escapeStringByFlag( string_text ) escapes any script characters in a given string. This method is controlled by the escapeStrings JNDI variable and is therefore less secure and not the recommended method to use.

7.2.8 Controlling the Export/Import of Portlet Personalizations

The export/import facility of Oracle Portal is a multi-purpose tool for moving your portal objects, such as portlets, between instances of Oracle Portal. For example, you might use export/import to move objects from a development environment to a stage environment and then, finally, to a production environment. You might also use export/import to move pages and page groups between Oracle Portal instances, or to move Web providers from one machine to another. For more information about export/import in general, please refer to the Oracle Fusion Middleware Administrator’s Guide for Oracle Portal .

Because portlet default settings can be set by the administrator and then changed by the user, they require some special consideration when you import and export them. To simplify the transport process, Oracle Portal provides default functionality that handles administrator personalization data (that is, data created using Edit Defaults mode) for you. When a portlet is exported, the default personalization data stored using PDK-Java’s PreferenceStore mechanism is exported with the portlet by default. Hence, when the portlet is imported into a target instance of Oracle Portal, this data is imported along with it. As a result, the portlet instance’s default settings are maintained when the portlet is moved from one portal instance to another. Foot 1

The aforementioned behavior is provided to you as a convenience and it requires no action on your part to leverage. You might, however, want to exercise more granular control over the export of personalization data than that provided by the default functionality. To implement your own requirements for export/import, you can make use of the programming interface to augment or override the default handling of personalizations.

If you use the PDK-Java preference store mechanism, the export/import of your Edit Default personalizations is built-in and requires no additional effort on your part. This default export/import of administrator personalizations relies on the PDK-Java preference store. If you have created your own preference store mechanism (for example, a file or database preference storage system), then you also must implement your own export/import support that performs the following functions:

Exports personalizations. This functionality must at least export administrator personalizations, but it could optionally include user personalizations, too.

Imports personalizations. Note that this functionality must reflect whatever you implemented for export. For example, if you allow the export of both administrator and user personalizations, then the import functionality must support both as well.

The export/import functionality for personalizations requires that your Oracle Portal instance and provider are on Release 10.1.2. Export/import of personalizations behaves the same regardless of the location of your provider, which can be either of the following:

in the default Oracle Containers for Java EE of the Oracle Fusion Middleware, where the Oracle Portal instance is different.

in a separate Oracle Containers for Java EE, where the Oracle Portal instance may be different, and the provider is the same but is not registered on the target Oracle Portal instance. Import/Export Programming Interface

The PDK-Java’s preference store mechanism allows data to be persisted by any number of application entities. The following three entities are the ones that persist data for the purposes of export/import:

The portlet instance is the portlet on a page with the default personalizations made to it by the administrator. The API for the portlet instance is as follows:

The portlet definition is the base portlet without any personalizations applied to it. You might think of the portlet definition as the version of the portlet that exists in the Portlet Repository before it is placed on a particular page for use. The API for the portlet definition is as follows:

The provider instance is the entity that contains and communicates with a set of portlets. The API for the provider instance is as follows:

By default, each of these entities employs an instance of oracle.portal.provider.v2.transport.PrefStoreTransporter to transform the data from an oracle.portal.provider.v2.preference.PreferenceStore to a byte array for transport. For the default export/import behavior, though, only the portlet instance entity’s personalization data is exported and imported. If you have persisted data at the portlet definition or provider instance level, you may want to export that data as well. For example, a billing handle that you persisted at the ProviderInstance level may need to be exported.

To change the behavior of PrefStoreTransporter , you can override its default implementation. The example in Section, “Exporting by Reference Example” illustrates how you can override PrefStoreTransporter .

To simplify troubleshooting of your export/import transactions, you can send messages to both the calling Oracle Portal instance and the Web provider log. PDK-Java provides a transport logging class that enables you to add events to the log during export and import operations. In this way, you can better keep track of events that occur during the transport of portlet personalizations. The log can be a valuable troubleshooting tool if you encounter unexpected behavior in your portlets during or after transport. For example, you can log events when incompatibilities between PDK-Java versions are found.

You log events using the logger object, an instance of the oracle.portal.provider.v2.transport.TransportLogger class provided for each of the methods mentioned earlier. You log events with the calling portal through the instance provided for each method. You record events in the Web provider log with the normal logging mechanism, oracle.portal.log.LogManager . The log levels for export/import are as follows: Exporting Personalizations Example

This example illustrates the most basic case where you build a portlet and accept the default behavior for the export of personalizations. In the examples in Section, “Encrypting Personalization Data Example” and Section, “Exporting by Reference Example”, you will see how to enhance the security of your personalizations during export and import. To implement the more basic form of exporting personalizations, do the following:

Create a stock portlet and implement the Show mode with the following class. Note that this class does not incorporate any special code to enable export/import.

Implement the Edit Defaults mode for your stock portlet with the following class, . This class enables the administrator to make and store default personalizations, which are then exported according to the default behavior.

Create the following class, , for your stock portlet:

Create a Web provider through provider.xml for this portlet. Notice the use of the

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

Register this export-enabled provider with the source Oracle Portal instance. For more information about registering Web providers, refer to Section 6.5.5, “Registering and Viewing Your Oracle PDK-Java Portlet”.

If the Web provider is running in a secured environment, remember to provide the proxy host and port while starting up Oracle WebLogic Server. For example:

Create two regions on a sample page and add My Stock Portlet to the first region. For information on creating regions and pages, refer to the Oracle Fusion Middleware User’s Guide for Oracle Portal .

Edit the page and click the Edit Defaults icon for My Stock Portlet. Choose the stock codes SUNW,IBM,ORCL . For more information on how to edit defaults for a portlet on a page, refer to the Oracle Fusion Middleware User’s Guide for Oracle Portal .

Add My Stock Portlet to a second region and again edit the defaults. Use a different stock code this time, MSFT .

Export the page group containing this page. For instructions on how to export a page group, refer to Chapter 10, “Exporting and Importing Content,” in the Oracle Fusion Middleware Administrator’s Guide for Oracle Portal .

Import the page group into a target Oracle Portal instance. For instructions on how to import a page group, refer to Chapter 10, “Exporting and Importing Content,” in the Oracle Fusion Middleware Administrator’s Guide for Oracle Portal .

View the page with My Stock Portlet in the target Oracle Portal instance and ensure that the personalizations were maintained. Implementing Security for Export/Import

Transporting personalizations can present a security concern if your portlet stores sensitive data and is not operating in a secured environment. At the provider and portlet level, Oracle Portal provides several ways for you to secure the export and subsequent import of portlet personalizations. To better secure portlets and providers for exportation and importation, you can take the following actions:

Section, “Securing Provider Communications”. Using Oracle Portal configuration options, you can secure the communications between providers and Oracle Portal. This step in turn makes the export and import of portlets more secure.

Section, “Disabling Export/Import of Personalizations”. You can disable the export of all portlet personalization data for each Web application. This method provides the greatest security but only at a significant cost in functionality because it prevents administrators from retaining their default personalizations when the portlet is moved.

Section, “Obfuscating Data for Transport (Automatic)”. By default, Oracle Portal obfuscates but does not encrypt personalization data before transporting it.

Section, “Encrypting Personalization Data for Transport”. You may want to encrypt personalization data for transport if any of the following are true:

Your Web provider connection is not secured using HTTPS.

You want to ensure the data is secured during transit.

You want the data to remain secure while stored in the Oracle Portal instance.

Section, “Exporting by Reference”. Instead of including portlet personalization data directly in the transport set, you can include it by reference in the transport set. Because the data itself is not present in the transport set, export by reference is the most secure way of transporting personalizations. Securing Provider Communications

If the security of exporting/importing portlets is of concern to you, you should configure Oracle Portal to secure communications with your portlet providers. The chief mechanisms for securing provider communications in Oracle Portal are as follows:

Message authentication through a Hashed Message Authentication Code (HMAC) algorithm. For more information on message authentication for providers, refer to Section, “Message Authentication”, in the Oracle Fusion Middleware Administrator’s Guide for Oracle Portal .

HTTPS between providers and Oracle Portal. For more information on HTTPS for provider communications, refer to Section, “HTTPS Communication”, in the Oracle Fusion Middleware Administrator’s Guide for Oracle Portal .

You cannot use certificates for the HTTPS communication with providers. Disabling Export/Import of Personalizations

The JNDI variable, oracle/portal/provider/global/transportEnabled , controls whether to allow the exportation and importation of personalizations. If you set the variable to true, personalizations are transported as part of export and import. If you set it to false, they are not transported. You can set JNDI variables for PDK-Java through a Deployment Plan set on the PDK-Java web application in the Oracle WebLogic Server. This can be done using the WebLogic Server Administration Console. Deployment Plans allow for easy modification of an application’s configuration, without modifying the packaged deployment descriptor files. After setting up the Deployment Plan, you can make manual changes to it for the JNDI variable within the pre-existing WEB-INF/web.xml module descriptor, like the following:

The variable definition of this variable assignment is made directly under the tag, and will look like:

This sets oracle/portal/provider/global/transportEnabled to false. Obfuscating Data for Transport (Automatic)

By default, personalization data is encoded (Base64). This encoding ensures that data is obfuscated during transport. You do not need to take any actions to leverage Base64 encoding as it is provided by default. However, if you want greater security, you can encrypt the data. Refer to Section, “Encrypting Personalization Data for Transport”. Encrypting Personalization Data for Transport

By implementing the class for your provider, you can encrypt the personalization data prior to exporting it. Upon import, the cipher manager is invoked again to decrypt the data. Refer to Section, “Encrypting Personalization Data Example”.

If you choose to encrypt your Web providers for export using the cipher manager, you must also devise your own key management strategy for the encryption algorithm. Exporting by Reference

As mentioned previously, the default behavior for exporting of portlets is to include the actual personalization data in the transport set. For a more secure transport, you can code your portlet such that the personalizations are exported using pointers rather than by including the actual preference data. When the transport set is imported, the target Oracle Portal instance sends the pointer back to the Web provider, which then has the opportunity to reassociate the actual data with the new portlet instance. Refer to Section, “Exporting by Reference Example”.

When exporting across security zones, exporting by reference may not work effectively. In general, you should only employ export by reference when transporting within the same general security environment. Encrypting Personalization Data Example

To encrypt personalization data in your Web provider, you need to create your own cipher manager and associate it with your portlet provider. This example provides a simple, insecure cipher manager for illustrative purposes only. To implement a secure implementation of the cipher manager for your production system, you would need to significantly extend this sample. Some of the issues you would need to consider for a production implementation are as follows:

Do not hold the key object in memory. Read it from a persistent store as necessary.

Use the provider’s PreferenceStore API supported by a DBPreferenceStore to work in the clustered case.

On import, if the cipher manager instance obtained from provider.xml matches the class name returned in the SOAP message, that CipherManager instance is used to perform the decryption. Hence, the instance maintained in the portlet/provider definition may be configured using any applicable means (for example, tags in provider.xml or JNDI variable) and that configuration is reused on import.

To encrypt personalization data in your Web provider, do the following:

The following sample is for illustrative purposes only. You would need to significantly enhance it for use in a production environment.

Create a cipher manager class, InsecureCipherManager . This class will be used for encryption and decryption of personalization data exported from or imported to a Web provider. A base64 encoded, hard coded secret key is used with the DES algorithm supplied by the default javax.crypto provider of the underlying Java Runtime Environment. As a result, this particular sample is insecure because the encoded key can be recovered by a malicious party simply by decompiling the byte code.

This sample makes use of the javax.crypto package, which is optional in Java 1.3 and must be installed manually. In Java 1.4, though, this package is present by default.

Modify your provider.xml to reference the cipher manager: Exporting by Reference Example

To export by reference rather than exporting the actual personalization, do the following:

Override the DefaultPortletInstance with the following ExportByRefDefaultPortletInstance :

Create the ExportByRefPrefStoreTransporter class referenced in ExportByRefDefaultPortletInstance . This class implements an alternative preference store transporter that does not send preference data during the export operation. Instead, it writes the context path of the source preference to the stream. During the export, it reads the context path and uses that path to look up the preference data and copy it to the new instance. This method of exporting by reference assumes that the source and target providers have access to the same preference store. In fact, the best case for this example would be the situation where the source and target providers are the same.

Update provider.xml to include the following element for your portlet:

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

7.2.9 Enhancing Portlet Performance with Caching

In the previous sections of this chapter, you learned how to write fully-functional Java portlets using the PDK Framework. Once you complete the basic functionality of your portlet, you may want to turn your attention to portlet performance.

Caching is a common technique for enhancing the performance of Web sites that include a great deal of dynamic content. The overhead involved in retrieving data and generating the output for dynamic content can be significantly reduced by proxying requests through a local agent backed by a large, low-latency data store known as a cache. The cache agent responds to a request in one of two ways, as follows:

If a valid version of the requested content exists in the cache, the agent simply returns the existing cached copy, thus skipping the costly process of content retrieval and generation. This condition is called a cache hit.

If a valid version of the requested content does not exist in the cache, the agent forwards the request to its destination and awaits the return of the content. The agent returns the content to the requestor and stores a local copy in its cache for reuse if a subsequent request for the same content arises. This condition is called a cache miss.

Web providers generate dynamic content (that is, portlets) and they often reside remotely from the Oracle Portal instance on which they are deployed. As such, caching might improve their performance. The architecture of Oracle Portal lends itself well to caching, since all rendering requests originate from a single page assembling agent, known as the Parallel Page Engine (PPE), which resides on the middle tier. You can make the PPE cache the portlets rendered by your Web provider and reuse the cached copies to handle subsequent requests, minimizing the overhead your Web provider imposes on page assembly.

The Web provider can use any one of three different caching methods, depending upon which one is best suited to the application. The methods differ chiefly in how they determine whether content is still valid. Following are the three caching methods:

Expiry-based Caching : When a provider receives a render request, it stamps its response with an expiry time. The rendered response remains in the cache and fills all subsequent requests for the same content until its expiry time passes. This caching scheme is perhaps the simplest and most performant because the test for cache validity requires very little overhead and does not involve any network round trips. Expiry-based caching suits applications where the content has a well-defined life span. For content with a less certain life span, however, expiry-based caching is less effective. Refer to Section, “Activating Caching” and Section, “Adding Expiry-Based Caching” for more information.

Invalidation-based Caching: Invalidation-based caching works essentially the same way as expiry-based caching, except that the contents of the cache can expire or become invalid at any time. Invalidation of cache content is usually triggered by an event.

For example, if you have a calendar portlet that shows your appointments for the day, the content for the portlet could be generated once, the first time you show the calendar for that day. The content remains cached until something happens to change your schedule for that day, such as the addition of an appointment, the deletion of an existing appointment, or a change of time for an appointment. Each of these change events can trigger an action in the calendar application. When such an event takes place, your calendar application can generate an invalidation request for any cached portlet content affected by the change. The next time you view a page containing your calendar portlet, the cache will not contain an entry. Your Web provider will be contacted to regenerate the new content with the modified schedule.

This method is a very efficient way to cache content because the originator of the content, that is, your Web provider, is contacted only when new content needs to be generated, but you are not bound to a fixed regeneration schedule. Refer to Section, “Activating Caching” and Section, “Adding Invalidation Based Caching” for more information.

Validation-based Caching : When a provider receives a render request, it stamps its response with a version identifier (or E Tag). The response goes into the cache, but, before the PPE can reuse the cached response, it must determine whether the cached version is still valid. It sends the provider a render request that includes the version identifier of the cached content. The provider determines whether the version identifier remains valid. If the version identifier is still valid, the provider immediately sends a lightweight response to the PPE without any content, which indicates the cached version can be used. Otherwise, the provider generates new content with a new version identifier, which replaces the previously cached version. In this form of caching, the PPE must always confirm with the provider whether the content is up to date. The validity of the cached copy is determined by some logic in the provider. The advantage of this approach is that the provider controls the use of the cached content rather than relying on a fixed period of time. Refer to Section, “Activating Caching” and Section, “Adding Validation-Based Caching” for more information. Assumptions

To perform the tasks in these sections, we are making the following assumptions:

You built a portlet using the wizard and successfully added it to a page. Activating Caching

To use the caching features of Oracle Portal in your Web providers, you must first activate the middle tier cache. This cache is known as the PL/SQL Cache because it is the same cache used by mod_plsql, the Oracle HTTP Server plug-in that calls database procedures, and hence database providers, over HTTP.

Usually, your OracleAS Portal administrator is responsible for the configuration details of caching.

For invalidation-based caching, you need to configure Oracle Web Cache in front of the Web provider. Bear in mind that remote Web providers often do not have Oracle Web Cache installed. For more information about Oracle Web Cache, refer to the Oracle Fusion Middleware Administrator’s Guide for Oracle Web Cache .

Once you have installed and configured Oracle Web Cache, ensure the following in the Oracle Web Cache Manager:

It points to the host name and port of the Web provider.

Caching rules do not cause the caching of provider content. Content should be cached according to the surrogate control headers generated by the provider in its response. Adding Expiry-Based Caching

Expiry-based caching is one of the simplest caching schemes to implement, and can be activated declaratively in your XML provider definition. You can set an expiry time for the output of any ManagedRenderer you utilize by setting its pageExpires property to the number of minutes you want the output to be cached for. For example, suppose you want portlet output to be cached for one minute. To add expiry-based caching, perform the following steps:

After you have used the Portlet Wizard to build a portlet as described in Section 6.5, “Building Oracle PDK-Java Portlets with Oracle JDeveloper”, edit the provider.xml file and set the pageExpires property tag of showPage to 1. This will set an expires entry of 1 minute for the portlet.

By default the wizard generates a standard and compressed tag for showPage . You need to expand the tag to include a subtag of pageExpires :

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

Test that the portlet is cached for 1 minute by adding some JSP code to your show page. You can simply add the current time to your JSP.

When viewing the portlet, you see that the time (including seconds) is constant for 1 minute. After the time has expired, the portlet displays the most current time and a new cache is set. Adding Invalidation Based Caching

When using Oracle Web Cache, requests for content are sent using HTTP and content is either returned from the cache or the HTTP request is forwarded to the originator of the content. When content is returned to Oracle Web Cache, it is added to the cache before being returned to the requestor. Cache content is invalidated by sending invalidation requests directly to Oracle Web Cache. PDK-Java uses the Java API for Web Cache (JAWC) to generate invalidation requests. This section describes how to configure Oracle Web Cache and use the invalidation-based caching sample that comes with PDK-Java.

Not all requests sent to Oracle Web Cache are cached. In order for the content to be cached, the content must include directives that tell Oracle Web Cache to cache the content. Usually Oracle Web Cache uses the URL associated with the request as the cache key, but you can specify additional keys by setting special HTTP headers, known as surrogate control headers, on the response.

To configure a Java portlet to use invalidation-based caching, you do the following:

Configuring Oracle Web Cache. Refer to Oracle Fusion Middleware Administrator’s Guide for Oracle Web Cache for more information. Configuring the Provider Servlet

To enable invalidation-based caching, you must switch it on at the provider servlet level. The flag is set in an initialization parameter inside the PDK-Java Web application deployment descriptor, web.xml . For example:

If the flag is not defined here, then invalidation-based caching is switched off. The status of this flag can be checked by displaying the provider’s test page. If the testPageURI property is not set in the file, then the provider code displays the test page in the old default style. The old style test page correctly picks up the invalidation caching flag from the web.xml file. The format of the test page URL is as follows: Defining the Oracle Web Cache Invalidation Port

If you are using an Oracle Fusion Middleware installation type where PDK-Java was automatically pre-installed (for example, an Oracle Portal and Wireless type installation), you should find that Oracle Web Cache invalidation settings have already been preconfigured in MID_TIER_ORACLE_HOME/portal/conf/cache.xml . In this case, you can safely ignore the instructions in this section and proceed to Section, “Configuring the XML Provider Definition”. Otherwise, you will need to configure the invalidation portlet for Oracle Web Cache.

First, you need the user name and password for the invalidation port(s) of the Oracle Web Cache instance(s) associated with your application server. After you obtain those, use the provided oracle.webdb.provider.v2.cache.Obfuscate Java utility to convert the user name and password into an obfuscated string of the format required by the JAWC API. In a default Oracle Fusion Middleware installation, the user name for the invalidation port is usually invalidator and the password is usually the same as the application server administrator’s password. For example, suppose you installed Oracle Fusion Middleware in D:\as904 , with an invalidation port user name of invalidator and a password of welcome . You would run the following command:

The command that follows assumes that pdkjava.jar and jawc.jar are present in ORACLE_HOME /j2ee/home/shared-lib/oracle.jpdk/1.0 , as required by the PDK-Java installation guide.

If you are using a standalone Oracle Containers for Java EE installation, you need to substitute in the path to the java executable an external Java 2 SDK installation.

If successful, the command should print a hexadecimal string like the following:

Now, use this information to create a JAWC configuration file, cache.xml , which specifies one or more Oracle Web Cache instances and their invalidation ports. For example:

JAWC finds this configuration file using the system property file. To set this system property for a Oracle WebLogic Server, simply add an appropriate line to the file for the particular instance in which PDK-Java is installed (for example, MW_HOME/wlserver_10.3/ ) and then restart that instance.

Since the location of the cache configuration file is defined as a system property, only one cache may be defined for each server instance. It is not possible to have two different Web Provider instances behind separate Oracle Web Cache configurations. Configuring the XML Provider Definition

Using a combination of tags in provider.xml , you can activate automatic invalidation-based caching for an entire portlet or some of its pages. To turn on automatic invalidation-based caching, you need to declare it as follows either at the level of individual pages or the renderer, to indicate that invalidation-based caching should be activated for all pages:

The maximum time for holding the page in the cache is the minimum of the following:

Maximum expiry time from Oracle Portal defined in the Cache tab of the Global Settings page.

Web Provider default (24 hours) if no maximum expiry time is specified by Oracle Portal.

The time in minutes of the

The following excerpt from provider.xml specifies that this portlet shall be cached for up to 5 minutes and shall be automatically invalidated upon personalization:

The pageExpires tag is also used for normal expiry based caching. These two forms of caching are mutually exclusive. Invalidation-based caching takes place in an Oracle Web Cache instance located in the same place as the Web provider. Pages stored using expiry based caching are cached in the middle tier of Oracle Portal.

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN: Manually Invalidating the Cache

You may want the cached version of the portlet invalidated when a request is processed or information somewhere has been updated. In these cases, you may want to manually invalidate the cache.

The invalidation-based caching portlet sample included with PDK-Java contains a single portlet that displays the time the content was cached and a link to trigger an invalidation request. The first time a page request is made to the Web provider through the cache, the response is cached. Subsequent requests for the portlet content are fulfilled by returning content from Oracle Web Cache. When you click the link at the bottom of the portlet an invalidation request is generated by the provider that removes the portlet from the cache. The next request for the portlet is forwarded to the provider and the provider generates a new portlet with the current time.

To perform invalidation calls to Oracle Web Cache, first you need to have a handle to a ServletInvalidationContext object. You can get this handle by calling the static getServletInvalidationContext() method of the ServletInvalidationContextFactory class.

Once you have the handle, you need to specify the cache key. In the cache key, you need to specify whether you want to invalidate a particular portlet instance, all the instances of a portlet, or all the portlets managed by a provider. To perform this task, you use the methods of the ServletInvalidationContext class or the methods of its super class, InvalidationContext . This is where you can specify whether the portlet should be cached for this particular user (USER level). If there is no user specified in the cache key, then the cached content is returned to all users, which means you are using SYSTEM level caching.

The following example invalidates a portlet instance and calls the setFullProviderPath() and setPortletReference() methods. When the caching key is set, you call the invalidate() method on the InvalidationContext object that sends the invalidation message to Oracle Web Cache.

Review the Web cache sample provider for more information. Adding Validation-Based Caching

Adding validation-based caching requires slightly more effort, but gives you explicit control over exactly which requests to your provider are cache hits. As an example, you may want to update the cache only when data within the portlet has changed. To implement this algorithm, you need to override the prepareResponse method. The signature of the BaseManagedRenderer.prepareResponse method is:

In your version of prepareResponse() , you need to do the following:

Retrieve the cached version identifier set by the PPE in the render request by calling the HttpPortletRendererUtil.getCachedVersion() method:

If the portlet finds the previously cached version valid, the appropriate header has to be set by calling the HttpPortletRendererUtil.useCachedVersion() method. It also instructs the RenderManager that it won’t be necessary to call renderBody() to render the portlet body.

Otherwise, use HttpPortletRendererUtil.setCachedVersion() to generate a new version of the portlet, which will be cached. It also indicates to the PPE that the renderBody() method has to be called to regenerate the portlet content.

For validation-based caching, you need not update provider.xml . You can view the portlet by refreshing the page or adding the portlet to a page and updating the content. If the content has changed, the portlet shows the new content. If the content has not changed, a cached version of the portlet is displayed.

7.2.10 Enhancing Portlets for Mobile Devices

This section explains how to go about enhancing a PDK-Java portlet for a mobile device. Before proceeding with this section, you should familiarize yourself with the guidelines for building mobile-enabled portlets, Section 6.1.4, “Guidelines for Mobile Portlets”, and the methods of building portlets with PDK-Java, Section 7.2, “Enhancing PDK-Java Portlets”.

To properly build a portlet for a mobile device, do the following:

Create a JSP to generate the OracleAS Wireless XML in response to the show request for the portlet. The portlet’s JSPs are managed and controlled by the built in renderer, oracle.portal.provider.v2.render.http.ResourceRenderer .

With this renderer, you can define distinct resources (JSPs) for each Show mode as well as which JSP to call for each Show mode. Hence, you can define one JSP to handle the Show mode when the requested content is HTML and another when the requested content is OracleAS Wireless XML. For example, this capability enables you to put the lottery portlet’s mobile rendition in a separate JSP. In this sample, mlotto.jsp generates the mobile rendition.

Note the contentType declaration in the first line of the source code. The content type of the JSPs response is set to text/ . This is the MIME type name for OracleAS Wireless XML. All mobile responses must set their content type to this value to work properly.

Modify provider.xml by adding the acceptContentType tag in the portlet definition to indicate that the portlet can generate OracleAS Wireless XML responses. Each acceptContentType tag defines a distinct content type that the portlet can render. The value is the MIME type of the content. In this case the lottery portlet declares that it can generate HTML ( text/html ) and OracleAS Wireless XML ( text/ ).

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

Declare the mapping of JSP renderers to Show modes in provider.xml .

You need to define a render handler for the pertinent Show modes by content type. One showPage declaration identifies a JSP that renders the HTML response and another one identifies the JSP that renders the OracleAS Wireless XML response. Note that the class attribute is now required, whereas, in a simpler case, it could allow the class to default. You express the association of a particular JSP to a particular content type through the resourcePath and contentType tags inside the showPage declaration as follows:

resourcePath defines the JSP used to render this mode.

contentType defines the response type of this JSP.

When the ResourceRenderer receives a show request for the lottery portlet it invokes lotto.jsp to render the HTML response and mlotto.jsp for OracleAS Wireless XML. The following code illustrates how you express this relationship in provider.xml :

The ResourceRenderer (and any portlet) determines the type of request it has received by the request’s Accept header. The Accept header is a standard HTTP header that defines the acceptable response types for a given request. It may be a list with multiple values if multiple content types are acceptable. When there are multiple values, they are listed in order from most to least preferred. Oracle Portal controls the values passed to the portlet in the Accept header. In the case of an HTML request, the Accept header is:

These values indicate that Oracle Portal prefers an HTML response but also accepts XML and OracleAS Wireless XML.

For mobile requests, the Accept header is:

These values indicate that Oracle Portal prefers OracleAS Wireless XML but also accepts general XML that contains a stylesheet reference that transforms to OracleAS Wireless XML.

The ResourceRenderer maps requested content type to the specific resource renderer by working through the Accept list in preference order. Once it finds a match between an acceptable response type and a registered renderer, it dispatches the request to the resource. For example, for HTML requests the ResourceRenderer will match the first entry, text/html , to the declaration that defines lotto.jsp as the text/html handler. Likewise, when a mobile request is received, the ResourceRenderer matches the first entry, text/ , to the declaration that defines mlotto.jsp as the text/ handler.

Declare a short title. A short title is the short form of a portlet’s name and is for use where display space is limited. Specifically, Oracle Portal uses it when rendering portlets as menu items in the page menu generated in response to a mobile request. If the portlet has registered a short title, Oracle Portal uses that as the menu item label. Otherwise, it uses the portlet’s standard title. To declare a short title, you include the shortTitle tag in the portlet’s metadata section in provider.xml :

Support short title personalization. Because the portlet’s short title is presented to the user as the menu item label that references the portlet instance on the page, we recommend that all portlets allow users to personalize the short title. PDK-Java provides a base data class that manages both the short and standard title:

The NameValuePersonalizationObject manages both the title and short title. It contains methods for getting and setting the values. The personalization code is split into two parts, form display and form submit. The logic first acquires the current data personalization object. Next, it checks to see if this is a form submit. If so, it updates the values in the data personalization object, writes them back to the repository, and returns. PDK-Java subsequently redirects back to this same form but without the parameters that indicate it is a form submit causing the form to redisplay with the new values. In this situation, the JSP responds with the personalization page including the current personalization values.

We recommend that portlets use this class or subclass to inherit this base support. The only personalization the lottery sample supports is these two titles. Hence, it uses the NameValuePersonalizationObject class directly in custom.jsp :

Support the rendering of personalized short titles. Once you add short title personalization, a portlet must take responsibility for rendering the portlet as a menu item in the mobile page response. Because of the small screen displays on mobile devices, portlets aren’t rendered together. Users are presented with a menu of links to portlets on a given page. The user navigates to each portlet through this menu to see the content. To better support this model, Oracle Portal provides Link mode, where portlets generate Link references to themselves.

For HTML requests, Link mode generates an anchor tag, a href . For mobile requests, Link mode generates a simpleHref tag. Currently, Oracle Portal only sends a Link mode request when assembling a mobile page response. Hence, you only need to support rendering the text/ content type for Link mode. If your portlet also has an HTML rendition, we recommend you also support HTML Link mode.

The lottery portlet example implements each Link rendition in a distinct JSP, as follows:

milotto.jsp contains the code to generate a text/ Link response.

anchorlotto.jsp contains the code to generate a text/html Link response.

The code for each is almost identical. Since the purpose of supporting Link mode is to render the personalized short title, the code first acquires the short title from the repository. It then generates the appropriate link tag for the requested markup. The acquired short title is rendered as the link’s label. Since Oracle Portal is responsible for creating the URL that references any particular usage of a portlet on a page, Oracle Portal creates the URL used in the link and passes it to the portlet, which then uses the URL to create the link. The URL for the link is retrieved from the request’s PageURL parameter. The code for milotto.jsp is as follows:

The text being output as the URL and the short title label are passed through special XML escape utilities. Because text/ is an XML content type, generated responses must adhere to XML rules, which require the escaping of specific characters. Unless generating static text, we recommend that all text be escaped using the two supplied utilities. The reason for two utility methods is that the set of characters requiring escape varies depending upon whether the text is a tag attribute value or a tag value.

Declare support for Link mode. Once you have implemented Link mode, you must update provider.xml to indicate the presence of Link mode. You declare Link mode by adding code similar to the following to provider.xml :

Bind the JSPs to the Link mode. The portlet must declare the mapping between the Show modes and the JSP renderers. The syntax for Link mode is similar to that for Show mode. Accessing Configuration, User, and Device Information

To better support mobile devices, Oracle Portal passes extra information to the portlet for use in generating its response. This information falls into three major categories, as follows: Configuration Data

Oracle Portal sends a flag that indicates whether the mobile function is enabled when requesting that the portlet render its personalization or edit pages. Portlets can use this information to exclude or include mobile specific attributes in their personalization pages as appropriate.

The portlet accesses this information using the PortletRenderRequest object: User Data

OracleAS Wireless adds the user location to the requests it forwards to Oracle Portal for response. This user location information is determined by the user’s actual location, if the user’s device has this support, or a profiled location. The user location is exposed by the ProviderUser object, which you can access from the PortletRenderRequest object. Portlets that are location aware can use this information to adjust the content they generate. Device Information

On each request, Oracle Portal sends characteristics about the requesting device to the portlet. This information is sent for all portlet requests, not just mobile requests. The information classifies the type of device making the request, its layout orientation, the maximum response size the device can handle, and an indication of whether the connection with the device is secure. Table 7-3 describes the available device types.

Table 7-3 Device Classes

Indicates a voice-only device, such as a normal telephone calling a voice access number.

Indicates text messenging devices, such as SMS phones or pagers.

Indicates general messenging devices, such as e-mail.

Indicates a small size display device, which supports a markup browser, such as a WAP phone.

Indicates a medium size display device, such as a Palm or PocketPC.

Indicates a large size display device used with desktop browsers.

Portlets may choose to alter the layout or representation of the content in their response based on the type of device making the request. For example, a portlet may break a wide table into a series of screens that link column groups together for small screen devices.

The maximum response size is a hint that a portlet can use to constrain the amount of data it returns. The size is expressed in bytes. A maximum response size of 0 means the size is unknown.

The portlet accesses this information using the PortletRenderRequest object. Modifying Navigation for Mobile Portlets

Much of the information in Section, “Implementing Navigation within a Portlet” is also relevant to the development of mobile portlets, but some of the utilities referenced are specific to portlets that render HTML. For portlets that render SimpleResult , the equivalent utilities shown in Table 7-4 are available.

Table 7-4 Equivalent HTML and SimpleResult Utilities

HTML Utilities SimpleResult Utilities

The following example illustrates how to adapt the thesaurus sample for a mobile-enabled portlet. Note that, when deployed as a mobile portlet, both sets of JSPs (HTML and SimpleResult ) are deployed. These JSPs complement their HTML counterparts, they do not replace them. Notice also that the JSPs use SimpleResult as their markup and the value of the navigation parameter has changed such that it points to the next mobile JSP rather than the next desktop JSP.

7.2.11 Writing Multilingual Portlets

This sec tion shows you how to build a Java portlet that can be rendered in different languages. The language used in your portlet will depend upon on the language setting that has been chosen in the portal that is displaying it.

Once you have completed this section you will be able to write portlets that support as many or as few languages as you wish. You will also be able to convert your existing portlets to support multiple languages. Once a portlet is written to support multiple languages, it is easy to plug in new languages. The basic model for multilingual Java portlets is similar to the standard Java Internationalization model. If you already know about Java Internationalization, you should find this process very familiar. Assumptions

To perform the tasks in this section, we are making the following assumptions:

You built a portlet using the wizard and successfully added it to a page. Internationalizing Your Portlet

This consists of the following two tasks: Providing Translations for Portlet Content

In Section 6.5, “Building Oracle PDK-Java Portlets with Oracle JDeveloper”, you created a portlet using the Java Portlet Wizard. The basic message created by the wizard is only available in one language and the text displayed is hard-coded in to the portlet’s renderer class. To make your portlets available in multiple languages, you have to store such language dependent elements in their own resource bundles .

Creating Resource Bundles

For each language you want your portlet to be available in, you will need a resource bundle. You will also need to create a resource bundle to use when there is no resource bundle corresponding to the language setting chosen in the portal. Perform the following tasks:

Create a Default Resource Bundle

Perform the following steps:

In Oracle JDeveloper, create a Java class called MyProviderBundle that extends ListResourceBundle from the java.util.package . The class should contain a multi-dimensional array of objects that holds key-value pairs representing each of the language dependent elements from your JSP show page. This implementation is demonstrated in the following code:

Creating Resource Bundles for Other Supported Languages

Now you must create a resource bundle class for each language you want your portlet to support. Each of these classes must be named the same as your default resource bundle class, but with a language code appended to the end. For example, if you want to support the French language, create a Java class named MyProviderBundle_fr . The language code fr is the same as the code that will be used by the locale object in the portal if the language setting is set to French

For more information on Locales, search for java.util.Locale in the Javadoc. Refer to the Javadoc on OTN by clicking Java Doc API on the Portlet Development page available at

When you change the language setting in Oracle Portal, you change the value of the current locale object and therefore the locale object’s language code. These language codes adhere to the ISO:639 codes for representation for names of languages. To create resource bundles for other supported languages, perform the following steps:

To create a French resource bundle, create a Java class named MyProviderBundle_fr , as described earlier.

Using your default resource bundle as a template, replace the English language strings with their French equivalents. An example is as follows:

Repeat steps 1 through 3 for every language that you wish to create a resource bundle for, updating the class name with the appropriate language code and the message strings with their equivalent in the appropriate language.

Updating Your Renderer

To make use of the resource bundles you just created, you need to edit the JSP show page and replace the hard-coded messages with references that will pickup the messages at run time from the resource bundle that corresponds most closely with the locale object of the portal. To update your renderer, perform the following steps:

Open the JSP that represents your show page and change the following:

Save your JSP page.

Now you can refresh your portlet and view the changes (Figure 7-12).

Figure 7-12 Portlet in English

To view the French greeting, you set the language in the Set Language portlet to French instead of English (Figure 7-13).

Figure 7-13 Portlet in French

Notice that the text inside the portlet has changed, but the portlet title remains in the default language, English. You can also have the portlet set the appropriate portlet attributes (such as portlet name, portlet title, and portlet description) by pointing to a resource bundle from provider.xml , as described in the next section. Providing Translation for Portlet Attributes

In your provider’s definition file, provider.xml , a number of attributes describing your portlet are defined such as the portlet’s name and description, these are used in places, for example in your portlet’s title bar in Show mode and so should be translated, too. There are two different ways of providing these translations, which one you choose is up to you. Both of these methods are outlined in the following sections:

Method 1: Using Resource Bundles at the Provider Level

You can provide translations for your portlet attributes in your resource bundle(s), then specify that you want to use these resource bundles in provider.xml , specifying the keys you have used in your resource bundles. Using this method you can use the keys you want to, and as long as you use different keys for each corresponding attribute in your provider’s various portlets you can have just one set of resource bundles that all of your provider’s portlets can use. This section consists of the following tasks:

Updating Your Resource Bundles

Perform the following steps:

Open your default resource bundle, .

Add additional strings to your resource bundle that represent your portlet attributes and then add text for those strings:

Open . Change it so that it contains the French strings that match the strings declared in MyProviderBundle .

Perform the following steps:

Open the XML provider definition file and update it to point to the resource bundle instead of using the hard-coded portlet attribute values.

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

Method 2: Creating Resource Bundles at Portlet Level

PDK-Java defines a set of resource bundle keys that you can use for providing translations for your portlet attributes. Making use of these keys means that you don’t have to specify the resource bundle keys in your provider.xml file, as we did in “Method 1: Using Resource Bundles at the Provider Level”. However, you do have to provide a separate set of resource bundles for each portlet in your provider as the keys you use for each portlet need to be the same, but their values will differ. You must perform the following tasks:

Updating Your Resource Bundles

Perform the following steps:

Open your default resource bundle, .

Remove any changes you made from the previous section, and import oracle.portal.provider.v2.PortletConstants . You can then reference the following constants instead of the strings. You do not have to declare static strings when using PortletConstants :

Open . Remove the portlet attributes added in the previous section, import oracle.portal.provider.v2.PortletConstants , and reference the constants instead of the strings.

Perform the following steps:

In provider.xml , you need to use only one tag instead of one tag for each string as you did in “Method 1: Using Resource Bundles at the Provider Level”. Delete all translated strings in the file, for example, the , , , and tags. Then add the following tag between the portlet id and the timeout number value:

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

For more information on Java Internationalization see the Internationalization trail of the Java Tutorial . Viewing the Portlet

Once you have updated your provider and deployed it to Oracle Containers for Java EE, refresh the provider and portal page containing your portlet. To see your resource bundles working, add the “Set Language” portlet to your page and try changing the language setting to French. Remember that the default resource bundle is English, and that selecting any other language that doesn’t have a corresponding resource bundle will result in the portlet being displayed in English.

7.3 Building Struts Portlets with Oracle JDeveloper

This section describes the framework for building Struts portlets with Oracle JDeveloper for use in Oracle Portal. You will learn how to build a Struts portlet from an existing application by adding the Struts Tag Library from the Oracle Portal Developer Kit (version or higher) to Oracle JDeveloper, then use the Oracle PDK Java Portlet wizard to create the Java portlet itself. This sections covers the following tasks:

7.3.1 Oracle Portal and the Apache Struts Framework

This section discusses the use of the Apache Struts with Oracle Portal. Struts is an implementation of the Model-View-Controller (MVC) design pattern. The following topics are discussed in this section: Model View Controller Overview

Enterprise applications undertake several distinct tasks, as follows:

Business logic implementation

User interface display

Application (page) Flow

The MVC (Model View Controller) architecture provides a way of compartmentalizing these tasks, based on the premise that activities, such as data presentation, should be separate from data access. This architecture enables you to easily plug a data source into the application without having to rewrite the user interface. MVC allows the logical separation of an application into three distinct layers: the Model, the View, and the Controller.

The Model is the repository for the application data and business logic. One facet of the Model’s purpose is to retrieve data from and persist data to the database. It is also responsible for exposing the data in such a way that the View can access it, and for implementing a business logic layer to validate and consume the data entered through the View. At the application level, the Model acts as the validation and abstraction layer between the user interface and the business data that is displayed. The database server itself is simply a persistence layer for the Model.

The View is responsible for rendering the Model data using JSPs. The View code does not include a hardcoded application or navigation logic, but may contain some logic to carry out tasks like displaying conditional data based on a user role. When an end user executes an action within the HTML page that the View renders, an event is submitted to the Controller. The Controller then determines the next step.

The Controller is the linchpin of the MVC pattern. Every user action carried out in the View is submitted through the Controller. The Controller then performs the next action, based on the content of the request from the browser.

The Controller can be driven in several different ways. For example, you can use URL arguments to route the requests to the correct code. The MVC pattern itself determines the function of the Controller, not how it should work.

The MVC architecture provides a clear and modular view of the application and its design. By separating the different components and roles of the application logic, it allows developers to design applications as a series of simple and different components: the Model, the View, and the Controller. This pattern should help to create applications that are easier to maintain and evolve. For example, once you create one view, you can easily create another view using the same business logic. Because of the ease and reusability, the MVC pattern is the most widely used pattern in the context of Web-based application development.

Figure 7-14 shows how the MVC pattern applies to a conventional thin-client Web application:

Figure 7-14 The MVC Pattern Apache Struts Overview

The Apache Struts framework ( ) is one of the most popular frameworks for building Web applications, and provides an architecture based on the JSP Model 2 approach of the MVC design paradigm. In the Model 2 approach, end user requests are managed by a servlet that controls the flow, and uses components such as JavaBeans or EJBs to access and manipulate the data. It then uses JSPs to render the application content in a Web browser. This model differs from JSP Model 1, where the JSPs managed the browser request and data access.

The Struts framework provides its own HTTP Servlet as a controller component. The Struts framework is driven by an XML configuration file that contains the page flow of the application. Struts does not provide the Model, but allows developers to integrate it to any data access mechanism, for example EJBs, TopLink, or JDBC. The most common technology for writing View components is JSP and Struts provides various tag libraries to help in writing these, although some of these tags have now been superseded by the Java Standard Tag Library (JSTL), which may also be used. Oracle Portal Integration with Struts

The Oracle Portal Developer Kit contains numerous examples and documents regarding the usage of the Oracle Portal APIs, such as personalization and caching. The integration of the application flow and business logic is not part of the portlet APIs. By using the Struts framework, however, you can leverage the MVC architecture to create and publish applications within your enterprise portal.

Oracle Struts Portlet

To create a portlet using the Struts framework, or to generate a portlet from an existing Struts application, you must deploy all the components in the J2EE container. In the context of Oracle Portal, the Struts application is called by the PPE, and not by the browser as compared to a standalone Struts application. When a portlet show call is made, the page engine sends a request to the Struts portlet renderer, which then forwards the request to the Apache Struts Controller servlet, as shown in Figure 7-15.

Figure 7-15 Integrating Struts Applications with Oracle Portal

The following code shows a portion of the provider definition file ( provider.xml ):

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN:

The showPage tag defines the business logic that will be executed in the Show mode of the portlet. The showPage of the Struts portlet contains two important components, which are as follows:

The renderer class ( oracle.portal.provider.v2.render.http.StrutsRenderer ), which receives the portlet request from the PPE and acts as a proxy to forward the request to the Struts Action Servlet.

The defaultAction tag, which defines the Struts action that will be used by default when the portlet is called for the first time.

The PDK-Java enables you to easily develop a view (Portal View) of your Struts application. This view enforces a consistent look and feel of your Struts portlet using portal styles, and allows the end user to use the application within the portal.

To create a Struts portlet, you must use the Oracle Portal JSP tags, which are extensions of the default Struts JSP tags. This development process is similar to that of creating a standalone Struts application. To learn how to build a Struts portlet, refer to Section, “Creating a Struts Portlet”. Also, since the portlet and struts application must also be in the same Servlet Context, you must create a single Web application that contains both elements. To learn how to easily create this Web application in Oracle JDeveloper, refer to the next section, Section, “Creating a Struts Portlet”. Summary

Apache Struts has become the de facto standard for developing MVC-based J2EE applications, because it offers a clean and simple implementation of the MVC design paradigm. This framework enables you, as the portlet developer, to separate the different components of an application, and to leverage the Struts controller to easily publish an existing Struts application to Oracle Portal without completely changing the existing business logic.

For more information on the Oracle Portal Developer Kit, see Portal Center ( )

7.3.2 Creating a Struts Portlet

Oracle PDK contains new extensions to integrate Apache Struts applications. This section explains how to build a portlet from an existing struts application. You can also follow these steps to create a portlet that uses the Model View Controller paradigm. To learn more about the Apache Struts framework, refer to Section 7.3.1, “Oracle Portal and the Apache Struts Framework”. The PDK-Java extensions described in this section rely on Apache Struts 1.1.

This section contains the following steps: Creating a Struts Portlet

To publish a part of an existing Struts application as portlet, we recommend that you first create a new view to serve as the Portal View of your application. This view uses existing objects ( Actions , ActionForm , and so on) with a new mapping and new JSPs.

Although we recommend that you create a Portal View of your application, you could alternatively replace your application’s struts tags with PDK-Java struts tags. This approach enables your application to run both as a standalone struts application and a portlet.

In this example, you will create a portlet that enables you to add a new entry to a Web Logger (Blog). Figure 7-16 and Figure 7-17 show how you submit a blog and save a blog entry.

Figure 7-16 Submitting a Blog

Figure 7-17 Saving a Blog Entry

prepareNewBlog is a simple empty action that redirects the request to the enterNewBlog.jsp page. This page shows a form for submitting a new blog.

The corresponding entry in the struts-config.xml is: Create a new flow and view to host the portlet actions

To create a new view, first create a new set of ActionMappings (page flow) that will redirect the various actions and requests to Portal-specific JSPs.

As you can see, only the path attributes are modified. The FormBean Action responsible for the application business logic remains unchanged. Creating the new JSPs

As specified in the previous step, the actions forward the request to new JSPs, which are responsible for rendering the portlet content. Your new portlet view JSPs can share the HTML with the standalone view, but be sure that the portlet meets the following criteria:

Uses Portal styles that enforce a consistent look and feel with the rest of the portal page.

Contains HTML code that is allowed in HTML table cells (that is, no , , and tags).

Renders portal-aware links and forms. This is necessary to ensure that your Struts portlet renders its content inline, thus keeping your users within the context of the portal page by rendering the requested content within the same portlet container.

To achieve inline rendering in your Struts portlet, you must use Oracle PDK tags:

During the rendering of the portlet, one of the JSP tags (for example, the pdk-struts-html:form tag), submits the form to the Parallel Page Engine (PPE), which then sends the parameters to the Struts portlet. The Struts controller executes the logic behind these actions and returns the next JSP to the portlet within the portal page.

The PDK contains all the Struts tags, and extends all the tags that are related to URLs. The following is a list of the PDK extended tags:

form : creates an HTML form and embeds the portal page context in the form to ensure inline rendering

text : renders fields on the form.

link and rewrite : create a link to the portal page, and are required for inline rendering

img : creates an absolute link that points to the Web provider. If you want to use this tag in the context of Internet Web sites that have firewalls, you must make sure the provider is directly accessible from the Internet. If it is not possible, you can deploy the images to the Oracle Portal middle tier and use the Apache Struts image link to generate a relative link (relative to the portal, not to the application).

You can register the Oracle PDK with Oracle JDeveloper so that you can drop the tags from the Oracle JDeveloper Components Palette. For more information, see the Registering a Custom Tag Library in JDeveloper section in the Oracle JDeveloper online help. Creating a Portlet

You can create your Struts portlet either manually or by using the Java Portlet wizard. Although the wizard does not explicitly offer Struts support, you can utilize the wizard to build your Struts portlet.

To create a portlet , perform the following steps:

In Oracle JDeveloper, open the Java Portlet Wizard to create an Oracle PDK Java Portlet.

The Java Portlet and Oracle PDK Java Portlet options are used to create JPS-compliant portlets and PDK-Java portlets respectively. Clicking Java Portlet or Oracle PDK Java Portlet opens the Java Portlet Wizard. For more information on opening the wizard, see Section 6.5.1, “Creating an Oracle PDK-Java Portlet and Provider”.

For the Implementation Style of the show page, select Java Class .

For the Package Name , enter oracle.portal.provider.v2.render.http

For the Class Name , enter StrutsRenderer . This generates the skeleton of the portlet renderer class, StrutsRenderer .

Since the StrutsRenderer is part of the PDK, you do not need this generated file. So, when you finish the wizard, you must delete the file generated by the wizard. To do so, click the file in the System Navigator window, then choose File > Erase from Disk in Oracle JDeveloper.

Edit the provider.xml and change the following properties:

At the provider level, perform the following:

If you want users to always return to the same portlet state as when they left the portal page, you can configure the struts renderer to save the struts action in the struts context:

If you prefer that users always start from the beginning of the portlet when they return from outside the portal page, then you should not save the struts action:

If the Struts application uses sessions (for example, the form sysnchronizer token mechanism is used or is set to true), enable session handling:

At the portlet level, perform the following:

Specify the first action to raise when the portlet is called. Use the following code:

For more information on the syntax of provider.xml , refer to the provider Javadoc on OTN: Extending the portlet to add Portal Business Logic

In your application, you should add code specific to your portal, such as the user’s information, personalization, and localization. To do so, you can create a new Action class that is only called in the Portal context, and handles all Portal-specific business logic. Registering the Provider

Now that your portlet is ready to be used by Oracle Portal, you must make it accessible to Oracle Portal by registering it. For information on how to register your PDK-Java portlet, refer to Section 6.5.5, “Registering and Viewing Your Oracle PDK-Java Portlet”. If you chose to save the struts action in the session context, true , then you must specify the provider login frequency as Once per user session during registration. Setting the login frequency this way ensures the session information is passed to your struts portlet. Summary

Oracle Fusion Middleware enables you to easily create Struts portlets using Oracle JDeveloper and publish existing Struts applications to Oracle Portal. For more information on using the Oracle JDeveloper Java Portlet wizards, refer to the beginning of this chapter. For more information on using Oracle Portal, refer to the Oracle Fusion Middleware User’s Guide for Oracle Portal and the Oracle Portal Online Help .

7.3.3 Creating an Oracle Application Development Framework (ADF) Portlet

Similarly to Struts, Oracle ADF relies on the MVC design pattern. Oracle ADF applications leveraging the Struts controller can be turned into portlets and deployed to Oracle Portal the same way as Struts applications. Refer to Section 7.3.2, “Creating a Struts Portlet”.

After creating the Oracle ADF portlet, you may find that the JSP page does not display correctly. This is because the Parallel Page Engine request is sent to a provider through a SOAP request ( oracle.webdb.provider.v2.adapter.SOAPServlet ), which implies that the portal does not serve the page as a standard .JSP page. To resolve this, create the ADFBindingFilter filter.

To create the ADFBindingFilter filter and filter mappings, include the following in your web.xml file:

Footnote 1: User personalization data for Oracle Portal objects is never exported. This restriction applies to portlets as well as other objects, such as pages.

7 Enhancing Java Portlets This chapter explains how to enhance Java portlets you created with the Oracle JDeveloper Portal Add-In, and how to make a portlet out of your struts application. This ]]>