From 1b7b141396d540957d1806719d403181da741828 Mon Sep 17 00:00:00 2001 From: jamesagnew Date: Tue, 8 Jul 2014 08:44:13 -0400 Subject: [PATCH] Tester improvements --- .../uhn/fhir/narrative/narratives.properties | 3 + .../fhir/narrative/title/Organization.html | 4 + ...efaultThymeleafNarrativeGeneratorTest.java | 16 + .../java/ca/uhn/fhir/jpa/dao/BaseFhirDao.java | 331 +++++++++--------- .../ca/uhn/fhir/jpa/dao/FhirResourceDao.java | 4 + .../ca/uhn/fhir/jpa/dao/FhirSystemDao.java | 3 +- .../main/java/ca/uhn/fhir/jpa/dao/IDao.java | 7 + .../ca/uhn/fhir/jpa/dao/IDaoListener.java | 7 + .../ca/uhn/fhir/jpa/dao/IFhirResourceDao.java | 4 +- .../ca/uhn/fhir/jpa/dao/IFhirSystemDao.java | 2 +- .../jpa/provider/JpaConformanceProvider.java | 24 +- .../ca/uhn/fhirtest/TestRestfulServer.java | 6 +- .../main/webapp/WEB-INF/templates/about.html | 2 +- .../webapp/WEB-INF/templates/tmpl-head.html | 2 - .../src/main/webapp/js/RestfulTester.js | 10 +- .../src/main/webapp/js/moment.min.js | 6 + .../ca/uhn/fhir/jpa/test/OverlayTestApp.java | 6 +- 17 files changed, 263 insertions(+), 174 deletions(-) create mode 100644 hapi-fhir-base/src/main/resources/ca/uhn/fhir/narrative/title/Organization.html create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IDao.java create mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IDaoListener.java create mode 100644 hapi-fhir-testpage-overlay/src/main/webapp/js/moment.min.js diff --git a/hapi-fhir-base/src/main/resources/ca/uhn/fhir/narrative/narratives.properties b/hapi-fhir-base/src/main/resources/ca/uhn/fhir/narrative/narratives.properties index f9afc4ad70b..dedb24ab88c 100644 --- a/hapi-fhir-base/src/main/resources/ca/uhn/fhir/narrative/narratives.properties +++ b/hapi-fhir-base/src/main/resources/ca/uhn/fhir/narrative/narratives.properties @@ -49,6 +49,9 @@ diagnosticreport.title=classpath:ca/uhn/fhir/narrative/title/DiagnosticReport.ht encounter.class=ca.uhn.fhir.model.dstu.resource.Encounter encounter.title=classpath:ca/uhn/fhir/narrative/title/Encounter.html +organization.class=ca.uhn.fhir.model.dstu.resource.Organization +organization.title=classpath:ca/uhn/fhir/narrative/title/Organization.html + patient.class=ca.uhn.fhir.model.dstu.resource.Patient patient.narrative=classpath:ca/uhn/fhir/narrative/Patient.html patient.title=classpath:ca/uhn/fhir/narrative/title/Patient.html diff --git a/hapi-fhir-base/src/main/resources/ca/uhn/fhir/narrative/title/Organization.html b/hapi-fhir-base/src/main/resources/ca/uhn/fhir/narrative/title/Organization.html new file mode 100644 index 00000000000..b4fe3fe21b1 --- /dev/null +++ b/hapi-fhir-base/src/main/resources/ca/uhn/fhir/narrative/title/Organization.html @@ -0,0 +1,4 @@ +
+ + Unknown Organization +
\ No newline at end of file diff --git a/hapi-fhir-base/src/test/java/ca/uhn/fhir/narrative/DefaultThymeleafNarrativeGeneratorTest.java b/hapi-fhir-base/src/test/java/ca/uhn/fhir/narrative/DefaultThymeleafNarrativeGeneratorTest.java index 200e939cb49..16ffbacada3 100644 --- a/hapi-fhir-base/src/test/java/ca/uhn/fhir/narrative/DefaultThymeleafNarrativeGeneratorTest.java +++ b/hapi-fhir-base/src/test/java/ca/uhn/fhir/narrative/DefaultThymeleafNarrativeGeneratorTest.java @@ -20,6 +20,7 @@ import ca.uhn.fhir.model.dstu.resource.Conformance; import ca.uhn.fhir.model.dstu.resource.DiagnosticReport; import ca.uhn.fhir.model.dstu.resource.Encounter; import ca.uhn.fhir.model.dstu.resource.Observation; +import ca.uhn.fhir.model.dstu.resource.Organization; import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.valueset.DiagnosticReportStatusEnum; import ca.uhn.fhir.model.dstu.valueset.EncounterClassEnum; @@ -89,6 +90,21 @@ public class DefaultThymeleafNarrativeGeneratorTest { } + @Test + public void testGenerateOrganization() throws DataFormatException { + Organization enc = new Organization(); + + enc.addIdentifier("urn:visits", "1234567"); + enc.setName("Some Test Org"); + enc.addAddress().addLine("123 Fake St").setCity("Toronto").setState("ON").setCountry("Canada").setZip("12345"); + + String title = gen.generateTitle(enc); + assertEquals("Some Test Org", title); + ourLog.info(title); + + } + + @Test public void testGenerateServerConformance() throws DataFormatException { Conformance value = myCtx.newXmlParser().parseResource(Conformance.class, new InputStreamReader(getClass().getResourceAsStream("/server-conformance-statement.xml"))); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseFhirDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseFhirDao.java index 82fcc764634..39618a8e693 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseFhirDao.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseFhirDao.java @@ -27,6 +27,7 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.tuple.Pair; import org.springframework.beans.factory.annotation.Autowired; @@ -78,37 +79,28 @@ import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; -public abstract class BaseFhirDao { +public abstract class BaseFhirDao implements IDao { + + private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseFhirDao.class); + + @Autowired(required = true) + private DaoConfig myConfig; @Autowired(required = true) private FhirContext myContext; @PersistenceContext(name = "FHIR_UT", type = PersistenceContextType.TRANSACTION, unitName = "FHIR_UT") private EntityManager myEntityManager; + private List myListeners = new ArrayList(); + @Autowired private List> myResourceDaos; private Map, IFhirResourceDao> myResourceTypeToDao; - protected void loadResourcesById(Set theIncludePids, List theResourceListToPopulate) { - Set pids = new HashSet(); - for (IdDt next : theIncludePids) { - pids.add(next.getIdPartAsLong()); - } - - CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); - CriteriaQuery cq = builder.createQuery(ResourceTable.class); - Root from = cq.from(ResourceTable.class); - // cq.where(builder.equal(from.get("myResourceType"), - // getContext().getResourceDefinition(myResourceType).getName())); - // if (theIncludePids != null) { - cq.where(from.get("myId").in(pids)); - // } - TypedQuery q = myEntityManager.createQuery(cq); - - for (ResourceTable next : q.getResultList()) { - IResource resource = toResource(next); - theResourceListToPopulate.add(resource); + protected void notifyWriteCompleted() { + for (IDaoListener next : myListeners) { + next.writeCompleted(); } } @@ -116,16 +108,67 @@ public abstract class BaseFhirDao { return myContext; } + @Override + public void registerDaoListener(IDaoListener theListener) { + Validate.notNull(theListener, "theListener"); + myListeners.add(theListener); + } + public void setContext(FhirContext theContext) { myContext = theContext; } - protected DaoConfig getConfig() { - return myConfig; + private void findMatchingTagIds(String theResourceName, IdDt theResourceId, Set tagIds, Class entityClass) { + { + CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); + CriteriaQuery cq = builder.createTupleQuery(); + Root from = cq.from(entityClass); + cq.multiselect(from.get("myTagId").as(Long.class)).distinct(true); + + if (theResourceName != null) { + Predicate typePredicate = builder.equal(from.get("myResourceType"), theResourceName); + if (theResourceId != null) { + cq.where(typePredicate, builder.equal(from.get("myResourceId"), theResourceId.getIdPartAsLong())); + } else { + cq.where(typePredicate); + } + } + + TypedQuery query = myEntityManager.createQuery(cq); + for (Tuple next : query.getResultList()) { + tagIds.add(next.get(0, Long.class)); + } + } } - @Autowired(required = true) - private DaoConfig myConfig; + private void searchHistoryCurrentVersion(List theTuples, List theRetVal) { + Collection tuples = Collections2.filter(theTuples, new com.google.common.base.Predicate() { + @Override + public boolean apply(HistoryTuple theInput) { + return theInput.isHistory() == false; + } + }); + Collection ids = Collections2.transform(tuples, new Function() { + @Override + public Long apply(HistoryTuple theInput) { + return theInput.getId(); + } + }); + if (ids.isEmpty()) { + return; + } + + CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); + CriteriaQuery cq = builder.createQuery(ResourceTable.class); + Root from = cq.from(ResourceTable.class); + cq.where(from.get("myId").in(ids)); + + cq.orderBy(builder.desc(from.get("myUpdated"))); + TypedQuery q = myEntityManager.createQuery(cq); + for (ResourceTable next : q.getResultList()) { + theRetVal.add(next); + } + } private void searchHistoryCurrentVersion(String theResourceName, Long theId, Date theSince, Date theEnd, Integer theLimit, List tuples) { CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); @@ -165,31 +208,33 @@ public abstract class BaseFhirDao { } } - private void searchHistoryCurrentVersion(List theTuples, List theRetVal) { + private void searchHistoryHistory(List theTuples, List theRetVal) { Collection tuples = Collections2.filter(theTuples, new com.google.common.base.Predicate() { @Override public boolean apply(HistoryTuple theInput) { - return theInput.isHistory() == false; + return theInput.isHistory() == true; } }); Collection ids = Collections2.transform(tuples, new Function() { @Override public Long apply(HistoryTuple theInput) { - return theInput.getId(); + return (Long) theInput.getId(); } }); if (ids.isEmpty()) { return; } + ourLog.info("Retrieving {} history elements from ResourceHistoryTable", ids.size()); + CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); - CriteriaQuery cq = builder.createQuery(ResourceTable.class); - Root from = cq.from(ResourceTable.class); + CriteriaQuery cq = builder.createQuery(ResourceHistoryTable.class); + Root from = cq.from(ResourceHistoryTable.class); cq.where(from.get("myId").in(ids)); cq.orderBy(builder.desc(from.get("myUpdated"))); - TypedQuery q = myEntityManager.createQuery(cq); - for (ResourceTable next : q.getResultList()) { + TypedQuery q = myEntityManager.createQuery(cq); + for (ResourceHistoryTable next : q.getResultList()) { theRetVal.add(next); } } @@ -232,39 +277,6 @@ public abstract class BaseFhirDao { } } - private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseFhirDao.class); - - private void searchHistoryHistory(List theTuples, List theRetVal) { - Collection tuples = Collections2.filter(theTuples, new com.google.common.base.Predicate() { - @Override - public boolean apply(HistoryTuple theInput) { - return theInput.isHistory() == true; - } - }); - Collection ids = Collections2.transform(tuples, new Function() { - @Override - public Long apply(HistoryTuple theInput) { - return (Long) theInput.getId(); - } - }); - if (ids.isEmpty()) { - return; - } - - ourLog.info("Retrieving {} history elements from ResourceHistoryTable", ids.size()); - - CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); - CriteriaQuery cq = builder.createQuery(ResourceHistoryTable.class); - Root from = cq.from(ResourceHistoryTable.class); - cq.where(from.get("myId").in(ids)); - - cq.orderBy(builder.desc(from.get("myUpdated"))); - TypedQuery q = myEntityManager.createQuery(cq); - for (ResourceHistoryTable next : q.getResultList()) { - theRetVal.add(next); - } - } - protected List extractResourceLinks(ResourceTable theEntity, IResource theResource) { ArrayList retVal = new ArrayList(); @@ -424,8 +436,7 @@ public abstract class BaseFhirDao { if (nextObject instanceof QuantityDt) { QuantityDt nextValue = (QuantityDt) nextObject; - ResourceIndexedSearchParamNumber nextEntity = new ResourceIndexedSearchParamNumber(resourceName, nextValue.getValue().getValue(), nextValue.getSystem().getValueAsString(), - nextValue.getUnits().getValue()); + ResourceIndexedSearchParamNumber nextEntity = new ResourceIndexedSearchParamNumber(resourceName, nextValue.getValue().getValue(), nextValue.getSystem().getValueAsString(), nextValue.getUnits().getValue()); nextEntity.setResource(theEntity); retVal.add(nextEntity); } else { @@ -513,8 +524,7 @@ public abstract class BaseFhirDao { } else if (nextObject instanceof ContactDt) { ContactDt nextContact = (ContactDt) nextObject; if (nextContact.getValue().isEmpty() == false) { - ResourceIndexedSearchParamString nextEntity = new ResourceIndexedSearchParamString(resourceName, normalizeString(nextContact.getValue().getValueAsString()), nextContact - .getValue().getValueAsString()); + ResourceIndexedSearchParamString nextEntity = new ResourceIndexedSearchParamString(resourceName, normalizeString(nextContact.getValue().getValueAsString()), nextContact.getValue().getValueAsString()); nextEntity.setResource(theEntity); retVal.add(nextEntity); } @@ -605,8 +615,8 @@ public abstract class BaseFhirDao { } assert systems.size() == codes.size() : "Systems contains " + systems + ", codes contains: " + codes; - - Set> haveValues = new HashSet>(); + + Set> haveValues = new HashSet>(); for (int i = 0; i < systems.size(); i++) { String system = systems.get(i); String code = codes.get(i); @@ -621,12 +631,12 @@ public abstract class BaseFhirDao { code = code.substring(0, ResourceIndexedSearchParamToken.MAX_LENGTH); } - Pair nextPair = Pair.of(system,code); + Pair nextPair = Pair.of(system, code); if (haveValues.contains(nextPair)) { continue; } haveValues.add(nextPair); - + ResourceIndexedSearchParamToken nextEntity; nextEntity = new ResourceIndexedSearchParamToken(nextSpDef.getName(), system, code); nextEntity.setResource(theEntity); @@ -641,6 +651,10 @@ public abstract class BaseFhirDao { return retVal; } + protected DaoConfig getConfig() { + return myConfig; + } + protected IFhirResourceDao getDao(Class theType) { if (myResourceTypeToDao == null) { myResourceTypeToDao = new HashMap, IFhirResourceDao>(); @@ -658,6 +672,60 @@ public abstract class BaseFhirDao { return myResourceTypeToDao.get(theType); } + protected TagDefinition getTag(String theScheme, String theTerm, String theLabel) { + CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); + CriteriaQuery cq = builder.createQuery(TagDefinition.class); + Root from = cq.from(TagDefinition.class); + cq.where(builder.and(builder.equal(from.get("myScheme"), theScheme), builder.equal(from.get("myTerm"), theTerm))); + TypedQuery q = myEntityManager.createQuery(cq); + try { + return q.getSingleResult(); + } catch (NoResultException e) { + TagDefinition retVal = new TagDefinition(theTerm, theLabel, theScheme); + myEntityManager.persist(retVal); + return retVal; + } + } + + protected TagList getTags(Class theResourceType, IdDt theResourceId) { + String resourceName = null; + if (theResourceType != null) { + resourceName = toResourceName(theResourceType); + if (theResourceId != null && theResourceId.hasVersionIdPart()) { + IFhirResourceDao dao = getDao(theResourceType); + BaseHasResource entity = dao.readEntity(theResourceId); + TagList retVal = new TagList(); + for (BaseTag next : entity.getTags()) { + retVal.add(next.getTag().toTag()); + } + return retVal; + } + } + + Set tagIds = new HashSet(); + findMatchingTagIds(resourceName, theResourceId, tagIds, ResourceTag.class); + findMatchingTagIds(resourceName, theResourceId, tagIds, ResourceHistoryTag.class); + if (tagIds.isEmpty()) { + return new TagList(); + } + { + CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); + CriteriaQuery cq = builder.createQuery(TagDefinition.class); + Root from = cq.from(TagDefinition.class); + cq.where(from.get("myId").in(tagIds)); + cq.orderBy(builder.asc(from.get("myScheme")), builder.asc(from.get("myTerm"))); + TypedQuery q = myEntityManager.createQuery(cq); + q.setMaxResults(getConfig().getHardTagListLimit()); + + TagList retVal = new TagList(); + for (TagDefinition next : q.getResultList()) { + retVal.add(next.toTag()); + } + + return retVal; + } + } + protected IBundleProvider history(String theResourceName, Long theId, Date theSince) { final List tuples = new ArrayList(); @@ -683,8 +751,8 @@ public abstract class BaseFhirDao { return new IBundleProvider() { @Override - public int size() { - return tuples.size(); + public InstantDt getPublished() { + return end; } @Override @@ -719,16 +787,32 @@ public abstract class BaseFhirDao { } @Override - public InstantDt getPublished() { - return end; + public int size() { + return tuples.size(); } }; } - InstantDt createHistoryToTimestamp() { - // final InstantDt end = new InstantDt(DateUtils.addSeconds(DateUtils.truncate(new Date(), Calendar.SECOND), - // -1)); - return InstantDt.withCurrentTime(); + protected void loadResourcesById(Set theIncludePids, List theResourceListToPopulate) { + Set pids = new HashSet(); + for (IdDt next : theIncludePids) { + pids.add(next.getIdPartAsLong()); + } + + CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); + CriteriaQuery cq = builder.createQuery(ResourceTable.class); + Root from = cq.from(ResourceTable.class); + // cq.where(builder.equal(from.get("myResourceType"), + // getContext().getResourceDefinition(myResourceType).getName())); + // if (theIncludePids != null) { + cq.where(from.get("myId").in(pids)); + // } + TypedQuery q = myEntityManager.createQuery(cq); + + for (ResourceTable next : q.getResultList()) { + IResource resource = toResource(next); + theResourceListToPopulate.add(resource); + } } protected String normalizeString(String theString) { @@ -744,21 +828,6 @@ public abstract class BaseFhirDao { return new String(out).toUpperCase(); } - protected TagDefinition getTag(String theScheme, String theTerm, String theLabel) { - CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); - CriteriaQuery cq = builder.createQuery(TagDefinition.class); - Root from = cq.from(TagDefinition.class); - cq.where(builder.and(builder.equal(from.get("myScheme"), theScheme), builder.equal(from.get("myTerm"), theTerm))); - TypedQuery q = myEntityManager.createQuery(cq); - try { - return q.getSingleResult(); - } catch (NoResultException e) { - TagDefinition retVal = new TagDefinition(theTerm, theLabel, theScheme); - myEntityManager.persist(retVal); - return retVal; - } - } - protected void populateResourceIntoEntity(IResource theResource, ResourceTable theEntity) { if (theEntity.getPublished().isEmpty()) { @@ -863,14 +932,14 @@ public abstract class BaseFhirDao { return retVal; } - protected String toResourceName(IResource theResource) { - return myContext.getResourceDefinition(theResource).getName(); - } - protected String toResourceName(Class theResourceType) { return myContext.getResourceDefinition(theResourceType).getName(); } + protected String toResourceName(IResource theResource) { + return myContext.getResourceDefinition(theResource).getName(); + } + protected ResourceTable updateEntity(final IResource theResource, ResourceTable entity, boolean theUpdateHistory, boolean theDelete) { if (entity.getPublished() == null) { entity.setPublished(new Date()); @@ -987,66 +1056,10 @@ public abstract class BaseFhirDao { return entity; } - protected TagList getTags(Class theResourceType, IdDt theResourceId) { - String resourceName = null; - if (theResourceType != null) { - resourceName = toResourceName(theResourceType); - if (theResourceId != null && theResourceId.hasVersionIdPart()) { - IFhirResourceDao dao = getDao(theResourceType); - BaseHasResource entity = dao.readEntity(theResourceId); - TagList retVal = new TagList(); - for (BaseTag next : entity.getTags()) { - retVal.add(next.getTag().toTag()); - } - return retVal; - } - } - - Set tagIds = new HashSet(); - findMatchingTagIds(resourceName, theResourceId, tagIds, ResourceTag.class); - findMatchingTagIds(resourceName, theResourceId, tagIds, ResourceHistoryTag.class); - if (tagIds.isEmpty()) { - return new TagList(); - } - { - CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); - CriteriaQuery cq = builder.createQuery(TagDefinition.class); - Root from = cq.from(TagDefinition.class); - cq.where(from.get("myId").in(tagIds)); - cq.orderBy(builder.asc(from.get("myScheme")), builder.asc(from.get("myTerm"))); - TypedQuery q = myEntityManager.createQuery(cq); - q.setMaxResults(getConfig().getHardTagListLimit()); - - TagList retVal = new TagList(); - for (TagDefinition next : q.getResultList()) { - retVal.add(next.toTag()); - } - - return retVal; - } - } - - private void findMatchingTagIds(String theResourceName, IdDt theResourceId, Set tagIds, Class entityClass) { - { - CriteriaBuilder builder = myEntityManager.getCriteriaBuilder(); - CriteriaQuery cq = builder.createTupleQuery(); - Root from = cq.from(entityClass); - cq.multiselect(from.get("myTagId").as(Long.class)).distinct(true); - - if (theResourceName != null) { - Predicate typePredicate = builder.equal(from.get("myResourceType"), theResourceName); - if (theResourceId != null) { - cq.where(typePredicate, builder.equal(from.get("myResourceId"), theResourceId.getIdPartAsLong())); - } else { - cq.where(typePredicate); - } - } - - TypedQuery query = myEntityManager.createQuery(cq); - for (Tuple next : query.getResultList()) { - tagIds.add(next.get(0, Long.class)); - } - } + InstantDt createHistoryToTimestamp() { + // final InstantDt end = new InstantDt(DateUtils.addSeconds(DateUtils.truncate(new Date(), Calendar.SECOND), + // -1)); + return InstantDt.withCurrentTime(); } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/FhirResourceDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/FhirResourceDao.java index ab561893799..f7f7f80d4b7 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/FhirResourceDao.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/FhirResourceDao.java @@ -517,6 +517,7 @@ public class FhirResourceDao extends BaseFhirDao implements myEntityManager.persist(newEntity); myEntityManager.merge(entity); + notifyWriteCompleted(); } @Override @@ -527,6 +528,7 @@ public class FhirResourceDao extends BaseFhirDao implements updateEntity(theResource, entity, false, false); MethodOutcome outcome = toMethodOutcome(entity); + notifyWriteCompleted(); return outcome; } @@ -1021,6 +1023,7 @@ public class FhirResourceDao extends BaseFhirDao implements ResourceTable savedEntity = updateEntity(theResource, entity, true, false); + notifyWriteCompleted(); return toMethodOutcome(savedEntity); } @@ -1033,6 +1036,7 @@ public class FhirResourceDao extends BaseFhirDao implements ResourceTable savedEntity = updateEntity(null, entity, true, true); + notifyWriteCompleted(); return toMethodOutcome(savedEntity); } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/FhirSystemDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/FhirSystemDao.java index 351323c4e10..a86fa77fd9b 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/FhirSystemDao.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/FhirSystemDao.java @@ -128,7 +128,8 @@ public class FhirSystemDao extends BaseFhirDao implements IFhirSystemDao { long delay = System.currentTimeMillis() - start; ourLog.info("Transaction completed in {}ms with {} creations and {} updates", new Object[] {delay, creations, updates}); - + + notifyWriteCompleted(); } @Override diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IDao.java new file mode 100644 index 00000000000..440471fd2e1 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IDao.java @@ -0,0 +1,7 @@ +package ca.uhn.fhir.jpa.dao; + +public interface IDao { + + void registerDaoListener(IDaoListener theListener); + +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IDaoListener.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IDaoListener.java new file mode 100644 index 00000000000..5b48d457815 --- /dev/null +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IDaoListener.java @@ -0,0 +1,7 @@ +package ca.uhn.fhir.jpa.dao; + +public interface IDaoListener { + + void writeCompleted(); + +} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IFhirResourceDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IFhirResourceDao.java index 6e7b5d334f6..14f62a1c07c 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IFhirResourceDao.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IFhirResourceDao.java @@ -14,7 +14,7 @@ import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.server.IBundleProvider; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; -public interface IFhirResourceDao { +public interface IFhirResourceDao extends IDao { void addTag(IdDt theId, String theScheme, String theTerm, String theLabel); @@ -33,7 +33,7 @@ public interface IFhirResourceDao { IBundleProvider history(IdDt theId,Date theSince); IBundleProvider history(Long theId, Date theSince); - + /** * * @param theId diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IFhirSystemDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IFhirSystemDao.java index d8d21db175b..3dd988be92a 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IFhirSystemDao.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/IFhirSystemDao.java @@ -8,7 +8,7 @@ import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.TagList; import ca.uhn.fhir.rest.server.IBundleProvider; -public interface IFhirSystemDao { +public interface IFhirSystemDao extends IDao { void transaction(List theResources); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/JpaConformanceProvider.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/JpaConformanceProvider.java index bc5bef6062f..0aa11640368 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/JpaConformanceProvider.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/JpaConformanceProvider.java @@ -1,13 +1,15 @@ package ca.uhn.fhir.jpa.provider; +import java.util.Collection; import java.util.Map; +import ca.uhn.fhir.jpa.dao.IDaoListener; +import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.dao.IFhirSystemDao; import ca.uhn.fhir.model.dstu.resource.Conformance; import ca.uhn.fhir.model.dstu.resource.Conformance.Rest; import ca.uhn.fhir.model.dstu.resource.Conformance.RestResource; import ca.uhn.fhir.model.primitive.DecimalDt; -import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.provider.ServerConformanceProvider; @@ -15,19 +17,33 @@ public class JpaConformanceProvider extends ServerConformanceProvider { private String myImplementationDescription; private IFhirSystemDao mySystemDao; + private volatile Conformance myCachedValue; - public JpaConformanceProvider(RestfulServer theRestfulServer, IFhirSystemDao theSystemDao) { + public JpaConformanceProvider(RestfulServer theRestfulServer, IFhirSystemDao theSystemDao, @SuppressWarnings("rawtypes") Collection theResourceDaos) { super(theRestfulServer); mySystemDao = theSystemDao; super.setCache(false); + + for (IFhirResourceDao nextResourceDao : theResourceDaos) { + nextResourceDao.registerDaoListener(new IDaoListener() { + @Override + public void writeCompleted() { + myCachedValue = null; + } + }); + } } @Override public Conformance getServerConformance() { + Conformance retVal = myCachedValue; + if (retVal != null) { + return retVal; + } Map counts = mySystemDao.getResourceCounts(); - Conformance retVal = super.getServerConformance(); + retVal = super.getServerConformance(); for (Rest nextRest : retVal.getRest()) { for (RestResource nextResource : nextRest.getResource()) { Long count = counts.get(nextResource.getType().getValueAsString()); @@ -38,7 +54,7 @@ public class JpaConformanceProvider extends ServerConformanceProvider { } retVal.getImplementation().setDescription(myImplementationDescription); - + myCachedValue = retVal; return retVal; } diff --git a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/TestRestfulServer.java b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/TestRestfulServer.java index e3740e524b1..54d8090ecf9 100644 --- a/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/TestRestfulServer.java +++ b/hapi-fhir-jpaserver-uhnfhirtest/src/main/java/ca/uhn/fhirtest/TestRestfulServer.java @@ -8,6 +8,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationContext; import org.springframework.web.context.ContextLoaderListener; +import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.dao.IFhirSystemDao; import ca.uhn.fhir.jpa.provider.JpaConformanceProvider; import ca.uhn.fhir.jpa.provider.JpaSystemProvider; @@ -57,7 +58,10 @@ public class TestRestfulServer extends RestfulServer { String implDesc = getInitParameter("ImplementationDescription"); - JpaConformanceProvider confProvider = new JpaConformanceProvider(this, systemDao); + @SuppressWarnings("rawtypes") + Collection resourceDaos = myAppCtx.getBeansOfType(IFhirResourceDao.class).values(); + + JpaConformanceProvider confProvider = new JpaConformanceProvider(this, systemDao, resourceDaos); confProvider.setImplementationDescription(implDesc); setServerConformanceProvider(confProvider); diff --git a/hapi-fhir-jpaserver-uhnfhirtest/src/main/webapp/WEB-INF/templates/about.html b/hapi-fhir-jpaserver-uhnfhirtest/src/main/webapp/WEB-INF/templates/about.html index c4892c0b29e..d552027e956 100644 --- a/hapi-fhir-jpaserver-uhnfhirtest/src/main/webapp/WEB-INF/templates/about.html +++ b/hapi-fhir-jpaserver-uhnfhirtest/src/main/webapp/WEB-INF/templates/about.html @@ -22,7 +22,7 @@
- +

This server provides a nearly complete implementation of the FHIR Specification diff --git a/hapi-fhir-testpage-overlay/src/main/webapp/WEB-INF/templates/tmpl-head.html b/hapi-fhir-testpage-overlay/src/main/webapp/WEB-INF/templates/tmpl-head.html index 56689c5469e..77925d12eef 100644 --- a/hapi-fhir-testpage-overlay/src/main/webapp/WEB-INF/templates/tmpl-head.html +++ b/hapi-fhir-testpage-overlay/src/main/webapp/WEB-INF/templates/tmpl-head.html @@ -21,9 +21,7 @@ - diff --git a/hapi-fhir-testpage-overlay/src/main/webapp/js/RestfulTester.js b/hapi-fhir-testpage-overlay/src/main/webapp/js/RestfulTester.js index e4c9ca72fbf..d50723d5613 100644 --- a/hapi-fhir-testpage-overlay/src/main/webapp/js/RestfulTester.js +++ b/hapi-fhir-testpage-overlay/src/main/webapp/js/RestfulTester.js @@ -82,10 +82,16 @@ function addSearchControls(theSearchParamType, theSearchParamName, theSearchPara $('', { id: 'param.' + theRowNum + '.2', placeholder: 'value', type: 'text', 'class': 'form-control' }) ) ); - } else if (theSearchParamType == 'string' || theSearchParamType == 'number') { + } else if (theSearchParamType == 'string' || theSearchParamType == 'number' || theSearchParamType == 'reference') { + var placeholderText = 'value'; + if (theSearchParamType == 'number') { + placeholderText = 'Number'; + } else if (theSearchParamType == 'reference') { + placeholderText = 'Resource ID'; + } $('#search-param-rowopts-' + theContainerRowNum).append( $('

', { 'class': 'col-sm-3' }).append( - $('', { id: 'param.' + theRowNum + '.0', placeholder: 'value', type: 'text', 'class': 'form-control' }) + $('', { id: 'param.' + theRowNum + '.0', placeholder: placeholderText, type: 'text', 'class': 'form-control' }) ) ); } else if (theSearchParamType == 'date') { diff --git a/hapi-fhir-testpage-overlay/src/main/webapp/js/moment.min.js b/hapi-fhir-testpage-overlay/src/main/webapp/js/moment.min.js new file mode 100644 index 00000000000..3fe82adf132 --- /dev/null +++ b/hapi-fhir-testpage-overlay/src/main/webapp/js/moment.min.js @@ -0,0 +1,6 @@ +//! moment.js +//! version : 2.6.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function c(a,b){function c(){ib.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}var d=!0;return i(function(){return d&&(c(),d=!1),b.apply(this,arguments)},b)}function d(a,b){return function(c){return l(a.call(this,c),b)}}function e(a,b){return function(c){return this.lang().ordinal(a.call(this,c),b)}}function f(){}function g(a){y(a),i(this,a)}function h(a){var b=r(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._bubble()}function i(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return b.hasOwnProperty("toString")&&(a.toString=b.toString),b.hasOwnProperty("valueOf")&&(a.valueOf=b.valueOf),a}function j(a){var b,c={};for(b in a)a.hasOwnProperty(b)&&wb.hasOwnProperty(b)&&(c[b]=a[b]);return c}function k(a){return 0>a?Math.ceil(a):Math.floor(a)}function l(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&t(a[d])!==t(b[d]))&&g++;return g+f}function q(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=Zb[a]||$b[b]||b}return a}function r(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=q(c),b&&(d[b]=a[c]));return d}function s(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}ib[b]=function(e,f){var g,h,i=ib.fn._lang[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=ib().utc().set(d,a);return i.call(ib.fn._lang,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function t(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function u(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function v(a,b,c){return $(ib([a,11,31+b-c]),b,c).week}function w(a){return x(a)?366:365}function x(a){return a%4===0&&a%100!==0||a%400===0}function y(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[pb]<0||a._a[pb]>11?pb:a._a[qb]<1||a._a[qb]>u(a._a[ob],a._a[pb])?qb:a._a[rb]<0||a._a[rb]>23?rb:a._a[sb]<0||a._a[sb]>59?sb:a._a[tb]<0||a._a[tb]>59?tb:a._a[ub]<0||a._a[ub]>999?ub:-1,a._pf._overflowDayOfYear&&(ob>b||b>qb)&&(b=qb),a._pf.overflow=b)}function z(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function A(a){return a?a.toLowerCase().replace("_","-"):a}function B(a,b){return b._isUTC?ib(a).zone(b._offset||0):ib(a).local()}function C(a,b){return b.abbr=a,vb[a]||(vb[a]=new f),vb[a].set(b),vb[a]}function D(a){delete vb[a]}function E(a){var b,c,d,e,f=0,g=function(a){if(!vb[a]&&xb)try{require("./lang/"+a)}catch(b){}return vb[a]};if(!a)return ib.fn._lang;if(!n(a)){if(c=g(a))return c;a=[a]}for(;f0;){if(c=g(e.slice(0,b).join("-")))return c;if(d&&d.length>=b&&p(e,d,!0)>=b-1)break;b--}f++}return ib.fn._lang}function F(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function G(a){var b,c,d=a.match(Bb);for(b=0,c=d.length;c>b;b++)d[b]=cc[d[b]]?cc[d[b]]:F(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function H(a,b){return a.isValid()?(b=I(b,a.lang()),_b[b]||(_b[b]=G(b)),_b[b](a)):a.lang().invalidDate()}function I(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Cb.lastIndex=0;d>=0&&Cb.test(a);)a=a.replace(Cb,c),Cb.lastIndex=0,d-=1;return a}function J(a,b){var c,d=b._strict;switch(a){case"Q":return Nb;case"DDDD":return Pb;case"YYYY":case"GGGG":case"gggg":return d?Qb:Fb;case"Y":case"G":case"g":return Sb;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?Rb:Gb;case"S":if(d)return Nb;case"SS":if(d)return Ob;case"SSS":if(d)return Pb;case"DDD":return Eb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ib;case"a":case"A":return E(b._l)._meridiemParse;case"X":return Lb;case"Z":case"ZZ":return Jb;case"T":return Kb;case"SSSS":return Hb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?Ob:Db;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Db;case"Do":return Mb;default:return c=new RegExp(R(Q(a.replace("\\","")),"i"))}}function K(a){a=a||"";var b=a.match(Jb)||[],c=b[b.length-1]||[],d=(c+"").match(Xb)||["-",0,0],e=+(60*d[1])+t(d[2]);return"+"===d[0]?-e:e}function L(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[pb]=3*(t(b)-1));break;case"M":case"MM":null!=b&&(e[pb]=t(b)-1);break;case"MMM":case"MMMM":d=E(c._l).monthsParse(b),null!=d?e[pb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[qb]=t(b));break;case"Do":null!=b&&(e[qb]=t(parseInt(b,10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=t(b));break;case"YY":e[ob]=ib.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[ob]=t(b);break;case"a":case"A":c._isPm=E(c._l).isPM(b);break;case"H":case"HH":case"h":case"hh":e[rb]=t(b);break;case"m":case"mm":e[sb]=t(b);break;case"s":case"ss":e[tb]=t(b);break;case"S":case"SS":case"SSS":case"SSSS":e[ub]=t(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=K(b);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":a=a.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=b)}}function M(a){var b,c,d,e,f,g,h,i,j,k,l=[];if(!a._d){for(d=O(a),a._w&&null==a._a[qb]&&null==a._a[pb]&&(f=function(b){var c=parseInt(b,10);return b?b.length<3?c>68?1900+c:2e3+c:c:null==a._a[ob]?ib().weekYear():a._a[ob]},g=a._w,null!=g.GG||null!=g.W||null!=g.E?h=_(f(g.GG),g.W||1,g.E,4,1):(i=E(a._l),j=null!=g.d?X(g.d,i):null!=g.e?parseInt(g.e,10)+i._week.dow:0,k=parseInt(g.w,10)||1,null!=g.d&&jw(e)&&(a._pf._overflowDayOfYear=!0),c=W(e,0,a._dayOfYear),a._a[pb]=c.getUTCMonth(),a._a[qb]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=l[b]=d[b];for(;7>b;b++)a._a[b]=l[b]=null==a._a[b]?2===b?1:0:a._a[b];l[rb]+=t((a._tzm||0)/60),l[sb]+=t((a._tzm||0)%60),a._d=(a._useUTC?W:V).apply(null,l)}}function N(a){var b;a._d||(b=r(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],M(a))}function O(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function P(a){a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=E(a._l),h=""+a._i,i=h.length,j=0;for(d=I(a._f,g).match(Bb)||[],b=0;b0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),cc[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),L(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[rb]<12&&(a._a[rb]+=12),a._isPm===!1&&12===a._a[rb]&&(a._a[rb]=0),M(a),y(a)}function Q(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function R(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function S(a){var c,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,d=c));i(a,d||c)}function T(a){var b,c,d=a._i,e=Tb.exec(d);if(e){for(a._pf.iso=!0,b=0,c=Vb.length;c>b;b++)if(Vb[b][1].exec(d)){a._f=Vb[b][0]+(e[6]||" ");break}for(b=0,c=Wb.length;c>b;b++)if(Wb[b][1].exec(d)){a._f+=Wb[b][0];break}d.match(Jb)&&(a._f+="Z"),P(a)}else ib.createFromInputFallback(a)}function U(b){var c=b._i,d=yb.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):"string"==typeof c?T(b):n(c)?(b._a=c.slice(0),M(b)):o(c)?b._d=new Date(+c):"object"==typeof c?N(b):"number"==typeof c?b._d=new Date(c):ib.createFromInputFallback(b)}function V(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function W(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function X(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function Y(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function Z(a,b,c){var d=nb(Math.abs(a)/1e3),e=nb(d/60),f=nb(e/60),g=nb(f/24),h=nb(g/365),i=45>d&&["s",d]||1===e&&["m"]||45>e&&["mm",e]||1===f&&["h"]||22>f&&["hh",f]||1===g&&["d"]||25>=g&&["dd",g]||45>=g&&["M"]||345>g&&["MM",nb(g/30)]||1===h&&["y"]||["yy",h];return i[2]=b,i[3]=a>0,i[4]=c,Y.apply({},i)}function $(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=ib(a).add("d",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function _(a,b,c,d,e){var f,g,h=W(a,0,1).getUTCDay();return c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:w(a-1)+g}}function ab(b){var c=b._i,d=b._f;return null===c||d===a&&""===c?ib.invalid({nullInput:!0}):("string"==typeof c&&(b._i=c=E().preparse(c)),ib.isMoment(c)?(b=j(c),b._d=new Date(+c._d)):d?n(d)?S(b):P(b):U(b),new g(b))}function bb(a,b){var c;return"string"==typeof b&&(b=a.lang().monthsParse(b),"number"!=typeof b)?a:(c=Math.min(a.date(),u(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a)}function cb(a,b){return a._d["get"+(a._isUTC?"UTC":"")+b]()}function db(a,b,c){return"Month"===b?bb(a,c):a._d["set"+(a._isUTC?"UTC":"")+b](c)}function eb(a,b){return function(c){return null!=c?(db(this,a,c),ib.updateOffset(this,b),this):cb(this,a)}}function fb(a){ib.duration.fn[a]=function(){return this._data[a]}}function gb(a,b){ib.duration.fn["as"+a]=function(){return+this/b}}function hb(a){"undefined"==typeof ender&&(jb=mb.moment,mb.moment=a?c("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.",ib):ib)}for(var ib,jb,kb,lb="2.6.0",mb="undefined"!=typeof global?global:this,nb=Math.round,ob=0,pb=1,qb=2,rb=3,sb=4,tb=5,ub=6,vb={},wb={_isAMomentObject:null,_i:null,_f:null,_l:null,_strict:null,_isUTC:null,_offset:null,_pf:null,_lang:null},xb="undefined"!=typeof module&&module.exports,yb=/^\/?Date\((\-?\d+)/i,zb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,Ab=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,Bb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,Cb=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,Db=/\d\d?/,Eb=/\d{1,3}/,Fb=/\d{1,4}/,Gb=/[+\-]?\d{1,6}/,Hb=/\d+/,Ib=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Jb=/Z|[\+\-]\d\d:?\d\d/gi,Kb=/T/i,Lb=/[\+\-]?\d+(\.\d{1,3})?/,Mb=/\d{1,2}/,Nb=/\d/,Ob=/\d\d/,Pb=/\d{3}/,Qb=/\d{4}/,Rb=/[+-]?\d{6}/,Sb=/[+-]?\d+/,Tb=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ub="YYYY-MM-DDTHH:mm:ssZ",Vb=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],Wb=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Xb=/([\+\-]|\d\d)/gi,Yb=("Date|Hours|Minutes|Seconds|Milliseconds".split("|"),{Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6}),Zb={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",Q:"quarter",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},$b={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},_b={},ac="DDD w W M D d".split(" "),bc="M D H h m s w W".split(" "),cc={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return l(this.year()%100,2)},YYYY:function(){return l(this.year(),4)},YYYYY:function(){return l(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?"+":"-";return b+l(Math.abs(a),6)},gg:function(){return l(this.weekYear()%100,2)},gggg:function(){return l(this.weekYear(),4)},ggggg:function(){return l(this.weekYear(),5)},GG:function(){return l(this.isoWeekYear()%100,2)},GGGG:function(){return l(this.isoWeekYear(),4)},GGGGG:function(){return l(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return t(this.milliseconds()/100)},SS:function(){return l(t(this.milliseconds()/10),2)},SSS:function(){return l(this.milliseconds(),3)},SSSS:function(){return l(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+l(t(a/60),2)+":"+l(t(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+l(t(a/60),2)+l(t(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},dc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];ac.length;)kb=ac.pop(),cc[kb+"o"]=e(cc[kb],kb);for(;bc.length;)kb=bc.pop(),cc[kb+kb]=d(cc[kb],2);for(cc.DDDD=d(cc.DDD,3),i(f.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=ib.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=ib([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return $(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),ib=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=c,g._f=d,g._l=e,g._strict=f,g._isUTC=!1,g._pf=b(),ab(g)},ib.suppressDeprecationWarnings=!1,ib.createFromInputFallback=c("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i)}),ib.utc=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=c,g._f=d,g._strict=f,g._pf=b(),ab(g).utc()},ib.unix=function(a){return ib(1e3*a)},ib.duration=function(a,b){var c,d,e,f=a,g=null;return ib.isDuration(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(g=zb.exec(a))?(c="-"===g[1]?-1:1,f={y:0,d:t(g[qb])*c,h:t(g[rb])*c,m:t(g[sb])*c,s:t(g[tb])*c,ms:t(g[ub])*c}):(g=Ab.exec(a))&&(c="-"===g[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*c},f={y:e(g[2]),M:e(g[3]),d:e(g[4]),h:e(g[5]),m:e(g[6]),s:e(g[7]),w:e(g[8])}),d=new h(f),ib.isDuration(a)&&a.hasOwnProperty("_lang")&&(d._lang=a._lang),d},ib.version=lb,ib.defaultFormat=Ub,ib.momentProperties=wb,ib.updateOffset=function(){},ib.lang=function(a,b){var c;return a?(b?C(A(a),b):null===b?(D(a),a="en"):vb[a]||E(a),c=ib.duration.fn._lang=ib.fn._lang=E(a),c._abbr):ib.fn._lang._abbr},ib.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),E(a)},ib.isMoment=function(a){return a instanceof g||null!=a&&a.hasOwnProperty("_isAMomentObject")},ib.isDuration=function(a){return a instanceof h},kb=dc.length-1;kb>=0;--kb)s(dc[kb]);ib.normalizeUnits=function(a){return q(a)},ib.invalid=function(a){var b=ib.utc(0/0);return null!=a?i(b._pf,a):b._pf.userInvalidated=!0,b},ib.parseZone=function(){return ib.apply(null,arguments).parseZone()},ib.parseTwoDigitYear=function(a){return t(a)+(t(a)>68?1900:2e3)},i(ib.fn=g.prototype,{clone:function(){return ib(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=ib(this).utc();return 00:!1},parsingFlags:function(){return i({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=H(this,a||ib.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c="string"==typeof a?ib.duration(+b,a):ib.duration(a,b),m(this,c,1),this},subtract:function(a,b){var c;return c="string"==typeof a?ib.duration(+b,a):ib.duration(a,b),m(this,c,-1),this},diff:function(a,b,c){var d,e,f=B(a,this),g=6e4*(this.zone()-f.zone());return b=q(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-ib(this).startOf("month")-(f-ib(f).startOf("month")))/d,e-=6e4*(this.zone()-ib(this).startOf("month").zone()-(f.zone()-ib(f).startOf("month").zone()))/d,"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:k(e)},from:function(a,b){return ib.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(ib(),a)},calendar:function(){var a=B(ib(),this).startOf("day"),b=this.diff(a,"days",!0),c=-6>b?"sameElse":-1>b?"lastWeek":0>b?"lastDay":1>b?"sameDay":2>b?"nextDay":7>b?"nextWeek":"sameElse";return this.format(this.lang().calendar(c,this))},isLeapYear:function(){return x(this.year())},isDST:function(){return this.zone()+ib(a).startOf(b)},isBefore:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)<+ib(a).startOf(b)},isSame:function(a,b){return b=b||"ms",+this.clone().startOf(b)===+B(a,this).startOf(b)},min:function(a){return a=ib.apply(null,arguments),this>a?this:a},max:function(a){return a=ib.apply(null,arguments),a>this?this:a},zone:function(a,b){var c=this._offset||0;return null==a?this._isUTC?c:this._d.getTimezoneOffset():("string"==typeof a&&(a=K(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,c!==a&&(!b||this._changeInProgress?m(this,ib.duration(c-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,ib.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?ib(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return u(this.year(),this.month())},dayOfYear:function(a){var b=nb((ib(this).startOf("day")-ib(this).startOf("year"))/864e5)+1;return null==a?b:this.add("d",a-b)},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=$(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add("y",a-b)},isoWeekYear:function(a){var b=$(this,1,4).year;return null==a?b:this.add("y",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add("d",7*(a-b))},isoWeek:function(a){var b=$(this,1,4).week;return null==a?b:this.add("d",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add("d",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return v(this.year(),1,4)},weeksInYear:function(){var a=this._lang._week;return v(this.year(),a.dow,a.doy)},get:function(a){return a=q(a),this[a]()},set:function(a,b){return a=q(a),"function"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=E(b),this)}}),ib.fn.millisecond=ib.fn.milliseconds=eb("Milliseconds",!1),ib.fn.second=ib.fn.seconds=eb("Seconds",!1),ib.fn.minute=ib.fn.minutes=eb("Minutes",!1),ib.fn.hour=ib.fn.hours=eb("Hours",!0),ib.fn.date=eb("Date",!0),ib.fn.dates=c("dates accessor is deprecated. Use date instead.",eb("Date",!0)),ib.fn.year=eb("FullYear",!0),ib.fn.years=c("years accessor is deprecated. Use year instead.",eb("FullYear",!0)),ib.fn.days=ib.fn.day,ib.fn.months=ib.fn.month,ib.fn.weeks=ib.fn.week,ib.fn.isoWeeks=ib.fn.isoWeek,ib.fn.quarters=ib.fn.quarter,ib.fn.toJSON=ib.fn.toISOString,i(ib.duration.fn=h.prototype,{_bubble:function(){var a,b,c,d,e=this._milliseconds,f=this._days,g=this._months,h=this._data;h.milliseconds=e%1e3,a=k(e/1e3),h.seconds=a%60,b=k(a/60),h.minutes=b%60,c=k(b/60),h.hours=c%24,f+=k(c/24),h.days=f%30,g+=k(f/30),h.months=g%12,d=k(g/12),h.years=d},weeks:function(){return k(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*t(this._months/12)},humanize:function(a){var b=+this,c=Z(b,!a,this.lang());return a&&(c=this.lang().pastFuture(b,c)),this.lang().postformat(c)},add:function(a,b){var c=ib.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=ib.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=q(a),this[a.toLowerCase()+"s"]()},as:function(a){return a=q(a),this["as"+a.charAt(0).toUpperCase()+a.slice(1)+"s"]()},lang:ib.fn.lang,toIsoString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"}});for(kb in Yb)Yb.hasOwnProperty(kb)&&(gb(kb,Yb[kb]),fb(kb.toLowerCase()));gb("Weeks",6048e5),ib.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},ib.lang("en",{ordinal:function(a){var b=a%10,c=1===t(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),xb?module.exports=ib:"function"==typeof define&&define.amd?(define("moment",function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(mb.moment=jb),ib}),hb(!0)):hb()}).call(this); \ No newline at end of file diff --git a/hapi-fhir-testpage-overlay/src/test/java/ca/uhn/fhir/jpa/test/OverlayTestApp.java b/hapi-fhir-testpage-overlay/src/test/java/ca/uhn/fhir/jpa/test/OverlayTestApp.java index 9d08514af23..ac065182df5 100644 --- a/hapi-fhir-testpage-overlay/src/test/java/ca/uhn/fhir/jpa/test/OverlayTestApp.java +++ b/hapi-fhir-testpage-overlay/src/test/java/ca/uhn/fhir/jpa/test/OverlayTestApp.java @@ -1,6 +1,7 @@ package ca.uhn.fhir.jpa.test; import java.lang.annotation.Documented; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -85,6 +86,9 @@ public class OverlayTestApp { IFhirSystemDao systemDao = appCtx.getBean("mySystemDao", IFhirSystemDao.class); + + @SuppressWarnings("rawtypes") + Collection resourceDaos = appCtx.getBeansOfType(IFhirResourceDao.class).values(); JpaSystemProvider systemProvider = new JpaSystemProvider(systemDao); RestfulServer restServer = new RestfulServer(); @@ -97,7 +101,7 @@ public class OverlayTestApp { restServer.setPagingProvider(new FifoMemoryPagingProvider(10)); restServer.setImplementationDescription("This is a great server!!!!"); - JpaConformanceProvider confProvider = new JpaConformanceProvider(restServer, systemDao); + JpaConformanceProvider confProvider = new JpaConformanceProvider(restServer, systemDao,resourceDaos); restServer.setServerConformanceProvider(confProvider); myPort = 8887;