diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/BrowseController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/BrowseController.java
index ac2ff7ca1..938ace13f 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/BrowseController.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/BrowseController.java
@@ -17,7 +17,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.filtering.WebappDaoFactoryFiltering;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilterUtils;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
import edu.cornell.mannlib.vitro.webapp.flags.PortalFlag;
-import edu.cornell.mannlib.vitro.webapp.view.VClassGroupView;
+import edu.cornell.mannlib.vitro.webapp.web.templatemodels.VClassGroupView;
import freemarker.template.SimpleSequence;
import org.apache.commons.logging.Log;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreeMarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreeMarkerHttpServlet.java
index a62c9a02e..0d2c14313 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreeMarkerHttpServlet.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreeMarkerHttpServlet.java
@@ -27,11 +27,11 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route;
import edu.cornell.mannlib.vitro.webapp.utils.StringUtils;
-import edu.cornell.mannlib.vitro.webapp.view.fileList.ScriptList;
-import edu.cornell.mannlib.vitro.webapp.view.fileList.StylesheetList;
-import edu.cornell.mannlib.vitro.webapp.view.menu.TabMenu;
import edu.cornell.mannlib.vitro.webapp.web.BreadCrumbsUtil;
import edu.cornell.mannlib.vitro.webapp.web.PortalWebUtil;
+import edu.cornell.mannlib.vitro.webapp.web.templatemodels.filelist.ScriptList;
+import edu.cornell.mannlib.vitro.webapp.web.templatemodels.filelist.StylesheetList;
+import edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu.TabMenu;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreeMarkerSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreeMarkerSetup.java
index e43637540..83037c293 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreeMarkerSetup.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreeMarkerSetup.java
@@ -10,7 +10,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.ConfigurationProperties;
-import edu.cornell.mannlib.vitro.webapp.view.ViewObject;
+import edu.cornell.mannlib.vitro.webapp.web.templatemodels.ViewObject;
import freemarker.ext.beans.BeansWrapper;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java
index 7f67ad98a..a6cab97ca 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java
@@ -14,7 +14,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.utils.StringUtils;
-import edu.cornell.mannlib.vitro.webapp.view.IndividualView;
+import edu.cornell.mannlib.vitro.webapp.web.templatemodels.IndividualView;
/**
* Generates a list of individuals for display in a template
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/IndividualView.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/IndividualView.java
new file mode 100644
index 000000000..b2e93c485
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/IndividualView.java
@@ -0,0 +1,118 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import edu.cornell.mannlib.vitro.webapp.beans.Individual;
+import edu.cornell.mannlib.vitro.webapp.beans.Link;
+import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route;
+import edu.cornell.mannlib.vitro.webapp.utils.StringUtils;
+import edu.cornell.mannlib.vitro.webapp.web.templatemodels.ViewFinder.ClassView;
+
+public class IndividualView extends ViewObject {
+
+ private static final Log log = LogFactory.getLog(IndividualView.class.getName());
+
+ private static final String PATH = Route.INDIVIDUAL.path();
+
+ private Individual individual;
+
+ public IndividualView(Individual individual) {
+ this.individual = individual;
+ }
+
+ /* These methods perform some manipulation of the data returned by the Individual methods */
+ public String getTagline() {
+ String tagline = individual.getMoniker();
+ return StringUtils.isEmpty(tagline) ? individual.getVClass().getName() : tagline;
+ }
+
+ // Return link to individual's profile page.
+ // There may be other urls associated with the individual. E.g., we might need
+ // getEditUrl(), getDeleteUrl() to return the links computed by PropertyEditLinks.
+ // RY **** Need to account for everything in URLRewritingHttpServlet
+ // Currently this is incorrect for individuals that are not in the default namespace (e.g., geographic individuals).
+ public String getProfileUrl() {
+ return getUrl(PATH + "/" + individual.getLocalName());
+ }
+
+ public String getSearchView() {
+ return getView(ClassView.SEARCH);
+ }
+
+ public String getShortView() {
+ return getView(ClassView.SHORT);
+ }
+
+ public String getDisplayView() {
+ return getView(ClassView.DISPLAY);
+ }
+
+ private String getView(ClassView view) {
+ ViewFinder vf = new ViewFinder(view);
+ return vf.findClassView(individual, context);
+ }
+
+ public Link getPrimaryLink() {
+ Link primaryLink = null;
+ String anchor = individual.getAnchor();
+ String url = individual.getUrl();
+ if (anchor != null && url != null) {
+ primaryLink = new Link();
+ primaryLink.setAnchor(individual.getAnchor());
+ primaryLink.setUrl(individual.getUrl());
+ }
+ return primaryLink;
+ }
+
+ public List getLinks() {
+ List additionalLinks = individual.getLinksList();
+ List links = new ArrayList(additionalLinks.size()+1);
+ Link primaryLink = getPrimaryLink();
+ if (primaryLink != null) {
+ links.add(primaryLink);
+ }
+ links.addAll(additionalLinks);
+ return links;
+ }
+
+ /* These methods simply forward to the Individual methods. It would be desirable to implement a scheme
+ for proxying or delegation so that the methods don't need to be simply listed here.
+ A Ruby-style method missing method would be ideal. */
+ public String getName() {
+ return individual.getName();
+ }
+
+ public String getUri() {
+ return individual.getURI();
+ }
+
+ public String getDescription() {
+ return individual.getDescription();
+ }
+
+ public String getBlurb() {
+ return individual.getBlurb();
+ }
+
+ public String getCitation() {
+ return individual.getBlurb();
+ }
+
+ public List getKeywords() {
+ return individual.getKeywords();
+ }
+
+ public String getImageUrl() {
+ return individual.getImageUrl();
+ }
+
+ public String getThumbUrl() {
+ return individual.getThumbUrl();
+ }
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/VClassGroupView.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/VClassGroupView.java
new file mode 100644
index 000000000..10db17218
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/VClassGroupView.java
@@ -0,0 +1,57 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import edu.cornell.mannlib.vitro.webapp.beans.VClass;
+import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
+
+public class VClassGroupView extends ViewObject {
+
+ private static final Log log = LogFactory.getLog(VClassGroupView.class.getName());
+
+ private VClassGroup vClassGroup = null;
+ private List classes = null;
+
+ public VClassGroupView(VClassGroup vClassGroup) {
+ this.vClassGroup = vClassGroup;
+ }
+
+ public int getDisplayRank() {
+ return vClassGroup.getDisplayRank();
+ }
+
+ public String getUri() {
+ return vClassGroup.getURI();
+ }
+
+ public String getNamespace() {
+ return vClassGroup.getNamespace();
+ }
+
+ public String getLocalName() {
+ return vClassGroup.getLocalName();
+ }
+
+ public String getPublicName() {
+ return vClassGroup.getPublicName();
+ }
+
+ public List getClasses() {
+ if (classes == null) {
+ List classList = vClassGroup.getVitroClassList();
+ classes = new ArrayList();
+ for (VClass vc : classList) {
+ classes.add(new VClassView(vc));
+ }
+ }
+
+ return classes;
+ }
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/VClassView.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/VClassView.java
new file mode 100644
index 000000000..4fb9b49c2
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/VClassView.java
@@ -0,0 +1,35 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import edu.cornell.mannlib.vitro.webapp.beans.VClass;
+import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Params;
+import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route;
+
+public class VClassView extends ViewObject {
+
+ private static final Log log = LogFactory.getLog(VClassView.class.getName());
+ private static final String PATH = Route.INDIVIDUAL_LIST.path();
+
+ private VClass vclass;
+
+ public VClassView(VClass vclass) {
+ this.vclass = vclass;
+ }
+
+ public String getName() {
+ return vclass.getName();
+ }
+
+ public String getUrl() {
+ return getUrl(PATH, new Params("vclassId", vclass.getURI()));
+ }
+
+ public int getIndividualCount() {
+ return vclass.getEntityCount();
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/ViewFinder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/ViewFinder.java
new file mode 100644
index 000000000..b0f6b068f
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/ViewFinder.java
@@ -0,0 +1,107 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import javax.servlet.ServletContext;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import edu.cornell.mannlib.vitro.webapp.beans.Individual;
+import edu.cornell.mannlib.vitro.webapp.beans.VClass;
+import edu.cornell.mannlib.vitro.webapp.utils.StringUtils;
+
+/**
+ * Class to find custom class views for individuals
+ * @author rjy7
+ *
+ */
+public class ViewFinder {
+
+ private static final Log log = LogFactory.getLog(ViewFinder.class.getName());
+
+ public enum ClassView {
+ DISPLAY("getCustomDisplayView", "/view/display"),
+ // NB this is not the value currently used for custom forms - we use the value on the object property
+ FORM("getCustomEntryForm", "/form"),
+ SEARCH("getCustomSearchView", "/view/search"),
+ SHORT("getCustomShortView", "/view/short");
+
+ private static String TEMPLATE_PATH = "/templates/freemarker/body/partials/class";
+
+ private Method method = null;
+ private String path = null;
+
+ ClassView(String methodName, String path) {
+ Class vc = VClass.class;
+ this.path = path;
+ try {
+ method = vc.getMethod(methodName);
+ } catch (SecurityException e) {
+ log.error("Access denied to method " + methodName + " or class " + vc.getName());
+ } catch (NoSuchMethodException e) {
+ log.error("Method " + methodName + " not defined for class " + vc.getName());
+ }
+ }
+
+ protected Method getMethod() {
+ return method;
+ }
+
+ protected String getPath() {
+ return TEMPLATE_PATH + path;
+ }
+
+ }
+
+ private ClassView view;
+
+ public ViewFinder(ClassView view) {
+ this.view = view;
+ }
+
+ public String findClassView(Individual individual, ServletContext context) {
+ String viewName = "default.ftl";
+ List vclasses = individual.getVClasses();
+ Method method = view.getMethod();
+ /* RY The logic here is incorrect. The vclasses are
+ * returned in a random order, whereas we need to
+ * traverse the class hierarchy and find the most
+ * specific custom view applicable to the individual.
+ * The logic is complex because individuals can belong
+ * to multiple classes, and classes can subclass multiple
+ * classes. If there are two competing custom views at the
+ * same level of specificity, what should we do? Also, if we
+ * are displaying a list of individuals belonging to a certain
+ * class, we may want to use only a custom view defined for that
+ * class and NOT a more specific one. See NIHVIVO-568.
+ */
+ for (VClass vc : vclasses) {
+ try {
+ String v = (String) method.invoke(vc);
+ if (!StringUtils.isEmpty(v)) {
+ String pathToView = context.getRealPath(view.getPath() + "/" + v);
+ File viewFile = new File(pathToView);
+ if (viewFile.isFile() && viewFile.canRead()) {
+ viewName = v;
+ break;
+ }
+ }
+ } catch (IllegalArgumentException e) {
+ log.error("Incorrect arguments passed to method " + method.getName() + " in findView().");
+ } catch (IllegalAccessException e) {
+ log.error("Method " + method.getName() + " cannot be accessed in findView().");
+ } catch (InvocationTargetException e) {
+ log.error("Exception thrown by method " + method.getName() + " in findView().");
+ }
+
+ }
+ return viewName;
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/ViewObject.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/ViewObject.java
new file mode 100644
index 000000000..4447657d1
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/ViewObject.java
@@ -0,0 +1,46 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels;
+
+import javax.servlet.ServletContext;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
+import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Params;
+
+public abstract class ViewObject {
+
+ private static final Log log = LogFactory.getLog(ViewObject.class.getName());
+
+ public static ServletContext context = null;
+
+ // Wrap UrlBuilder method so templates can call ${item.url}
+ public String getUrl(String path) {
+ return UrlBuilder.getUrl(path);
+ }
+
+ // Wrap UrlBuilder method so templates can call ${item.url}
+ public String getUrl(String path, Params params) {
+ return UrlBuilder.getUrl(path, params);
+ }
+
+ /*
+ * public static List> wrapList(List> list, Class cl)
+ * throw error if cl not a child of ViewObject
+ * This block of code is going to be repeated a lot:
+ List groups = // code to get the data
+ List vcgroups = new ArrayList(groups.size());
+ Iterator i = groups.iterator();
+ while (i.hasNext()) {
+ vcgroups.add(new VClassGroupView(i.next()));
+ }
+ body.put("classGroups", vcgroups);
+ Can we generalize it to a generic method of ViewObject - wrapList() ?
+ static method of ViewObject
+ Params: groups, VClassGroupView (the name of the class) - but must be a child of ViewObject
+ Return: List
+ */
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/fileList/FileList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/fileList/FileList.java
similarity index 88%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/fileList/FileList.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/fileList/FileList.java
index 06987927e..ee02e31e7 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/fileList/FileList.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/fileList/FileList.java
@@ -1,12 +1,12 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-package edu.cornell.mannlib.vitro.webapp.view.fileList;
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels.fileList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
-import edu.cornell.mannlib.vitro.webapp.view.ViewObject;
+import edu.cornell.mannlib.vitro.webapp.web.templatemodels.ViewObject;
public abstract class FileList extends ViewObject {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/fileList/ScriptList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/fileList/ScriptList.java
similarity index 87%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/fileList/ScriptList.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/fileList/ScriptList.java
index b233654bc..a97685329 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/fileList/ScriptList.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/fileList/ScriptList.java
@@ -1,6 +1,6 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-package edu.cornell.mannlib.vitro.webapp.view.fileList;
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels.fileList;
public class ScriptList extends FileList {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/fileList/StylesheetList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/fileList/StylesheetList.java
similarity index 87%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/fileList/StylesheetList.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/fileList/StylesheetList.java
index 865817af5..52a8a59cc 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/fileList/StylesheetList.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/fileList/StylesheetList.java
@@ -1,6 +1,6 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-package edu.cornell.mannlib.vitro.webapp.view.fileList;
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels.fileList;
public class StylesheetList extends FileList {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/MainMenu.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MainMenu.java
similarity index 93%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/MainMenu.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MainMenu.java
index c38882b4f..ef5660e18 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/MainMenu.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MainMenu.java
@@ -1,6 +1,6 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-package edu.cornell.mannlib.vitro.webapp.view.menu;
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/MainMenuItem.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MainMenuItem.java
similarity index 90%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/MainMenuItem.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MainMenuItem.java
index c9f9ff95d..3714f83cc 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/MainMenuItem.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MainMenuItem.java
@@ -1,6 +1,6 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-package edu.cornell.mannlib.vitro.webapp.view.menu;
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/Menu.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/Menu.java
similarity index 84%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/Menu.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/Menu.java
index b8b9ec2fb..babd89c7d 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/Menu.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/Menu.java
@@ -1,6 +1,6 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-package edu.cornell.mannlib.vitro.webapp.view.menu;
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu;
import java.util.ArrayList;
import java.util.List;
@@ -9,7 +9,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.view.ViewObject;
+import edu.cornell.mannlib.vitro.webapp.web.templatemodels.ViewObject;
public class Menu extends ViewObject {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/MenuItem.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MenuItem.java
similarity index 81%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/MenuItem.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MenuItem.java
index 3ffa49455..b6aff8fe6 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/MenuItem.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MenuItem.java
@@ -1,11 +1,11 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-package edu.cornell.mannlib.vitro.webapp.view.menu;
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import edu.cornell.mannlib.vitro.webapp.view.ViewObject;
+import edu.cornell.mannlib.vitro.webapp.web.templatemodels.ViewObject;
public class MenuItem extends ViewObject {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/TabMenu.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/TabMenu.java
similarity index 97%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/TabMenu.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/TabMenu.java
index 3f710b86f..aae9e03c1 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/menu/TabMenu.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/TabMenu.java
@@ -1,6 +1,6 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-package edu.cornell.mannlib.vitro.webapp.view.menu;
+package edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu;
import java.util.Iterator;
import java.util.List;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/IndividualView.java b/webapp/web/view/IndividualView.java
similarity index 100%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/IndividualView.java
rename to webapp/web/view/IndividualView.java
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/VClassGroupView.java b/webapp/web/view/VClassGroupView.java
similarity index 100%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/VClassGroupView.java
rename to webapp/web/view/VClassGroupView.java
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/VClassView.java b/webapp/web/view/VClassView.java
similarity index 100%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/VClassView.java
rename to webapp/web/view/VClassView.java
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/ViewFinder.java b/webapp/web/view/ViewFinder.java
similarity index 100%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/ViewFinder.java
rename to webapp/web/view/ViewFinder.java
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/view/ViewObject.java b/webapp/web/view/ViewObject.java
similarity index 100%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/view/ViewObject.java
rename to webapp/web/view/ViewObject.java