From 9cb5d61fa85ade9df72c49c12530b8870ce43b48 Mon Sep 17 00:00:00 2001 From: davewaltermire Date: Sat, 21 May 2011 19:17:08 +0000 Subject: [PATCH] Made entity containers optional in the meta model. Fixed various compile warnings. Refactored packages for rest services. Generalized the statistic service to report on stats for all entities and relationships. Added pooling support for Marshaller/Unmarshaller in AbstractContentStore to allow for reuse and better efficiencies in processing since these are expensive to create. Integrated AbstractContentStore into the content DB project. Fixed exception handling in content DB store. Added content DB store to the main build. Added diagram of the meta model. --- .../scapdev/content/model/MetadataModel.png | Bin 0 -> 13223 bytes content-model/src/main/xsd/MetaModel.xsd | 2 +- .../config/RepositoryConfiguration.java | 2 - .../ContentRepositoryStartupServlet.java | 1 + .../war/rest/ContentUploadEndpoints.java | 4 +- .../rest/response/FileUploadXMLResponse.java | 1 - .../response/UploadedFileResponseEntry.java | 3 + .../ContentStatisticsEndpoints.java | 18 +-- .../war/rest/statistic/RelationshipItem.java | 30 +++++ .../RepositoryStatisticsXMLResponse.java | 60 ++------- .../war/rest/statistic/StatItem.java | 43 ++++++ .../src/main/webapp/WEB-INF/web.xml | 2 +- .../content/core/ContentException.java | 4 +- .../ContentPersistenceException.java | 52 ++++++++ .../hybrid/AbstractContentRetriever.java | 2 +- .../hybrid/AbstractContentStore.java | 125 ++++++++++++++++++ .../hybrid/DefaultContentRetriever.java | 43 ++++++ .../hybrid/MemoryResidentContentStore.java | 2 +- .../java/org/scapdev/db/DbContentStore.java | 69 ++++------ .../org/scapdev/db/DbContentStoreFactory.java | 2 +- pom.xml | 1 + 21 files changed, 348 insertions(+), 118 deletions(-) create mode 100644 content-model/src/main/java/org/scapdev/content/model/MetadataModel.png rename content-repository-war/src/main/java/org/content/repository/war/rest/{ => statistic}/ContentStatisticsEndpoints.java (83%) create mode 100644 content-repository-war/src/main/java/org/content/repository/war/rest/statistic/RelationshipItem.java rename content-repository-war/src/main/java/org/content/repository/war/rest/{response => statistic}/RepositoryStatisticsXMLResponse.java (55%) create mode 100644 content-repository-war/src/main/java/org/content/repository/war/rest/statistic/StatItem.java create mode 100644 content-repository/src/main/java/org/scapdev/content/core/persistence/ContentPersistenceException.java create mode 100644 content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/AbstractContentStore.java create mode 100644 content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/DefaultContentRetriever.java diff --git a/content-model/src/main/java/org/scapdev/content/model/MetadataModel.png b/content-model/src/main/java/org/scapdev/content/model/MetadataModel.png new file mode 100644 index 0000000000000000000000000000000000000000..482290e3b07eaa7bd7ae9aca647bab1db25cbeee GIT binary patch literal 13223 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 Wu8O*u0slz@(z>swR&no9`2PV&4y}3s literal 0 HcmV?d00001 diff --git a/content-model/src/main/xsd/MetaModel.xsd b/content-model/src/main/xsd/MetaModel.xsd index cb12297..0cd7d2e 100644 --- a/content-model/src/main/xsd/MetaModel.xsd +++ b/content-model/src/main/xsd/MetaModel.xsd @@ -289,7 +289,7 @@ - + diff --git a/content-repository-war/src/main/java/org/content/repository/config/RepositoryConfiguration.java b/content-repository-war/src/main/java/org/content/repository/config/RepositoryConfiguration.java index 31daa9d..4a7a945 100644 --- a/content-repository-war/src/main/java/org/content/repository/config/RepositoryConfiguration.java +++ b/content-repository-war/src/main/java/org/content/repository/config/RepositoryConfiguration.java @@ -27,8 +27,6 @@ import java.util.Properties; import org.scapdev.content.core.ContentRepository; -import org.scapdev.content.core.persistence.hybrid.HybridContentPersistenceManager; -import org.scapdev.content.core.persistence.hybrid.MemoryResidentHybridContentPersistenceManager; /** * A single place to access configuration settings for the repository and hold on to diff --git a/content-repository-war/src/main/java/org/content/repository/servlet/startup/ContentRepositoryStartupServlet.java b/content-repository-war/src/main/java/org/content/repository/servlet/startup/ContentRepositoryStartupServlet.java index dde3c0b..cb9c290 100644 --- a/content-repository-war/src/main/java/org/content/repository/servlet/startup/ContentRepositoryStartupServlet.java +++ b/content-repository-war/src/main/java/org/content/repository/servlet/startup/ContentRepositoryStartupServlet.java @@ -56,6 +56,7 @@ protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) private void initRepo() { // initialize repository war configuration + @SuppressWarnings("unused") RepositoryConfiguration rc = RepositoryConfiguration.INSTANCE; } } diff --git a/content-repository-war/src/main/java/org/content/repository/war/rest/ContentUploadEndpoints.java b/content-repository-war/src/main/java/org/content/repository/war/rest/ContentUploadEndpoints.java index 337e3cf..9d659cc 100644 --- a/content-repository-war/src/main/java/org/content/repository/war/rest/ContentUploadEndpoints.java +++ b/content-repository-war/src/main/java/org/content/repository/war/rest/ContentUploadEndpoints.java @@ -83,7 +83,9 @@ public FileUploadXMLResponse uploadContent(@Context HttpServletRequest request) List items = null; try { - items = upload.parseRequest(request); + @SuppressWarnings("unchecked") + List requestItems = upload.parseRequest(request); + items = requestItems; } catch (FileUploadException fue) { // TODO: is the temp dir removed? ret.setCause(fue); diff --git a/content-repository-war/src/main/java/org/content/repository/war/rest/response/FileUploadXMLResponse.java b/content-repository-war/src/main/java/org/content/repository/war/rest/response/FileUploadXMLResponse.java index 0986b69..a87d724 100644 --- a/content-repository-war/src/main/java/org/content/repository/war/rest/response/FileUploadXMLResponse.java +++ b/content-repository-war/src/main/java/org/content/repository/war/rest/response/FileUploadXMLResponse.java @@ -43,7 +43,6 @@ public class FileUploadXMLResponse extends SimpleXMLResponse { // will actually be used // when response is serialized by jaxb - @SuppressWarnings("unused") @XmlElement(name = "fileEntry") private List filesUploaded = new LinkedList(); diff --git a/content-repository-war/src/main/java/org/content/repository/war/rest/response/UploadedFileResponseEntry.java b/content-repository-war/src/main/java/org/content/repository/war/rest/response/UploadedFileResponseEntry.java index a30c9de..4b2fabe 100644 --- a/content-repository-war/src/main/java/org/content/repository/war/rest/response/UploadedFileResponseEntry.java +++ b/content-repository-war/src/main/java/org/content/repository/war/rest/response/UploadedFileResponseEntry.java @@ -34,9 +34,12 @@ @XmlAccessorType(XmlAccessType.FIELD) public class UploadedFileResponseEntry { + @SuppressWarnings("unused") private String filename; + @SuppressWarnings("unused") @XmlAttribute private int entitiesProcessed; + @SuppressWarnings("unused") @XmlAttribute private int relationshipsProcessed; diff --git a/content-repository-war/src/main/java/org/content/repository/war/rest/ContentStatisticsEndpoints.java b/content-repository-war/src/main/java/org/content/repository/war/rest/statistic/ContentStatisticsEndpoints.java similarity index 83% rename from content-repository-war/src/main/java/org/content/repository/war/rest/ContentStatisticsEndpoints.java rename to content-repository-war/src/main/java/org/content/repository/war/rest/statistic/ContentStatisticsEndpoints.java index 8df94e9..a355354 100644 --- a/content-repository-war/src/main/java/org/content/repository/war/rest/ContentStatisticsEndpoints.java +++ b/content-repository-war/src/main/java/org/content/repository/war/rest/statistic/ContentStatisticsEndpoints.java @@ -21,9 +21,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ -package org.content.repository.war.rest; +package org.content.repository.war.rest.statistic; -import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -33,7 +32,6 @@ import org.apache.log4j.Logger; import org.content.repository.config.RepositoryConfiguration; -import org.content.repository.war.rest.response.RepositoryStatisticsXMLResponse; import org.scapdev.content.core.ContentRepository; import org.scapdev.content.core.query.EntityStatistic; import org.scapdev.content.model.MetadataModel; @@ -58,17 +56,9 @@ public RepositoryStatisticsXMLResponse getGlobalStatistics() Set entityInfoIds = mm.getEntityInfoIds(); Map stats = cr.queryStatistics(entityInfoIds); - - // TODO: build response - - Iterator keyItr = stats.keySet().iterator(); - while(keyItr.hasNext()) - { - String key = keyItr.next(); - EntityStatistic stat = stats.get(key); - - ret.setCount(key, stat); - } + for (EntityStatistic stat : stats.values()) { + ret.add(stat); + } } finally { diff --git a/content-repository-war/src/main/java/org/content/repository/war/rest/statistic/RelationshipItem.java b/content-repository-war/src/main/java/org/content/repository/war/rest/statistic/RelationshipItem.java new file mode 100644 index 0000000..dea3b01 --- /dev/null +++ b/content-repository-war/src/main/java/org/content/repository/war/rest/statistic/RelationshipItem.java @@ -0,0 +1,30 @@ +package org.content.repository.war.rest.statistic; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + +import org.scapdev.content.core.query.RelationshipStatistic; + +@XmlType +@XmlAccessorType(XmlAccessType.FIELD) +public class RelationshipItem { + @SuppressWarnings("unused") + @XmlAttribute(required=true) + private String id; + // TODO: add support for language bundle + private String title; + @SuppressWarnings("unused") + @XmlAttribute(required=true) + private int count; + + public RelationshipItem () { + // No arg required by JAXB + } + + public RelationshipItem(RelationshipStatistic stat) { + id = stat.getRelationshipInfo().getId(); + count = stat.getCount(); + } +} diff --git a/content-repository-war/src/main/java/org/content/repository/war/rest/response/RepositoryStatisticsXMLResponse.java b/content-repository-war/src/main/java/org/content/repository/war/rest/statistic/RepositoryStatisticsXMLResponse.java similarity index 55% rename from content-repository-war/src/main/java/org/content/repository/war/rest/response/RepositoryStatisticsXMLResponse.java rename to content-repository-war/src/main/java/org/content/repository/war/rest/statistic/RepositoryStatisticsXMLResponse.java index b2d1487..8510ab6 100644 --- a/content-repository-war/src/main/java/org/content/repository/war/rest/response/RepositoryStatisticsXMLResponse.java +++ b/content-repository-war/src/main/java/org/content/repository/war/rest/statistic/RepositoryStatisticsXMLResponse.java @@ -21,69 +21,33 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ -package org.content.repository.war.rest.response; +package org.content.repository.war.rest.statistic; -import java.util.HashMap; -import java.util.Map; +import java.util.LinkedList; +import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import org.apache.log4j.Logger; import org.scapdev.content.core.query.EntityStatistic; @XmlType @XmlRootElement(name = "repositoryStatistics") @XmlAccessorType(XmlAccessType.FIELD) -public class RepositoryStatisticsXMLResponse -{ - @XmlTransient - private static Logger LOG = Logger.getLogger(RepositoryStatisticsXMLResponse.class); - - private int ovalDefinitions; - private int ovalTests; - private int ovalObjects; - private int ovalStates; - private int ovalVariables; - private int other; +public class RepositoryStatisticsXMLResponse { +// @XmlElementRef(name = "entity", type = StatItem.class) + @XmlElement + private List item; // required by jaxb - public RepositoryStatisticsXMLResponse() - { - + public RepositoryStatisticsXMLResponse() { + item = new LinkedList(); } - - public void setCount(String key, EntityStatistic stat) - { - if(key.equals("urn:scap-content:entity:org.mitre.oval:test")) - { - ovalTests += stat.getCount(); - } - else if(key.equals("urn:scap-content:entity:org.mitre.oval:definition")) - { - ovalDefinitions += stat.getCount(); - } - else if(key.equals("urn:scap-content:entity:org.mitre.oval:object")) - { - ovalObjects += stat.getCount(); - } - else if(key.equals("urn:scap-content:entity:org.mitre.oval:state")) - { - ovalStates += stat.getCount(); - } - else if(key.equals("urn:scap-content:entity:org.mitre.oval:variable")) - { - ovalVariables += stat.getCount(); - } - else - { - LOG.info("Adding unhandled count for key " + key); - other += stat.getCount(); - } + public void add(EntityStatistic stat) { + item.add(new StatItem(stat)); } - } diff --git a/content-repository-war/src/main/java/org/content/repository/war/rest/statistic/StatItem.java b/content-repository-war/src/main/java/org/content/repository/war/rest/statistic/StatItem.java new file mode 100644 index 0000000..3e90b5d --- /dev/null +++ b/content-repository-war/src/main/java/org/content/repository/war/rest/statistic/StatItem.java @@ -0,0 +1,43 @@ +package org.content.repository.war.rest.statistic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +import org.scapdev.content.core.query.EntityStatistic; +import org.scapdev.content.core.query.RelationshipStatistic; + +@XmlType +@XmlAccessorType(XmlAccessType.FIELD) +public class StatItem { + @SuppressWarnings("unused") + @XmlAttribute(required=true) + private String id; + // TODO: add support for language bundle + private String title; + @SuppressWarnings("unused") + @XmlAttribute(required=true) + private int count; + @XmlElement + private List relationship; + + public StatItem () { + // No arg required by JAXB + } + + public StatItem(EntityStatistic stat) { + this.id = stat.getEntityInfo().getId(); + this.count = stat.getCount(); + Collection relationshipStats = stat.getRelationshipInfoStatistics().values(); + this.relationship = new ArrayList(relationshipStats.size()); + for (RelationshipStatistic item : relationshipStats) { + this.relationship.add(new RelationshipItem(item)); + } + } +} \ No newline at end of file diff --git a/content-repository-war/src/main/webapp/WEB-INF/web.xml b/content-repository-war/src/main/webapp/WEB-INF/web.xml index ccc4de0..104cf53 100644 --- a/content-repository-war/src/main/webapp/WEB-INF/web.xml +++ b/content-repository-war/src/main/webapp/WEB-INF/web.xml @@ -21,7 +21,7 @@ com.sun.jersey.config.property.packages - org.content.repository.war.rest;org.content.repository.war.rest.oval + org.content.repository.war.rest;org.content.repository.war.rest.oval;org.content.repository.war.rest.query;org.content.repository.war.rest.statistic 2 diff --git a/content-repository/src/main/java/org/scapdev/content/core/ContentException.java b/content-repository/src/main/java/org/scapdev/content/core/ContentException.java index f0dd50e..cc2a533 100644 --- a/content-repository/src/main/java/org/scapdev/content/core/ContentException.java +++ b/content-repository/src/main/java/org/scapdev/content/core/ContentException.java @@ -25,9 +25,7 @@ public class ContentException extends RuntimeException { - /** - * - */ + /** the serial version UID */ private static final long serialVersionUID = 1L; public ContentException() { diff --git a/content-repository/src/main/java/org/scapdev/content/core/persistence/ContentPersistenceException.java b/content-repository/src/main/java/org/scapdev/content/core/persistence/ContentPersistenceException.java new file mode 100644 index 0000000..3473b66 --- /dev/null +++ b/content-repository/src/main/java/org/scapdev/content/core/persistence/ContentPersistenceException.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * The MIT License + * + * Copyright (c) 2011 davidwal + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ +package org.scapdev.content.core.persistence; + +import org.scapdev.content.core.ContentException; + +public class ContentPersistenceException extends ContentException { + + /** the serial version UID */ + private static final long serialVersionUID = 1L; + + public ContentPersistenceException() { + // TODO Auto-generated constructor stub + } + + public ContentPersistenceException(String message) { + super(message); + // TODO Auto-generated constructor stub + } + + public ContentPersistenceException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub + } + + public ContentPersistenceException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub + } + +} diff --git a/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/AbstractContentRetriever.java b/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/AbstractContentRetriever.java index b4471c3..0177c43 100644 --- a/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/AbstractContentRetriever.java +++ b/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/AbstractContentRetriever.java @@ -27,7 +27,7 @@ import org.scapdev.content.model.MetadataModel; -public abstract class AbstractContentRetriever implements ContentRetriever { +public abstract class AbstractContentRetriever implements ContentRetriever { public String contentId; public MetadataModel model; diff --git a/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/AbstractContentStore.java b/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/AbstractContentStore.java new file mode 100644 index 0000000..dce4f69 --- /dev/null +++ b/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/AbstractContentStore.java @@ -0,0 +1,125 @@ +/******************************************************************************* + * The MIT License + * + * Copyright (c) 2011 'David Waltermire' + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ +package org.scapdev.content.core.persistence.hybrid; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; + +import org.scapdev.content.core.persistence.ContentPersistenceException; +import org.scapdev.content.model.Entity; +import org.scapdev.content.model.MetadataModel; + +public abstract class AbstractContentStore implements ContentStore { +// private final JAXBMarshallerPool marshallerPool; +// private final JAXBUnmarshallerPool unmarshallerPool; + private Queue marshallerPool; + private Queue unmarshallerPool; + + public AbstractContentStore() { + marshallerPool = new LinkedList(); + unmarshallerPool = new LinkedList(); + } + + private Unmarshaller retrieveUnmarshaller(JAXBContext context) throws JAXBException { + Unmarshaller unmarshaller; + synchronized (this) { + unmarshaller = unmarshallerPool.poll(); + } + if (unmarshaller == null) { + unmarshaller = context.createUnmarshaller(); + } + return unmarshaller; + } + + private void storeUnmarshaller(Unmarshaller unmarshaller) { + synchronized (this) { + unmarshallerPool.offer(unmarshaller); // always returns true + } + } + + @Override + public JAXBElement getContent(String contentId, MetadataModel model) { + try { + Unmarshaller unmarshaller = retrieveUnmarshaller(model.getJAXBContext()); + JAXBElement result = getContentInternal(contentId, model, unmarshaller); + storeUnmarshaller(unmarshaller); + return result; + } catch (JAXBException e) { + throw new ContentPersistenceException(e); + } + } + + protected abstract JAXBElement getContentInternal(String contentId, MetadataModel model, Unmarshaller unmarshaller); + + @Override + public ContentRetriever getContentRetriever(String contentId, MetadataModel model) { + return new DefaultContentRetriever(contentId, model, this); + } + + private Marshaller retrieveMarshaller(JAXBContext context) throws JAXBException { + Marshaller marshaller; + synchronized (this) { + marshaller = marshallerPool.poll(); + } + if (marshaller == null) { + marshaller = context.createMarshaller(); + } + return marshaller; + } + + private void storeMarshaller(Marshaller marshaller) { + synchronized (this) { + marshallerPool.offer(marshaller); // always returns true + } + } + + @Override + public Map persist(List entities, + MetadataModel model) { + try { + Marshaller marshaller = retrieveMarshaller(model.getJAXBContext()); + Map result = persistInternal(entities, model, marshaller); + storeMarshaller(marshaller); + return result; + } catch (JAXBException e) { + throw new ContentPersistenceException(e); + } + } + + protected abstract Map persistInternal(List entities, MetadataModel model, Marshaller marshaller); + + @Override + public void shutdown() { + // TODO Auto-generated method stub + + } +} diff --git a/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/DefaultContentRetriever.java b/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/DefaultContentRetriever.java new file mode 100644 index 0000000..a489b61 --- /dev/null +++ b/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/DefaultContentRetriever.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * The MIT License + * + * Copyright (c) 2011 davidwal + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ +package org.scapdev.content.core.persistence.hybrid; + +import javax.xml.bind.JAXBElement; + +import org.scapdev.content.model.MetadataModel; + +public class DefaultContentRetriever extends AbstractContentRetriever { + private ContentStore contentStore; + + public DefaultContentRetriever(String contentId, MetadataModel model, ContentStore contentStore) { + super(contentId, model); + this.contentStore = contentStore; + } + + @Override + protected JAXBElement getContentInternal(String contentId, + MetadataModel model) { + return contentStore.getContent(contentId, model); + } +} diff --git a/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/MemoryResidentContentStore.java b/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/MemoryResidentContentStore.java index 5302a5b..8a43c96 100644 --- a/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/MemoryResidentContentStore.java +++ b/content-repository/src/main/java/org/scapdev/content/core/persistence/hybrid/MemoryResidentContentStore.java @@ -67,7 +67,7 @@ public InternalContentRetriever getContentRetriever(String contentId, MetadataMo return new InternalContentRetriever(contentId, model); } - private class InternalContentRetriever extends AbstractContentRetriever { + private class InternalContentRetriever extends AbstractContentRetriever { public InternalContentRetriever(String contentId, MetadataModel model) { super(contentId, model); diff --git a/db-store/src/main/java/org/scapdev/db/DbContentStore.java b/db-store/src/main/java/org/scapdev/db/DbContentStore.java index fb8cefc..2cee2930 100644 --- a/db-store/src/main/java/org/scapdev/db/DbContentStore.java +++ b/db-store/src/main/java/org/scapdev/db/DbContentStore.java @@ -19,17 +19,15 @@ import javax.xml.bind.Unmarshaller; import org.apache.log4j.Logger; -import org.scapdev.content.core.persistence.hybrid.AbstractContentRetriever; -import org.scapdev.content.core.persistence.hybrid.ContentRetriever; -import org.scapdev.content.core.persistence.hybrid.ContentStore; +import org.scapdev.content.core.persistence.ContentPersistenceException; +import org.scapdev.content.core.persistence.hybrid.AbstractContentStore; import org.scapdev.content.model.Entity; import org.scapdev.content.model.MetadataModel; -import net.sourceforge.jtds.jdbc.Driver; -//import com.microsoft.jdbc.sqlserver.SQLServerDriver; -public class DbContentStore implements ContentStore { +public class DbContentStore extends AbstractContentStore { + @SuppressWarnings("unused") private static final Properties env = new Properties(); private static final Logger LOG = Logger.getLogger(DbContentStore.class); private java.sql.Driver driver = new net.sourceforge.jtds.jdbc.Driver(); @@ -40,8 +38,7 @@ public class DbContentStore implements ContentStore { // Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); Class.forName("net.sourceforge.jtds.jdbc.Driver"); } catch (ClassNotFoundException e) { - System.out.println("Can't load MS SQL Server JDBC Driver com.microsoft.jdbc.sqlserver.SQLServerDriver"); - e.printStackTrace(); + LOG.error("Can't load MS SQL Server JDBC Driver com.microsoft.jdbc.sqlserver.SQLServerDriver", e); } } @@ -52,12 +49,13 @@ public DbContentStore() { System.out.println("Trying connection URL: " + urlString); conn = DriverManager.getConnection(urlString, "sa", "adminadmin"); } catch (SQLException e) { - System.out.println("Can't create database connection"); - e.printStackTrace(); + LOG.error("Can't create database connection", e); } } - public JAXBElement getContent(String contentId, MetadataModel model) { + + @Override + protected JAXBElement getContentInternal(String contentId, MetadataModel model, Unmarshaller unmarshaller) { JAXBElement result = null; String content = null; try { @@ -69,37 +67,37 @@ public JAXBElement getContent(String contentId, MetadataModel model) { content = rs.getString(1); if (content != null) { ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes()); - Unmarshaller unmarshaller = model.getJAXBContext().createUnmarshaller(); @SuppressWarnings("unchecked") JAXBElement unmarshalled = (JAXBElement) unmarshaller.unmarshal(bais); result = unmarshalled; } else { - throw new IllegalStateException("CONTENT ID NOT FOUND: " + contentId); + throw new ContentPersistenceException("CONTENT ID NOT FOUND: " + contentId); } } - - } catch (Exception e) { - LOG.error("Error getting content for id: " + contentId,e); + } catch (JAXBException e) { + LOG.error("Error retrieveing content for id: " + contentId, e); + throw new ContentPersistenceException("Unable to unmarshall content", e); + } catch (SQLException e) { + LOG.error("Error querying content for id: " + contentId, e); + throw new ContentPersistenceException("Unable to query content", e); } return result; } - public Map persist(List entities, - MetadataModel model) { + @Override + protected Map persistInternal(List entities, MetadataModel model, Marshaller marshaller) { Map result = new HashMap(); for (Entity entity : entities) { JAXBElement element = entity.getObject(); String contentId = null; String content = null; try { - Marshaller marshaller = model.getJAXBContext().createMarshaller(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(element, baos); content = new String(baos.toByteArray()); - } catch (Exception e) { - String message = "Error marshalling content " + entity.getKey().getId() + " to be persisted"; - LOG.error(message, e); - throw new IllegalStateException(message, e); + } catch (JAXBException e) { + LOG.error("Error marshalling content for key: " + entity.getKey().getId(), e); + throw new ContentPersistenceException("Unable to marshall content", e); } try { conn.setAutoCommit(false); @@ -115,36 +113,19 @@ public Map persist(List entities, result.put(contentId, entity); conn.commit(); conn.setAutoCommit(true); - } catch (Exception e) { - String message = "Error inserting content " + entity.getKey().getId() + " into database"; - LOG.error(message, e); - throw new IllegalStateException(message, e); + } catch (SQLException e) { + LOG.error("Error storing content for key: " + entity.getKey().getId(), e); + throw new ContentPersistenceException("Unable to insert content", e); } } return result; } - public ContentRetriever getContentRetriever(String contentId, - MetadataModel model) { - return new InternalContentRetriever(contentId, model); - } - public void shutdown() { try { conn.close(); } catch (SQLException e) { - } - } - - private class InternalContentRetriever extends AbstractContentRetriever { - - public InternalContentRetriever(String contentId, MetadataModel model) { - super(contentId, model); - } - - @Override - protected JAXBElement getContentInternal(String contentId, MetadataModel model) { - return DbContentStore.this.getContent(contentId, model); + LOG.error(e); } } diff --git a/db-store/src/main/java/org/scapdev/db/DbContentStoreFactory.java b/db-store/src/main/java/org/scapdev/db/DbContentStoreFactory.java index d0072a6..0d739e9 100644 --- a/db-store/src/main/java/org/scapdev/db/DbContentStoreFactory.java +++ b/db-store/src/main/java/org/scapdev/db/DbContentStoreFactory.java @@ -6,7 +6,7 @@ public class DbContentStoreFactory implements ContentStoreFactory { - static DbContentStore INSTANCE = null; + private static DbContentStore INSTANCE = null; public ContentStore newContentStore() { if (INSTANCE == null) { diff --git a/pom.xml b/pom.xml index 47974a8..704561a 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ content-repository content-repository-flex-console content-repository-war + db-store