Completing the picture: Spring, OSGi, and the SpringSource Application Platform

Adrian Colyer

** Updated May 2nd with case study :- see the bottom of this post for details **
I'm sure most of you reading this blog will have seen the announcement of the SpringSource Application Platform yesterday. If not, be sure to check out Rob's blog post which describes some of the motivation, programming model, and roadmap.

A couple of common questions are being asked that I'd like to address straight away in this post. After that I'll describe two other exciting announcements that complement the SpringSource Application Platform itself but that didn't grab the headlines yesterday: the SpringSource Enterprise Bundle Repository and the Application Platform tools for Eclipse. Together these complete the story around OSGi-based enterprise application development with Spring.

The question I've heard several times over the last 24 hours is: what's wrong with OSGi - why can't we just use a vanilla OSGi Service Platform (such as Equinox, Felix, or Knopflerfish) instead of the SpringSource Application Platform?

There is absolutely nothing wrong with OSGi.

OSGi is a great foundation and service platform - that's why we and many others have chosen to build upon it. It's proven in a wide range of industries and applications, and underpins applications such as Eclipse and IBM's WebSphere as well as the middleware stacks of several other vendors.

Programming straight to the the OSGi specification APIs lacks some of the qualities we have come to expect for enterprise applications - such as the ability to use dependency injection and create applications that are easily unit and integration testable outside of the container. Programming straight to the OSGi specification APIs also forces you to deal at a relatively low level with the dynamics of the OSGi platform - what do you do when modules and services you depend on are stopped, started, installed, and updated at runtime? But there's no fundamental obstacle here that we weren't able to overcome with the Spring Dynamic Modules project. Applications built using Spring Dynamic Modules can run on any standard OSGi Service Platform, and we test all our builds against Equinox, Felix, and Knopflerfish. We are committed to ensuring that Spring Dynamic Modules and the Spring based programming model remain runtime neutral. That position will not change with the introduction of the SpringSource Application Platform.

There is also absolutely nothing wrong with existing enterprise libraries.

Well, ok. There are some cases that leave a little to be desired, but by and large we know how to make them work for enterprise application development needs.

So what's the problem then?

