From b96a7a7a8c11d417d2f2dbab098b9be9021ce44a Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Fri, 6 Feb 2009 09:12:08 +0000 Subject: [PATCH] SPR-5460: Add AtomView sample to PetClinic --- org.springframework.samples.petclinic/ivy.xml | 1 + .../petclinic.iml | 216 ++++++++++++++++-- .../samples/petclinic/Visit.java | 2 +- .../petclinic/web/ClinicController.java | 20 +- .../samples/petclinic/web/VisitsAtomView.java | 82 +++++++ .../src/main/webapp/WEB-INF/jsp/owner.jsp | 8 + .../main/webapp/WEB-INF/petclinic-servlet.xml | 12 + .../petclinic/web/VisitsAtomViewTest.java | 90 ++++++++ 8 files changed, 407 insertions(+), 24 deletions(-) create mode 100644 org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/web/VisitsAtomView.java create mode 100644 org.springframework.samples.petclinic/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTest.java diff --git a/org.springframework.samples.petclinic/ivy.xml b/org.springframework.samples.petclinic/ivy.xml index 034ae084c61..0174102e230 100644 --- a/org.springframework.samples.petclinic/ivy.xml +++ b/org.springframework.samples.petclinic/ivy.xml @@ -19,6 +19,7 @@ + diff --git a/org.springframework.samples.petclinic/petclinic.iml b/org.springframework.samples.petclinic/petclinic.iml index 6d29da7ba42..b0463567bc5 100644 --- a/org.springframework.samples.petclinic/petclinic.iml +++ b/org.springframework.samples.petclinic/petclinic.iml @@ -73,17 +73,6 @@ - - - - - - - - - - - @@ -96,15 +85,6 @@ - - - - - - - - - @@ -145,6 +125,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/Visit.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/Visit.java index e1eb90ab232..c42bdcee5e5 100644 --- a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/Visit.java +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/Visit.java @@ -63,7 +63,7 @@ public class Visit extends BaseEntity { /** Setter for property pet. * @param pet New value of property pet. */ - protected void setPet(Pet pet) { + public void setPet(Pet pet) { this.pet = pet; } diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java index 120ac3f268c..5dd5edf7547 100644 --- a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java @@ -5,8 +5,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.samples.petclinic.Clinic; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; /** @@ -42,8 +43,8 @@ public class ClinicController { /** * Custom handler for displaying vets. - *

- * Note that this handler returns a plain {@link ModelMap} object instead of + * + *

Note that this handler returns a plain {@link ModelMap} object instead of * a ModelAndView, thus leveraging convention-based model attribute names. * It relies on the RequestToViewNameTranslator to determine the logical * view name based on the request URL: "/vets.do" -> "vets". @@ -68,4 +69,17 @@ public class ClinicController { return mav; } + /** + * Custom handler for displaying an list of visits. + * + * @param petId the ID of the pet whose visits to display + * @return a ModelMap with the model attributes for the view + */ + @RequestMapping(value="/owners/*/pets/{petId}/visits", method=RequestMethod.GET) + public ModelAndView visitsHandler(@PathVariable int petId) { + ModelAndView mav = new ModelAndView("visits"); + mav.addObject("visits", this.clinic.loadPet(petId).getVisits()); + return mav; + } + } diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/web/VisitsAtomView.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/web/VisitsAtomView.java new file mode 100644 index 00000000000..e9da832e4d7 --- /dev/null +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/web/VisitsAtomView.java @@ -0,0 +1,82 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.samples.petclinic.web; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.sun.syndication.feed.atom.Content; +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.feed.atom.Feed; + +import org.springframework.samples.petclinic.Visit; +import org.springframework.web.servlet.view.feed.AbstractAtomFeedView; + +/** + * A view creating a Atom representation from a list of Visit objects. + * + * @author Alef Arendsen + * @author Arjen Poutsma + */ +public class VisitsAtomView extends AbstractAtomFeedView { + + @Override + protected void buildFeedMetadata(Map model, Feed feed, HttpServletRequest request) { + feed.setId("tag:springsource.com"); + feed.setTitle("Pet Clinic Visits"); + @SuppressWarnings("unchecked") + List visits = (List) model.get("visits"); + for (Visit visit : visits) { + Date date = visit.getDate(); + if (feed.getUpdated() == null || date.compareTo(feed.getUpdated()) > 0) { + feed.setUpdated(date); + } + } + } + + @Override + protected List buildFeedEntries(Map model, + HttpServletRequest request, HttpServletResponse response) throws Exception { + + @SuppressWarnings("unchecked") + List visits = (List) model.get("visits"); + List entries = new ArrayList(visits.size()); + + for (Visit visit : visits) { + Entry entry = new Entry(); + String date = String.format("%1$tY-%1$tm-%1$td", visit.getDate()); + // see http://diveintomark.org/archives/2004/05/28/howto-atom-id#other + entry.setId(String.format("tag:springsource.com,%s:%d", date, visit.getId())); + entry.setTitle(String.format("%s visit on %s", visit.getPet().getName(), date)); + entry.setUpdated(visit.getDate()); + + Content summary = new Content(); + summary.setValue(visit.getDescription()); + entry.setSummary(summary); + + entries.add(entry); + } + + return entries; + + } + +} diff --git a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/jsp/owner.jsp b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/jsp/owner.jsp index 91d8578afcb..1a8432124e2 100644 --- a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/jsp/owner.jsp +++ b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/jsp/owner.jsp @@ -94,6 +94,14 @@ Add Visit + + + + + + + Atom Feed + diff --git a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/petclinic-servlet.xml b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/petclinic-servlet.xml index b7e8816ef6a..77798e75a0c 100644 --- a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/petclinic-servlet.xml +++ b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/petclinic-servlet.xml @@ -57,6 +57,18 @@ + + + + + +