You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by mf...@apache.org on 2012/06/11 14:22:11 UTC

svn commit: r1348814 - in /rave/branches/model_interfaces/rave-components: rave-core/src/main/java/org/apache/rave/portal/model/ rave-core/src/main/java/org/apache/rave/portal/model/conversion/ rave-core/src/main/java/org/apache/rave/portal/repository/...

Author: mfranklin
Date: Mon Jun 11 12:22:10 2012
New Revision: 1348814

URL: http://svn.apache.org/viewvc?rev=1348814&view=rev
Log:
Committed patch from Aaron Gooch (RAVE-632)

Added:
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaTag.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaWidgetTag.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/TagImpl.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/WidgetTagImpl.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/conversion/JpaTagConverter.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/conversion/JpaWidgetTagConverter.java
    rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/conversion/JpaTagConverterTest.java
    rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/conversion/JpaWidgetTagConverterTest.java
Modified:
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaWidget.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Tag.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/WidgetTag.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/TagRepository.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/WidgetTagRepository.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaTagRepository.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaWidgetTagRepository.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/security/impl/DefaultWidgetTagPermissionEvaluator.java
    rave/branches/model_interfaces/rave-components/rave-core/src/main/resources/META-INF/persistence.xml
    rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/TagTest.java
    rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/WidgetTagTest.java
    rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/WidgetTest.java
    rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaTagRepositoryTest.java
    rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaWidgetTagRepositoryTest.java
    rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultTagServiceTest.java
    rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultWidgetTagServiceTest.java
    rave/branches/model_interfaces/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rest/WidgetApi.java
    rave/branches/model_interfaces/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rest/WidgetApiTest.java
    rave/branches/model_interfaces/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/WidgetStoreControllerTest.java