If OSGi works so well, and existing enterprise libraries are meeting our needs, then where's the problem? The difficulty comes when you try to combine an OSGi Service Platform with a set of existing enterprise libraries that weren't written with OSGi in mind. That's not the fault of OSGi, it's got a great model that provides for excellent modularity, versioning, and operational control. It's not the fault of the enterprise libraries either - they weren't written to run under OSGi. But the very things that make OSGi so attractive break assumptions that the developers of those enterprise libraries made. The modularity model of OSGi for example stops you seeing the private parts of other people's bundles. That's exactly what you want, until you realise that your enterprise library can no longer see your application types. Lots of things can break: from commons logging to jsps, tag libraries to data sources, load-time weaving to component scanning, resource loading to orm mapping. The list goes on… (Yes, you can get many of these things to work when you package your application code and all of the libraries it needs into a single bundle, but that's very much missing the point!).

This is why you see lots of people building on top of OSGi, but very few cases of passing OSGi benefits on into the application programming model (Eclipse RCP is a rare exception). When you build on top of OSGi, but don't necessarily expose that model for end user application development, you can build to the OSGi model and make things work. When you need to provide a platform on which large numbers of existing enterprise libraries can be used it's a different ball game. If we could just throw all that away and start again with libraries written explicitly for OSGi we'd be fine. We've made sure for example that the Spring Framework is fully able to run inside an OSGi Service Platform. But that's not a realistic proposition. Alternatively we could wait for the developers of existing libraries to convert them all to run under OSGi out of the box (as we have done with Spring). But what's the motivation for them to do that unless everyone else does it too? So we seem to be stuck in a chicken-and-egg situation. It's a problem that the OSGi Enterprise Expert Group has spent a lot of time discussing over the past year.
This is the problem that the SpringSource Application Platform solves :- it bootstraps enterprise application development into the world of OSGi by making standard OSGi bundles with standard OSGi semantics work with existing enterprise application libraries.

I'd also like to re-emphasize that the platform is not just about OSGi : the OSGi support is one of the features we're most excited about, but the SpringSource Application Platform is also an excellent server platform for deploying standard war files. We'll describe the benefits the platform offers in such scenarios in later postings.

Hopefully this post has helped to clear up some of the confusion surrounding exactly how the SpringSource Application Platform relates to OSGi. If you've been following along so far, you might have picked up on another lurking problem: it's all well and good to make existing enterprise libraries work under OSGi, but don't you need to turn all of their jar files into OSGi bundles in order to be able to deploy them? Yes you do. And it turns out that's a lot of work if you want to correctly version all of the imports and exports and ensure that you have correct symbolic names etc.. The good news is that for hundreds of commonly used enterprise applications libraries, we've done the hard work for you and made the OSGi-ready versions available in the SpringSource Enterprise Bundle Repository…

SpringSource Enterprise Bundle Repository

The SpringSource Enterprise Bundle Repository is both a repository that can be used from Ivy and Maven, and also an online searchable database of enterprise libraries. You'll find it at www.springsource.com/repository. You can browse for bundles by name, or just type in a search term to find bundles with matching names, exported packages, classes, or resources. You can also see the minimal (satisfying only the required dependencies) and maximal (satisfying as many of the optional dependencies as possible) transitive dependencies of any bundle.

From the FAQ:

"The SpringSource Enterprise Bundle Repository is a collection of open source libraries commonly used for developing enterprise Java applications with the Spring Framework. The repository contains jar files (bundles) and library definition (".libd") files. A library defines a collection of bundles that are often used together for some purpose (e.g. the "Spring Framework" library). There are hundreds of bundles contained in the repository."
The repository meets the following criteria:

  • Every jar file in the repository is a valid OSGi bundle. Any jar you download from the repository can be deployed as-is into an OSGi Service Platform and the SpringSource Application Platform. It can also be used as a regular jar file outside of OSGi.
  • Every bundle and library has full version information associated with it. The package export information for a bundle contains version information, and the package import information for a bundle contains full version range compatibility information.
  • The repository is transitively complete. The mandatory dependencies of any bundle are guaranteed to also be in the repository. Most of the optional dependencies of any bundle in the repository will also be present. The bundles listed in any library definition are guaranteed to be in the repository.
  • The repository is self-consistent. Before any artefact is uploaded to the repository, we verify that it can be installed, resolved, and started in an OSGi Service Platform (using the same profile as the SpringSource Application Platform) alongside all of the other bundles in the repository.
  • The repository can be used from Ivy and Maven based builds.

To maintain these guarantees we have put in place a governance model around the publishing of artefacts to the repository. There is a JIRA instance against which you can raise requests for additional libraries to be included and to report any problems (relating to OSGi manifests etc.) with existing published artefacts.

Application Development Tools:

So far we've discussed the Spring-based programming model for developing applications as OSGi bundles, the availability of enterprise libraries to deploy into an OSGi Service Platform, and a runtime (the SpringSource Application Platform) that enables these legacy libraries to work in an OSGi runtime. The missing piece of the puzzle is the developer tools that make the creation of OSGi-based applications easy.

Eclipse already has OSGi development tools built-in. Since every Eclipse plugin is also an OSGi bundle, the Eclipse PDE tools (Plugin Development Environment tools) can be used for OSGi application development. However, the fact that these tools were primarily designed for the development of Eclipse plugins shows through and there are a couple of common frustrations when using them for OSGi application development. One is that the META-INF/MANIFEST.MF file can only be placed at the root of the project - which doesn't work well with build tools such as Ivy and Maven, and the other is that you are restricted to a single target platform (collection of bundles to develop against) for your whole workspace. What *is* great about the PDE tools, and which you really need, is that they build the compilation classpath for your project from the OSGi manifest - so that you don't have differences in classpath and class visibility between compile, test, and runtimes.

Alongside the SpringSource Application Platform we've also released a set of Eclipse plugins (available from the SpringSource Application Platform download page) that makes the development of OSGi applications easier, especially applications targeted at the SpringSource Application Platform. Your META-INF/MANIFEST.MF file can be in any source directory, and the tools build the compilation classpath from the manifest entries. Instead of a single target platform though, you can associate your project with a SpringSource Application Platform server defined to Eclipse (using the WTP facilities). The classpath for your project is then derived from the import statements in your manifest, resolved against other bundle projects in your workspace and the bundles installed in the associated server. You get the exact same interpretation of your classpath and dependencies at compile time as you do at runtime. And of course, the normal "deploy to server" options work too.

Here's how the server looks when it's running inside Eclipse:

And this screenshot shows how the classpath is managed with a "Bundle Dependencies" classpath container. Notice how packages that you have not imported in your manifest file are greyed out to indicate that you can't currently access them.

Even better is how we're able to take advantage of OSGi's modularity. A set of projects (one per bundle) make up your application. When you change anything in the project, an additional incremental builder analyses the resources deltas and does a live update of the running bundle in the SpringSource Application Platform - so you're continually running with the latest code : every time, all the time. That's a great productivity boost and a great development experience.

Case Study

Matt Raible posted a blog entry about his adventures trying to get a Spring web application working under OSGi using Freemarker - without using the SpringSource Application Platform. This seemed like a good challenge application to test out what I said above about making existing enterprise libraries work. The good news is, this application runs very happily on the SpringSource Application Platform. Here are the steps I followed to make it work (total time, about 10 minutes):

  • Download the zip file from Matt's blog
  • Run 'mvn'
  • cp target/mpapp.war to the pickup directory of the Platform
  • Startup the platform: bin/startup.sh.

I got the following output to the console:

com.springsource.platform.deployer.core.DeploymentException: Unable to satisfy constraints of 'myapp' version '0.0.0':
Cannot resolve: myapp  Unsatisfied leaf constraints:
Bundle: myapp_0.0.0 - Import-Package: org.springframework.osgi.web.context.support; version="0.0.0"
Did you mean: 'org.springframework.osgi.context.support'?
Bundle: myapp_0.0.0 - Import-Package: freemarker.ext.servlet; version="0.0.0"
Did you mean: 'javax.servlet'?
Bundle: myapp_0.0.0 - Import-Package: freemarker.core; version="0.0.0"
Did you mean: 'org.hamcrest.core'?
Bundle: myapp_0.0.0 - Import-Package: freemarker.template; version="0.0.0"
Did you mean: 'org.antlr.tool'?
Bundle: myapp_0.0.0 - Import-Package: freemarker.cache; version="0.0.0"
Did you mean: 'org.apache'?

These are expected messages since I don't have freemarker or the osgi.web.context support bundles installed in the platform.

  • Go to http://www.springsource.com/repository. Type "freemarker" into the search box, find the one matching entry and click on the link to download it. Copy the downloaded bundle in repository/bundles/usr
  • Simplify the manifest to point to the new bundles and libraries on the platform. The original manifest looked like this:
Import-Package: javax.servlet,javax.servlet.http,javax.servlet.resources,javax.swing.tree,
javax.naming,org.w3c.dom,org.apache.commons.logging,javax.xml.parsers;resolution:=optional,
org.xml.sax;resolution:=optional,org.xml.sax.helpers;resolution:=optional,
org.springframework.osgi.web.context.support, org.springframework.context.support,
org.springframework.web.context, org.springframework.web.context.support,
org.springframework.web.servlet, org.springframework.web.servlet.mvc,
org.springframework.web.servlet.mvc.support, org.springframework.web.servlet.view,
org.springframework.ui, org.springframework.web.servlet.view.
freemarker, freemarker.cache,freemarker.core,freemarker.template,freemarker.ext.servlet

and I took it down to:

Import-Package: org.apache.commons.logging
Import-Library: org.springframework.spring;version="[2.5.4,3.0.0)"
Import-Bundle: com.springsource.freemarker;version="2.3.12"

When we know you are deploying a web application, the commonly required imports are automatically added at deployment time. Import-Library and Import-Bundle allow you to conveniently refer to libraries and bundles in a single statement. I also deleted the "Bundle-Classpath" entry as the application platform will automatically detect libraries in WEB-INF/lib and add them to the bundle classpath.

  • I edited web.xml and commented out the context-param declaration since there is no need to use a custom application context type here
  • Run 'mvn' again, and copy the myapp.war into the pickup directory.
  • The Application Platform automatically redeployed the application
  • Point a browser at http://localhost:8080/myapp/ …. SUCCESS!

I think this is a nice demonstration of the value proposition of the platform in smoothing the path of making enterprise libraries work under OSGi.

 

5 responses


  1. Question: If you're using Maven, won't you be in trouble any time you need a dependency which isn't in the repository (of which there are many and will always be many) because your artifactIds are different than the real artifact ids? For instance, I include an artifact from another repository (like some non-spring product) and it depends on commons-beanutils. Because the artifactIds are different, you'll end up with two versions of the same artifact because one of them will have an artifact id like com.springsource.commons-beanutils.


  2. AP - excellent idea. To demonstrate the power, is it possible to re-assemble Eclipse and run it under AP?


  3. Question: If you're using Maven, won't you be in trouble any time you need a dependency which isn't in the repository (of which there are many and will always be many) because your artifactIds are different than the real artifact ids?

    Dan, we've updated the FAQ on the repository site itself to address this question. Please see question 13: "I currently use the public Maven 2 repository to access my Spring JARs. How does this effect me?" (http://www.springsource.com/repository/app/faq#q13) and question 14: " Can I mix use of the SpringSource Bundle Repository with other artifact repositories, for example, the public Maven 2 repository?" ().

    Hope this helps clarify things,
    Regards, Adrian.


  4. On May 2, 2008 at 3:44 pm, Alexander Shvets said:

    AP - excellent idea. To demonstrate the power, is it possible to re-assemble Eclipse and run it under AP?

    Eclipse is "just" a set of bundles that run on top of Equinox. In principle therefore you could install all of the Eclipse bundles into the AP and have them run. At the heart of the AP the Equinox bundle we use is unmodified from the one that Eclipse distributes. There would be three technical considerations involved in getting this to work:

    1) Creating the structure that the Eclipse bundles expect to find (plugins and features directories) under the "repository/bundles/usr" AP repository location
    2) Resolving any conflicts with Equinox hooks (this one would definitely need some investigation). The reason that we can use Equinox unmodified, and that Eclipse can do the same, is that Equinox provides a large number of low-level hooks for customizing its behaviour. The AP takes advantage of these hooks to integrate its special features, and so does Eclipse. I don't know without investigation whether the two could easily co-exist.
    3) Providing a "par" file to install into the AP that would bootstrap Eclipse when run (this one should be relatively easy).

    Although running Eclipse the IDE on the AP would be of limited benefit (but an interesting demonstration), running Eclipse RCP applications, and especially Eclipse RAP applications is a very attractive proposition. Both of these use an OSGi-based development model and deploy most naturally to an OSGi-based runtime. This should make the AP the natural home for deploying and running Rich Internet Applications written using Eclipse RAP. We have yet to develop this support, but it is certainly a direction of interest for us.


  5. hei!

    i chatted with you at the booth and i have been looking at the documentation since. one thing i didn't ask about …

    context:
    (1) you showed how a web application can (via spring configuration) be wired to a named service with a given interface type), the instance of which was provided by a bundle.
    (2) you also showed how a bundle can import packages and bundles.

    question: can a bundle import a service (according to interface type) like the application, rather than just importing a package or a bundle? obviously, the dependent bundle must import the package (associated with the service interface type) or the bundle (which contains the service interface type), but a bundle which advertises a service dependency must do more than just import a package or a bundle because it doesn't necessarily know how to do anything with that service type other than invoke methods on it.

    am i making any sense?

    the answer might already be out there, but i need some dope now.

    -jonnie

