tag:blogger.com,1999:blog-9200581756117359622024-03-05T08:50:16.801-08:00Marius Cristea"Promote knowledge and knowledge will promote you" - http://mcristea.wordpress.com/Marius Cristeahttp://www.blogger.com/profile/05797914930690354847noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-920058175611735962.post-43899854899340598792013-04-11T01:27:00.002-07:002013-04-11T01:27:17.492-07:00Moved to a new spaceIn order to make my life easier I decided to move my publish house to wordpress - so check it out <a href="http://mcristea.wordpress.com/">http://mcristea.wordpress.com/</a>
Marius Cristeahttp://www.blogger.com/profile/05797914930690354847noreply@blogger.com0tag:blogger.com,1999:blog-920058175611735962.post-8123622972819368962013-04-08T04:41:00.000-07:002013-04-08T06:45:39.763-07:00JSF - Upload Image in Primefaces CKEditor<div class="page-content" id="content_1">
<div style="text-align: justify;">
JSF 2.0 is a framework interesting enough to get your attention; combined with a component library like Primefaces it really makes it worth. In addition to the 100+ rich set of JSF components from <a href="http://www.primefaces.org/">Primefaces</a> you could also add the <a href="http://fractalsoft.net/primeext-showcase-mojarra/views/home.jsf">PrimeFaces Extensions</a>.
Having all these on hand, I noticed that the <a href="http://fractalsoft.net/primeext-showcase-mojarra/views/ckEditor.jsf">CKEditor</a> that is integrated in Primefaces Extension doesn't have built-in support for uploading/rendering images.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Let's get rollin' on uploading/rendering an image in CKEditor using:</div>
<ul>
<li>Primefaces Extension for CKEditor component</li>
<li>HttpServlet for CKEditorUploadServlet and for CKEditorGetImageServlet</li>
<li>JS for CKEditor configuration</li>
<li>Spring @Service for saving or getting images from db</li>
</ul>
<b>1. Declare primefaces dependencies in your pom.xml</b><br />
<script class="brush: xml; toolbar: false;" type="syntaxhighlighter"><![CDATA[
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.primefaces.extensions</groupId>
<artifactId>resources-ckeditor</artifactId>
<version>0.6.2</version>
</dependency>
]]></script>
<br />
<b>2. Add the editor.xhtml to your project</b>
<br />
<script class="brush: xml; toolbar: false;" type="syntaxhighlighter"><![CDATA[
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:pe="http://primefaces.org/ui/extensions">
<ui:composition>
<pe:ckEditor id="#{id}" required="true" width="0"
height="#{height}" requiredMessage="#{requiredMessage}"
value="#{value}" customConfig="#{request.contextPath}/resources/js/ckeditor.js"
toolbar="[['Bold', 'Italic', 'Underline','-', 'Image','-', 'Link']]">
<p:ajax event="blur" update="editorMessageId" />
</pe:ckEditor>
<p:message for="#{id}" id="editorMessageId" />
<h:outputLabel value="#{request.contextPath}"/>
</ui:composition>
</html>
]]></script>
<br />
<b>3.Include the editor.xhtml to any page - where it's needed</b>
<br />
<script class="brush: xml; toolbar: false;" type="syntaxhighlighter"><![CDATA[
<ui:include src="/pages/editor.xhtml">
<ui:param name="requiredMessage" value="#{msg['documentation.required']}" />
<ui:param name="value" value="#{bean.documentation}" />
<ui:param name="id" value="documentationId" />
<ui:param name="height" value="260" />
</ui:include>
]]></script>
<br />
<br />
<b>4.</b> Configure the <b>filebrowserImageUploadUrl</b> from <b>CKEditor</b>, so it knows what servlet to use when the upload button is clicked. I saved the file in <b>/resources/js/</b> as <b>ckeditor.js</b>.
<br />
<script class="brush: xml; toolbar: false;" type="syntaxhighlighter"><![CDATA[
CKEDITOR.editorConfig = function(config) {
var contextPath = $('.contextPath').html();
config.filebrowserImageUploadUrl = contextPath+'/ckeditor/uploadimage';
};
]]></script>
</div>
<div class="page-content" id="content_2">
<b>5. Implement and declare CKEditorUploadServlet</b> - this servlet will be responsible for uploading the images to db
<br />
<br />
<b>5.1 Declare it in web.xml file</b>
<script class="brush: xml; toolbar: false;" type="syntaxhighlighter"><![CDATA[
<servlet>
<servlet-name>CKEditorUploadServlet</servlet-name>
<servlet-class>com.myapp.servlet.CKEditorUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CKEditorUploadServlet</servlet-name>
<url-pattern>/ckeditor/uploadimage</url-pattern>
</servlet-mapping>
]]></script>
<b>5.2 Implementation of CKEditorUploadServlet</b>
<script class="brush: java; toolbar: false;" type="syntaxhighlighter"><![CDATA[
package com.myapp.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.myapp.model.UploadedFile;
import com.myapp.service.UploadedFileService;
/**
* This Class is responsible for uploading the images from UI to the DB It will
* provide as response the callback method and URL for the image that has been
* uploaded
*
* @author mcristea
*
*/
@SuppressWarnings("unchecked")
public class CKEditorUploadServlet extends HttpServlet {
private static final long serialVersionUID = -7570633768412575697L;
private static final Logger LOG = LoggerFactory.getLogger(CKEditorUploadServlet.class);
private static final String ERROR_FILE_UPLOAD = "An error occurred to the file upload process.";
private static final String ERROR_NO_FILE_UPLOAD = "No file is present for upload process.";
private static final String ERROR_INVALID_CALLBACK = "Invalid callback.";
private static final String CKEDITOR_CONTENT_TYPE = "text/html; charset=UTF-8";
private static final String CKEDITOR_HEADER_NAME = "Cache-Control";
private static final String CKEDITOR_HEADER_VALUE = "no-cache";
private static final Pattern PATTERN = Pattern.compile("[\\w\\d]*");
private String errorMessage = "";
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(request.getSession().
getServletContext());
UploadedFileService uploadedFileService = (UploadedFileService) ctx.getBean("uploadedFileService");
UploadedFile uploadedFile = new UploadedFile();
PrintWriter out = response.getWriter();
response.setContentType(CKEDITOR_CONTENT_TYPE);
response.setHeader(CKEDITOR_HEADER_NAME, CKEDITOR_HEADER_VALUE);
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
if (!items.isEmpty() && items.get(0) != null) {
uploadedFile.setContent(items.get(0).get());
uploadedFile.setContentType(items.get(0).getContentType());
uploadedFile.setFileName(((DiskFileItem) items.get(0)).getName());
uploadedFileService.saveUploadedFile(uploadedFile);
} else {
errorMessage = ERROR_NO_FILE_UPLOAD;
}
} catch (FileUploadException e) {
errorMessage = ERROR_FILE_UPLOAD;
LOG.error(errorMessage, e);
}
// CKEditorFuncNum Is the location to display when the callback
String callback = request.getParameter("CKEditorFuncNum");
// verify if the callback contains only digits and letters in order to
// avoid vulnerability on parsing parameter
if (!PATTERN.matcher(callback).matches()) {
callback = "";
errorMessage = ERROR_INVALID_CALLBACK;
}
String pathToFile = request.getContextPath() + "/ckeditor/getimage?imageId=" + uploadedFile.getId();
out.println("<script
type=\"text/javascript\">window.parent.CKEDITOR.tools.callFunction(" +
callback + ",'" + pathToFile + "','" + errorMessage + "')");
out.println("</script>");
out.flush();
out.close();
}
}
]]></script>
</div>
<div class="page-content" id="content_3">
<b>6. Implement and declare CKEditorGetImageServlet</b> - this servlet will be responsible for getting the images from db
<br />
<br />
<b>6.1 Declare it in web.xml file</b>
<script class="brush: xml; toolbar: false;" type="syntaxhighlighter"><![CDATA[
<servlet>
<servlet-name>CKEditorGetImageServlet</servlet-name>
<servlet-class>com.myapp.servlet.CKEditorGetImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CKEditorGetImageServlet</servlet-name>
<url-pattern>/ckeditor/getimage</url-pattern>
</servlet-mapping>
]]></script>
<b>6.2 Implementation of CKEditorGetImageServlet</b>
<script class="brush: java; toolbar: false;" type="syntaxhighlighter"><![CDATA[
/**
*
*/
package com.myapp.servlet;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.myapp.model.UploadedFile;
import com.myapp.service.UploadedFileService;
/**
* This Servlet is responsible for delivering images from DB to UI It will provide
* as response the image that has been requested by id as parameter
*
* @author mcristea
*
*/
public class CKEditorGetImageServlet extends HttpServlet {
private static final long serialVersionUID = -7570633768412575697L;
private static final Logger LOG = LoggerFactory.getLogger(CKEditorGetImageServlet.class);
private static final String ERROR_FILE_DOWNLOAD = "An error occured when trying to get the image with id:";
private static final String IMAGE_PARAMETER_NAME = "imageId";
private static final long CACHE_AGE_MILISECONDS_TWO_WEEKS = 1209600000;
private static final String CKEDITOR_CONTENT_EXPIRE = "Expires";
private static final String CKEDITOR_CONTENT_TYPE = "Content-Type";
private static final String CKEDITOR_CONTENT_LENGTH = "Content-Length";
private static final String CKEDITOR_CONTENT_DISPOSITION = "Content-Disposition";
private static final String CKEDITOR_CONTENT_DISPOSITION_VALUE = "inline; filename=\"";
private static final String CKEDITOR_HEADER_NAME = "Cache-Control";
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Long imageId = null;
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(request.getSession()
.getServletContext());
UploadedFileService uploadedFileService = (UploadedFileService) ctx.getBean("uploadedFileService");
String parameterId = request.getParameter(IMAGE_PARAMETER_NAME);
try {
imageId = Long.valueOf(parameterId);
UploadedFile uploadedFile = uploadedFileService.getUploadedFileById(imageId);
if (uploadedFile != null && uploadedFile.getContent().length > 0) {
byte[] rb = uploadedFile.getContent();
long expiry = new Date().getTime() + CACHE_AGE_MILISECONDS_TWO_WEEKS;
response.setDateHeader(CKEDITOR_CONTENT_EXPIRE, expiry);
response.setHeader(CKEDITOR_HEADER_NAME, "max-age=" + CACHE_AGE_MILISECONDS_TWO_WEEKS);
response.setHeader(CKEDITOR_CONTENT_TYPE, uploadedFile.getContentType());
response.setHeader(CKEDITOR_CONTENT_LENGTH, String.valueOf(rb.length));
response.setHeader(CKEDITOR_CONTENT_DISPOSITION,
CKEDITOR_CONTENT_DISPOSITION_VALUE + uploadedFile.getFileName() + "\"");
response.getOutputStream().write(rb, 0, rb.length);
response.getOutputStream().flush();
response.getOutputStream().close();
}
} catch (Exception e) {
response.getOutputStream().close();
LOG.error(ERROR_FILE_DOWNLOAD + parameterId, e);
}
}
}
]]></script>
</div>
<div class="page-content" id="content_4">
<b>7. Here is the proof</b>
<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh18KgXqQ8jXAq-I2KqoOBq0lf7bUQnqV107k2f9ivp4OobpRyp5URJggjhSJi8z2WlYHNhVdyhXEN4Q0ztQCOdFkGGUPzXY7eYEfm_dV5Y2ZAuAgWnBfhuW81RLFpJo8YgnhcsgnetdOQ/s1600/1.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh18KgXqQ8jXAq-I2KqoOBq0lf7bUQnqV107k2f9ivp4OobpRyp5URJggjhSJi8z2WlYHNhVdyhXEN4Q0ztQCOdFkGGUPzXY7eYEfm_dV5Y2ZAuAgWnBfhuW81RLFpJo8YgnhcsgnetdOQ/s320/1.png" /></a>
</p><p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmgpjhA3trRAjl-wn9mkDsQqAmTtBbM_yCMzaY5wrSc7evIgXY43911YVFW5KOYcvmOVzVFN0TNyYzGIA0Tnz7FGpKDab0V0rTbM5itnemRFiL8sdm9Jo_Cr8S3dVqdld1RoNGksWCSl0/s1600/2.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmgpjhA3trRAjl-wn9mkDsQqAmTtBbM_yCMzaY5wrSc7evIgXY43911YVFW5KOYcvmOVzVFN0TNyYzGIA0Tnz7FGpKDab0V0rTbM5itnemRFiL8sdm9Jo_Cr8S3dVqdld1RoNGksWCSl0/s320/2.png" /></a>
</p><p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSBAzvzwBYpVhJPHuRZZ-d4N_vKaAcDuE6ye8UxA0IiNywt0pTNJng1Xhvgt9NzOQSfTXE59s6q_H4oOL471trZTaM8nP1lD2Ds3cSgWJ_bZaDQJb4GX1x_iqKuV7ey2c4pZlSOpkOZtk/s1600/3.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSBAzvzwBYpVhJPHuRZZ-d4N_vKaAcDuE6ye8UxA0IiNywt0pTNJng1Xhvgt9NzOQSfTXE59s6q_H4oOL471trZTaM8nP1lD2Ds3cSgWJ_bZaDQJb4GX1x_iqKuV7ey2c4pZlSOpkOZtk/s320/3.png" /></a>
</p>
</div>
<div style="font-weight: bold;">
Pages:
<a class="page-button" href="http://mariusicacristea.blogspot.ro/2013/04/jsf-upload-image-in-ckeditor-primefaces.html#content_1"> 1</a>
<a class="page-button" href="http://mariusicacristea.blogspot.ro/2013/04/jsf-upload-image-in-ckeditor-primefaces.html#content_2"> 2</a>
<a class="page-button" href="http://mariusicacristea.blogspot.ro/2013/04/jsf-upload-image-in-ckeditor-primefaces.html#content_3"> 3</a>
<a class="page-button" href="http://mariusicacristea.blogspot.ro/2013/04/jsf-upload-image-in-ckeditor-primefaces.html#content_4"> 4</a>
</div>
<script>
function onPageLoad() {
$('.page-content').hide();
var page = 1;
if (location.hash) {
page = location.hash[location.hash.length - 1];
}
$('#content_' + page).show();
}
function onPageButtonClick() {
$('.page-content').hide();
console.log('#content_' + this.href[this.href.length - 1]);
$('#content_' + this.href[this.href.length - 1]).show();
}
$(document).ready(function() {
$('.page-button').click(onPageButtonClick);
onPageLoad();
});
</script>Marius Cristeahttp://www.blogger.com/profile/05797914930690354847noreply@blogger.com1tag:blogger.com,1999:blog-920058175611735962.post-50765507155474984042013-03-22T05:47:00.001-07:002013-04-03T04:41:11.946-07:00Adding PMI (PerformanceMonitorInterceptor) to your application in 3 easy stepsYesterday I found out that Spring cares about showing how fast it is, but not only that, it does make it easy for you, and without further ado let's get to business.<br />
<br />
<b>1. Declare the interceptor (<a href="http://static.springsource.org/spring/docs/1.2.9/api/org/springframework/aop/interceptor/PerformanceMonitorInterceptor.html">PerformanceMonitorInterceptor</a>) and its pointcut (<a href="http://static.springsource.org/spring/docs/2.0.x/reference/aop.html#">declaring a pointcut</a>) within the aspect configuration:</b><br />
<b><br /></b>
Save the below configuration into a config file (<b>aop-config.xml</b>).<br />
<b><br /></b>
<script class="brush: xml; toolbar: false;" type="syntaxhighlighter"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<aop:aspectj-autoproxy />
<bean id="performanceMonitor" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor">
<property name="useDynamicLogger" value="true"/>
</bean>
<aop:config>
<aop:pointcut id="allServiceMethods" expression="execution(* com.mypackage.service..*.*(..))" />
<aop:advisor pointcut-ref="allServiceMethods" advice-ref="performanceMonitor" order="2" />
</aop:config>
</beans>
]]></script>
2. Include the aop-config.xml file in the spring general configuration file:
<script class="brush: xml; toolbar: false;" type="syntaxhighlighter"><![CDATA[
<import resource="classpath:spring-config/aop-config.xml" />
]]></script>
<br />
<div>
<b>3. And enable logging for:</b></div>
<div>
<b><br /></b></div>
<div>
log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE</div>
<div>
<br /></div>
<div>
The logging has to be to TRACE in order for you to see the following:</div>
<div>
<br /></div>
<div>
<div>
Line 22734: 178062 ["http-bio-8079"-exec-2] TRACE org.springframework.aop.interceptor.PerformanceMonitorInterceptor - StopWatch ' com.mypackage.service.ApplicationParametersService.getApplicationParam': <b>running time (millis) = 12</b></div>
<div>
<br /></div>
<div>
Line 23155: 178551 ["http-bio-8079"-exec-2] TRACE org.springframework.aop.interceptor.PerformanceMonitorInterceptor - StopWatch 'com.mypackage.service.common.PaginatedTableService.getData': <b>running time (millis) = 467</b></div>
</div>
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js" type="text/javascript"></script>Marius Cristeahttp://www.blogger.com/profile/05797914930690354847noreply@blogger.com0tag:blogger.com,1999:blog-920058175611735962.post-64317700541134855542013-03-04T23:04:00.000-08:002013-04-01T12:30:36.071-07:00Discover the beauty of your own maven plugin Going these days through the message bundles files, that have been modified chaotically, I realized that we do not have a maven plugin that can synchronize those bundles.<br />
<br />
<b> 1.</b> 'First I was afraid, I was petrified' - did a quick Google search on 'build maven plugin' and the first result pointed me at <a href="http://maven.apache.org/guides/plugin/guide-java-plugin-development.html">Build Maven Plugin</a>. A quick read through got me going on this.<br />
<br />
<b> 2.</b> I used the Mojo archetype with the following command line:<br />
<br />
<b> mvn archetype:generate</b> -DgroupId=syncronize.files -DartifactId=sync-files-keys-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-plugin<br />
<br />
<b> 3.</b> I imported the generated archetype in eclipse and I started to work on it.<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeR7rlImMXSLJuA-9FLFU9hIl21UBlZ19PrMEaGHnV3lN9L3HaKHhM3S_zdytjGTKlhAdNaOEMJV1ShPC4IVaGQO2Nzn3i-yJ3S4pjf5Qvm6qxugB6X0_e-ymXM1jHo1XiXuO6ZUYwwis/s1600/eclipse_project.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeR7rlImMXSLJuA-9FLFU9hIl21UBlZ19PrMEaGHnV3lN9L3HaKHhM3S_zdytjGTKlhAdNaOEMJV1ShPC4IVaGQO2Nzn3i-yJ3S4pjf5Qvm6qxugB6X0_e-ymXM1jHo1XiXuO6ZUYwwis/s320/eclipse_project.png" /></a><br />
What I was looking for was the ability to automatically synchronize all my message bundle files. Having, let's say the English version as the most complete one (containing all the necessary pairs of key/value). I decided to use it as base file for synchronizing the other message bundle files.<br />
<br />
<b>4.</b> I started to add the plugin parameters. All you have to do is to use the @Parameter. In this particular case we need:<br />
- <b>targetPattern </b>- This parameter defines the target files pattern that will be processed<br />
- <b>targetDirPath </b>-This parameter defines the target directory that contains the message bundle files<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> /* use absolute path for it e.g. d:/work/project/war/src/main/resources/properties/.<br />
- <b>baseFileName </b>- This parameter defines the base file from where all the missing keys with their values will be pulled<br />
<br />
<br />
@Parameter(property = "pattern", required = true)<br />
private String targetPattern;<br />
<br />
<b>5. </b>Implement the <b>execute()</b> method - using <b><a href="http://org.apache.commons.configuration.propertiesconfiguration.propertiesconfiguration/">org.apache.commons.configuration.PropertiesConfiguration.PropertiesConfiguration</a></b> I did iterate over all the other bundles and I added all the missing keys. Keep in mind that the comments from bundle will not be passed along.<br />
<br />
The implementation itself is not the point of this post.<br />
<br />
<b>6.</b> Build the maven plugin - use the classic <b>mvn clean install</b><br />
<b><br /></b>
<b>7.</b> Install the plugin in your local repository<br />
<b>mvn install:install-file</b> -Dfile=sync-files-keys-plugin-1.0.jar -DgroupId=syncronize.files -DartifactId=sync-files-keys-plugin -Dversion=1.0 -Dpackaging=maven-plugin<br />
<br />
<b>8. </b>Use the plugin<br />
<br />
<script type="syntaxhighlighter" class="brush: xml; toolbar: false;"><![CDATA[
<plugin>
<groupId>syncronize.files</groupId>
<artifactId>sync-files-keys-plugin</artifactId>
<version>1.0</version>
<configuration>
<baseFileName>d:/work/project/war/src/main/resources/properties/messages_en.properties</baseFileName>
<targetPattern>*.properties</targetPattern>
<targetDirPath>d:/work/project/war/src/main/resources/properties/.</targetDirPath>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>process</goal>
</goals>
</execution>
</executions>
</plugin>
]]></script>
<br />
As result I did get all the other message bundles files populated with the missing keys, with the values in English - as a nice feature we could call the Google translate API and get the translation of the value in the required language.<br />
<br />
<a href="https://github.com/cmmc030/mvn-repo/tree/master/snapshots">Download the maven plugin.</a><br />
<a href="https://github.com/cmmc030/syncronize.files.maven.plugin">Download the source code.</a><br />
<br />
<b>Enjoy building your own maven plugin.</b>Marius Cristeahttp://www.blogger.com/profile/05797914930690354847noreply@blogger.com1tag:blogger.com,1999:blog-920058175611735962.post-7934951672407198682009-08-02T13:56:00.000-07:002009-09-23T23:24:45.458-07:00Scoaterea din circuitul agricolPentru a putea obţine autorizaţie de construcţie şi implicit pentru a începe construcţia propriu-zisă este neaparat nevoie de scoaterea din circuitul agricol a terenului pe care se doreşte să se construiască, asta dacă pamântul este încadrat din punct de vedere funciar ca fiind arabil.<br />Prin simpa răsfoire certificatului de urbanism eliberat de primărie poţi realiza imediat dacă pământul este arabil sau nu, a nu se confuda cu intravilan şi extravilan. Poţi avea pamant situat în intravilanul municipiului(adica cu PUZ) şi în acelaşi timp sa fie pamânt arabil.<br /><br />Scoaterea din circuitul agricol se compune din 2 avize şi scoaterea propriu-zisă: aviz <a href="http://www.anif.ro/">ANIF</a> (Administratia Natională a Îmbunătăţirilor Funciare) , aviz <a href="http://www.ancpi.ro/">OCPI</a>(sau in iasi ANCPI Agenţia Naţională de Cadastru şi Publicitate Imobiliară) şi scoaterea care este realizată de <a href="http://www.icpa.ro/">OSPA</a>(Oficiul Pentru Studii Pedologice şi Agrochimice).<br /><br />Pentru a ajunge la OSPA trebuie să aveţi cele două avize de la OCPI si de la ANIF, numai aşa se poate elibera decizia de scoatere din circuit.<br /><br /><span style="font-weight: bold; text-decoration: underline;">Acte necesare:</span><br />- certificat de urbanism - să specifice că terenul e intravilan<br />- extras de carte funciara actualizat - citeste <a href="http://mariusicacristea.blogspot.com/2009/07/povestea-continua-actualizarea-cartii.html">povestea actualizarii</a><br />- actul de proprietate - titlu sau contract vanzare-cumparare<br />- plan de situatie a terenului vizat OCPI<br />- plan de incadrare a terenului<br />- plan de amplasament<br />- schita cadastrala<br />- HCL(Hotarârea Consiliului Local) prin care se atesta ca terenul este intravilan<br />- avizul de aprobare PUZ a CJ(Consiliului Judetean)<br />- cererea de eliberare a avizului<br /><br />Nu trebuie sa te sperii, dacă ai ajuns până aici ar trebui sa ai cam toate actele in gentuţă :).<br />Toate aceste acte iţi trebuie la cele 3 instituţii mai sus menţionate, insă ANIF e singura dintre ele care cere dublu exemplar de copii.<br /><br /><span style="font-weight: bold; text-decoration: underline;">Taxe:</span><br />Din toate cele 3 instituţii singura care are o taxă fixă e OCPI: 250 RON<br />ANIF şi OSPA vor taxa în funcţie de suprafaţa scoasă din circuit şi de tipul pământului arabil existent: vii, pădure,...<br />Eu pentru suprafaţa de 440 mp care avea şi vii am platit la ANIF 238 RON, iar la OSPA 165 RON.<br /><br /><span style="font-weight: bold; text-decoration: underline;">Durată:</span><br />Dacă dosarele sunt complete şi aici ma refer la toate actele descrise mai sus, puteţi depune la ANIF şi la OSPA în acelaşi timp în mod normal nu ar trebu să dureze mai mult de 5 zile lucrătoare. O mică problemă de care am auzit ar fi cu cei de la ANIF unde în cazul în care ei nu au documentaţia necesară pentru a elibera avizul, toată documentaţia este trimisă la Bucureşti, asta nu va face decât să întârzie tot procesul cu CEL PUŢIN 30 de zile.<br />Cei de la ANIF iţi vor elibera avizul personal şi va trebui să îl duci la OSPA, in timp ce OCPI îl va trimite acolo.<br />Imediat ce ai depus la OSPA avizul de la ANIF porneşti cronometru şi îl laşi cam 5-6 zile lucrătoare să işi facă treaba.<br /><br /><span style="font-weight: bold; text-decoration: underline;">Informaţii utile pentru cei din IAŞI:</span><br /><span style="font-weight: bold;">OCPI</span> - nu e foarte greu de găsit, între liceul Vasile Alecsandri şi Hala Centrală se afla o biserica si alături un drum care duce undeva în spate, pe acel drum trebuie mers circa 50m. Iţi dai seama că ai ajuns unde trebuie imediat ce vezi o pancardă publicitară luminoasă a OCPI. Trebuie să ţineţi cont că funcţionarii sunt foarte agasanţi şi neînţelegători.<br /> <br /> Adresa: Str. Costache Negri nr. 48, Iasi, jud. Iasi cod postal 700071<br /> Tel: <span class="attribute-value">+40-232-316797; +40-232-316797<br /> Program: 8:30 - 12:00 pentru de punere de acte, 13:30 - 16:00 pentru ridicare de acte<br /><br /><span style="font-weight: bold;">ANIF</span> - nu e chiar în centrul oraşului, practic imediat ce ai ajuns în galata pe Calea Galata, vei merge circa 2-300 de metri până la un mic pod şi vei face imediat la dreapta pe Caramidari sau Cicoarei unde vei mai merge circa 500 de metri, este o cladire(casă cu etaj) galbenă cu aluminiu alb, arată foarte bine. Dacă te rătăceşti întreabă de Cicoarei, toată lumea ştie. Cei de la ANIF sunt super de treabă, doamna Ancuţa te va ajuta să obţii avizul.<br /> <br /> Adresa: </span><span class="cellText">Str. Cicoarei nr.13 <br /> Tel: 0232-226526<br /> Email: raifis@euroweb.ro<br /> Program: 9:00 - 16:00<br /><br /><span style="font-weight: bold;">OSPA</span> - Copou e locaşul ce îţi va aduce scoaterea din circuit. Imediat după stadionul Emil Alexandrescu este o straduţă la sfârşitul careia vei vedea o casă old style şi o pancardă pe care scrie OSPA. Cei de acolo sunt super draguţi de la secretare până la domnul ing. Jescu Toader, cel care te va ajuta să obţii scoaterea.<br /><br /> Adresă: Str. Dumbrava Rosie, nr.3, jud. Iasi<br /> Tel: 0232-217787<br /> Mobil: 0723-213862<br /> Program: 8:00 - 16:00<br /><br />Dacă ai nevoie de alte detalii nu uita de email-ul meu : <a href="mailto:mariusica.cristea@gmail.com">mariusica.cristea@gmail.com</a>.<br /></span>Marius Cristeahttp://www.blogger.com/profile/05797914930690354847noreply@blogger.com21tag:blogger.com,1999:blog-920058175611735962.post-5959833877682777642009-07-05T10:51:00.000-07:002009-07-07T00:26:32.112-07:00Povestea continua - Actualizarea cartii funciareImediat ce au fost eliberate cele 2 avize PUZ(unul de la Consilul Local, care se elibereaza numai dupa ce a fost pe sedintza de zi a consiliului si consiliul la aprobat si cel de la Consiliul Judetean care deasemenea dureaza o vesnicie cca. 40 de zile) treaba nu e nici pe departe de a fi gata, terenul trebuie sa aiba o carte funciara actualizata, necesara si pentru scoaterea din circuitul agricol.<br /><br /><span style="font-weight: bold;">Actualizarea cartii funciare<br /></span><span><br />The real fun shit story is here. Pentru a actualiza cartea funciara trebuie sa aveti cel putin 1 Kg de lamai, de ce? foarte simplu, doamnele sau domnii de la OCPI(Oficiu Cadastrului si Publicitatii imobiliare) sunt plini de greatza si imediat le oferiti una din lamaile cumparate pentru a mai taia din greatza.<br /><br /><span style="font-style: italic;">Prima zi la OCPI: </span>Merg pentru a ma interesa ce acte trebuie sa depun pentru actualizarea cartii funciare si va spun sincer ca parea destul de simplu si banal, tinand cont de faptul ca aveam cele 2 avize eliberate de cele mai inalte institutii locale si judetene ale orasului IASI(Consiliu Local - Primaria, Consiliul Judetean - Prefectura).<br />Oooo! nu baietii de acolo imi zic sa arunc o privire la avizier unde scrie negru pe alb - "Adresa </span><span>de la primarie prin care sa reiasa ca terenul e in intravilanul municipiului Iasi"</span><span> (</span>Din punct de vedere juridic, comunicare oficiala scrisa, facuta de o institutie, o intreprindere etc. <span>)<br />Pai zic cum vine asta, ia uitati ce scrie la Art. 1 din hotararea Consiliului Local "</span><span style=";font-family:";font-size:12;" lang="RO" >Se aproba Planul Urbanistic Zonal-Iasi, xxxxxxxx - Adresa, intocmit in vederea extinderii intravilanului municipiului Iasi si construirii de locuinte individuale pe teren proprietate privata persoana fizica.Suprafata terenului studiat prin PUZ este de 1308 mp.,conform contractului de vanzare cumparare nr.1414/2008. Indicatori urbanistici : </span><st1:stockticker><span style=";font-family:";font-size:12;" lang="RO" >POT</span></st1:stockticker><span style=";font-family:";font-size:12;" lang="RO" >=max.30%, CUT=0.9; regim de inaltime P+2E (Hmaxim 9m).<o:p></o:p></span> <p class="MsoNormal"><span style=";font-family:";font-size:12;" lang="RO" >Anexa (plansa de reglementari urbanistice<span style=""> </span>nr. U 2 ) face parte integrantă din prezenta<span style=""> </span>hotărâre.</span><span>"<br /></span></p><p class="MsoNormal"><span>Eu zic un articol 1 din hotarare destul de explicit prin care se specifica ca terenul e in intravilanul mun. Iasi si are PUZ.</span></p><p class="MsoNormal"><span>Nu Domle' trebuie adresa!Daca trebuie ce sa ii faci?<br /></span></p><p class="MsoNormal"><span>Ei na zic io ma duc sa iau o adresa, mare problema, am facut si asa un zilion de acte "big deal" pentru o adresa.</span></p><p class="MsoNormal"><span><span style="font-style: italic;">Prima zi la primarie:</span>Merg la primarie unde clar ca nu era program, daca OCPI lucreaza la depuneri de acte de la 8-12, la primarie era program de la 13-15, evident nu? No problem, deaja nu mai aveam cum sa depun azi si adresa pentru actualizare de carte funciara, asa ca a trebuit sa rog o ruda sa merga la primarie sa ceara adresa in numele meu.</span></p><p class="MsoNormal"><span><span style="font-style: italic;">A doua zi la primarie</span>: Merge ruda la primarie si binenteles cere 'asa vestita Adresa' pentru cei de la OCPI, cei de la primarie, care sincer va spun mi se pare cea mai profesionista institutie dintre toate pe la care am perindat, habar nu aveau de aceasta cerintza a OCPI asa ca au fost luati prin suprindere de acest tip de adresa, desi una din doamnele dragutze de la urbanism parca mai auzise un request de acest tip de la altcineva. Dupa ce au urmat o serie de telefoane intre cei de la primarie si OCPI, ce aparent au lamurit cum sta treaba, mi-au zis sa revin saptamana viitoare, ca, binenteles dureaza pana ce este semnata adresa.</span></p><p class="MsoNormal"><span><span style="font-style: italic;">A doua saptamana la primarie</span>: Merg si reusesc sa ridic adresa, bucuros in acelasi timp ca sa intamplat de dimineatza, just in time, pentru a fi depusa la OCPI. Insa nu avea sa fie asa de usor dupa cum bine va imaginati. Aici e frumusetea Romaniei dragi.<br /></span></p><p class="MsoNormal"><span>M-am indreptat bucuros cu proaspata adresa de la primarie catre sediul OCPI, unde avea sa inceapa calvarul. Imediat ajuns acolo, fericit intind actele catre un tip de la Ghiseul 2, acelasi tip care in urma cu 1 saptamana lucra la ghiseul de informatii, cel care mi-a spus ce acte trebuie sa aduc. Ca o mica paranteza va da-ti seama cat profesionalism, imi si imaginez o tanti de la informatii trenuri, cum pleaca din gara conducand un tren :). In fine "domnul" de la ghiseul 2 se uita pe acte si ajunge la hotararea de la consiliul local(hotarare ce se afla pe net la www.primaria-iasi.ro - obligatoriu prin lege) unde se opreste brusc si imi spune:"pai da tre sa fie conforma cu originalul". Acea copie care i-am dat-o era primita de la primarie prin posta, mai mult de atat nu aveam.</span></p><p class="MsoNormal"><span>Acum ma aflam la punctul maxim de fierbere pentru ca acel neghiob mai sus mentionat ca domn, nu imi spuse din prima exact ce imi trebuie, pe langa asta una din "doamne" de la ghiseul OCPI se ridica recalcitrant din scaun si bate cu degetul pe un perete, unde era aparent o foicica ce mentiona clar negru pe alb si exact ce acte trebuie, hartiutza ce aparuse peste noapte in acea locatie.</span></p><p class="MsoNormal"><span>Fugi la primarie si roaga-te de gardieni sa te lase la secretariat sa poti cere de la una din doamne o copie conforma cu originalul a Hotararii Consiliului Local - Referitoare la PUZ. Dupa cum spuneam si mai devreme cei din primarie foarte draguti, mi-au facut 2 copii conforme cu originalul.</span></p><p class="MsoNormal"><span>Ziua 2, saptamana 2 OCPI: Finally <span style="font-weight: bold;">papanasul</span> de la biroul 2 imi ia actele si ma intreba "doriti in regim de urgentza pentru 300 RON sau regim normal pentru 60 de RON". Aproape ca plangeam si radeam de fericire in acel moment, dupa ce ca sunt niste badarani lipsiti de orice simt uman si te poarta din stanga in dreapta mai au si taxa de urgentza. Pai daca ai posibilitatea de a-mi elibera extrasul de carte funciara reactualizat, elibereaza-mi-l cat poti de repede la cel mai mic pret ca doar nu faci overtime si trebuiesti platit in plus. Pe ideea ca nu mai ai timpi morti la servici, iar daca tot nu ii ai macar sa iti dam mai multi bani nu? desi el esti platit in mod normal 8 ore pe zi, in care trebuie sa isi faca norma de 5 actualizari sau mai stiu eu cate. Cum dracu urgentezi chestia asta, aaaaaa! pur si simplu iti depasesti norma si faci 20 pe zi, cate ar trebui sa faci in mod normal, fara sa ceri bani in plus.<br /></span></p><p class="MsoNormal"><span>In fine aleg taxa de 60 de RON si imi zice ca va fi eliberat in 3 saptamani, la urgentze ar fi fost doar 2, HA hA HA sa fac pe mine de ras.</span></p><p class="MsoNormal"><span>No bine voi continua cu povestirile din minunata si fascinanta Romanie.</span></p><p class="MsoNormal"><span><br /></span></p>Marius Cristeahttp://www.blogger.com/profile/05797914930690354847noreply@blogger.com7tag:blogger.com,1999:blog-920058175611735962.post-54544261592684085032009-01-19T10:51:00.000-08:002014-07-16T03:08:38.570-07:00PUZ<div style="text-align: justify;"> Da stiu suna ciudat, acest cuvant l-am visat indelung in ultimele 3 luni, PUZ(Plan Urbanistic Zonal), de ce avem nevoie de el? Destul de simplu in acest moment multe din terenurile din Romania sunt incadrate intr-o anumita categorie: arabil sau CC(curti constructii), binenteles nu vorbim doar de 2 cateorii, cu siguranta mai sunt si altele, dar aceste 2 au fost in atentia mea.<br /><span style="font-style: italic;"> Ce ar trebui sa faca un tanar</span> din zilele nostre de 25 de ani dupa ce isi cumpara un teren ce se afla la o adresa din municipiu, dar este extravilan arabil?<br />Pai in primul rand trebuie sa se inarmeze cu mult entuziasm, ceea ce urmeaza nu e deloc usor.<br /><br /> Pentru a avea o rata de succes destul de mare in ceea ce priveste avizul PUZ ce va fi eliberat de primarie, iti trebuie un arhitect bunicel si specializat in documentatie PUZ, numai pentru acest arhitect, pentru documentatia ce va fi facuta va trebui sa scoti din buzunar nu mai putin de 1000 Euro.<br /><span style="font-style: italic;"> Ce va face arhitectul pentru tine? Ce ar trebui sa faca?</span><br />Pai in primul rand daca nu ai un certificat de urbanism eliberat pe numele tau, fugi cat poti de repede la primarie si depune o cerere de eliberare certificat de urbanism, costa doar 15RON si in general in Iasi dureaza cca. 20-30 de zile lucratoare pana cand iti este eliberat certificatul de urbanism. Acesta va fi necesar la <span style="font-style: italic; font-weight: bold;">toate </span>avizele ce vor trebui obtinute pentru avizul PUZ.<br />Arhitectul va trebui sa intocmeasca documentatia necesara pentru toate avizele ce trebuiesc pentru avizarea PUZ, acestea vor fi specificate in certificatul de urbanism.(<span style="font-style: italic;">Nota: numai cele bifate in certificatul de urbanism trebuiesc obtinute</span>).<br />Fiecare documentatie este specifica tipul de aviz de care ai nevoie si fiecare regie de la care trebuie obtinut avizul are sau nu o taxa pentru obtinerea avizului.<br /></div><ul style="text-align: justify;"><li><span style="font-weight: bold;">APAVital</span> - fostul RAJAC, nu trebuie platita nici o taxa si dureaza nu mai mult de 1 saptamana</li><li><span style="font-weight: bold;">E-ON Gaz</span> - trebuie platiata o taxa de 15 RON si dureaza cca 10 zile.</li><li><span style="font-weight: bold;">E-ON Electrica</span> - o nebunie aici, nu trebuie platita nici o taxa, dar doar daca ai noroc vei obtine acel aviz intr-o luna, imediat ce au trecut 2 saptamani trebuie insistat la ei si chiar date telefoane pentru follow-up.</li><li><span style="font-weight: bold;">CITADIN/Salubris</span> - "piece of cake" dureaza 5 zile lucratoare si trebuie platita o mica taxa de 25 RON</li><li><span style="font-weight: bold;">Sanepid</span> - o mama aici sa vedeti ce greu merge treaba, ba vor plan de 1:1500. ba de 1:1000, ideea este sa fiti pregatiti cu planul la cel putin cele 2 scari enumerate mai sus, un arhitect bun din Iasi oricum stie care e treaba si o sa va sfatuiasca. Dureaza cel putin la fel de mult ca la E-ON Electrica si mai trebuie platit si 50RON.</li><li><span style="font-weight: bold;">Agentia pentru protectia mediului</span> - aici dureaza cca 10 zile si nu costa nimic, e super usor de obtinut acest aviz</li><li><span style="font-weight: bold;">Avizul pentru protectie civila si Avizul de securitate la incendiu</span> - ambele vor fi eliberate de catre Ministerul Internelor si Reformei Administrative, fara cost si cat se poate de repede cca 5 zile.</li><li><span style="font-weight: bold;">Romtelecom</span> - baietii iti zic de la inceput ca va dura cc. 30 de zile, insa cu putina insitenta il vei obtine in 20 de zile.<br /></li></ul><div style="text-align: justify;"> Pentru Mediu si Pompieri, va trebui sa ai toate celelalte avize inainte sa mergi la ei. Nu uita insa e important sa ai un arhitect bun care stie fitzele acestor regii/institutii, fiindca el trebuie sa iti intocmeasca toate aceste documentatii cu care tu sau altcineva se va prezenta la aceste institutii.<br /> De ce zic altcineva, pentru ca de obicei arhitectul cunoaste persoane care stau pe la aceste institutii toata ziua si binenteles contra cost vor umbla ei pentru tine, de obicei taxeaza cam 50 RON per aviz. Daca ar fi sa o iau de la capat cu sigurantza Sanepid si E-ON Electrica le-as inmana unei asemenea persoane.<br /><br /> Toate aceste avize descrise mai sus au fost bifate in Certificatul de urbanism eliberat de Primaria IASI, asa ca nu uita verifica ceritificatul inainte sa incep sa fugi pe la regii, in principiu arhitectul care te va ajuta la intocmirea documentatie iti va zice exact ce avize iti trebuie.<br /><br /> Acum cand ai toate aceste avize arhitectul iti va intocmi un Memoriu General sub titlul de Plan Urbanistic zonal(PUZ), ce va fi compus dintr-un Memoriu de Prezentare si de Regulamentul Local de urbanism aferent PUZ.<br /><br />Va continua cu prezentarea si documentarea procesului de obtinere a autorizatiei PAC.<br /><br />
O recomand pe <strong>Slincu Daniela</strong> ca si persoana ce va poate ajuta sa obtineti PUZ-ul. O puteti contacta prin email la <strong>slincud@yahoo.com</strong>.</div>Marius Cristeahttp://www.blogger.com/profile/05797914930690354847noreply@blogger.com5