Added: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaTag.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaTag.java?rev=1348814&view=auto
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaTag.java (added)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaTag.java Mon Jun 11 12:22:10 2012
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.rave.portal.model;
+
+import org.apache.rave.persistence.BasicEntity;
+import org.apache.rave.portal.model.conversion.ConvertingListProxyFactory;
+import org.apache.rave.portal.model.conversion.JpaWidgetTagConverter;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a group in the social database. The assumption in this object is that groups are
+ * associated with individuals and are used by those individuals to manage people.
+ */
+@Entity
+@Table(name = "tag")
+@Access(AccessType.FIELD)
+@NamedQueries({
+        @NamedQuery(name = JpaTag.GET_ALL, query = "select t from JpaTag t order by t.keyword asc"),
+        @NamedQuery(name = JpaTag.COUNT_ALL, query = "select count(t) from JpaTag t "),
+        @NamedQuery(name = JpaTag.GET_ALL_NOT_IN_WIDGET, query = "select tag from JpaTag tag where tag.keyword not in " +
+                "(select t.keyword from JpaTag t join t.widgets w where w.widgetId =:widgetId)"),
+
+        @NamedQuery(name = JpaTag.FIND_BY_KEYWORD, query = "select t from JpaTag t where UPPER(t.keyword) = UPPER(:keyword)")
+})
+
+public class JpaTag implements BasicEntity, Tag {
+
+    public static final String FIND_BY_KEYWORD = "findByKeyword";
+    public static final String GET_ALL = "getAll";
+    public static final String COUNT_ALL = "countAll";
+    public static final String GET_ALL_NOT_IN_WIDGET="getAllNotInWidget" ;
+    public static final String KEYWORD_PARAM = "keyword";
+
+    @Autowired
+    private JpaWidgetTagConverter jpaWidgetTagConverter;
+
+    /**
+     * The internal object ID used for references to this object. Should be generated by the
+     * underlying storage mechanism
+     */
+    @Id
+    @Column(name = "entity_id")
+    @GeneratedValue(strategy = GenerationType.TABLE, generator = "tagIdGenerator")
+    @TableGenerator(name = "tagIdGenerator", table = "RAVE_PORTAL_SEQUENCES", pkColumnName = "SEQ_NAME",
+            valueColumnName = "SEQ_COUNT", pkColumnValue = "tag", allocationSize = 1, initialValue = 1)
+    private Long entityId;
+
+    @Basic
+    @Column(name = "keyword", unique = true)
+    private String keyword;
+
+    @OneToMany(mappedBy="tag")
+    public List<JpaWidgetTag> widgets;
+
+
+    public JpaTag() {
+
+    }
+
+    public JpaTag(Long entityId, String keyword) {
+        this.entityId = entityId;
+        this.keyword = keyword;
+    }
+
+    public String getKeyword() {
+        return keyword;
+    }
+
+    public void setKeyword(String keyword) {
+        this.keyword = keyword;
+    }
+
+    public Long getEntityId() {
+        return entityId;
+    }
+
+    public void setEntityId(Long entityId) {
+        this.entityId = entityId;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public List<WidgetTag> getWidgets() {
+        return ConvertingListProxyFactory.createProxyList(WidgetTag.class, widgets);
+    }
+
+    @Override
+    public void setWidgets(List<WidgetTag> widgets) {
+        if(this.widgets == null){
+            this.widgets = new ArrayList<JpaWidgetTag>();
+        }
+        this.getWidgets().clear();
+        this.getWidgets().addAll(widgets);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        JpaTag tag = (JpaTag) o;
+
+        if (entityId != null ? !entityId.equals(tag.entityId) : tag.entityId != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return entityId != null ? entityId.hashCode() : 0;
+    }
+}

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaWidget.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaWidget.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaWidget.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaWidget.java Mon Jun 11 12:22:10 2012
@@ -91,7 +91,7 @@ public class JpaWidget implements BasicE
     static final String WHERE_CLAUSE_STATUS = " WHERE w.widgetStatus = :" + PARAM_STATUS;
     static final String WHERE_CLAUSE_URL = " WHERE w.url = :" + PARAM_URL;
     static final String WHERE_CLAUSE_OWNER = " WHERE w.owner = :" + PARAM_OWNER;
-    static final String WIDGET_TAG_BY_KEYWORD=" (select t.widgetId from WidgetTag t where lower(t.tag.keyword)=:"+PARAM_TAG+")";
+    static final String WIDGET_TAG_BY_KEYWORD=" (select t.widgetId from JpaWidgetTag t where lower(t.tag.keyword)=:"+PARAM_TAG+")";
     static final String JOIN_TAGS=" WHERE w.entityId in"+WIDGET_TAG_BY_KEYWORD;
 
     static final String ORDER_BY_TITLE_ASC = " ORDER BY w.featured DESC, w.title ASC ";
@@ -182,7 +182,7 @@ public class JpaWidget implements BasicE
 
     @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
     @JoinColumn(name = "widget_id", referencedColumnName = "entity_id")
-    private List<WidgetTag> tags;
+    private List<JpaWidgetTag> tags;
 
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(name="widget_category",
@@ -401,12 +401,19 @@ public class JpaWidget implements BasicE
 
     @Override
     public List<WidgetTag> getTags() {
-        return tags;
+        return ConvertingListProxyFactory.createProxyList(WidgetTag.class, tags);
     }
 
     @Override
     public void setTags(List<WidgetTag> tags) {
-        this.tags = tags;
+        if(this.tags == null) {
+            this.tags = new ArrayList<JpaWidgetTag>();
+        }
+        //Ensure that all operations go through the conversion proxy
+        this.getTags().clear();
+        if(tags != null) {
+            this.getTags().addAll(tags);
+        }
     }
 
     @Override

Added: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaWidgetTag.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaWidgetTag.java?rev=1348814&view=auto
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaWidgetTag.java (added)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/JpaWidgetTag.java Mon Jun 11 12:22:10 2012
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2011 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rave.portal.model;
+
+import javax.persistence.*;
+import javax.xml.bind.annotation.XmlRootElement;
+import java.io.Serializable;
+import java.util.Date;
+/**
+ * A tag for a widget.
+ */
+@Entity
+@Table(name = "widget_tag")
+@Access(AccessType.FIELD)
+@XmlRootElement
+@NamedQueries({
+        @NamedQuery(name = JpaWidgetTag.FIND_BY_WIDGET_AND_KEYWORD, query = "select t from JpaWidgetTag t where t.widgetId=:widgetId and UPPER(t.tag.keyword) = UPPER(:keyword)")
+})
+public class JpaWidgetTag implements WidgetTag, Serializable {
+
+    public static final String FIND_BY_WIDGET_AND_KEYWORD = "findByWidgetAndKeyword";
+    public static final String WIDGET_ID_PARAM = "widgetId";
+    public static final String TAG_KEYWORD_PARAM = "keyword";
+
+    @Id
+    @Column(name = "entity_id")
+    @GeneratedValue(strategy = GenerationType.TABLE, generator = "widgetTagIdGenerator")
+    @TableGenerator(name = "widgetTagIdGenerator", table = "RAVE_PORTAL_SEQUENCES", pkColumnName = "SEQ_NAME",
+            valueColumnName = "SEQ_COUNT", pkColumnValue = "widget_tag", allocationSize = 1, initialValue = 1)
+    private Long entityId;
+
+    @Basic
+    @Column(name = "widget_id")
+    private Long widgetId;
+
+    @OneToOne(fetch = FetchType.EAGER)
+    @JoinColumn(name = "user_id")
+    private User user;
+
+    @ManyToOne(fetch=FetchType.EAGER,cascade = CascadeType.ALL)
+    @JoinColumn(name = "tag_id")
+    private JpaTag tag;
+
+    @Basic
+    @Column(name = "created_date")
+    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
+    private Date createdDate;
+
+    public JpaWidgetTag() {}
+
+    public JpaWidgetTag(long id, long widgetId, User user, Date date, JpaTag tag) {
+        this.entityId = id;
+        this.widgetId = widgetId;
+        this.user = user;
+        this.createdDate = date;
+        this.tag = tag;
+    }
+
+    public Long getEntityId(){
+        return this.entityId;
+    }
+    
+    public void setEntityId(Long id){
+        this.entityId = id;
+    }
+    
+    @Override
+    public Long getWidgetId() {
+        return this.widgetId;
+    }
+
+    @Override
+    public void setWidgetId(Long id) {
+        this.widgetId = id;
+    }
+
+    @Override
+    public User getUser() {
+        return this.user;
+    }
+
+    @Override
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    @Override
+    public Tag getTag() {
+        return this.tag;
+    }
+
+    @Override
+    public void setTag(Tag tag) {
+        this.tag = (JpaTag)tag;
+    }
+
+    @Override
+    public Date getCreatedDate() {
+        return this.createdDate;
+    }
+
+    @Override
+    public void setCreatedDate(Date date) {
+        this.createdDate = date;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof JpaWidgetTag)) return false;
+
+        JpaWidgetTag that = (JpaWidgetTag) o;
+
+        if (createdDate != null ? !createdDate.equals(that.createdDate) : that.createdDate != null) return false;
+        if (tag != null ? !tag.equals(that.tag) : that.tag != null) return false;
+        if (user != null ? !user.equals(that.user) : that.user != null) return false;
+        if (widgetId != null ? !widgetId.equals(that.widgetId) : that.widgetId != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = widgetId != null ? widgetId.hashCode() : 0;
+        result = 31 * result + (user != null ? user.hashCode() : 0);
+        result = 31 * result + (tag != null ? tag.hashCode() : 0);
+        result = 31 * result + (createdDate != null ? createdDate.hashCode() : 0);
+        return result;
+    }
+}

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Tag.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Tag.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Tag.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Tag.java Mon Jun 11 12:22:10 2012
@@ -1,127 +1,28 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * Copyright 2011 The Apache Software Foundation.
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.apache.rave.portal.model;
 
-import org.apache.rave.persistence.BasicEntity;
-
-import javax.persistence.*;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
-/**
- * Represents a group in the social database. The assumption in this object is that groups are
- * associated with individuals and are used by those individuals to manage people.
- */
-@Entity
-@Access(AccessType.FIELD)
-@Table(name = "tag")
-@NamedQueries({
-        @NamedQuery(name = Tag.GET_ALL, query = "select t from Tag t order by t.keyword asc"),
-        @NamedQuery(name = Tag.COUNT_ALL, query = "select count(t) from Tag t "),
-        @NamedQuery(name = Tag.GET_ALL_NOT_IN_WIDGET, query = "select tag from Tag tag where tag.keyword not in " +
-                        "(select t.keyword from Tag t join t.widgets w where w.widgetId =:widgetId)"),
-
-        @NamedQuery(name = Tag.FIND_BY_KEYWORD, query = "select t from Tag t where UPPER(t.keyword) = UPPER(:keyword)")
-})
-
-public class Tag implements BasicEntity {
-
-    public static final String FIND_BY_KEYWORD = "findByKeyword";
-    public static final String GET_ALL = "getAll";
-    public static final String COUNT_ALL = "countAll";
-    public static final String GET_ALL_NOT_IN_WIDGET="getAllNotInWidget" ;
-
-    /**
-     * The internal object ID used for references to this object. Should be generated by the
-     * underlying storage mechanism
-     */
-    @Id
-    @Column(name = "entity_id")
-    @GeneratedValue(strategy = GenerationType.TABLE, generator = "tagIdGenerator")
-    @TableGenerator(name = "tagIdGenerator", table = "RAVE_PORTAL_SEQUENCES", pkColumnName = "SEQ_NAME",
-            valueColumnName = "SEQ_COUNT", pkColumnValue = "tag", allocationSize = 1, initialValue = 1)
-    private Long entityId;
-
-    @Basic
-    @Column(name = "keyword", unique = true)
-    private String keyword;
-
-    @OneToMany(mappedBy="tag")
-    public List<WidgetTag> widgets;
-
-
-    public Tag() {
-
-    }
-
-    public Tag(Long entityId, String keyword) {
-        this.entityId = entityId;
-        this.keyword = keyword;
-    }
-
-    public String getKeyword() {
-        return keyword;
-    }
-
-    public void setKeyword(String keyword) {
-        this.keyword = keyword;
-    }
-
-    public Long getEntityId() {
-        return entityId;
-    }
-
-    public void setEntityId(Long entityId) {
-        this.entityId = entityId;
-    }
-
-    public List<WidgetTag> getWidgets() {
-        if (widgets==null) widgets=new ArrayList<WidgetTag>();
-        return widgets;
-    }
-
-    public void setWidgets(List<WidgetTag> widgets) {
-        this.widgets = widgets;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        Tag tag = (Tag) o;
 
-        if (entityId != null ? !entityId.equals(tag.entityId) : tag.entityId != null) {
-            return false;
-        }
+public interface Tag {
 
-        return true;
-    }
+    String getKeyword();
+    void setKeyword(String keyword);
+    List<WidgetTag> getWidgets();
+    void setWidgets(List<WidgetTag> widgets);
 
-    @Override
-    public int hashCode() {
-        return entityId != null ? entityId.hashCode() : 0;
-    }
 }

Added: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/TagImpl.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/TagImpl.java?rev=1348814&view=auto
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/TagImpl.java (added)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/TagImpl.java Mon Jun 11 12:22:10 2012
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2011 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rave.portal.model;
+
+import java.util.List;
+
+public class TagImpl implements Tag {
+
+    private String keyword;
+    private List<WidgetTag> widgets;
+
+    public TagImpl(String keyword, List<WidgetTag> widgets) {
+        this.keyword = keyword;
+        this.widgets = widgets;
+    }
+
+    public TagImpl(String keyword) {
+        this.keyword = keyword;
+    }
+
+    public TagImpl() {
+    }
+
+    @Override
+    public String getKeyword() {
+        return this.keyword;
+    }
+
+    @Override
+    public void setKeyword(String keyword) {
+        this.keyword = keyword;
+    }
+
+    @Override
+    public List<WidgetTag> getWidgets() {
+        return this.widgets;
+    }
+
+    @Override
+    public void setWidgets(List<WidgetTag> widgets) {
+        this.widgets = widgets;
+    }
+}

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/WidgetTag.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/WidgetTag.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/WidgetTag.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/WidgetTag.java Mon Jun 11 12:22:10 2012
@@ -13,138 +13,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.rave.portal.model;
 
-import org.apache.rave.persistence.BasicEntity;
+package org.apache.rave.portal.model;
 
-import javax.persistence.*;
-import javax.xml.bind.annotation.XmlRootElement;
-import java.io.Serializable;
 import java.util.Date;
 
-/**
- * A tag for a widget.
- */
-@Entity
-@Access(AccessType.FIELD)
-@Table(name = "widget_tag")
-@XmlRootElement
-@NamedQueries({
-        @NamedQuery(name = WidgetTag.FIND_BY_WIDGET_AND_KEYWORD, query = "select t from WidgetTag t where t.widgetId=:widgetId and UPPER(t.tag.keyword) = UPPER(:keyword)")
-})
-
-public class WidgetTag implements BasicEntity, Serializable {
-
-    public static final String FIND_BY_WIDGET_AND_KEYWORD = "findByWidgetAndKeyword";
-
-    @Id
-    @Column(name = "entity_id")
-    @GeneratedValue(strategy = GenerationType.TABLE, generator = "widgetTagIdGenerator")
-    @TableGenerator(name = "widgetTagIdGenerator", table = "RAVE_PORTAL_SEQUENCES", pkColumnName = "SEQ_NAME",
-            valueColumnName = "SEQ_COUNT", pkColumnValue = "widget_tag", allocationSize = 1, initialValue = 1)
-    private Long entityId;
-
-    @Basic
-    @Column(name = "widget_id")
-    private Long widgetId;
-
-    @OneToOne(fetch = FetchType.EAGER)
-    @JoinColumn(name = "user_id")
-    private User user;
-
-    @ManyToOne(fetch=FetchType.EAGER,cascade = CascadeType.ALL)
-    @JoinColumn(name = "tag_id")
-    private Tag tag;
-
-    @Basic
-    @Column(name = "created_date")
-    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
-    private Date createdDate;
-
-    public WidgetTag() {
-
-    }
-
-    public WidgetTag(Long entityId, Long widgetId, User user, Date created, Tag tag) {
-        this.entityId = entityId;
-        this.widgetId = widgetId;
-        this.user = user;
-        this.tag = tag;
-        this.createdDate = created;
-    }
-
-    @Override
-    public Long getEntityId() {
-        return entityId;
-    }
-
-    @Override
-    public void setEntityId(Long entityId) {
-        this.entityId = entityId;
-    }
-
-    public Long getWidgetId() {
-        return widgetId;
-    }
-
-    public void setWidgetId(Long widgetId) {
-        this.widgetId = widgetId;
-    }
-
-    public User getUser() {
-        return user;
-    }
-
-    public void setUser(User user) {
-        this.user = user;
-    }
-
-
-
-    public Date getCreatedDate() {
-        return createdDate;
-    }
-
-    public void setCreatedDate(Date created) {
-        this.createdDate = created;
-    }
-
-    public Tag getTag() {
-        return tag;
-    }
-
-    public void setTag(Tag tag) {
-        this.tag = tag;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        final WidgetTag other = (WidgetTag) obj;
-        if (this.entityId != other.entityId && (this.entityId == null || !this.entityId.equals(other.entityId))) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = 7;
-        hash = 79 * hash + (this.entityId != null ? this.entityId.hashCode() : 0);
-        return hash;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb=new StringBuilder("WidgetTag") ;
-        sb.append("{").append("entityId=").append(entityId).append( ", widgetId=").append(widgetId);
-        if (tag!=null) sb.append("tag keyword=").append(tag.getKeyword());
-        sb.append("}") ;
-        return sb.toString();
-    }
+public interface WidgetTag {
+    
+    Long getWidgetId();
+    void setWidgetId(Long id);
+    User getUser();
+    void setUser(User user);
+    Tag getTag();
+    void setTag(Tag tag);
+    Date getCreatedDate();
+    void setCreatedDate(Date date);
 }

Added: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/WidgetTagImpl.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/WidgetTagImpl.java?rev=1348814&view=auto
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/WidgetTagImpl.java (added)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/WidgetTagImpl.java Mon Jun 11 12:22:10 2012
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2011 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rave.portal.model;
+
+import java.util.Date;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Aaron Gooch
+ * Date: 5/31/12
+ * Time: 9:36 AM
+ */
+public class WidgetTagImpl implements WidgetTag {
+
+    private Long widgetId;
+    private User user;
+    private Tag tag;
+    private Date createdDate;
+
+    public WidgetTagImpl() {
+    }
+
+    public WidgetTagImpl(Long widgetId, User user, Date createdDate, Tag tag) {
+        this.widgetId = widgetId;
+        this.user = user;
+        this.tag = tag;
+        this.createdDate = createdDate;
+    }
+
+    @Override
+    public Long getWidgetId() {
+        return this.widgetId;
+    }
+
+    @Override
+    public void setWidgetId(Long id) {
+        this.widgetId = id;
+    }
+
+    @Override
+    public User getUser() {
+        return this.user;
+    }
+
+    @Override
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    @Override
+    public Tag getTag() {
+        return this.tag;
+    }
+
+    @Override
+    public void setTag(Tag tag) {
+        this.tag = tag;
+    }
+
+    @Override
+    public Date getCreatedDate() {
+       return this.createdDate;
+    }
+
+    @Override
+    public void setCreatedDate(Date date) {
+        this.createdDate = date;
+    }
+}

Added: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/conversion/JpaTagConverter.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/conversion/JpaTagConverter.java?rev=1348814&view=auto
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/conversion/JpaTagConverter.java (added)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/conversion/JpaTagConverter.java Mon Jun 11 12:22:10 2012
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2011 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rave.portal.model.conversion;
+
+import org.apache.rave.model.ModelConverter;
+import org.apache.rave.persistence.jpa.util.JpaUtil;
+import org.apache.rave.portal.model.JpaTag;
+import org.apache.rave.portal.model.Tag;
+import org.springframework.stereotype.Component;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+
+/**
+ * Converts from a {@link org.apache.rave.portal.model.Tag} to a {@link org.apache.rave.portal.model.JpaTag}
+ */
+@Component
+public class JpaTagConverter implements ModelConverter<Tag, JpaTag> {
+
+    @PersistenceContext
+    private EntityManager manager;
+
+    @Override
+    public Class<Tag> getSourceType() {
+        return Tag.class;
+    }
+
+    @Override
+    public JpaTag convert(Tag source) {
+        return source instanceof JpaTag ? (JpaTag)source : createEntity(source);
+    }
+
+    private JpaTag createEntity(Tag source) {
+        JpaTag convertedTag;
+        TypedQuery<JpaTag> query = manager.createNamedQuery(JpaTag.FIND_BY_KEYWORD, JpaTag.class);
+        query.setParameter(JpaTag.KEYWORD_PARAM, source.getKeyword());
+        convertedTag = JpaUtil.getSingleResult(query.getResultList());
+
+        if (convertedTag == null){
+            convertedTag = new JpaTag();
+        }
+        updateProperties(source, convertedTag);
+        return convertedTag;
+    }
+
+    private void updateProperties(Tag source, JpaTag jpaTag) {
+        jpaTag.setKeyword(source.getKeyword());
+        jpaTag.setWidgets(source.getWidgets());
+    }
+
+
+}

Added: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/conversion/JpaWidgetTagConverter.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/conversion/JpaWidgetTagConverter.java?rev=1348814&view=auto
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/conversion/JpaWidgetTagConverter.java (added)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/conversion/JpaWidgetTagConverter.java Mon Jun 11 12:22:10 2012
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2011 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rave.portal.model.conversion;
+
+import org.apache.rave.model.ModelConverter;
+import org.apache.rave.persistence.jpa.util.JpaUtil;
+import org.apache.rave.portal.model.JpaWidgetTag;
+import org.apache.rave.portal.model.WidgetTag;
+import org.springframework.stereotype.Component;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+
+/**
+ * Converts from a {@link org.apache.rave.portal.model.WidgetTag} to a {@link org.apache.rave.portal.model.JpaWidgetTag}
+ */
+@Component
+public class JpaWidgetTagConverter implements ModelConverter<WidgetTag, JpaWidgetTag> {
+
+    @PersistenceContext
+    private EntityManager manager;
+
+    @Override
+    public Class<WidgetTag> getSourceType() {
+        return WidgetTag.class;
+    }
+
+    @Override
+    public JpaWidgetTag convert(WidgetTag source) {
+        return source instanceof JpaWidgetTag ? (JpaWidgetTag)source : createEntity(source);
+    }
+
+    private JpaWidgetTag createEntity(WidgetTag source) {
+        JpaWidgetTag convertedWidgetTag;
+        TypedQuery<JpaWidgetTag> query = manager.createNamedQuery(JpaWidgetTag.FIND_BY_WIDGET_AND_KEYWORD, JpaWidgetTag.class);
+        query.setParameter(JpaWidgetTag.WIDGET_ID_PARAM, source.getWidgetId());
+        query.setParameter(JpaWidgetTag.TAG_KEYWORD_PARAM, source.getTag().getKeyword());
+        convertedWidgetTag = JpaUtil.getSingleResult(query.getResultList());
+
+        if (convertedWidgetTag == null){
+            convertedWidgetTag = new JpaWidgetTag();
+        }
+        updateProperties(source, convertedWidgetTag);
+        return convertedWidgetTag;
+    }
+
+    private void updateProperties(WidgetTag source, JpaWidgetTag convertedWidgetTag) {
+        convertedWidgetTag.setCreatedDate(source.getCreatedDate());
+        convertedWidgetTag.setTag(source.getTag());
+        convertedWidgetTag.setUser(source.getUser());
+        convertedWidgetTag.setWidgetId(source.getWidgetId());
+    }
+}

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/TagRepository.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/TagRepository.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/TagRepository.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/TagRepository.java Mon Jun 11 12:22:10 2012
@@ -25,11 +25,11 @@ import org.apache.rave.portal.model.Tag;
 import java.util.List;
 
 /**
- * Repository interface for {@link org.apache.rave.portal.model.Tag}
+ * Repository interface for {@link org.apache.rave.portal.model.JpaTag}
  */
 public interface TagRepository extends Repository<Tag> {
     /**
-     * @return a List of all {@link Tag}'s.
+     * @return a List of all {@link org.apache.rave.portal.model.JpaTag}'s.
      */
 
     List<Tag> getAll();
@@ -47,7 +47,7 @@ public interface TagRepository extends R
     Tag getByKeyword(String keyword);
 
     /**
-     * @return a List of all tag not link to this widget{@link Tag}'s.
+     * @return a List of all tag not link to this widget{@link org.apache.rave.portal.model.JpaTag}'s.
      */
 
     List<Tag> getAvailableTagsByWidgetId(Long widgetId);

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/WidgetTagRepository.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/WidgetTagRepository.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/WidgetTagRepository.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/WidgetTagRepository.java Mon Jun 11 12:22:10 2012
@@ -24,11 +24,11 @@ import org.apache.rave.portal.model.Widg
 public interface WidgetTagRepository extends Repository<WidgetTag> {
 
     /**
-         * Tries to find a {@link WidgetTag} by the id's of a Widget and Tag keyword
+         * Tries to find a {@link org.apache.rave.portal.model.WidgetTag} by the id's of a Widget and Tag keyword
          *
          * @param widgetId unique identifier of a Widget
          * @param keyword   tag's keyword
-         * @return {@link WidgetTag} if it exists, otherwise {@literal null}
+         * @return {@link org.apache.rave.portal.model.WidgetTag} if it exists, otherwise {@literal null}
          */
         WidgetTag getByWidgetIdAndTag(Long widgetId, String keyword);
 }

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaTagRepository.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaTagRepository.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaTagRepository.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaTagRepository.java Mon Jun 11 12:22:10 2012
@@ -19,58 +19,84 @@
 
 package org.apache.rave.portal.repository.impl;
 
-import org.apache.rave.persistence.jpa.AbstractJpaRepository;
+import org.apache.rave.portal.model.JpaTag;
 import org.apache.rave.portal.model.Tag;
+import org.apache.rave.portal.model.conversion.JpaTagConverter;
 import org.apache.rave.portal.repository.TagRepository;
+import org.apache.rave.util.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
 import java.util.List;
 
 import static org.apache.rave.persistence.jpa.util.JpaUtil.getSingleResult;
+import static org.apache.rave.persistence.jpa.util.JpaUtil.saveOrUpdate;
 
 /**
  * JPA implementation for {@link org.apache.rave.portal.repository.AuthorityRepository}
  */
 @Repository
-public class JpaTagRepository extends AbstractJpaRepository<Tag>
-        implements TagRepository {
+public class JpaTagRepository implements TagRepository {
 
-    public JpaTagRepository() {
-        super(Tag.class);
-    }
+    @PersistenceContext
+    private EntityManager manager;
+    
+    @Autowired
+    private JpaTagConverter converter;
 
 
     @Override
     public List<Tag> getAll() {
-        TypedQuery<Tag> query = manager.createNamedQuery(Tag.GET_ALL, Tag.class);
-        return query.getResultList();
+        TypedQuery<JpaTag> query = manager.createNamedQuery(JpaTag.GET_ALL, JpaTag.class);
+        return CollectionUtils.<Tag>toBaseTypedList(query.getResultList());
     }
 
+    @Override
+    public Class<? extends Tag> getType(){
+        return JpaTag.class;
+    }
 
     @Override
     public int getCountAll() {
-        Query query = manager.createNamedQuery(Tag.COUNT_ALL);
+        Query query = manager.createNamedQuery(JpaTag.COUNT_ALL);
         Number countResult = (Number) query.getSingleResult();
         return countResult.intValue();
     }
 
     @Override
-    public Tag getByKeyword(String keyword) {
+    public JpaTag getByKeyword(String keyword) {
         if (keyword != null) {
             keyword = keyword.trim();
         }
-        TypedQuery<Tag> query = manager.createNamedQuery(Tag.FIND_BY_KEYWORD, Tag.class);
+        TypedQuery<JpaTag> query = manager.createNamedQuery(JpaTag.FIND_BY_KEYWORD, JpaTag.class);
         query.setParameter("keyword", keyword);
         return getSingleResult(query.getResultList());
     }
 
     @Override
     public List<Tag> getAvailableTagsByWidgetId(Long widgetId) {
-        TypedQuery<Tag> query = manager.createNamedQuery(Tag.GET_ALL_NOT_IN_WIDGET, Tag.class);
+        TypedQuery<JpaTag> query = manager.createNamedQuery(JpaTag.GET_ALL_NOT_IN_WIDGET, JpaTag.class);
         query.setParameter("widgetId", widgetId);
-        return query.getResultList();
+        return CollectionUtils.<Tag>toBaseTypedList(query.getResultList());
+    }
+
+    @Override
+    public Tag get(long id) {
+        return manager.find(JpaTag.class, id);
     }
 
+    @Override
+    public Tag save(Tag item) {
+        JpaTag tag = converter.convert(item);
+        return saveOrUpdate(tag.getEntityId(), manager, tag);
+    }
+
+    @Override
+    public void delete(Tag item) {
+        manager.remove(item instanceof JpaTag ? item : getByKeyword(item.getKeyword()));
+    }
 }

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaWidgetTagRepository.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaWidgetTagRepository.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaWidgetTagRepository.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaWidgetTagRepository.java Mon Jun 11 12:22:10 2012
@@ -15,32 +15,58 @@
  */
 package org.apache.rave.portal.repository.impl;
 
-import org.apache.rave.persistence.jpa.AbstractJpaRepository;
+import org.apache.rave.portal.model.JpaWidgetTag;
 import org.apache.rave.portal.model.WidgetTag;
+import org.apache.rave.portal.model.conversion.JpaWidgetTagConverter;
 import org.apache.rave.portal.repository.WidgetTagRepository;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
 import javax.persistence.TypedQuery;
 
 import static org.apache.rave.persistence.jpa.util.JpaUtil.getSingleResult;
+import static org.apache.rave.persistence.jpa.util.JpaUtil.saveOrUpdate;
 
 @Repository
-public class JpaWidgetTagRepository extends AbstractJpaRepository<WidgetTag> implements WidgetTagRepository {
+public class JpaWidgetTagRepository implements WidgetTagRepository {
 
-    JpaWidgetTagRepository() {
-        super(WidgetTag.class);
-    }
+    @PersistenceContext
+    EntityManager manager;
+    
+    @Autowired
+    JpaWidgetTagConverter converter;
 
     @Override
-    public WidgetTag getByWidgetIdAndTag(Long widgetId, String keyword) {
+    public JpaWidgetTag getByWidgetIdAndTag(Long widgetId, String keyword) {
         if (keyword != null) {
             keyword = keyword.trim();
         }
-        TypedQuery<WidgetTag> query = manager.createNamedQuery(WidgetTag.FIND_BY_WIDGET_AND_KEYWORD, WidgetTag.class);
+        TypedQuery<JpaWidgetTag> query = manager.createNamedQuery(JpaWidgetTag.FIND_BY_WIDGET_AND_KEYWORD, JpaWidgetTag.class);
         query.setParameter("keyword", keyword);
         query.setParameter("widgetId", widgetId);
         return getSingleResult(query.getResultList());
     }
 
+    @Override
+    public Class<? extends WidgetTag> getType() {
+        return JpaWidgetTag.class;
+    }
+
+    @Override
+    public WidgetTag get(long id) {
+        return manager.find(JpaWidgetTag.class, id);
+    }
 
+    @Override
+    public WidgetTag save(WidgetTag item) {
+        JpaWidgetTag widgetTag = converter.convert(item);
+        return saveOrUpdate(widgetTag.getEntityId(), manager, widgetTag);
+    }
+
+    @Override
+    public void delete(WidgetTag item) {
+        manager.remove(item instanceof JpaWidgetTag ? item: getByWidgetIdAndTag(item.getWidgetId(), item.getTag().getKeyword()));
+    }
 }

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/security/impl/DefaultWidgetTagPermissionEvaluator.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/security/impl/DefaultWidgetTagPermissionEvaluator.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/security/impl/DefaultWidgetTagPermissionEvaluator.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/java/org/apache/rave/portal/security/impl/DefaultWidgetTagPermissionEvaluator.java Mon Jun 11 12:22:10 2012
@@ -170,7 +170,7 @@ public class DefaultWidgetTagPermissionE
         if (trustedDomainObject) {
             trustedWidgetTag = widgetTag;
         } else {
-            trustedWidgetTag = getTrustedWidgetTag(widgetTag.getEntityId(), trustedWidgetTagContainer);
+            trustedWidgetTag = getTrustedWidgetTag(widgetTag.getWidgetId(), widgetTag.getTag().getKeyword(), trustedWidgetTagContainer);
         }                  
         
         return isWidgetTagOwnerByUsername(authentication, trustedWidgetTag.getUser().getUsername());
@@ -178,10 +178,10 @@ public class DefaultWidgetTagPermissionE
     
     // returns a trusted WidgetTag object, either from the WidgetTagRepository, or the
     // cached container list
-    private WidgetTag getTrustedWidgetTag(long widgetTagId, List<WidgetTag> trustedWidgetTagContainer) {
+    private WidgetTag getTrustedWidgetTag(long widgetId, String tagKeyword, List<WidgetTag> trustedWidgetTagContainer) {
         WidgetTag p = null;
         if (trustedWidgetTagContainer.isEmpty()) {
-            p = widgetTagRepository.get(widgetTagId);
+            p = widgetTagRepository.getByWidgetIdAndTag(widgetId, tagKeyword);
             trustedWidgetTagContainer.add(p);
         } else {
             p = trustedWidgetTagContainer.get(0);

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/main/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/main/resources/META-INF/persistence.xml?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/main/resources/META-INF/persistence.xml (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/main/resources/META-INF/persistence.xml Mon Jun 11 12:22:10 2012
@@ -33,8 +33,8 @@
             <class>org.apache.rave.portal.model.JpaWidgetRating</class>
             <class>org.apache.rave.portal.model.JpaPageLayout</class>
             <class>org.apache.rave.portal.model.JpaAuthority</class>
-            <class>org.apache.rave.portal.model.Tag</class>
-            <class>org.apache.rave.portal.model.WidgetTag</class>
+            <class>org.apache.rave.portal.model.JpaTag</class>
+            <class>org.apache.rave.portal.model.JpaWidgetTag</class>
             <class>org.apache.rave.portal.model.JpaPortalPreference</class>
             <class>org.apache.rave.portal.model.JpaPageTemplate</class>
             <class>org.apache.rave.portal.model.JpaPageTemplateRegion</class>

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/TagTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/TagTest.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/TagTest.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/TagTest.java Mon Jun 11 12:22:10 2012
@@ -30,7 +30,7 @@ public class TagTest {
 
     @Test
     public void testAuthority() throws Exception {
-        Tag tag = new Tag();
+        Tag tag = new JpaTag();
         tag.setKeyword("test");
         assertEquals("test", tag.getKeyword());
 

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/WidgetTagTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/WidgetTagTest.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/WidgetTagTest.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/WidgetTagTest.java Mon Jun 11 12:22:10 2012
@@ -27,7 +27,7 @@ import static org.junit.Assert.*;
  */
 public class WidgetTagTest {
     
-    private WidgetTag widgetTag;
+    private JpaWidgetTag widgetTag;
     
     private static final Long VALID_ENTITY_ID = 1L;
     private static final Long VALID_USER_ID = 1L;
@@ -36,12 +36,12 @@ public class WidgetTagTest {
     
     @Before
     public void setUp() {
-        widgetTag = new WidgetTag();
+        widgetTag = new JpaWidgetTag();
         widgetTag.setEntityId(VALID_ENTITY_ID);
         widgetTag.setWidgetId(VALID_WIDGET_ID);
         widgetTag.setUser(new User(1L, "John.Doe"));
         widgetTag.setCreatedDate(VALID_CREATED_DATE);
-        widgetTag.setTag(new Tag(1L, "test"));
+        widgetTag.setTag(new JpaTag(1L, "test"));
     }
     
     @Test

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/WidgetTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/WidgetTest.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/WidgetTest.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/WidgetTest.java Mon Jun 11 12:22:10 2012
@@ -28,7 +28,6 @@ import java.util.Date;
 import java.util.List;
 
 import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
 
 /**
  * Test for {@link JpaWidget}
@@ -62,15 +61,15 @@ public class WidgetTest {
         status = WidgetStatus.PREVIEW;
         widgetComments = new ArrayList<WidgetComment>();
 
-        Tag tag=new Tag(1L, "test") ;
-        Tag tag1=new Tag(2L, "test1") ;
+        JpaTag tag=new JpaTag(1L, "test") ;
+        JpaTag tag1=new JpaTag(2L, "test1") ;
         
         ratings = new ArrayList<WidgetRating>();
         ratings.add(new JpaWidgetRating(1L, 1L, 1L, 1));
         
         tags = new ArrayList<WidgetTag>();
-        tags.add(new WidgetTag(1L, 1L, new User(), new Date(), tag)) ;
-        tags.add(new WidgetTag(2L,1L, new User(), new Date(), tag1)) ;
+        tags.add(new JpaWidgetTag(1L, 1L, new User(), new Date(), tag)) ;
+        tags.add(new JpaWidgetTag(2L,1L, new User(), new Date(), tag1)) ;
 
         widget.setEntityId(id);
         widget.setTitle(title);

Added: rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/conversion/JpaTagConverterTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/conversion/JpaTagConverterTest.java?rev=1348814&view=auto
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/conversion/JpaTagConverterTest.java (added)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/conversion/JpaTagConverterTest.java Mon Jun 11 12:22:10 2012
@@ -0,0 +1,46 @@
+package org.apache.rave.portal.model.conversion;
+
+import org.apache.rave.portal.model.JpaTag;
+import org.apache.rave.portal.model.TagImpl;
+import org.apache.rave.portal.model.WidgetTag;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {"classpath:test-dataContext.xml", "classpath:test-applicationContext.xml"})
+public class JpaTagConverterTest {
+    
+    @Autowired
+    JpaTagConverter jpaTagConverter;
+
+    @Test
+    public void convert_valid_tagImpl(){
+        TagImpl tag = new TagImpl("blazer", new ArrayList<WidgetTag>());
+        JpaTag jpaTag = jpaTagConverter.convert(tag);
+        assertNotNull(jpaTag);
+        assertEquals(tag.getKeyword(), jpaTag.getKeyword()); 
+        assertEquals(tag.getWidgets().size(), jpaTag.getWidgets().size());
+    }
+
+
+    @Test
+    public void convert_valid_jpaTag(){
+        JpaTag tag = new JpaTag();
+        tag.setKeyword("blazer");
+        tag.setWidgets(new ArrayList<WidgetTag>());
+        tag.setEntityId(387L);
+        JpaTag jpaTag = jpaTagConverter.convert(tag);
+        assertNotNull(jpaTag);
+        assertSame(tag, jpaTag);
+    }
+    
+}

Added: rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/conversion/JpaWidgetTagConverterTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/conversion/JpaWidgetTagConverterTest.java?rev=1348814&view=auto
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/conversion/JpaWidgetTagConverterTest.java (added)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/conversion/JpaWidgetTagConverterTest.java Mon Jun 11 12:22:10 2012
@@ -0,0 +1,49 @@
+package org.apache.rave.portal.model.conversion;
+
+import org.apache.rave.portal.model.*;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.Date;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {"classpath:test-dataContext.xml", "classpath:test-applicationContext.xml"})
+public class JpaWidgetTagConverterTest {
+  
+    @Autowired 
+    JpaWidgetTagConverter jpaWidgetTagConverter;
+    
+    @Test
+    public void convert_valid_widgetTaq(){
+        WidgetTag widgetTag = new WidgetTagImpl();
+        widgetTag.setCreatedDate(new Date());
+        widgetTag.setUser(new User());
+        widgetTag.setWidgetId(3L);
+        widgetTag.setTag(new JpaTag(1L, "news"));
+        JpaWidgetTag jpaWidgetTag = jpaWidgetTagConverter.convert(widgetTag);
+        assertNotNull(jpaWidgetTag);
+        assertEquals(widgetTag.getCreatedDate(), jpaWidgetTag.getCreatedDate());
+        assertSame(widgetTag.getTag(), jpaWidgetTag.getTag());
+        assertSame(widgetTag.getUser(), jpaWidgetTag.getUser());
+        assertEquals(widgetTag.getWidgetId(), jpaWidgetTag.getWidgetId());
+    }
+
+    @Test
+    public void convert_valid_jpaWidgetTaq(){
+        JpaWidgetTag widgetTag = new JpaWidgetTag();
+        widgetTag.setCreatedDate(new Date());
+        widgetTag.setUser(new User());
+        widgetTag.setWidgetId(3L);
+        widgetTag.setTag(new JpaTag(1L, "news"));
+        JpaWidgetTag jpaWidgetTag = jpaWidgetTagConverter.convert(widgetTag);
+        assertNotNull(jpaWidgetTag);
+        assertSame(widgetTag, jpaWidgetTag);
+    }
+}

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaTagRepositoryTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaTagRepositoryTest.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaTagRepositoryTest.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaTagRepositoryTest.java Mon Jun 11 12:22:10 2012
@@ -19,17 +19,22 @@
 
 package org.apache.rave.portal.repository.impl;
 
+import org.apache.rave.portal.model.JpaTag;
 import org.apache.rave.portal.model.Tag;
+import org.apache.rave.portal.model.TagImpl;
+import org.apache.rave.portal.model.WidgetTag;
 import org.apache.rave.portal.repository.TagRepository;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.Rollback;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
+import java.util.ArrayList;
 import java.util.List;
 
 import static org.junit.Assert.*;
@@ -55,7 +60,7 @@ public class JpaTagRepositoryTest {
     public void getById_validId() {
         final Tag tag = repository.get(VALID_ID);
         assertNotNull(tag);
-        assertEquals(VALID_ID, tag.getEntityId());
+        assertEquals(VALID_ID, ((JpaTag)tag).getEntityId());
         assertEquals(tag.getKeyword(), "news");
     }
 
@@ -77,18 +82,76 @@ public class JpaTagRepositoryTest {
     public void getByKeyword() {
         Tag tag = repository.getByKeyword("news");
         assertNotNull(tag);
-        assertTrue(tag.getEntityId() == 1);
+        assertTrue(((JpaTag)tag).getEntityId() == 1);
         tag = repository.getByKeyword("NEWS");
         assertNotNull(tag);
-        assertTrue(tag.getEntityId() == 1);
+        assertTrue(((JpaTag)tag).getEntityId() == 1);
         tag = repository.getByKeyword("news  ");
         assertNotNull(tag);
-        assertTrue(tag.getEntityId() == 1);
+        assertTrue(((JpaTag)tag).getEntityId() == 1);
         tag = repository.getByKeyword("   news  ");
         assertNotNull(tag);
-        assertTrue(tag.getEntityId() == 1);
+        assertTrue(((JpaTag)tag).getEntityId() == 1);
+    }
+
+    @Test
+    @Transactional
+    @Rollback(true)
+    public void save_valid(){
+        Tag tag = new JpaTag();
+        String ordnance = "ordnance";
+        tag.setKeyword(ordnance);
+        tag.setWidgets(new ArrayList<WidgetTag>());
+        repository.save(tag);
+        Tag foundTag = repository.getByKeyword(ordnance);
+        assertNotNull(foundTag);
+        assertEquals(tag.getKeyword(), foundTag.getKeyword());
+        assertEquals(tag.getWidgets().size(), foundTag.getWidgets().size());
+    }
+
+    @Test(expected = NullPointerException.class)
+    @Transactional
+    @Rollback(true)
+    public void save_null(){
+        Tag tag = null;
+        tag = repository.save(tag);
+        assertNull(tag);
+    }
+
+    @Test
+    @Transactional
+    @Rollback(true)
+    public void delete_valid_jpaTag(){
+        String keyword = "news";
+        JpaTag jpaTag = (JpaTag)repository.getByKeyword(keyword);
+        assertNotNull(jpaTag);
+        repository.delete(jpaTag);
+        assertNull(repository.getByKeyword(keyword));
+    }
 
+    @Test
+    @Transactional
+    @Rollback(true)
+    public void delete_valid_tagImpl(){
+        String keyword = "news";
+        // make sure we do have a tag with the keyword in the db
+        JpaTag control = (JpaTag)repository.getByKeyword(keyword);
+        assertNotNull(control);
+        // create a tag with the keyword not of JpaTag.class for branch coverage
+        TagImpl tag = new TagImpl(keyword);
+        assertNotNull(tag);
+        repository.delete(tag);
+        assertNull(repository.getByKeyword(keyword));
     }
 
+    @Test
+    @Transactional
+    @Rollback(true)
+    public void delete_invalid(){
+        String keyword = "abdhjdhlnews";
+        TagImpl tag = new TagImpl(keyword);
+        assertNotNull(tag);
+        repository.delete(tag);
+    }
 
 }

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaWidgetTagRepositoryTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaWidgetTagRepositoryTest.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaWidgetTagRepositoryTest.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaWidgetTagRepositoryTest.java Mon Jun 11 12:22:10 2012
@@ -19,11 +19,15 @@
 
 package org.apache.rave.portal.repository.impl;
 
+import org.apache.rave.portal.model.JpaTag;
+import org.apache.rave.portal.model.JpaWidgetTag;
+import org.apache.rave.portal.model.User;
 import org.apache.rave.portal.model.WidgetTag;
 import org.apache.rave.portal.repository.WidgetTagRepository;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.Rollback;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.transaction.annotation.Transactional;
@@ -31,9 +35,9 @@ import org.springframework.transaction.a
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import java.util.Date;
+
+import static org.junit.Assert.*;
 
 /**
  *
@@ -50,9 +54,106 @@ public class JpaWidgetTagRepositoryTest 
     private WidgetTagRepository repository;
 
     @Test
+    public void getByWidgetIdAndTag_valid(){
+        Long widgetId = 3L;
+        String keyword = "news";
+        JpaWidgetTag jpaWidgetTag = (JpaWidgetTag)repository.getByWidgetIdAndTag(widgetId, keyword);
+        assertNotNull(jpaWidgetTag);
+        assertEquals(widgetId, jpaWidgetTag.getWidgetId());
+        assertEquals(keyword, jpaWidgetTag.getTag().getKeyword());
+    }
+
+    @Test
+    public void getByWidgetIdAndTag_keyword_trim_valid(){
+        Long widgetId = 3L;
+        String keyword = "  news    ";
+        JpaWidgetTag jpaWidgetTag = (JpaWidgetTag)repository.getByWidgetIdAndTag(widgetId, keyword);
+        assertNotNull(jpaWidgetTag);
+        assertEquals(widgetId, jpaWidgetTag.getWidgetId());
+        assertEquals(keyword.trim(), jpaWidgetTag.getTag().getKeyword());
+    }
+
+    @Test
+    public void getByWidgetIdAndTag_invalid(){
+        Long widgetId = 3L;
+        String keyword = "saturday";
+        JpaWidgetTag jpaWidgetTag = (JpaWidgetTag)repository.getByWidgetIdAndTag(widgetId, keyword);
+        assertNull(jpaWidgetTag);
+    }
+    
+    @Test
+    public void get_valid(){
+        Long id = 1L;
+        JpaWidgetTag widgetTag = (JpaWidgetTag)repository.get(id);
+        assertNotNull(widgetTag);
+        assertEquals(id, widgetTag.getEntityId());
+    }
+    
+    @Test
+    public void get_invalid(){
+        Long id = 1000291L;
+        JpaWidgetTag jpaWidgetTag = (JpaWidgetTag)repository.get(id);
+        assertNull(jpaWidgetTag);
+    }
+
+    @Test
+    @Transactional
+    @Rollback(true)
     public void save() {
+        WidgetTag widgetTag = new JpaWidgetTag();
+        JpaTag tag = new JpaTag(100L, "boing");
+        widgetTag.setTag(tag);
+        widgetTag.setWidgetId(2L);
+        widgetTag.setCreatedDate(new Date());
+        widgetTag.setUser(new User());
+        JpaWidgetTag jpaWidgetTag = (JpaWidgetTag)repository.save(widgetTag);
+        assertNotNull(jpaWidgetTag);
+        assertEquals(widgetTag.getTag().getKeyword(), jpaWidgetTag.getTag().getKeyword());
+        assertEquals(widgetTag.getWidgetId(), jpaWidgetTag.getWidgetId());
+        assertEquals(widgetTag.getUser(), jpaWidgetTag.getUser());
+        assertEquals(widgetTag.getCreatedDate(), jpaWidgetTag.getCreatedDate());
+        assertEquals(JpaWidgetTag.class, jpaWidgetTag.getClass());
+    }
 
+    @Test(expected = NullPointerException.class)
+    @Transactional
+    @Rollback(true)
+    public void save_null() {
+        WidgetTag widgetTag = null;
+        JpaWidgetTag jpaWidgetTag = (JpaWidgetTag)repository.save(widgetTag);
+        assertNull(jpaWidgetTag);
+    }
+    
+    @Test
+    @Transactional
+    @Rollback(true)
+    public void delete_valid(){
+        Long id = 1L;
+        WidgetTag widgetTag = repository.get(id);
+        assertNotNull(widgetTag);
+        repository.delete(widgetTag);
+        assertNull(repository.get(id));
+    }
 
+    @Test
+    @Transactional
+    @Rollback(true)
+    public void delete_jpaWidgetTag_valid(){
+        Long id = 1L;
+        JpaWidgetTag jpaWidgetTag = (JpaWidgetTag)repository.get(id);
+        assertNotNull(jpaWidgetTag);
+        repository.delete(jpaWidgetTag);
+        assertNull(repository.get(id));
     }
 
+    @Test(expected = NullPointerException.class)
+    @Transactional
+    @Rollback(true)
+    public void delete_invalid(){
+        Long id = 17827873261L;
+        WidgetTag widgetTag = repository.get(id);
+        assertNull(widgetTag);
+        repository.delete(widgetTag);
+        assertNull(repository.get(id));
+    }
 }

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultTagServiceTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultTagServiceTest.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultTagServiceTest.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultTagServiceTest.java Mon Jun 11 12:22:10 2012
@@ -20,6 +20,7 @@
 package org.apache.rave.portal.service.impl;
 
 import org.apache.rave.portal.model.Tag;
+import org.apache.rave.portal.model.TagImpl;
 import org.apache.rave.portal.repository.TagRepository;
 import org.apache.rave.portal.service.TagService;
 import org.junit.Before;
@@ -47,7 +48,7 @@ public class DefaultTagServiceTest {
 
     @Test
     public void getTagById() {
-        Tag tag = createTag(1L, "test");
+        Tag tag = createTag("test");
         expect(repository.get(1L)).andReturn(tag);
         replay(repository);
         Tag sTag = service.getTagById(1L);
@@ -56,10 +57,9 @@ public class DefaultTagServiceTest {
     }
 
 
-    private static Tag createTag(long id, String keyword) {
-        Tag tag = new Tag();
+    private static Tag createTag(String keyword) {
+        TagImpl tag = new TagImpl();
         tag.setKeyword(keyword);
-        tag.setEntityId(id);
         return tag;
     }
 
@@ -77,7 +77,7 @@ public class DefaultTagServiceTest {
     @Test
     public void allTags() {
         List<Tag> tags = new ArrayList<Tag>();
-        Tag tag = createTag(1L, "test");
+        Tag tag = createTag("test");
         tags.add(tag);
         expect(repository.getAll()).andReturn(tags);
         replay(repository);
@@ -88,7 +88,7 @@ public class DefaultTagServiceTest {
 
     @Test
     public void getByKeyword() {
-        Tag tag = createTag(1L, "test");
+        Tag tag = createTag("test");
         expect(repository.getByKeyword("test")).andReturn(tag);
         expect(repository.getByKeyword("TEST")).andReturn(tag);
         expect(repository.getByKeyword(" test")).andReturn(tag);

Modified: rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultWidgetTagServiceTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultWidgetTagServiceTest.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultWidgetTagServiceTest.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultWidgetTagServiceTest.java Mon Jun 11 12:22:10 2012
@@ -15,8 +15,8 @@
  */
 package org.apache.rave.portal.service.impl;
 
-import org.apache.rave.portal.model.Tag;
-import org.apache.rave.portal.model.WidgetTag;
+import org.apache.rave.portal.model.TagImpl;
+import org.apache.rave.portal.model.WidgetTagImpl;
 import org.apache.rave.portal.repository.WidgetTagRepository;
 import org.apache.rave.portal.service.WidgetTagService;
 import org.junit.Before;
@@ -39,8 +39,7 @@ public class DefaultWidgetTagServiceTest
 
     @Test
     public void getWidgetTag() {
-        WidgetTag tag = new WidgetTag();
-        tag.setEntityId(1L);
+        WidgetTagImpl tag = new WidgetTagImpl();
         expect(widgetTagRepository.get(1L)).andReturn(tag);
         replay(widgetTagRepository);
 
@@ -52,9 +51,8 @@ public class DefaultWidgetTagServiceTest
     public void saveWidgetTag() {
         try {
 
-            WidgetTag wtag = new WidgetTag();
-            wtag.setEntityId(3L);
-            Tag tag = new Tag(4L, "test");
+            WidgetTagImpl wtag = new WidgetTagImpl();
+            TagImpl tag = new TagImpl();
             wtag.setTag(tag);
             expect(widgetTagRepository.save(wtag)).andReturn(wtag);
             replay(widgetTagRepository);

Modified: rave/branches/model_interfaces/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rest/WidgetApi.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rest/WidgetApi.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rest/WidgetApi.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/api/rest/WidgetApi.java Mon Jun 11 12:22:10 2012
@@ -157,7 +157,7 @@ public class WidgetApi extends AbstractR
         if (tagText != null && !tagText.trim().isEmpty()) {
             WidgetTag existed = widgetTagService.getWidgetTagByWidgetIdAndKeyword(widgetId, tagText);
             if (existed == null) {
-                WidgetTag widgetTag = new WidgetTag();
+                WidgetTag widgetTag = new WidgetTagImpl();
                 widgetTag.setWidgetId(widgetId);
                 widgetTag.setUser(userService.getAuthenticatedUser());
                 widgetTag.setCreatedDate(new Date());
@@ -187,7 +187,7 @@ public class WidgetApi extends AbstractR
     private Tag getTag(String keyword) {
         Tag tag = tagService.getTagByKeyword(keyword);
         if (tag == null) {
-            tag = new Tag();
+            tag = new TagImpl();
             tag.setKeyword(keyword);
         }
         return tag;

Modified: rave/branches/model_interfaces/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rest/WidgetApiTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rest/WidgetApiTest.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rest/WidgetApiTest.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/api/rest/WidgetApiTest.java Mon Jun 11 12:22:10 2012
@@ -32,10 +32,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 import static org.easymock.EasyMock.*;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.sameInstance;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
 
 public class WidgetApiTest {
     private WidgetApi widgetApi;
@@ -64,8 +62,8 @@ public class WidgetApiTest {
         user.setEntityId(VALID_USER_ID);
 
         tagList = new ArrayList<Tag>();
-        tagList.add(new Tag(1L, "tag1"));
-        tagList.add(new Tag(2L, "tag2"));
+        tagList.add(new TagImpl("tag1"));
+        tagList.add(new TagImpl("tag2"));
 
         response = createMock(MockHttpServletResponse.class);
         widgetApi = new WidgetApi(widgetRatingService, widgetCommentService, userService, tagService, widgetTagService);
@@ -206,12 +204,12 @@ public class WidgetApiTest {
 
         verify(userService);
     }
-
+    
     @Test
     public void getTags() {
         expect(tagService.getAvailableTagsByWidgetId(VALID_WIDGET_ID)).andReturn(tagList);
         replay(tagService);
-
+        
         assertThat(widgetApi.getTags(VALID_WIDGET_ID), is(tagList));
         verify(tagService);
     }
@@ -228,14 +226,16 @@ public class WidgetApiTest {
     @Test
     public void createWidgetTag_newTag() {
         final String TAG_TEXT = "mytag";
-        Tag tag = new Tag(1L, TAG_TEXT);
-        WidgetTag widgetTag = new WidgetTag();
+        TagImpl tag = new TagImpl();
+        tag.setKeyword(TAG_TEXT);
+        WidgetTag widgetTag = new WidgetTagImpl();
         widgetTag.setTag(tag);
-
+        widgetTag.setWidgetId(VALID_WIDGET_ID);
+                        
         expect(widgetTagService.getWidgetTagByWidgetIdAndKeyword(VALID_WIDGET_ID, TAG_TEXT)).andReturn(null);
         expect(userService.getAuthenticatedUser()).andReturn(user);
         expect(tagService.getTagByKeyword(TAG_TEXT)).andReturn(null);
-        widgetTagService.saveWidgetTag(widgetTag);
+        widgetTagService.saveWidgetTag(isA(WidgetTag.class));
         expectLastCall();
         replay(widgetTagService, userService, tagService);
         widgetApi.createWidgetTag(VALID_WIDGET_ID, TAG_TEXT, response);
@@ -245,14 +245,15 @@ public class WidgetApiTest {
     @Test
     public void createWidgetTag_newTag_existsForOtherWidget() {
         final String TAG_TEXT = "mytag";
-        Tag tag = new Tag(1L, TAG_TEXT);
-        WidgetTag widgetTag = new WidgetTag();
+        TagImpl tag = new TagImpl();
+        tag.setKeyword(TAG_TEXT);
+        WidgetTagImpl widgetTag = new WidgetTagImpl();
         widgetTag.setTag(tag);
 
         expect(widgetTagService.getWidgetTagByWidgetIdAndKeyword(VALID_WIDGET_ID, TAG_TEXT)).andReturn(null);
         expect(userService.getAuthenticatedUser()).andReturn(user);
         expect(tagService.getTagByKeyword(TAG_TEXT)).andReturn(tag);
-        widgetTagService.saveWidgetTag(widgetTag);
+        widgetTagService.saveWidgetTag(isA(WidgetTag.class));
         expectLastCall();
         replay(widgetTagService, userService, tagService);
         widgetApi.createWidgetTag(VALID_WIDGET_ID, TAG_TEXT, response);
@@ -262,8 +263,9 @@ public class WidgetApiTest {
     @Test
     public void createWidgetTag_nullText() {
         final String TAG_TEXT = null;
-        Tag tag = new Tag(1L, TAG_TEXT);
-        WidgetTag widgetTag = new WidgetTag();
+        TagImpl tag = new TagImpl();
+        tag.setKeyword(TAG_TEXT);
+        WidgetTagImpl widgetTag = new WidgetTagImpl();
         widgetTag.setTag(tag);
 
         widgetApi.createWidgetTag(VALID_WIDGET_ID, TAG_TEXT, response);
@@ -272,8 +274,9 @@ public class WidgetApiTest {
     @Test
     public void createWidgetTag_emptyText() {
         final String TAG_TEXT = "      ";
-        Tag tag = new Tag(1L, TAG_TEXT);
-        WidgetTag widgetTag = new WidgetTag();
+        TagImpl tag = new TagImpl();
+        tag.setKeyword(TAG_TEXT);
+        WidgetTagImpl widgetTag = new WidgetTagImpl();
         widgetTag.setTag(tag);
 
         widgetApi.createWidgetTag(VALID_WIDGET_ID, TAG_TEXT, response);
@@ -282,9 +285,9 @@ public class WidgetApiTest {
     @Test
     public void createWidgetTag_existingTag() {
         final String TAG_TEXT = "mytag";
-        Tag tag = new Tag(1L, TAG_TEXT);
-        WidgetTag widgetTag = new WidgetTag();
-        widgetTag.setEntityId(9L);
+        TagImpl tag = new TagImpl();
+        tag.setKeyword(TAG_TEXT);
+        WidgetTagImpl widgetTag = new WidgetTagImpl();
         widgetTag.setTag(tag);
 
         expect(widgetTagService.getWidgetTagByWidgetIdAndKeyword(VALID_WIDGET_ID, TAG_TEXT)).andReturn(widgetTag);

Modified: rave/branches/model_interfaces/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/WidgetStoreControllerTest.java
URL: http://svn.apache.org/viewvc/rave/branches/model_interfaces/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/WidgetStoreControllerTest.java?rev=1348814&r1=1348813&r2=1348814&view=diff
==============================================================================
--- rave/branches/model_interfaces/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/WidgetStoreControllerTest.java (original)
+++ rave/branches/model_interfaces/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/WidgetStoreControllerTest.java Mon Jun 11 12:22:10 2012
@@ -23,11 +23,7 @@ package org.apache.rave.portal.web.contr
 import org.apache.rave.portal.model.*;
 import org.apache.rave.portal.model.util.SearchResult;
 import org.apache.rave.portal.model.util.WidgetStatistics;
-import org.apache.rave.portal.service.PortalPreferenceService;
-import org.apache.rave.portal.service.TagService;
-import org.apache.rave.portal.service.CategoryService;
-import org.apache.rave.portal.service.UserService;
-import org.apache.rave.portal.service.WidgetService;
+import org.apache.rave.portal.service.*;
 import org.apache.rave.portal.web.util.ModelKeys;
 import org.apache.rave.portal.web.util.PortalPreferenceKeys;
 import org.apache.rave.portal.web.util.ViewNames;
@@ -45,18 +41,9 @@ import java.util.List;
 import java.util.Map;
 
 import static junit.framework.Assert.assertEquals;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.sameInstance;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.easymock.EasyMock.*;
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
 
 
 /**