One trackback

Leave a Reply

Quote selected text

buy viagra
generic viagra
buy viagra online
cheap viagra
free viagra
viagra prescription
viagra online stores
viagra online
viagra side effects
viagra for women
order viagra
herbal viagra
viagra for sale
discount viagra
viagra sale
viagra uk
natural viagra
viagra without prescription
buy cheap viagra
female viagra
cheapest viagra prices
buy generic viagra
cheap generic viagra
free viagra sample
viagra canada
try viagra for free
viagra pills
side effects of viagra
order viagra online
viagra 6 free samples
viagra alternative
viagra on line
cialis vs viagra
purchase viagra online
can viagra causes legs to ache
what is generic viagra
buying viagra online
buy viagra meds online
viagra no prescription
buy viagra online 35008
viagra soft tabs
viagra dosage
low cost viagra
buy viagra cheap
viagra uterine thickness
viagra alternatives
viagra vs cialis
viagra samples
online viagra
viagra over the counter
viagra from india
viagra lawyers
buy viagra now
viagra stories
buy viagra on line
viagra attorneys
viagra mexico
viagra free trial
canadian viagra
viagra prices
buy viagra australia
viagra covered by insurance
viagra substitute
splitting viagra
viagra patent
free sample prescription for viagra
viagra oral jelly
viagra reviews
viagra jokes
womens viagra
viagra pharmacy
viagra 100mg
cialis levia and viagra
legal viagra
fda on viagra
over the counter viagra
viagra pill
viagra generic
generic name of viagra
viagra overnight
buying viagra
cheap herbal viagra
cheapest viagra
viagra blood pressure
viagra cheap
viagra sample
viagra overdose
prescription for viagra
effects of viagra on women
generic viagra india
pfizer viagra
mail order viagra
viagra buy
viagra and cialis
u 3312 viagra cialis
cialis viagra
what does viagra do to females
ladies viagra
buy online viagra
buy viagra per pill
free sites computer search viagra find
on viagra
viagra women
online viagra store
cuddle chemical viagra boosts performance
viagra patent pfizer
viagra boosts chemical cuddle performance
viagra facts
viagra from usa
bad side effects of viagra
buy viagra order viagra
free viagra samples
viagra online cheap
viagra fuerteventura market
free sample viagra
no prescription viagra
best price for generic viagra
viagra and alcohol
viagra free pills
what is viagra
viagra price
viagra cialis
order 50mg viagra
viagra side affects
viagra potenzmittel
impotence viagra
can women take viagra
viagra cialis levitra
buy cheap viagra online uk
viagra experiences
viagra results
viagra low cost
order cheap viagra fas
viagra versus cialis
non prescription viagra
free trial of viagra
purchase viagra
viagra effekter biverkningar
herbal viagra australia
viagra generic brand
buy viagra ups
low cost viagra online
viagra 50 mg
viagra testosterone
recreational viagra use
viagra viagra
viagra times
where to buy viagra
buy viagra onli
generic viagra mexico
viagra commercial
viagra boosts chemical cuddle
viagra attorney ohio
gernic viagra
buy viagra pill
uk viagra sales
viagra online uk
mexico pharmacy generic viagra
herbal v viagra study
viagra and discovery
drinking and viagra
songs about viagra
viagra natural
viagra effects on women
viagra fuerteventura
generic viagra overnight
viagra forum
viagra sverige
death by viagra
cheapest viagra in uk
mexican viagra
viagra sales
uprima cialis viagra
viagra faq
discounted viagra
buy viagra online australia
generic viagra pill
buy viagra uk
side effects from viagra
viagra no prior prescription
viagra cartoon
viagra lawyer columbus
viagra blindness
buy viagra online inu
viagra effects
viagra as ergogenic aid
find viagra free computer sites
cost of viagra
viagra info
best natural viagra
women viagra
guaranteed cheapest viagra
viagra sex
get viagra
viagra lawyer ohio
viagra attorney columbus
viagra jelly
buy viagra online 35008 buy
viagra free sites computer find
free samples of viagra
cialis super viagra
canada viagra
buy viagra australian
2007 viagra hmo
effects of viagra
is there a female viagra
viagra substitutes
dangers of viagra
cheap viagra online
viagra or cealis
natural alternative to viagra
bought viagra fuerteventura
pharmacy viagra
videos viagra
find sites computer shop viagra free
acheter du viagra
cialis v s viagra
viagra sales uk
buy sublingual viagra online
viagra free sample
fake viagra
viagra for woman
does viagra work
order discount viagra
viagra st
viagra for cheap
cialis new viagra
best herbal viagra
what does viagra do
viagra next day delivery
buy viagra without prescription
viagra use
viagra litigation
free viagra online
india viagra
buy australian viagra
free viagra samples before buying
discount viagra pills
t 84 viagra
viagra warning
viagra instructions
viagra from canada
viagra free sites computer find search
viagra find sites computer search
sublingual viagra
impotence and viagra
viagra max complaints
vicodin viagra
viagra beneficial side effects
viagra and nitrous oxide
viagra testimonials
apcalis levitra viagra
viagra for men
find viagra free sites computer
cialis versus viagra
discount viagra online
free viagra without prescription
generic viagra overnight delivery
viagra cialis generica
find viagra free sites edinburgh
find viagra free sites
viagra tolerance
generic viagra online
viagra discounts
viagra online no rx comparison
getting viagra in the philippines
money order viagra
viagra australia
viagra find free computer sites pages
viagra price strategy
viagra discount
can viagra cause restless leg syndrome
women and viagra
find sites computer shop viagra search
buy viagra in canada
rate generic viagra
free viagra canadian pharmacy
viagra retail discount
viagra online overnight delivery
soft viagra
viagra online no rx
dog ate viagra tablet any danger
generic viagra cheap
compare viagra
viagra suppositories ivf
viagra vs levitra
qry viagra
buy viagra in uk
discount generic viagra
viagra dosing
viagra illegal phillipines
viagra bon marche
viagra free samples
viagra 50mg
generisch viagra
buy discount viagra online
detumescence priapism viagra
q viagra meta
harm of expired viagra
viagra news edinburgh comment moo
viagra ad
viagra experience
viagra sideffects
viagra type drugs
viagra works
viagra online shop in uk
viagra paypal
viagra pay with paypal
buying viagra online uk
rapid tabs viagra
is viagra from india safe
cheapest price for viagra
online ed drugs viagra samples package
viagra shelf life
get viagra drug online
diabetes and viagra
viagra overnight delivery
viagra song
viagra sex domination
female viagra cream
viagra purchase online
what is better viagra or levitra
non presciption viagra replacements
adverse side effects of viagra
viagra logo
discount priced viagra
cheap viagra nz
womens viagra
women does viagra work
viagra ingredients
does viagra really work
viagra uk 32
is viagra safe for women
indian viagra
viagra free sites computer find online
mixing vicodin viagra
cialis or viagra
zenerx natural viagra
viagra effect women
edinburgh uk news viagra site search
canadian generic viagra
prescription free viagra
viagra buy online
viagra herbal substitute
pleasure viagra
where to buy viagra on line
viagra dosage recomendation
buy viagra by pill
free sample of viagra
women taking viagra
viagra purchase
where can i get free viagra
arlene farmer viagra
q viagra search
oyster viagra
ge n eric viagra
viagra federal express
viagra sildenafil citrate information
viagra ads funny
viagra levitra cialis pharmacist perscription drugs
counterfeit viagra
search viagra free sites find computer
mode demploi viagra
discount viagra in the usa
viagra pics
lialda viagra
wild horses viva viagra
viagra equivalent
viagra directions
viagra joke
natural viagra substitutes
viagra generico impotencia
garlic better than viagra
query viagra
effects of viagra mixed with cocaine
buy cheap viagra online
viagra does not work
viagra from canada legitimate
ending viagra use
counterfeit viagra abu dhabi
where to buy viagra online
viagra manufacturer
viagra side effects dangers
viagra users discussion
generic price viagra
buy taladafil viagra
viagra cialis delivery
viagra recreational
buy viagra in bangkok
generic viagra soft tab fast
viagra online no prescription
viagra covered california hmo
viagra forums
viagra 50mg sverige
viagra boosts post cuddle chemical
teenney transplant and viagra
lowest prices viagra
viagra picture funny
viagra for pulmonary hypertension
colleagues viagra
search viagra pages computer find
viagra boots
what to know about viagra jelly
cheap viagra overnight
song viagra in the water
viagra for doggies
viagra free sites computer edinburgh find
q viagra kgs 0 kls 0
viagra cheap no prescription
find search viagra edinburgh free
find viagra free sites edinburgh computer
viagra next day shipment
viagra free trials
free sample viagra vs cialis
online viagra prescriptions
dosage viagra
pn 1 viagra
mail order viagra in uk
viagra information
viagra mail order uk
viagra tutorial
viagra sildenafil citrate
compare cialis and viagra
woman taking viagra
viagra supplement
compare cialis viagra levitra
best price for viagra
niacin works like viagra
from generic india viagra
viagra ads
phentermine viagra
cheapest generic viagra
free samples viagra
newsletter viagra
ordering viagra
cheap generic viagra no script
viagra generique
health net viagra non-formulary cost
viagra on line uk
cialis and viagra together
order pfizer viagra with mastercard
atenolol viagra
buy viagra online without prescription
womans viagra
compare cilalis and viagra
herbal viagra uk
viagra gel
free herbal viagra samples
disp no 19105 viagra
viagra and women
viagra on-line
viagra coverage california
viagra news edinburgh comment search
viagra etc
otc viagra
cialis viagra combo
viagra use of
viagra product strategy
affects of viagra
viagra eyes
viagra and cocaine
viagra best prices
generic viagra canada
viagra cost
mail order for viagra tablets
viagra mail order
viagra edinburgh find search free
generic sample viagra
find viagra free sites search
viagra comparison prices online
viagra jet lag
negative side affects of viagra
habituate viagra
viagra cartoons
semen turns yellow viagra
find viagra free sites computer edinburgh
viagra free sites find computer
cialis viagra sampler
c-ring viagra
next dat delivery generic viagra
gay viagra stories
viagra pay by e-check
viagra price comparison
take cialis and viagra together
overnight viagra
free sample pack of viagra
q viagra
viagra penis size
viagra free sites computer edinburgh
herbal viagra replacements
viagra ejaculation
multiple acts viagra
free viagra sample viagra sample
salis vs viagra
find viagra free sites edinburgh search
q viagra btng search meta
viagra without a prescription
health net viagra
mexico viagra
can i take viagra
edinburgh uk viagra news comment moo
viagra oral sex
viagra usage
viagra wholesale
viagra urethral
find search edinburgh viagra phentermine
buy cheap viagra online u
viagra pictures
tia viagra
viagra in mexico
viagra not working
viagra rss feed
viagra generico
does viagra lower blood pressure
online phamacy viagra
articles of counterfeit viagra
viagra canada satisfaction guarantee
edinburgh search pages viagra report
phillip stricker viagra trial
cialis canada online pharmacy viagra
viagra 50 mg or 100mg
viagra and marijuana
viagra tiajuana
longer sex with viagra
viagra levitra compared
viagra dose
best buy viagra
counterfeit viagra identify four package
viagra pills cod
viagra sales mexico
info on viagra
viagra danger dogs
viagra commercial girl
viagra discussion
ed viagra
womans viagra
which is better lavitra or viagra
side effects of teenren using viagra
india generic viagra on line sales
color of viagra
order viagra online no rx prescription
free sites computer viagra find
taking viagra and adderall together
expired viagra
no prescription cheap viagra
find viagra free sites computer search
viagra and altace
pt 141 viagra
buy viagra in mexico
recreational viagra
ref hth q viagra
viagra discount online
peruvian viagra
viagra wikipedia
generic form of viagra
viagra find sites computer href
edinburgh report pages search viagra
apcalis vs viagra
buy viagra online uk
hair growth with viagra
viagra free sites computer find href
edinburgh pages search viagra report
viagra otc
viagra uk purchase
viagra 20online 20stores
pharmacy viagra fuerteventura
viagra benefits
find viagra free sites computer href
viagra sex games
purchase viagra in australia
viagra online in canada
viagra supplier
viagras ad campaign
formula for viagra
snorting viagra
edinburgh viagra tid search charles linskaill
viagra availability at boots
does viagra work for woman
viagra news
one great passion viagra commercial
free viagra order online
sydney australia legal viagra
viagra coupon
viagra headache
find how to use viagra
buy canada viagra
buy viagra in england
gay men viagra vs cialis
compare viagra prices
buy viagra from canada
viagra worldcanada
generic name viagra
search viagra edinburgh phentermine find
viagra car decals
generico viagra
he took viagra and fucked me
viagra for sale in eastbay california
pic viagra woman
viagra cost per pill in mexico
buy cheap viagra in uk
premature ejaculation viagra
generic brands of viagra online
viagra label
voto eletronico viagra eleitores passivos
taking more than 100 mg viagra
viagra erection
side affects viagra
recreational use of viagra
funny viagra gif
brand viagra without prescription
cialis viagra comparisons
viagra nation
generic viagra buy
viagra online store
buy viagra in amsterdam
150 mg viagra
viagra tablets
topamax viagra
viagra and jokes
buying viagra in new zealand
viagra find sites computer free
phpjunkyard free lawyer viagra pills penis
viagra discount retail
what happens when you take viagra
boots viagra
cheapest place to buy viagra
viagra enzyte combo
viagra joke of the day
alcohol with viagra
viagra for sale online
que sabes del viagra
viagra online pharmacy
genric viagra
cheap online generic viagra
viagra porn
viagra levitra cialis
cycling performance viagra
buy viagra $8 per pill
find search viagra free computer sites
viagra professional
hl en q viagra
uk pharmacies cheap viagra
best generic viagra prices
viagra meltabs
viagra nz
viagra side effect
real viagra
free viagra si