001 /*
002 * ----------------------------------------------------------------------
003 * Copyright (C) 2009 Enrique Lara (k957@68k.org)
004 *
005 * TinLizard is free software; you can redistribute it and/or
006 * modify it under the terms of the GNU Lesser General Public License
007 * as published by the Free Software Foundation; either version 3.0
008 * of the License, or (at your option) any later version.
009 *
010 * TinLizard is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Lesser General Public License for more details.
014 *
015 * You should have received a copy of the GNU Lesser General Public License
016 * along with TinLizard. If not, see http://www.gnu.org/licenses/.
017 * ----------------------------------------------------------------------
018 */
019 package tinlizard.web;
020
021 import tinlizard.util.Messages;
022
023 import java.io.IOException;
024 import java.util.Date;
025
026 import javax.servlet.RequestDispatcher;
027 import javax.servlet.ServletException;
028
029 import org.apache.commons.lang.StringUtils;
030
031 import org.kohsuke.stapler.StaplerRequest;
032 import org.kohsuke.stapler.StaplerResponse;
033 import org.kohsuke.stapler.export.Exported;
034 import org.kohsuke.stapler.export.ExportedBean;
035 import org.kohsuke.stapler.export.Flavor;
036
037 /**
038 * Base class for beans exposed via Stapler.
039 * @param <E> the object being exposed.
040 */
041 @ExportedBean(defaultVisibility = 1)
042 public abstract class ObjectWeb<E extends Object> {
043 //XXX make max depth configurable.
044 private static final int MAX_DEPTH = 5;
045 private static final int MAX_DEPTH_ERROR = 451;
046
047 @Exported
048 public abstract String getName();
049
050 protected abstract E getSubject();
051
052 public abstract Date getCreated();
053
054 public abstract String getCreatedBy();
055
056 public abstract Date getLastModified();
057
058 public abstract String getLastModifiedBy();
059
060 public void doDelete(final StaplerRequest request, final StaplerResponse response) throws Exception {
061 throw new UnsupportedOperationException();
062 }
063
064 public final void doJson(final StaplerRequest request, final StaplerResponse response) throws Exception {
065 if (checkDepth(request, response)) {
066 response.serveExposedBean(request, this, Flavor.JSON);
067 }
068 }
069
070 public final void doXml(final StaplerRequest request, final StaplerResponse response) throws Exception {
071 if (checkDepth(request, response)) {
072 response.serveExposedBean(request, this, Flavor.XML);
073 }
074 }
075
076 public final void doPython(final StaplerRequest request, final StaplerResponse response) throws Exception {
077 if (checkDepth(request, response)) {
078 response.serveExposedBean(request, this, Flavor.PYTHON);
079 }
080 }
081
082 private boolean checkDepth(final StaplerRequest request, final StaplerResponse response) throws IOException {
083 if (StringUtils.isNumeric(request.getParameter("depth"))) {
084 int depth = Integer.parseInt(request.getParameter("depth"));
085
086 if (depth > MAX_DEPTH) {
087 response.sendError(MAX_DEPTH_ERROR, Messages.Error451());
088 }
089 }
090
091 return true;
092 }
093
094 protected void gotoMyIndex(final StaplerRequest request, final StaplerResponse response) throws IOException, ServletException {
095 RequestDispatcher view = request.getView(this, "index.jsp");
096 view.include(request, response);
097 }
098 }