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

<channel>
	<title>IT Blog</title>
	<atom:link href="http://www.bogho.ro/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.bogho.ro</link>
	<description></description>
	<lastBuildDate>Tue, 23 Mar 2010 13:02:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Google China se muta in Hong Kong</title>
		<link>http://www.bogho.ro/?p=69</link>
		<comments>http://www.bogho.ro/?p=69#comments</comments>
		<pubDate>Tue, 23 Mar 2010 13:02:18 +0000</pubDate>
		<dc:creator>gonen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bogho.ro/?p=69</guid>
		<description><![CDATA[In ultimele luni, Google a purtat negocieri cu guvernarea chinezeasca pentru a elimina cenzura pe care statul chinez a pus-o asupra site-urilor de internet, inclusiv a cautarilor ce se efectueaza prin intermediul serviciului Google.
Aceste negocieri au esuat, fiindca guvernul chinez nu a renuntat deloc la cenzura si din aceste motiv, compania Google a hotarat ca [...]]]></description>
			<content:encoded><![CDATA[<p>In ultimele luni, Google a purtat negocieri cu guvernarea chinezeasca pentru a elimina cenzura pe care statul chinez a pus-o asupra site-urilor de internet, inclusiv a cautarilor ce se efectueaza prin intermediul serviciului Google.<br />
Aceste negocieri au esuat, fiindca guvernul chinez nu a renuntat deloc la cenzura si din aceste motiv, compania Google a hotarat ca toate cautarile ce se vor face prin google.cn sa fie redirectate catre site-ul din Hong Kong, google.com.hk.<br />
David Drummond, prim-vicepresedinte in cadrul Google, a anuntat pe blogul <a href="http://googleblog.blogspot.com/">google </a>aceasta mutare si se asteapta ca din cauza suprasolicitarii aceste servere sa functioneze ceva mai greoi la inceput. </p>
<p>Aceasta mutare poate fi considerata ca un prim pas facut de Google in renuntarea totala a serviciilor existente in China, renuntare ce se zvoneste (compania americana nu a confirmat niciodata aceste zvonuri) terminata pe 10 aprilie 2010.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bogho.ro/?feed=rss2&amp;p=69</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox Mobile &#8211; Gata de start?</title>
		<link>http://www.bogho.ro/?p=63</link>
		<comments>http://www.bogho.ro/?p=63#comments</comments>
		<pubDate>Wed, 23 Dec 2009 21:20:27 +0000</pubDate>
		<dc:creator>gonen</dc:creator>
				<category><![CDATA[Diverse]]></category>
		<category><![CDATA[Browser Mini]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Stiri]]></category>

		<guid isPermaLink="false">http://www.bogho.ro/?p=63</guid>
		<description><![CDATA[In cazul in care nu ati auzit inca de Fennec ar trebui sa stiti ca acest cuvant reprezinta numele de cod al primei versiuni de Firefox pentru Mobile si se anunta un concurent puternic pentru Opera Mini. Lansarea oficiala al acestui produs se va face pana la sfarsitul anului si se va adresa posesorilor de [...]]]></description>
			<content:encoded><![CDATA[<p>In cazul in care nu ati auzit inca de Fennec ar trebui sa stiti ca acest cuvant reprezinta numele de cod al primei versiuni de Firefox pentru Mobile si se anunta un concurent puternic pentru Opera Mini. Lansarea oficiala al acestui produs se va face pana la sfarsitul anului si se va adresa posesorilor de telefoane Nokia N900, dar in curand browserul produs de Mozilla va putea fi utilizat si pe alte telefoane mobile.<br />
Printre noutatile pe care producatorul le anunta pentru acest mini-browser se numara:<br />
* sincronizarea cu varianta desktop astfel incat in momentul in care utilizatorul paraseste calculatorul personal sa poata continua navigarea pe mobil de unde a lasat-o<br />
* posibilitatea de personalizare printr-o serie de add-on-uri ce vor fi puse la dispozitie<br />
* navigarea prin tab-uri asemanatoare cu versiunea pentru PC</p>
<p>In paralel, Mozilla lucreaza si la 2 versiuni de browser compatibile cu Windows Mobile si Android, dar nu se stie inca o data la care vor fi lansate.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bogho.ro/?feed=rss2&amp;p=63</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DownloadServlet &#8211; util pentru aplicatii web</title>
		<link>http://www.bogho.ro/?p=46</link>
		<comments>http://www.bogho.ro/?p=46#comments</comments>
		<pubDate>Wed, 23 Dec 2009 14:02:10 +0000</pubDate>
		<dc:creator>gonen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[Servlet]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.bogho.ro/?p=46</guid>
		<description><![CDATA[Aproape orice aplicatie web are nevoie si de o optiune de Download care sa fie accesibila vizitatorilor site-ului si nu numai. O sa prezint o clasa realizata de mine, de fapt un servlet, ce implementeaza o operatie de download.
Acest servlet va primi 2 parametri : output ce reprezinta numele fisierului .zip generat si file (daca [...]]]></description>
			<content:encoded><![CDATA[<p>Aproape orice aplicatie web are nevoie si de o optiune de Download care sa fie accesibila vizitatorilor site-ului si nu numai. O sa prezint o clasa realizata de mine, de fapt un servlet, ce implementeaza o operatie de download.<br />
Acest servlet va primi 2 parametri : <strong>output</strong> ce reprezinta numele fisierului .zip generat si <strong>file</strong> (daca se downloadeaza un singur fisier) sau <strong>dir</strong>(daca trebuie luate toate fisierele dintr-un director). Indiferent de ce fisiere sunt trimise spre download, se creeaza un fisier .zip temporar care este trimis catre download.<br />
In sectiunea download a acestui articol se gasesc 2 arhive, una continand codul sursa si cealalta contine arhiva .war ce poate fi utilizata out-of-the-box.<br />
<span id="more-46"></span></p>
<p>Ce veti gasi in acest servlet?</p>
<p>Pentru inceput 2 metode, doGet si doPost, despre care se poate spune ca trebuie sa existe in orice servlet. Pentru acest servlet de download, aceste 2 metode pot fi inlocuite cu success de metoda service.</p>
<blockquote><p>
protected void doPost(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse res) throws javax.servlet.ServletException, java.io.IOException<br />
{<br />
doGet(req, res);<br />
}</p>
<p>protected void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse res) throws javax.servlet.ServletException, java.io.IOException<br />
{<br />
this.outputFileName = req.getParameter(&#8220;output&#8221;);</p>
<p>this.fileToDownload = req.getParameter(&#8220;file&#8221;);</p>
<p>this.dirToDownload = req.getParameter(&#8220;dir&#8221;);</p>
<p>processResponse(req, res);</p>
<p>}</p></blockquote>
<p>Dupa cum se poate observa, metoda doPost doar apeleaza metoda doGet. Aceasta din urma preia parametrii trimisi catre servlet si initiza procesul de download prin metoda processResponse.</p>
<blockquote><p> private boolean processResponse(HttpServletRequest req,<br />
HttpServletResponse	res)<br />
{<br />
File tmpZip = null;<br />
Throwable th = null;</p>
<p>try<br />
{<br />
tmpZip = new File(TMP_DIR<br />
+ File.separator + Calendar.getInstance().getTimeInMillis() +TMP_PREFIX);</p>
<p>this.createTmpZipFile(tmpZip);<br />
this.download(res, tmpZip);</p>
<p>return true;<br />
}</p>
<p>catch (Exception e)<br />
{<br />
th = e;<br />
}</p>
<p>finally<br />
{<br />
DownloadServlet.deleteFile(tmpZip);<br />
}</p>
<p>if (th != null)<br />
{<br />
log(&#8220;Error while processing the download request: &#8220;, th);<br />
}</p>
<p>return false;<br />
}</p></blockquote>
<p>Metoda ProcessResponse creaza fisierul .zip temporar sub numele %current_time%.zip, unde %current_time% reprezinta timpul curent in milisecunde.</p>
<p>Dupa ce fisierul zip temporar a fost creat, se scriu toate fisirele care au fost cerute pentru download.</p>
<blockquote><p>private void createTmpZipFile(File tmpFile)<br />
throws Exception<br />
{<br />
FileOutputStream zipFile = null;<br />
ZipOutputStream outZip = null;</p>
<p>try<br />
{<br />
zipFile = new FileOutputStream(tmpFile);<br />
outZip = new ZipOutputStream(zipFile);</p>
<p>if (this.fileToDownload != null)<br />
this.addFile2Zip(outZip, new File(fileToDownload));<br />
if (this.dirToDownload != null)<br />
this.addFiles2ZipFromDir(outZip, dirToDownload);<br />
}</p>
<p>catch (FileNotFoundException e)<br />
{<br />
throw e;<br />
}</p>
<p>finally<br />
{<br />
outZip.close();<br />
zipFile.close();<br />
}<br />
}</p></blockquote>
<p>Prin createTmpZipFile se stabileste continutul fisierul .zip ce va fi trimis ca raspuns catre browser. Aceasta metoda scrie in fisierul temporar toate fisierele care au fost solicitate. In cazul in care exista ambii parametri, file si dir, atunci arhiva zip va contine toate fisierele din directorul trimis ca parametru, dar si fiserul care a fost solicitat.<br />
Parametrii file si dir nu se exclud unul pe celalalt.</p>
<blockquote><p>private void download(HttpServletResponse res, File zipFile)<br />
throws Exception<br />
{<br />
OutputStream outStream = null;<br />
FileInputStream fis = null;</p>
<p>Throwable th = null;</p>
<p>try<br />
{<br />
this.setResponseContent(res, (int) zipFile.length());</p>
<p>outStream = res.getOutputStream();<br />
fis = new FileInputStream(zipFile);</p>
<p>DownloadServlet.copyStream(fis, outStream);</p>
<p>outStream.flush();<br />
return;<br />
}</p>
<p>catch (IOException e)<br />
{<br />
th = e;<br />
}</p>
<p>catch (Exception e)<br />
{<br />
th = e;<br />
}</p>
<p>finally<br />
{<br />
outStream.close();<br />
fis.close();<br />
}</p>
<p>throw new Exception(&#8220;Error on download: &#8220;, th);<br />
}</p></blockquote>
<p>Metoda download trimite fisierul zip nou creat ca si raspuns la cererea primita. In aceasta metoda se deschide un stream de scriere in care se copiaza, in mod binar, fisierul zip arhivat.<br />
In codul sursa atasat la articol veti mai gasi cateva metode pe care nu le-am explicat aici, deoarece consider ca sunt usor de inteles.</p>
<p><strong>Recomandari</strong><br />
1) Implementarea unei metode de validare a fisierelor ce vor fi arhivate. Asa cum este creat acum servletul, se poate prelua orice fisier sau director de pe sistem daca se trimite toata calea. De exemplu, apelul linkului<br />
<strong>http://%server%/downloadServlet/servlet/download?output=win&#038;dir=D:\config</strong> va crea un fisier win.zip ce va contine toate fisirele din directorul D:\config.</p>
<p>2) Modificarea metodelor necesare astfel incat sa fie acceptati mai multi parametri cu numele &#8220;<strong>file</strong>&#8221; sau &#8220;<strong>dir</strong>&#8220;. Metodele ce trebuie modificate sunt doGet si createTmpZipFile.</p>
<p>3) Modificare addFiles2ZipFromDir astfel incat fisierul zip destinatie sa contina structura recursiva a directorului.</p>
<p>4) Adaugarea unei clase DownloadException care sa fie folosita la metodele createTmpZipFile, download, copyStream, addFiles2ZipFromDir,addFile2Zip</p>
<p><strong>Download</strong></p>
<p>1)<a href="http://www.bogho.ro/download/downloadServletSrc.zip"> Codul sursa &#8211; downloadServletSrc.zip</a></p>
<p>2) <a href="http://www.bogho.ro/download/downloadServlet.war">Arhiva downloadServlet.war</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bogho.ro/?feed=rss2&amp;p=46</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conexiuni la baze de date prin JDBC</title>
		<link>http://www.bogho.ro/?p=22</link>
		<comments>http://www.bogho.ro/?p=22#comments</comments>
		<pubDate>Mon, 21 Dec 2009 11:58:18 +0000</pubDate>
		<dc:creator>gonen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Baze de date]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://www.bogho.ro/?p=22</guid>
		<description><![CDATA[Majoritatea programelor din ziua de astazi folosesc ca si backend un server de baze de date. Nu putine au fost situatiile cand trebuia ca pentru aplicatiile la care lucrez sa creez cateva clase pentru conexiunile la baze de date, de aceea am considerat ca pentru o dezvoltare mai usoara ar fi nevoie sa imi fac [...]]]></description>
			<content:encoded><![CDATA[<p>Majoritatea programelor din ziua de astazi folosesc ca si backend un server de baze de date. Nu putine au fost situatiile cand trebuia ca pentru aplicatiile la care lucrez sa creez cateva clase pentru conexiunile la baze de date, de aceea am considerat ca pentru o dezvoltare mai usoara ar fi nevoie sa imi fac un pachet de clase care sa fie reutilizabil si usor de modificat.<br />
In continuarea acestui articol vor fi prezentate cateva clase care pot fi folosite in orice aplicatie java pentru conectarea la un server de baze de date. Din motive de codare, numele claselor, al metodelor si al obiectelor vor fi in engleza. De asemenea, tin sa precizez ca nu sunt foarte bun pe partea de explicatii, de aceea in cazul in care exista nelamuriri nu existati sa intrebati.<br />
<span id="more-22"></span><br />
Incep cu o clasa abstracta ce va fi clasa parinte pentru celelalte clase folosite. Aceasta clasa trebuie sa contina declaratii pentru metode specifice JDBC-ului : getConnection, freeConnection, closeStatement si realeaseAllConnection. De asemenea aceasta clasa va contine si un membru de tip Properties si care va contine datele de conectare (url, user, parola, etc&#8230;) la serverul de baze de date.</p>
<p> <strong>getConnection ()</strong> &#8211; intoarce un java.sql.Connection (fie un obiect deja existent in pool, fie creeaza un obiect nou)</p>
<p><strong>freeConnection()</strong> &#8211; inchide o conexiune din pool. Aceasta conexiune este transmisa ca si parametru la metoda</p>
<p><strong>releaseAllConnection() </strong>- inchide toate conexiunile existente in pool.</p>
<p><strong>closeStatement()</strong> &#8211; inchide un obiect de tipul java.sql.Statement care este trimis ca parametru</p>
<p>Listing 1. Clasa  <strong>base.database.pool.AbstractDatabasePool</strong></p>
<blockquote><p>
package base.database.pool;</p>
<p>import java.sql.Connection;<br />
import java.sql.Statement;</p>
<p>import base.properties.ApplicationProperties;</p>
<p>public abstract class AbstractDatabasePool<br />
{<br />
	/**<br />
	 *  this is the <code>ApplicationProperties</code> instance.<br />
	 */<br />
	protected ApplicationProperties props = ApplicationProperties.getInstance();</p>
<p>	/**<br />
	 * Method getConnection.Returns a Connection from the pool,<br />
	 * or creates a new one,<br />
	 * @return Connection Connection<br />
	 */<br />
	public abstract Connection getConnection();</p>
<p>	/**<br />
	 * Method freeConnection.Releases the Connection to the pool.<br />
	 * @param conn The connection to free.<br />
	 */</p>
<p>	public abstract void freeConnection(Connection conn);</p>
<p>	/**<br />
	 * Method releaseAllConnections. Closes all available connections.<br />
	 */</p>
<p>	public abstract void releaseAllConnections();</p>
<p>	/**<br />
	 * Method closeStatement.Closes the specified Statement.<br />
	 * @param stmt The Statement you want to close.<br />
	 */<br />
	public abstract void closeStatement(Statement stmt);</p>
<p>}
</p></blockquote>
<p>Dupa cum se poate observa in listingul anterior, exista si un membru props, care va fi folosit pentru incarcarea datelor de conectare la baza de date. Aceste date sunt trecute intr-un fisier .properties care va fi folosit la instantierea clasei ApplicationProperties.<br />
Listing 2. Clasa <strong>base.properties.ApplicationProperties<br />
</strong></p>
<blockquote><p>
package base.properties;</p>
<p>import java.io.BufferedInputStream;<br />
import java.io.FileInputStream;<br />
import java.io.FileNotFoundException;<br />
import java.io.IOException;<br />
import java.util.Properties;<br />
import java.util.StringTokenizer;</p>
<p>import base.exception.BaseException;</p>
<p>/**<br />
 * This class is a singletone that is used to share some general properties<br />
 * by all the modules from JBase project. The instance of the class holds the<br />
 * properties read from jbase.properties file.<br />
 *<br />
 *<br />
 */<br />
public class ApplicationProperties extends Properties<br />
{</p>
<p>	private static ApplicationProperties instance;<br />
	private Logger appLogger = null;</p>
<p>	/**<br />
	 * Constructor for ApplicationProperties.<br />
	 */<br />
	public ApplicationProperties()<br />
	{<br />
		super();<br />
	}</p>
<p>	/**<br />
	 * Constructor for ApplicationProperties.<br />
	 * @param arg0<br />
	 */<br />
	private ApplicationProperties(Properties arg0)<br />
	{<br />
		super(arg0);<br />
	}</p>
<p>	/**<br />
	 * Initialize the <code>ApplicationProperties</code> singletone from a properties<br />
	 * file.<br />
	 *<br />
	 * @param propertiesFileName &#8211; the absolute filepath of the properties file<br />
	 * @throws JBaseException &#8211; when the object is already initialized or when<br />
	 * 							the properties file could not be accessed or is<br />
	 *                          in a wrong format.<br />
	 */<br />
	public synchronized static void initialize(String propertiesFileName)<br />
		throws BaseException<br />
	{<br />
		if (instance != null)<br />
		{<br />
			throw new BaseException(&#8220;JBaseProperties already initialized !&#8221;);<br />
		}</p>
<p>		System.out.println(&#8220;Loading &#8221; + propertiesFileName + &#8220;&#8230;&#8221;);<br />
		instance = new ApplicationProperties();</p>
<p>		Throwable th = null;</p>
<p>		try<br />
		{<br />
			instance.load(<br />
				new BufferedInputStream(<br />
					new FileInputStream(propertiesFileName)));<br />
		}<br />
		catch (FileNotFoundException e)<br />
		{<br />
			th = e;<br />
		}<br />
		catch (IOException e)<br />
		{<br />
			th = e;<br />
		}<br />
		if (th != null)<br />
		{<br />
			throw new BaseException(th);<br />
		}</p>
<p>		if (ApplicationProperties.printMissing == true)<br />
		{<br />
			JBaseUtil.getMissingProperties(instance);<br />
		}<br />
	}</p>
<p>	/**<br />
	 * Initialize the <code>ApplicationProperties</code> singletone from a <code><br />
	 * Properties</code> object.<br />
	 *<br />
	 * @param properties &#8211; the Properties object<br />
	 * @throws BaseException &#8211; when the object is already initialized or when<br />
	 * 							the properties file could not be accessed or is<br />
	 *                          in a wrong format.<br />
	 */<br />
	public static void initialize(Properties properties) throws BaseException<br />
	{<br />
		if (instance != null)<br />
		{<br />
			throw new BaseException(&#8220;ApplicationProperties already initialized !&#8221;);<br />
		}<br />
		instance = new ApplicationProperties(properties);</p>
<p>	}</p>
<p>	/**<br />
	 * Returns the instance.<br />
	 * @return ApplicationProperties<br />
	 */<br />
	public static ApplicationProperties getInstance()<br />
	{<br />
		return instance;<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.maxConn</code> property from app.properties<br />
	 *<br />
	 * @return int &#8211; Returns the dbMaxConn.<br />
	 */<br />
	public int getDbMaxConn()<br />
	{<br />
		try<br />
		{<br />
			return Integer.parseInt(this.getProperty(&#8220;db.maxConn&#8221;));<br />
		}<br />
		catch (Exception e)<br />
		{<br />
			return 0;<br />
		}<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.password</code> property from app.properties<br />
	 *<br />
	 * @return String &#8211; Returns the dbPassword.<br />
	 */<br />
	public String getDbPassword()<br />
	{<br />
		return this.getProperty(&#8220;db.password&#8221;);<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.url</code> property from app.properties<br />
	 *<br />
	 * @return String &#8211; Returns the dbUrl.<br />
	 */<br />
	public String getDbUrl()<br />
	{<br />
		return this.getProperty(&#8220;db.url&#8221;);<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.user</code> property from app.properties<br />
	 *<br />
	 * @return String -Returns the dbUser.<br />
	 */<br />
	public String getDbUser()<br />
	{<br />
		return this.getProperty(&#8220;db.user&#8221;);<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.class</code> property from app.properties<br />
	 *<br />
	 * @return String &#8211; Returns the dbClass.<br />
	 */<br />
	public String getClassName()<br />
	{<br />
		return this.getProperty(&#8220;db.class&#8221;);<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.initConn</code> property from app.properties<br />
	 *<br />
	 * @return int &#8211; Returns the dbInitConn.<br />
	 */<br />
	public int getInitConn()<br />
	{<br />
		try<br />
		{<br />
			return Integer.parseInt(this.getProperty(&#8220;db.initConn&#8221;));<br />
		}<br />
		catch (Exception e)<br />
		{<br />
			return 0;<br />
		}<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.connTimeout</code> property from app.properties<br />
	 *<br />
	 * @return long &#8211; Returns the dbConnTimeout.<br />
	 */<br />
	public long getConnTimeout()<br />
	{<br />
		try<br />
		{<br />
			return Long.parseLong(this.getProperty(&#8220;db.connTimeout&#8221;));<br />
		}<br />
		catch (Exception e)<br />
		{<br />
			return 0;<br />
		}<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.expiryTime</code> property from app.properties<br />
	 *<br />
	 * @return long &#8211; Returns the dbExpiryTime<br />
	 */<br />
	public long getExpiryTime()<br />
	{<br />
		try<br />
		{<br />
			return Long.parseLong(this.getProperty(&#8220;db.expiryTime&#8221;));<br />
		}<br />
		catch (Exception e)<br />
		{<br />
			return 0;<br />
		}<br />
	}</p>
<p>	/**<br />
	 * Oracle driver has a log . If you set this property, there will be<br />
	 * created a file with this name in db.logPath that contains oracle log<br />
	 *<br />
	 * @return string representing oracle log filename<br />
	 */<br />
	public String getOracleOptionalLogFileName()<br />
	{<br />
		return this.getProperty(&#8220;db.oracleLogFileName&#8221;);<br />
	}</p>
<p>	/**<br />
	 * SqlServer driver has a log . If you set this property, there will be<br />
	 * created a file with this name in db.logPath that contains sqlServer log<br />
	 *<br />
	 * @return string representing sqlServer log filename<br />
	 */<br />
	public String getSqlServerOptionalLogFileName()<br />
	{<br />
		return this.getProperty(&#8220;db.sqlServerLogFileName&#8221;);<br />
	}<br />
	/**<br />
	 * Postgres driver has a log . If you set this property, there will be<br />
	 * created a file with this name in db.logPath that contains postgres log<br />
	 *<br />
	 * @return string representing postgres log filename<br />
	 */<br />
	public String getPostgresOptionalLogFileName()<br />
	{<br />
		return this.getProperty(&#8220;db.postgresLogFileName&#8221;);<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.dbName</code> property from app.properties<br />
	 *<br />
	 * @return String -Returns the database name used to the application.<br />
	 */<br />
	public String getDbName()<br />
	{<br />
		return this.getProperty(&#8220;db.dbName&#8221;);<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.serverName</code> property from jbase.properties<br />
	 *<br />
	 * @return String -Returns the server name used to the application.<br />
	 */<br />
	public String getServerName()<br />
	{<br />
		return this.getProperty(&#8220;db.serverName&#8221;);<br />
	}</p>
<p>	/**<br />
	 * Returns the <code>db.portNumber</code> property from app.properties<br />
	 *<br />
	 * @return String -Returns the port number of database.<br />
	 */<br />
	public String getPortNumber()<br />
	{<br />
		return this.getProperty(&#8220;db.portNumber&#8221;);<br />
	}</p>
<p>}
</p></blockquote>
<p> Nu voi insista foarte mult pe explicatii privind aceasta clasa, deoarece consider ca numele metodelor folosite sunt suficient de explicite. Trebuie sa precizez doar ca aceasta clasa poate fi folosita si pentru alte zone ale aplicatiei. De exemplu poate contine informatiile necesare pentru trimiterea de emailuri si proprietatile respective pot fi folosite in zone specifice din aplicatie.</p>
<p>Cele doua clase prezentate anterior stau la baza claselor ce vor efectua conexiunile catre baza de date. In continuare vor fi prezentate doar clasele pentru conectarea la Mysql si Oracle. Pentru alte servere de baze de date, puteti lasa un comentariu la acest articol si voi creea si clasa respectiva.</p>
<p>Pentru conectarea la Mysql va fi folosit driverul JDBC pus la dispozitie de catre mysql.com, mai exact clasa MysqlDataSource. Fisierul .jar folosit de mine, este pus la dispozitie in zona Download existenta la finalul acestui articol.</p>
<p>Listing 3. Clasa <strong>base.database.pool.MySqlDbPool </strong>ce poate fi folosita pentru conectarea la un server mysql</p>
<blockquote><p>package base.database.pool;</p>
<p>import java.sql.Connection;<br />
import java.sql.SQLException;<br />
import java.sql.Statement;</p>
<p>import base.database.DatabaseException;<br />
import base.database.DatabaseRuntimeException;<br />
import base.database.DbLogger;</p>
<p>import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;</p>
<p>/**<br />
 *<br />
 */<br />
public class MySqlDbPool extends AbstractDatabasePool<br />
{<br />
	/**<br />
	 * The <code>DataSource</code> object used to retrieve the connections<br />
	 * to database.<br />
	 */<br />
	private MysqlDataSource ds = null;</p>
<p>	/**<br />
	 * Constructs a new <code>MySqlDbPool</code> object.<br />
	 *<br />
	 * @throws DatabaseException if fails<br />
	 */<br />
	public MySqlDbPool() throws DatabaseException<br />
	{<br />
		this.ds = new MysqlDataSource();<br />
		this.ds.setUrl(props.getDbUrl());<br />
	}</p>
<p>	/**<br />
	 *<br />
	 */<br />
	public Connection getConnection()<br />
	{<br />
		try<br />
		{<br />
			return this.ds.getConnection(props.getDbUser(),<br />
					props.getDbPassword());<br />
		}</p>
<p>		catch (SQLException e)<br />
		{<br />
			// Do what you want</p>
<p>			throw new DatabaseRuntimeException(e);<br />
		}<br />
	};</p>
<p>	/**<br />
	 * @see AbstractDatabasePool#releaseAllConnections()<br />
	 */<br />
	public void releaseAllConnections()<br />
	{<br />
		// Do what you want<br />
	};</p>
<p>	/**<br />
	 * @see AbstractDatabasePool#closeStatement(Statement)<br />
	 */<br />
	public void closeStatement(Statement stmt)<br />
	{<br />
		if (stmt == null)<br />
		{<br />
			return;<br />
		}</p>
<p>		try<br />
		{<br />
			stmt.close();<br />
		}</p>
<p>		catch (SQLException e)<br />
		{<br />
			// Do what you want<br />
		}<br />
	};</p>
<p>	/**<br />
	 * @see AbstractDatabasePool#freeConnection<br />
	 */<br />
	public void freeConnection(Connection conn)<br />
	{<br />
		if (conn == null)<br />
		{<br />
			return;<br />
		}</p>
<p>		try<br />
		{<br />
			conn.close();<br />
		}</p>
<p>		catch (SQLException e)<br />
		{<br />
			// Do what you want<br />
		}<br />
	}</p>
<p>}
</p></blockquote>
<p>Clasa care se ocupa de conectarea la Oracle, poate parea un picut mai complicata, deoarece sistemul Oracle are posibilitatea de a pune un log separat, fisier de log ce este definit in fisierul de proprietati folosit la inceput.</p>
<p>Listing 4. Clasa <strong>base.database.pool.OraDbPool </strong>ce poate fi folosita pentru conectarea la un server oracle</p>
<blockquote><p>
package base.database.pool;</p>
<p>import java.io.File;<br />
import java.io.FileNotFoundException;<br />
import java.io.FileOutputStream;<br />
import java.io.PrintWriter;<br />
import java.sql.Connection;<br />
import java.sql.SQLException;<br />
import java.sql.Statement;<br />
import java.util.Date;<br />
import java.util.Hashtable;<br />
import java.util.Iterator;</p>
<p>import oracle.jdbc.pool.OracleConnectionCacheImpl;<br />
import oracle.jdbc.pool.OracleConnectionPoolDataSource;<br />
import base.database.DatabaseException;<br />
import base.database.DatabaseRuntimeException;</p>
<p>/**<br />
 *<br />
 *<br />
 */<br />
public class OraDbPool extends AbstractDatabasePool<br />
{<br />
	private class InUseConnection<br />
	{<br />
		private InUseConnection(Date aDate, StackTraceElement[] aStack)<br />
		{<br />
			this.getDate = aDate;<br />
			this.stack = aStack;<br />
		}<br />
		private Date getDate = null;<br />
		private StackTraceElement[] stack = null;</p>
<p>	private Hashtable usedConnections = null;</p>
<p>	/** flag that is set true if pool was closed */<br />
	private boolean isClosed = false;</p>
<p>	/**<br />
	 * The Oracle pool data source.<br />
	 */<br />
	private OracleConnectionPoolDataSource ocpds = null;</p>
<p>	/**<br />
	 * The Oracle cache implementation.<br />
	 */<br />
	private OracleConnectionCacheImpl occ = null;</p>
<p>	/**<br />
	 * @see java.lang.Object#Object()<br />
	 */<br />
	public OraDbPool() throws DatabaseException<br />
	{<br />
		super();<br />
		initialize();<br />
	}</p>
<p>	/**<br />
	 * Here we&#8217;ll do all the initializations for this connection pool.<br />
	 * First, a oracle data source is defined, then a cache for this source<br />
	 * is created, so connections can be managed automatically.<br />
	 *<br />
	 */<br />
	private void initialize() throws DatabaseException<br />
	{<br />
		if (props == null)<br />
		{<br />
				// do what you want<br />
        throw new DatabaseException(&#8220;Properties are not loaded !&#8221;);<br />
		}</p>
<p>		String oracleLog = props.getOracleOptionalLogFileName();<br />
		String logDir = props.getDbLogPath();</p>
<p>		// create pool<br />
		try<br />
		{<br />
			ocpds = new OracleConnectionPoolDataSource();<br />
			if (oracleLog != null &#038;&#038; logDir != null)<br />
			{<br />
				ocpds.setLogWriter(<br />
					new PrintWriter(<br />
						new FileOutputStream(new File(logDir, oracleLog))));<br />
			}<br />
		}<br />
		catch (FileNotFoundException e)<br />
		{<br />
				// do what you want<br />
		}<br />
		catch (SQLException e)<br />
		{<br />
				// do what you want<br />
			throw new DatabaseException(e);<br />
		}</p>
<p>		ocpds.setURL(props.getDbUrl());<br />
		ocpds.setUser(props.getDbUser());<br />
		ocpds.setPassword(props.getDbPassword());<br />
		int maxconn = props.getDbMaxConn();</p>
<p>		try<br />
		{<br />
			occ = new OracleConnectionCacheImpl(ocpds);<br />
			if (maxconn > 0)<br />
			{<br />
				occ.setMaxLimit(maxconn);<br />
			}<br />
			occ.setCacheScheme(OracleConnectionCacheImpl.DYNAMIC_SCHEME);<br />
		}<br />
		catch (SQLException e)<br />
		{<br />
			// do what you want<br />
			throw new DatabaseException(e);<br />
		}<br />
	}</p>
<p>	/**<br />
	 * @see AbstractDatabasePool#getConnection()<br />
	 */</p>
<p>	public Connection getConnection()<br />
	{<br />
		if (this.isClosed)<br />
		{<br />
			//	// do what you want<br />
			return null;<br />
		}</p>
<p>		int activeConnections = occ.getActiveSize();<br />
		if (activeConnections > 20)<br />
		{<br />
			// do what you want<br />
		}</p>
<p>		try<br />
		{<br />
			Connection conn = occ.getConnection();<br />
			if (debugMode)<br />
			{<br />
				StackTraceElement[] stack = null;<br />
				try<br />
				{<br />
					throw new RuntimeException();<br />
				}<br />
				catch (RuntimeException ex)<br />
				{<br />
					stack = ex.getStackTrace();<br />
					usedConnections.put(<br />
						conn,<br />
						new InUseConnection(new Date(), stack));<br />
				}<br />
			}</p>
<p>			return conn;<br />
		}<br />
		catch (SQLException e)<br />
		{<br />
			// do what you want<br />
			throw new DatabaseRuntimeException(e);<br />
		}<br />
	}</p>
<p>	/**<br />
	 * @see AbstractDatabasePool#releaseAllConnections()<br />
	 */</p>
<p>	public void releaseAllConnections()<br />
	{<br />
		if (this.isClosed)<br />
		{<br />
			// do what you want<br />
			return;<br />
		}</p>
<p>		if (occ == null)<br />
		{<br />
				// do what you want<br />
			return;<br />
		}</p>
<p>		try<br />
		{<br />
			occ.close();<br />
			this.isClosed = true;<br />
		}<br />
		catch (SQLException e)<br />
		{<br />
				// do what you want<br />
		}<br />
	}</p>
<p>	/**<br />
	 * @see AbstractDatabasePool#closeStatement(Statement)<br />
	 */<br />
	public void closeStatement(Statement stmt)<br />
	{</p>
<p>		if (stmt == null)<br />
		{<br />
				// do what you want<br />
			return;<br />
		}</p>
<p>		try<br />
		{<br />
			stmt.close();<br />
		}<br />
		catch (SQLException e)<br />
		{<br />
				// do what you want<br />
		}<br />
	}</p>
<p>	/**<br />
	 * @see AbstractDatabasePool#freeConnection(Connection)<br />
	 */<br />
	public void freeConnection(Connection conn)<br />
	{<br />
		if (this.isClosed)<br />
		{<br />
	// do what you want<br />
		}</p>
<p>		if (conn == null)<br />
		{<br />
				// do what you want<br />
			return;<br />
		}</p>
<p>		try<br />
		{<br />
			conn.rollback();<br />
			conn.setAutoCommit(true);<br />
			conn.close();<br />
		}<br />
		catch (SQLException e)<br />
		{<br />
			// do what you want<br />
		}</p>
<p>	}</p>
<p>}
</p></blockquote>
<p>In continuare, prezint pe scurt, felul in care pot fi folosite aceste clase. In exemplu meu, aplicatia este web-base si initializarile se fac in metoda <strong>contextInitialized(ServletContextEvent sc)</strong> definita intr-o clasa ce extinde <strong>javax.servlet.ServletContextEvent</strong></p>
<p>Listing 5. Metoda dbInitialize ce realizeaza initierea conexiunii catre baza de date</p>
<blockquote>
<p>	public static void dbInitialize () throws DatabaseException<br />
	{<br />
		if (dbInstance != null)<br />
		{<br />
			dbInstance .releaseAllConnections();<br />
			dbInstance = null;<br />
		}</p>
<p>		ApplicationProperties dbProps = ApplicationProperties.getInstance();<br />
		if (dbProps == null)<br />
		{<br />
			throw new DatabaseException(&#8220;The <<ApplicationProperties>> &#8221;<br />
										+ &#8220;was not initialized !&#8221;);<br />
		}<br />
		String className = dbProps.getClassName();</p>
<p>		try<br />
		{<br />
			Class classInstance = Class.forName(className);<br />
			dbInstance = (AbstractDatabasePool) classInstance.newInstance();<br />
		}<br />
		catch (Exception e)<br />
		{<br />
			throw new DatabaseException(<br />
				&#8220;Class not found ->>> &#8221; + className,<br />
				e);<br />
		}</p>
<p>	}
</p></blockquote>
<p>Obiectul<strong> dbInstance</strong>  este definit de tipul <strong>AbstractDatabasePool</strong>. Dupa cum se poate observa din codul anterior, la initializare se incarca doar clasa ce este definita in <strong>app.properties</strong> la intrarea db.class.<br />
De exemplu pentru conectare la MySQL aceasta linie este:<br />
<strong>db.class=base.database.pool.MySqlDbPool</strong><br />
Recomandarea mea este ca aceasta metoda sa fie definita staticintr-o clasa separata, gen DbFactory. Puteti gasi aceata clasa, DbFactory, in codul sursa atasat la aceste articol.</p>
<p>Listing 6.  Metoda contextInitialized(ServletContextEvent sc) ce este folosita pentru initializa. In codul de aici este prezentata doar sectiunea legata de bazele de date</p>
<blockquote><p>
public void contextInitialized(ServletContextEvent sc)<br />
	{<br />
		try<br />
		{</p>
<p>			ApplicationProperties.initialize(APPLICATION_PROPERTIES);<br />
			DBFactory.dbInitialize();</p>
<p>		}<br />
		catch (Throwable th)<br />
		{<br />
			th.printStackTrace();<br />
		}
</p></blockquote>
<p>In acesta metoda se incarca fisierul de proprietati, definit intr-o variabila statica APPLICATION_PROPERTIES. Recomand ca acest fisier sa fie definit in functie de context-ul in care ruleaza aplicatia (sc.getServletContext().getRealPath(&#8220;&#8221;) ).</p>
<p>Listing 7. O metoda prin care se preia din baza de date un user, pe baza unui id. Fraza SQL folosita pentru aceata metoda este definita intr-o variabila statica, SQL_GET_USER_BY_ID.</p>
<blockquote><p>
	public static User getUserById(long id)<br />
		throws UserException<br />
	{<br />
		Connection conn = null;<br />
		PreparedStatement stmt = null;</p>
<p>		try<br />
		{<br />
			conn = PortalApp.dbPool.getConnection();<br />
			stmt = conn.prepareStatement(SQL_GET_USER_BY_ID);<br />
			stmt.setLong(1, id);</p>
<p>			ResultSet rset = stmt.executeQuery();</p>
<p>			if (rset.next() == false)<br />
			{<br />
				return null;<br />
			}</p>
<p>			return buildUserObjectFromRS(rset);<br />
		}</p>
<p>		catch (SQLException e)<br />
		{<br />
			throw new UserException(&#8220;Failed to retrieve group &#8221;<br />
				+ id + &#8221; from database&#8221;, e);<br />
		}</p>
<p>		finally<br />
		{<br />
			PortalApp.dbPool.closeStatement(stmt);<br />
		}<br />
	}
</p></blockquote>
<p>Ce face aceata metoda?<br />
Preia conexiunea initializata in aplicatie (PortalApp este clasa care contine mai multe variabile de tip static pentru a putea fi folosite peste tot in aplicatie. Aceasta aplicatie are si o metoda initialize care este apelata in metoda contextListener si primeste mai multi parametri, printre care si cele legate de baza de date. Ramane la latitudinea programatorului cum creeaza aceasta clasa, de aceea nu face obiectul in aceasta prezentare.<br />
Dupa ce este preluata conexiunea respectiva, se executa fraza sql necesara, se preia rezultatul executiei si se contruieste obiectul ce trebuie intors. Continutul din metoda buildUserObjectFromRS depinde de membri clasei User precum si de legaturile acestora cu datele din baza de date, de aceea nu este prezentat in acest articol.</p>
<p><strong>Download</strong></p>
<p>1. <a href="http://www.bogho.ro/download/dbconnectionsrc.zip">Codul sursa</a></p>
<p>2. Fisierele .jar ce contin drivere pentru conectarile la bazele de date</p>
<ul>
<ol><a href="http://www.bogho.ro/download/mysql-connector-java-3.0.11-stable-bin.jar.zip">Conector pentru Mysql &#8211; mysql-connector-java-3.0.11-stable-bin.jar</a></ol>
<ol><a href="http://www.bogho.ro/download/classes12.zip">Conector pentru Oracle &#8211; classes12.</a>jar</ol>
<ol><a href="http://www.bogho.ro/download/postgresql-8.0-311.jdbc3.jar.zip"> Conector pentru PostgreSql &#8211; postgresql-8.0-311.jdbc3.jar</a></ol>
<ol> <a href="http://www.bogho.ro/download/ojdbc14.zip">Conector pentru ODBC &#8211; ojdbc14.jar</a></ol>
</ul>
<p>Reamintesc faptul ca daca sunteti interesati si de conexiuni catre alte servere de baze de date, puteti sa lasati un comentariu la acest articol</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bogho.ro/?feed=rss2&amp;p=22</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>www.expedition-earth.com</title>
		<link>http://www.bogho.ro/?p=18</link>
		<comments>http://www.bogho.ro/?p=18#comments</comments>
		<pubDate>Mon, 09 Nov 2009 09:23:32 +0000</pubDate>
		<dc:creator>gonen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bogho.ro/?p=18</guid>
		<description><![CDATA[O familie formata din Ruan si Tina au inceput in 2008 o expeditie privind sindromul CHARGE. Aceasta expeditie consta in traversarea Europei, pe jos, cu plecarea din Cape Norkinn (Norvegia) si sosirea la Cape Tenaro (Grecia). In aceasta perioada aceste persoane se afla pe teritoriul Romaniei si sunt gazduiti la casa din Craiova. Am vorbit [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: Verdana; color: #ff9900; font-size: x-small;"><strong><span style="color: #000000;">O familie formata din Ruan si Tina au inceput in 2008 o expeditie privind sindromul CHARGE. Aceasta expeditie consta in traversarea Europei, pe jos, cu plecarea din Cape Norkinn (Norvegia) si sosirea la Cape Tenaro (Grecia). In aceasta perioada aceste persoane se afla pe teritoriul Romaniei si sunt gazduiti la casa din Craiova. Am vorbit cu ei si ar avea nevoie de ceva donatii, ce pot fi facute prin paypal-detalii pe site-ul lor-, dar au si la vanzare albume foto ce contin imaginii din toate locurile pe unde au umblat cei doi, albume foto ce sunt la vanzare cu un pret de 37 de euro. In cazul in care sunt doritori care vor aceste albume, pot sa imi anunte fiindca ar trebui sa le spun maine, marti 10 noiembrie, cam cate albume sa vina din Elvetia.</span></strong></span></p>
<p><strong>Detalii despre intreaga expeditie se pot afla pe site-ul <a href="http://www.expedition-earth.com" target="_blank">http://www.expedition-earth.com</a></strong></p>
<p>PS.  Eventualele comenzi de albume le puteti lasa fie ca si comentarii la acest mesaj, dar si pe adresa de mail, bogdan.barbu@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bogho.ro/?feed=rss2&amp;p=18</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft lanseaza primele update-uri pentru Windows7</title>
		<link>http://www.bogho.ro/?p=11</link>
		<comments>http://www.bogho.ro/?p=11#comments</comments>
		<pubDate>Mon, 12 Oct 2009 15:46:08 +0000</pubDate>
		<dc:creator>gonen</dc:creator>
				<category><![CDATA[Diverse]]></category>
		<category><![CDATA[Microsoft Windows]]></category>
		<category><![CDATA[Stiri]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[vulnerabilitate]]></category>

		<guid isPermaLink="false">http://www.bogho.ro/?p=11</guid>
		<description><![CDATA[Asa cum Microsoft si-a obisnuit clienti, in a doua zi de marti a fiecarei luni va lansa o serie de update-uri pentru produsele sale. Compania de software a a emis un comunicat prin care anunta ca maine, 13 octombrie 2009, vor fi disponibile pentru download o serie de update-uri (13 la numar) menite sa rezolve [...]]]></description>
			<content:encoded><![CDATA[<p>Asa cum Microsoft si-a obisnuit clienti, in a doua zi de marti a fiecarei luni va lansa o serie de update-uri pentru produsele sale. Compania de software a a emis un comunicat prin care anunta ca maine, 13 octombrie 2009, vor fi disponibile pentru download o serie de update-uri (13 la numar) menite sa rezolve o serie de vulnerabilitati (34 la numar) raportate in ultima perioada. Din cele 13 pachete de update 5 sunt adresate noului sistem de operare, Windows 7, sistem de operare ce nu a fost lansat inca oficial (data lansarii fiind 22 octombrie in SUA si 31 octombrie in Romania).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bogho.ro/?feed=rss2&amp;p=11</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Start in blogosfera</title>
		<link>http://www.bogho.ro/?p=1</link>
		<comments>http://www.bogho.ro/?p=1#comments</comments>
		<pubDate>Wed, 07 Oct 2009 08:47:15 +0000</pubDate>
		<dc:creator>gonen</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.bogho.ro/?p=1</guid>
		<description><![CDATA[De astazi voi intra si eu in aceasta blogosfera prin intermediul unui blog de sorginte &#8220;tehnologia informatiei&#8221;, in special pe partea de dezvoltare aplicatii software, dar vor aparea si alte domenii legate de IT(hardware, birotica, etc&#8230;)
Intentionez ca o parte din articole sa fie raspunsuri la intrebarile cititorilor. De aceea, puteti lasa intrebari legate de IT, [...]]]></description>
			<content:encoded><![CDATA[<p>De astazi voi intra si eu in aceasta blogosfera prin intermediul unui blog de sorginte &#8220;tehnologia informatiei&#8221;, in special pe partea de dezvoltare aplicatii software, dar vor aparea si alte domenii legate de IT(hardware, birotica, etc&#8230;)</p>
<p>Intentionez ca o parte din articole sa fie raspunsuri la intrebarile cititorilor. De aceea, puteti lasa intrebari legate de IT, fie prin comentarii la articole, fie alte metode de contact (email, telefon, ym &#8211; pentru cei care le cunosc) si voi raspunde la ele in cel mai scurt timp posibil.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bogho.ro/?feed=rss2&amp;p=1</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
