Sunday, March 04, 2012

Spring-Web Service 2 Using JAXB and Maven Complete Tutorial


Note : This tutorial only covers simple setup and working code for Spring Web Service using Maven and JAXB.

Prerequisites
JDK 1.6
Eclipse Hellos
M2e plugin for Maven (get it from Eclipse marketplace)
Tomcat 7.0

JAXB plugin for Eclipse (get it from http://java.net/downloads/jaxb-workshop/IDE%20plugins/org.jvnet.jaxbw.zip)
or
JAXB Maven plugin (ref  :  http://www.altuure.com/2008/01/22/jaxb-quickstart-via-maven2/  and http://mojo.codehaus.org/jaxb2-maven-plugin/index.html)

Recommendation : first go through Spring-WS documentation 

Aim of the experiment 
Write a service for HR which will update leave request.
Input
Employee : employee number, first name, last name
Leave : start date, end date

Output
Status : status code, description

Step - 1
Create a maven project in Eclipse.
Here is my pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.hr</groupId>
<artifactId>holidayWSService</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>holidayService Spring-WS Application</name>
<url>http://www.springframework.org/spring-ws</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<finalName>holidayService</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<packagingExcludes>WEB-INF/web.xml</packagingExcludes>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.3.1</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<packageName>com.mycompany.hr.jaxb.model</packageName> <!-- The name of your generated source package -->
<outputDirectory>${basedir}/src/main/java</outputDirectory>
<schemaDirectory>${basedir}/src/main/resources/xsd</schemaDirectory>
<clearOutputDir>false</clearOutputDir>
<schemaFiles>hr.xsd</schemaFiles>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-test</artifactId>
<version>2.0.4.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.0.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

My Project structure :

Step 2
Write an XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:hr="http://mycompany.com/hr/schemas"
        elementFormDefault="qualified"
        targetNamespace="http://mycompany.com/hr/schemas">
    <xs:element name="LeaveRequest">
        <xs:complexType>
            <xs:all>
                <xs:element name="Leave" type="hr:LeaveType"/>
                <xs:element name="Employee" type="hr:EmployeeType"/>              
            </xs:all>
        </xs:complexType>
    </xs:element>
    <xs:element name="LeaveResponse">
        <xs:complexType>
            <xs:all>
                <xs:element name="Status" type="hr:StatusType"/>            
            </xs:all>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="LeaveType">
        <xs:sequence>
            <xs:element name="StartDate" type="xs:date"/>
            <xs:element name="EndDate" type="xs:date"/>              
        </xs:sequence>                                                    
    </xs:complexType>
    <xs:complexType name="EmployeeType">
        <xs:sequence>
            <xs:element name="Number" type="xs:integer"/>
            <xs:element name="FirstName" type="xs:string"/>
            <xs:element name="LastName" type="xs:string"/>    
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="StatusType">
        <xs:sequence>
            <xs:element name="StatusCode" type="xs:integer"/>
            <xs:element name="StatusDesc" type="xs:string"/>              
        </xs:sequence>                                                    
    </xs:complexType>
</xs:schema>

Step 3
Generate domain classes using JAXB

using JAXB Eclipse plugin


or using Maven plugin
(right click on project ) -> Run As --> Run configuration  [Goal s: jaxb2:xjc]

You can run "mvn jaxb2:xjc" through command line as well.
Warning : Please be careful while generating the JAXB files, it may delete your existing required files in the base folder. If it happens, then you may recover those files from Eclipse history, this may not recover fully.

Strp 4
update your configuration files

Here is my web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">
 
    <servlet>
        <servlet-name>spring-ws</servlet-name>
        <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
        <init-param>
      <param-name>transformWsdlLocations</param-name>
      <param-value>true</param-value>
    </init-param>      
    </servlet>  

    <servlet-mapping>
        <servlet-name>spring-ws</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>


Note : 1. "MessageDispatcherServlet" is configured
           2. "transformWsdlLocations" marked as true. Please ref to Spring-WS documentaion.

spring-ws-servlet.xml file

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sws="http://www.springframework.org/schema/web-services"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/web-services
        http://www.springframework.org/schema/web-services/web-services-2.0.xsd
        http://www.springframework.org/schema/oxm
        http://www.springframework.org/schema/oxm/spring-oxm-1.5.xsd
        http://www.springframework.org/schema/context                      
http://www.springframework.org/schema/context/spring-context-3.1.xsd"
xmlns:oxm="http://www.springframework.org/schema/oxm">

<context:annotation-config />
<context:component-scan base-package="com.mycompany.hr"/>
<sws:annotation-driven/>

<oxm:jaxb2-marshaller id="marshaller"
contextPath="com.mycompany.hr.jaxb.model" />
<!-- <sws:static-wsdl id="hr" location="wsdl/hr.wsdl"/> -->

<!-- If dynamic wsdl need to expose -->
<sws:dynamic-wsdl id="holiday" serviceName="leave"
portTypeName="HumanResource" locationUri="http://localhost:8082/holidayService/"
targetNamespace="http://mycompany.com/hr/definitions">
<sws:xsd location="classpath:/xsd/hr.xsd" />
</sws:dynamic-wsdl>

<bean id="exceptionResolver"
class="org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver">
<property name="defaultFault" value="SERVER" />
<property name="exceptionMappings">
<value>
org.springframework.oxm.ValidationFailureException=CLIENT,Invalid request
</value>
</property>
</bean>
</beans>
Note : 1. "<context:annotation-config/>" will look for all the annotated classes.
           2. "oxm:jaxb2-marshaller" looks for JAXB generated classes.
           3.  "sws:dynamic-wsdl" will create the wsdl file dynamically, but it's not recommended , once you get the wsdl from browser , change to static ""sws:static-wsdl" (ref: Spring-WS documentation).
          4. id="holiday" in "sws:dynamic-wsdl" , the wsdl will be exposed under "holiday.wsdl" (ref : Step 7)

Step 5
Writing the Endpoint and Service classes
Here is my Endpoint implementation class (HolidayEndPointImpl.java)

package com.mycompany.hr.ws;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

import com.mycompany.hr.jaxb.model.LeaveRequest;
import com.mycompany.hr.jaxb.model.LeaveResponse;
import com.mycompany.hr.service.HolidayService;

@Endpoint
public class HolidayEndpointImpl implements HolidayEndpoint{

private HolidayService holidayService;
@Autowired
public void setHolidayService(HolidayService holidayService) {
this.holidayService = holidayService;
}

@PayloadRoot(localPart = "LeaveRequest",namespace = "http://mycompany.com/hr/schemas")
@ResponsePayload
public LeaveResponse applyLeave(@RequestPayload LeaveRequest LeaveRequest){
return holidayService.applyHoliday(LeaveRequest);
}
}

Note: LeaveRequest and LeaveResponse classes are JAXB generated classes.

Here is my service implementation class (HolidayServiceImpl.java)

package com.mycompany.hr.service;

import java.math.BigInteger;

import org.springframework.stereotype.Service;

import com.mycompany.hr.jaxb.model.LeaveRequest;
import com.mycompany.hr.jaxb.model.LeaveResponse;
import com.mycompany.hr.jaxb.model.StatusType;

@Service
public class HolidayServiceImpl implements HolidayService{

@Override
public LeaveResponse applyHoliday(LeaveRequest leaveRequest) {
LeaveResponse leaveResponse = new LeaveResponse();
StatusType statusType = new StatusType();
if(leaveRequest.getLeave() == null){
statusType.setStatusCode(new BigInteger("1000"));
statusType.setStatusDesc("Leave Request Object missing");
leaveResponse.setStatus(statusType);
return leaveResponse;
}

if(leaveRequest.getLeave().getStartDate().compare(leaveRequest.getLeave().getEndDate()) > 0){
statusType.setStatusCode(new BigInteger("2000"));
statusType.setStatusDesc("Start Date should be before End Date");
leaveResponse.setStatus(statusType);
}else{
statusType.setStatusCode(new BigInteger("111"));
statusType.setStatusDesc("SUCCESS");
leaveResponse.setStatus(statusType);
}
return leaveResponse;
}

}

Step 6
Build and deploy in Tomcat

Step 7
Go to http://localhost:8082/holidayService/holiday.wsdl  (I have configured my tomcat for 8082 port)
Now you can see the wsdl file, you can use it for static loading. (ref: Step 4).

Step 8
Test the web-service.

For testing the web-service using  Eclipse plugin please ref : http://www.eclipse.org/webtools/jst/components/ws/1.0/tutorials/WebServiceExplorer/WebServiceExplorer.html

56 comments:

Anonymous said...

Thank You

Bharadwaj said...

Thanks for a detailed tutorial. Actually I have been working on writing a Spring Web Service but I am trying to expose the WSDL as a sws:static-wsdl. The WSDL itself gets exposed nicely but any of the local XSD files that it refers are not being exposed.

I have tried several approaches suggested in other posts but none worked for me.

I have the following in my spring-ws-servlet.xml



And my web.xml has the following


spring-ws
org.springframework.ws.transport.http.MessageDispatcherServlet


transformWsdlLocations
true

1




spring-ws
/services/*


My wsdl file imports other xsd as follows








Not sure what I am doing wrong??

I tried the sws:dinamic-wsdl approach too but it didn't work either !!

Anonymous said...

As a Newbie, I am constantly exploring online for articles that can

help me. Thank you
Here is my website work Placements in Fashion

Anonymous said...

A lot of thanks for your entire work on this website. Gloria

take interest in conducting

research and it is easy to see why. We all know all about the compelling method you

make worthwhile tricks via

the web blog and as well as

invigorate

participation from others on the content while my daughter is really studying a great
deal. Take advantage of the rest of

the year. Your carrying out a useful job.
Also visit my weblog :: vezha.kiev.ua

Anonymous said...

I get pleasure from, lead to I discovered just what I used to be having a look for.


You've ended my 4 day lengthy hunt! God Bless you man. Have a nice day. Bye
My blog post ... http://allseotipstricks.blogspot.fr/2011/09/seo-tips-and-tricks-latest-seo-tips.html?m=1

Anonymous said...

Would you be all for exchanging

hyperlinks?
Visit my blog : http://wiki.teilar.net/index.php?title=Συζήτηση_χρήστη:BrittenyThompson85

Anonymous said...

Fascinating blog! Is your theme custom made or did you download
it from

somewhere? A theme like yours with a few simple adjustements would really make my
blog

stand out. Please let me know where you got your theme. Many thanks
Visit my web page - spain smoking

Anonymous said...

It’s hard to search out knowledgeable folks on this topic, however you
sound like you

recognize what you’re talking about! Thanks
Check out my blog post : http://isusec.com/wiki/index.php?title=Greatest_Beaches_Within_France

Anonymous said...

As I web site possessor I believe the content matter here is
rattling wonderful , appreciate it for your efforts.
You should keep it up forever! Good Luck.
Also visit my web blog http://sweetrevenge.altervista.org/phpBB2/profile.php?mode=viewprofile&u=38778&sid=4a2950b88eb9d7929590a3a185b20149

Anonymous said...

Does your website have a contact page? I'm having trouble locating it but, I'd like to

send you an email. I've got some recommendations for your blog you

might be interested in hearing. Either way, great site and I look forward to seeing it improve over time.
Feel free to surf my website ... property uws

Anonymous said...

Nice post. I was checking constantly this blog and
I am impressed! Very

helpful info particularly the last part :) I care for such info much.

I was looking for this particular info for a long time.
Thank you and good luck.
Look at my webpage ; real estate lynn ma

Anonymous said...

Have you ever considered about including a little bit more than just your articles?
I mean, what you say

is important and all. Nevertheless think of if you added some great photos or
videos to give your posts more,

"pop"! Your content is excellent but with pics and clips,
this website could

definitely be one of the greatest in its niche. Wonderful blog!
my webpage :: www.myitiltemplates.com

Anonymous said...

hey there and thanks on your info - I’ve

certainly picked up something new from right here.
I did alternatively experience several technical points the use of

this web site, since I skilled to reload the website many
times prior to I could get it to load correctly. I

were considering in case

your web host is OK? Now not that I'm complaining, but

slow loading instances occasions will very frequently have an

effect on your placement in google and could injury your quality rating if advertising and ***********
Also see my web site > www.bomingz.com

Anonymous said...

Wow! Thank you! I constantly wanted to write on my

website something like that. Can I take a part of your post
to my

website?
Also see my web page - facultea.com

Anonymous said...

As I site possessor I believe the content material here is rattling magnificent ,
appreciate it for your hard work. You should keep it up forever!



Best of luck.
Look into my web-site - http://Wiki.Fassette.com

Anonymous said...

whoah this blog is excellent i love reading your articles.

Keep up the

good work! You know, lots of people are hunting around for this


information, you could help them greatly.
My web page - mouse click The up coming website

Anonymous said...

Hey there, You've done an excellent job.

I’ll certainly digg it and in my opinion suggest

to my friends. I'm confident they will be benefited
from this website.
Also visit my blog post Vilamartin valdeorras ruta das Covas

Anonymous said...

Would you be fascinated by exchanging

hyperlinks?
My webpage ; www.authenticlinks.com

Anonymous said...

hello!,I like your writing so much! share we communicate more about your post on AOL?
I

require an expert on this area to solve my problem. Maybe that's you! Looking forward to see you.
Also visit my web blog - HTTP://Essentialweb.asia/story.php?title=castellarsolar-just-how-much-does-it-cost-to-begin-a-solar-panel-system-for-your-property

Anonymous said...

Howdy this is kinda of off topic but I was wondering if blogs use
WYSIWYG editors or if you have to manually code with HTML.

I'm starting a blog soon but have

no coding skills so I wanted to get advice from someone with

experience. Any help would be greatly appreciated!
Also see my page: spannabis 2013 tickets

Anonymous said...

With havin so much written content do you ever run into any problems of plagorism

or copyright infringement? My website has a lot of exclusive content

I've either authored myself or outsourced but it looks like a lot of it is popping it up

all over the web without my authorization. Do you know any

methods to help stop content from being ripped off? I'd genuinely appreciate it.
My web site ; http://ajgbfkn.pdyeswnm.ofnrkx.zxvfxd.vzapc.forum.mythem.es/

Anonymous said...

Wonderful blog! I found it while surfing around on Yahoo News.
Do you have any

suggestions on how to get listed in Yahoo News? I've been trying for a while but I never seem to get there! Thank you
Here is my web site fishing uganik lake

Anonymous said...

Great paintings! This is the kind of information that are supposed to be
shared across the web. Disgrace on the

search engines for now not positioning this submit
upper! Come on

over and visit my web site . Thanks

=)
my web page: jcow.samuelseidel.eu

Anonymous said...

I've been browsing on-line greater than three hours lately, yet I never discovered any fascinating article like yours. It’s beautiful value sufficient for me. Personally, if all site owners and bloggers made just right content material as you did, the web will likely be much more useful than ever before.
Also see my web page :: http://animal-action.east.org.tw/userinfo.php?uid=492

Anonymous said...

of course like your web-site but you have to check the

spelling on quite a few of your posts. Several of
them are rife with spelling problems

and I find it very bothersome to tell the truth nevertheless I’ll surely come

back again.
Look into my website :: Travel News Dartford Bridge

Anonymous said...

advertising and ***********

with Adwords. Well I am including this RSS to my e-mail and could look out

for a lot extra of your respective fascinating content.
Make sure you update this once more very soon..
Look at my web page intellectual property law crimes

Anonymous said...

Hi there! I just wanted to ask if you ever have any trouble with hackers?


My last blog (wordpress) was hacked and I ended up losing several weeks
of hard work due

to no backup. Do you have any solutions to
protect against hackers?
My weblog :: www.apexblog.hu

Anonymous said...

you're really a good webmaster. The web site loading speed is incredible. It seems that

you're doing any unique trick. Moreover, The contents are masterpiece.
you've done a excellent job on this topic!
My web site :: fourthirds-user.com

Anonymous said...

You must participate in a contest for the most effective blogs on the web.
I will

recommend this site!
my web site: Property law issues

Anonymous said...

I'm not sure exactly why but this website is loading incredibly slow for

me. Is anyone else having this issue or is it a problem on my end? I'll check back later
and

see if the problem still exists.
Here is my web page - http://wiki.nasta.tv

Anonymous said...

I do not even know how I ended up here, but I thought this post was good.

I don't know who you are

but definitely you're going to a famous blogger if you aren't already ;) Cheers!
Feel free to surf my blog post www.shiur.com

Anonymous said...

Fantastic items from you, man. I've keep in mind your stuff

previous to and you are just too wonderful. I actually like what you have got right here,

really like what you are saying and the best way by

which you are saying it. You make

it enjoyable and you continue to care for to keep it

wise. I can not wait to learn far more from you. This is really a

great website.
My web site http://fadaf.de/wiki/index.php?title=Benutzer:ColbyHenry47

Anonymous said...

Please let me know if you're looking for a writer for your weblog. You

have some really great articles and I think I would be a good asset. If you ever want to take

some of the load off, I'd really like to write some articles
for your blog in

exchange for a link back to mine. Please blast me an email if interested.

Regards!
Here is my homepage azgefi.tmccsgytp.xpqgimn.qypvthu.loqu.forum.mythem.es

Anonymous said...

Normally I do not read article on blogs, but I would like to
say that this

write-up very forced me to try and do it! Your writing style has been amazed
me. Thanks, quite nice

post.
Also visit my blog - http://bloggotype.blogspot.fr

Anonymous said...

Good blog! I really love how it is easy on my eyes and the
data are well written.

I'm wondering how I might be notified whenever a new post has been made. I've subscribed

to your RSS which must do the trick! Have a nice day!
My site: Estimatedwebsite.co.uk

Anonymous said...

Have you ever considered about including a little bit more than
just your articles? I mean, what you say

is important and all. Nevertheless

imagine if you added some great photos or videos to give your posts more,


"pop"! Your content is excellent but with images and clips, this site
could

undeniably be one of the very best in its niche.


Amazing blog!
Feel free to visit my weblog - employment from piking paking job

Anonymous said...

I'm often to blogging and i actually appreciate your content. The article has really peaks my interest. I am going to bookmark your

website and hold checking for brand spanking new information.
Look at my page property cdbconnection.tableprefix is not defined

Anonymous said...

A lot of thanks for your entire efforts on this


web page. My mother

really loves making time for

internet research and it's simple to grasp why. Most of us learn all relating to the powerful mode you

give great steps by means of

this web site and

increase

participation from the others about this issue then my daughter is really understanding a lot of things. Enjoy the remaining portion of the year. You are carrying out a terrific job.
Also see my website :: senas.sklandymas.lt

Anonymous said...

I don’t even understand how I finished up here,

however I thought this post used to be good.
I

do not know who you might be however definitely you are going to a well-known blogger for those
who are not already ;) Cheers!
My web site - www.gloriouslinks.com

Anonymous said...

It is actually a nice and helpful piece of

information. I’m satisfied that you simply shared this
useful

information with us. Please stay us informed
like this. Thanks for sharing.
Also visit my weblog ... gratis-community.at

Anonymous said...

What i do not realize is actually how you are not actually much
more well-liked than

you might be right now. You are so intelligent.

You realize thus

significantly relating to this subject, produced me personally consider it from a


lot of varied angles. Its like men and women aren't fascinated unless it is one thing to

accomplish with Lady gaga! Your own stuffs excellent. Always maintain it up!
Look at my blog - www.yemle.com

Anonymous said...

Wow, incredible blog layout! How long have you been blogging for?


you made blogging look easy. The overall look of your site is wonderful,
as well as the content!
Take a look at my blog post :: Catral

Anonymous said...

Can I simply say what a reduction to seek out someone who

actually is aware of what theyre speaking about on the internet.
You

undoubtedly know the right way to carry a difficulty to

gentle and make it important. Extra people have to learn
this

and understand this aspect of the story. I
cant consider youre no more

standard because you

positively have the gift.
Also visit my weblog - pixnet.net

Anonymous said...

I don’t even know how I stopped up right here,

but I thought this put up was once great. I

don't understand who you're however

certainly you are going to a famous blogger for those
who are not already ;) Cheers!

Also visit my site http://gratis-community.at/story.php?id=892090

Anonymous said...

My spouse and I absolutely love your blog and find the

majority of your post's to be precisely what I'm

looking for. can you offer guest writers to write content
for you? I wouldn't mind writing

a post or elaborating on a lot of the subjects you write

concerning here. Again, awesome site!

Here is my web blog ... testphp.altervista.org

Anonymous said...

I just couldn't depart your website prior to suggesting that I extremely enjoyed the standard information a person provide for your visitors? Is going to be back often to check up on new posts

my web blog: http://cityadslive.com/blogs/viewstory/247004

Anonymous said...

I’ve read some good stuff here. Certainly worth bookmarking for revisiting.
I

surprise how much effort you put to create such a wonderful


informative site.

Look at my homepage - globalpostern.com

Anonymous said...

This really answered my downside, thank you!

Here is my page - http://Social.tyranitartube.net/GilbertSl

Anonymous said...

I have been examinating out many of your posts and it's clever stuff. I will

definitely bookmark your site.

my web site: ukbl.net

Anonymous said...

Howdy! I know this is kinda off topic however , I'd figured I'd ask.
Would you be interested in trading links or maybe guest

authoring a blog article or vice-versa? My site addresses a

lot of the same subjects as yours and I believe we could greatly benefit from each other.
If you are interested feel free to send me an email.
I look forward to

hearing from you! Fantastic blog by the way!

My site; http://myhotlatinas.com/members/clarindamorales1977/activity/1337

Anonymous said...

As I site possessor I believe the content material here is rattling magnificent
, appreciate it for your efforts. You should keep it up forever!


Best of luck.

Here is my page - Www.Gloriouslinks.com

Anonymous said...

Wonderful goods from you, man. I have understand your stuff previous to and

you are just too excellent. I really like what

you've acquired here, certainly like what you are saying and the way in which you

say it. You make it enjoyable and you still care for to keep it smart. I

cant wait to read much more from you. This is really a great site.

Feel free to surf to my web-site ... titanita.cirp.usp.br

Anonymous said...

Howdy! Do you know if they make any plugins to help with

SEO? I'm trying to get my blog to rank for some targeted keywords but I'm
not seeing very good

success. If you know of any please share. Thank you!


Here is my weblog ... riskanduncertainty.net

Anonymous said...

As I site possessor I believe the content material here is rattling magnificent , appreciate
it for your hard work. You should keep it up forever!

Best of luck.

Have a look at my blog - x10.mx

Anonymous said...

Hi! This post could not be written any better!


Reading through this post reminds me of my previous room mate!

He always kept talking

about this. I will forward this article to him.
Pretty sure he will have a good read.

Many thanks for sharing!

Also visit my blog translate.lorea.org

Anonymous said...

Excellent post however I was

wanting to know if you could write a litte more on this topic?

I'd be very grateful if you

could elaborate a little bit more. Appreciate it!

My blog post :: http://rasalnet.com/index.php?do=/profile-281/info