tomee-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jgallim...@apache.org
Subject [01/11] tomee git commit: TOMEE-2151 Use correct classloader for creating application resources specified in resources.xml. Added examples and arquillian tests.
Date Tue, 28 Nov 2017 20:54:11 GMT
Repository: tomee
Updated Branches:
  refs/heads/master e20d46165 -> b2d2cc08b


http://git-wip-us.apache.org/repos/asf/tomee/blob/b2d2cc08/examples/simple-ear/moviefun-webapp/src/main/webapp/assets/js/bootstrap.min.js
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-webapp/src/main/webapp/assets/js/bootstrap.min.js b/examples/simple-ear/moviefun-webapp/src/main/webapp/assets/js/bootstrap.min.js
new file mode 100644
index 0000000..3b91223
--- /dev/null
+++ b/examples/simple-ear/moviefun-webapp/src/main/webapp/assets/js/bootstrap.min.js
@@ -0,0 +1,568 @@
+/*!
+ * Bootstrap.js by @fat & @mdo
+ * Copyright 2012 Twitter, Inc.
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ */
+!function (e) {
+    e(function () {
+        "use strict";
+        e.support.transition = function () {
+            var e = function () {
+                var e = document.createElement("bootstrap"), t = {WebkitTransition: "webkitTransitionEnd", MozTransition: "transitionend", OTransition: "oTransitionEnd otransitionend", transition: "transitionend"}, n;
+                for (n in t)if (e.style[n] !== undefined)return t[n]
+            }();
+            return e && {end: e}
+        }()
+    })
+}(window.jQuery), !function (e) {
+    "use strict";
+    var t = '[data-dismiss="alert"]', n = function (n) {
+        e(n).on("click", t, this.close)
+    };
+    n.prototype.close = function (t) {
+        function s() {
+            i.trigger("closed").remove()
+        }
+
+        var n = e(this), r = n.attr("data-target"), i;
+        r || (r = n.attr("href"), r = r && r.replace(/.*(?=#[^\s]*$)/, "")), i = e(r), t && t.preventDefault(), i.length || (i = n.hasClass("alert") ? n : n.parent()), i.trigger(t = e.Event("close"));
+        if (t.isDefaultPrevented())return;
+        i.removeClass("in"), e.support.transition && i.hasClass("fade") ? i.on(e.support.transition.end, s) : s()
+    }, e.fn.alert = function (t) {
+        return this.each(function () {
+            var r = e(this), i = r.data("alert");
+            i || r.data("alert", i = new n(this)), typeof t == "string" && i[t].call(r)
+        })
+    }, e.fn.alert.Constructor = n, e(function () {
+        e("body").on("click.alert.data-api", t, n.prototype.close)
+    })
+}(window.jQuery), !function (e) {
+    "use strict";
+    var t = function (t, n) {
+        this.$element = e(t), this.options = e.extend({}, e.fn.button.defaults, n)
+    };
+    t.prototype.setState = function (e) {
+        var t = "disabled", n = this.$element, r = n.data(), i = n.is("input") ? "val" : "html";
+        e += "Text", r.resetText || n.data("resetText", n[i]()), n[i](r[e] || this.options[e]), setTimeout(function () {
+            e == "loadingText" ? n.addClass(t).attr(t, t) : n.removeClass(t).removeAttr(t)
+        }, 0)
+    }, t.prototype.toggle = function () {
+        var e = this.$element.closest('[data-toggle="buttons-radio"]');
+        e && e.find(".active").removeClass("active"), this.$element.toggleClass("active")
+    }, e.fn.button = function (n) {
+        return this.each(function () {
+            var r = e(this), i = r.data("button"), s = typeof n == "object" && n;
+            i || r.data("button", i = new t(this, s)), n == "toggle" ? i.toggle() : n && i.setState(n)
+        })
+    }, e.fn.button.defaults = {loadingText: "loading..."}, e.fn.button.Constructor = t, e(function () {
+        e("body").on("click.button.data-api", "[data-toggle^=button]", function (t) {
+            var n = e(t.target);
+            n.hasClass("btn") || (n = n.closest(".btn")), n.button("toggle")
+        })
+    })
+}(window.jQuery), !function (e) {
+    "use strict";
+    var t = function (t, n) {
+        this.$element = e(t), this.options = n, this.options.slide && this.slide(this.options.slide), this.options.pause == "hover" && this.$element.on("mouseenter", e.proxy(this.pause, this)).on("mouseleave", e.proxy(this.cycle, this))
+    };
+    t.prototype = {cycle: function (t) {
+        return t || (this.paused = !1), this.options.interval && !this.paused && (this.interval = setInterval(e.proxy(this.next, this), this.options.interval)), this
+    }, to: function (t) {
+        var n = this.$element.find(".item.active"), r = n.parent().children(), i = r.index(n), s = this;
+        if (t > r.length - 1 || t < 0)return;
+        return this.sliding ? this.$element.one("slid", function () {
+            s.to(t)
+        }) : i == t ? this.pause().cycle() : this.slide(t > i ? "next" : "prev", e(r[t]))
+    }, pause: function (t) {
+        return t || (this.paused = !0), this.$element.find(".next, .prev").length && e.support.transition.end && (this.$element.trigger(e.support.transition.end), this.cycle()), clearInterval(this.interval), this.interval = null, this
+    }, next: function () {
+        if (this.sliding)return;
+        return this.slide("next")
+    }, prev: function () {
+        if (this.sliding)return;
+        return this.slide("prev")
+    }, slide: function (t, n) {
+        var r = this.$element.find(".item.active"), i = n || r[t](), s = this.interval, o = t == "next" ? "left" : "right", u = t == "next" ? "first" : "last", a = this, f = e.Event("slide", {relatedTarget: i[0]});
+        this.sliding = !0, s && this.pause(), i = i.length ? i : this.$element.find(".item")[u]();
+        if (i.hasClass("active"))return;
+        if (e.support.transition && this.$element.hasClass("slide")) {
+            this.$element.trigger(f);
+            if (f.isDefaultPrevented())return;
+            i.addClass(t), i[0].offsetWidth, r.addClass(o), i.addClass(o), this.$element.one(e.support.transition.end, function () {
+                i.removeClass([t, o].join(" ")).addClass("active"), r.removeClass(["active", o].join(" ")), a.sliding = !1, setTimeout(function () {
+                    a.$element.trigger("slid")
+                }, 0)
+            })
+        } else {
+            this.$element.trigger(f);
+            if (f.isDefaultPrevented())return;
+            r.removeClass("active"), i.addClass("active"), this.sliding = !1, this.$element.trigger("slid")
+        }
+        return s && this.cycle(), this
+    }}, e.fn.carousel = function (n) {
+        return this.each(function () {
+            var r = e(this), i = r.data("carousel"), s = e.extend({}, e.fn.carousel.defaults, typeof n == "object" && n), o = typeof n == "string" ? n : s.slide;
+            i || r.data("carousel", i = new t(this, s)), typeof n == "number" ? i.to(n) : o ? i[o]() : s.interval && i.cycle()
+        })
+    }, e.fn.carousel.defaults = {interval: 5e3, pause: "hover"}, e.fn.carousel.Constructor = t, e(function () {
+        e("body").on("click.carousel.data-api", "[data-slide]", function (t) {
+            var n = e(this), r, i = e(n.attr("data-target") || (r = n.attr("href")) && r.replace(/.*(?=#[^\s]+$)/, "")), s = !i.data("modal") && e.extend({}, i.data(), n.data());
+            i.carousel(s), t.preventDefault()
+        })
+    })
+}(window.jQuery), !function (e) {
+    "use strict";
+    var t = function (t, n) {
+        this.$element = e(t), this.options = e.extend({}, e.fn.collapse.defaults, n), this.options.parent && (this.$parent = e(this.options.parent)), this.options.toggle && this.toggle()
+    };
+    t.prototype = {constructor: t, dimension: function () {
+        var e = this.$element.hasClass("width");
+        return e ? "width" : "height"
+    }, show: function () {
+        var t, n, r, i;
+        if (this.transitioning)return;
+        t = this.dimension(), n = e.camelCase(["scroll", t].join("-")), r = this.$parent && this.$parent.find("> .accordion-group > .in");
+        if (r && r.length) {
+            i = r.data("collapse");
+            if (i && i.transitioning)return;
+            r.collapse("hide"), i || r.data("collapse", null)
+        }
+        this.$element[t](0), this.transition("addClass", e.Event("show"), "shown"), e.support.transition && this.$element[t](this.$element[0][n])
+    }, hide: function () {
+        var t;
+        if (this.transitioning)return;
+        t = this.dimension(), this.reset(this.$element[t]()), this.transition("removeClass", e.Event("hide"), "hidden"), this.$element[t](0)
+    }, reset: function (e) {
+        var t = this.dimension();
+        return this.$element.removeClass("collapse")[t](e || "auto")[0].offsetWidth, this.$element[e !== null ? "addClass" : "removeClass"]("collapse"), this
+    }, transition: function (t, n, r) {
+        var i = this, s = function () {
+            n.type == "show" && i.reset(), i.transitioning = 0, i.$element.trigger(r)
+        };
+        this.$element.trigger(n);
+        if (n.isDefaultPrevented())return;
+        this.transitioning = 1, this.$element[t]("in"), e.support.transition && this.$element.hasClass("collapse") ? this.$element.one(e.support.transition.end, s) : s()
+    }, toggle: function () {
+        this[this.$element.hasClass("in") ? "hide" : "show"]()
+    }}, e.fn.collapse = function (n) {
+        return this.each(function () {
+            var r = e(this), i = r.data("collapse"), s = typeof n == "object" && n;
+            i || r.data("collapse", i = new t(this, s)), typeof n == "string" && i[n]()
+        })
+    }, e.fn.collapse.defaults = {toggle: !0}, e.fn.collapse.Constructor = t, e(function () {
+        e("body").on("click.collapse.data-api", "[data-toggle=collapse]", function (t) {
+            var n = e(this), r, i = n.attr("data-target") || t.preventDefault() || (r = n.attr("href")) && r.replace(/.*(?=#[^\s]+$)/, ""), s = e(i).data("collapse") ? "toggle" : n.data();
+            n[e(i).hasClass("in") ? "addClass" : "removeClass"]("collapsed"), e(i).collapse(s)
+        })
+    })
+}(window.jQuery), !function (e) {
+    "use strict";
+    function r() {
+        i(e(t)).removeClass("open")
+    }
+
+    function i(t) {
+        var n = t.attr("data-target"), r;
+        return n || (n = t.attr("href"), n = n && /#/.test(n) && n.replace(/.*(?=#[^\s]*$)/, "")), r = e(n), r.length || (r = t.parent()), r
+    }
+
+    var t = "[data-toggle=dropdown]", n = function (t) {
+        var n = e(t).on("click.dropdown.data-api", this.toggle);
+        e("html").on("click.dropdown.data-api", function () {
+            n.parent().removeClass("open")
+        })
+    };
+    n.prototype = {constructor: n, toggle: function (t) {
+        var n = e(this), s, o;
+        if (n.is(".disabled, :disabled"))return;
+        return s = i(n), o = s.hasClass("open"), r(), o || (s.toggleClass("open"), n.focus()), !1
+    }, keydown: function (t) {
+        var n, r, s, o, u, a;
+        if (!/(38|40|27)/.test(t.keyCode))return;
+        n = e(this), t.preventDefault(), t.stopPropagation();
+        if (n.is(".disabled, :disabled"))return;
+        o = i(n), u = o.hasClass("open");
+        if (!u || u && t.keyCode == 27)return n.click();
+        r = e("[role=menu] li:not(.divider) a", o);
+        if (!r.length)return;
+        a = r.index(r.filter(":focus")), t.keyCode == 38 && a > 0 && a--, t.keyCode == 40 && a < r.length - 1 && a++, ~a || (a = 0), r.eq(a).focus()
+    }}, e.fn.dropdown = function (t) {
+        return this.each(function () {
+            var r = e(this), i = r.data("dropdown");
+            i || r.data("dropdown", i = new n(this)), typeof t == "string" && i[t].call(r)
+        })
+    }, e.fn.dropdown.Constructor = n, e(function () {
+        e("html").on("click.dropdown.data-api touchstart.dropdown.data-api", r), e("body").on("click.dropdown touchstart.dropdown.data-api", ".dropdown form",function (e) {
+            e.stopPropagation()
+        }).on("click.dropdown.data-api touchstart.dropdown.data-api", t, n.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api", t + ", [role=menu]", n.prototype.keydown)
+    })
+}(window.jQuery), !function (e) {
+    "use strict";
+    var t = function (t, n) {
+        this.options = n, this.$element = e(t).delegate('[data-dismiss="modal"]', "click.dismiss.modal", e.proxy(this.hide, this)), this.options.remote && this.$element.find(".modal-body").load(this.options.remote)
+    };
+    t.prototype = {constructor: t, toggle: function () {
+        return this[this.isShown ? "hide" : "show"]()
+    }, show: function () {
+        var t = this, n = e.Event("show");
+        this.$element.trigger(n);
+        if (this.isShown || n.isDefaultPrevented())return;
+        e("body").addClass("modal-open"), this.isShown = !0, this.escape(), this.backdrop(function () {
+            var n = e.support.transition && t.$element.hasClass("fade");
+            t.$element.parent().length || t.$element.appendTo(document.body), t.$element.show(), n && t.$element[0].offsetWidth, t.$element.addClass("in").attr("aria-hidden", !1).focus(), t.enforceFocus(), n ? t.$element.one(e.support.transition.end, function () {
+                t.$element.trigger("shown")
+            }) : t.$element.trigger("shown")
+        })
+    }, hide: function (t) {
+        t && t.preventDefault();
+        var n = this;
+        t = e.Event("hide"), this.$element.trigger(t);
+        if (!this.isShown || t.isDefaultPrevented())return;
+        this.isShown = !1, e("body").removeClass("modal-open"), this.escape(), e(document).off("focusin.modal"), this.$element.removeClass("in").attr("aria-hidden", !0), e.support.transition && this.$element.hasClass("fade") ? this.hideWithTransition() : this.hideModal()
+    }, enforceFocus: function () {
+        var t = this;
+        e(document).on("focusin.modal", function (e) {
+            t.$element[0] !== e.target && !t.$element.has(e.target).length && t.$element.focus()
+        })
+    }, escape: function () {
+        var e = this;
+        this.isShown && this.options.keyboard ? this.$element.on("keyup.dismiss.modal", function (t) {
+            t.which == 27 && e.hide()
+        }) : this.isShown || this.$element.off("keyup.dismiss.modal")
+    }, hideWithTransition: function () {
+        var t = this, n = setTimeout(function () {
+            t.$element.off(e.support.transition.end), t.hideModal()
+        }, 500);
+        this.$element.one(e.support.transition.end, function () {
+            clearTimeout(n), t.hideModal()
+        })
+    }, hideModal: function (e) {
+        this.$element.hide().trigger("hidden"), this.backdrop()
+    }, removeBackdrop: function () {
+        this.$backdrop.remove(), this.$backdrop = null
+    }, backdrop: function (t) {
+        var n = this, r = this.$element.hasClass("fade") ? "fade" : "";
+        if (this.isShown && this.options.backdrop) {
+            var i = e.support.transition && r;
+            this.$backdrop = e('<div class="modal-backdrop ' + r + '" />').appendTo(document.body), this.options.backdrop != "static" && this.$backdrop.click(e.proxy(this.hide, this)), i && this.$backdrop[0].offsetWidth, this.$backdrop.addClass("in"), i ? this.$backdrop.one(e.support.transition.end, t) : t()
+        } else!this.isShown && this.$backdrop ? (this.$backdrop.removeClass("in"), e.support.transition && this.$element.hasClass("fade") ? this.$backdrop.one(e.support.transition.end, e.proxy(this.removeBackdrop, this)) : this.removeBackdrop()) : t && t()
+    }}, e.fn.modal = function (n) {
+        return this.each(function () {
+            var r = e(this), i = r.data("modal"), s = e.extend({}, e.fn.modal.defaults, r.data(), typeof n == "object" && n);
+            i || r.data("modal", i = new t(this, s)), typeof n == "string" ? i[n]() : s.show && i.show()
+        })
+    }, e.fn.modal.defaults = {backdrop: !0, keyboard: !0, show: !0}, e.fn.modal.Constructor = t, e(function () {
+        e("body").on("click.modal.data-api", '[data-toggle="modal"]', function (t) {
+            var n = e(this), r = n.attr("href"), i = e(n.attr("data-target") || r && r.replace(/.*(?=#[^\s]+$)/, "")), s = i.data("modal") ? "toggle" : e.extend({remote: !/#/.test(r) && r}, i.data(), n.data());
+            t.preventDefault(), i.modal(s).one("hide", function () {
+                n.focus()
+            })
+        })
+    })
+}(window.jQuery), !function (e) {
+    "use strict";
+    var t = function (e, t) {
+        this.init("tooltip", e, t)
+    };
+    t.prototype = {constructor: t, init: function (t, n, r) {
+        var i, s;
+        this.type = t, this.$element = e(n), this.options = this.getOptions(r), this.enabled = !0, this.options.trigger == "click" ? this.$element.on("click." + this.type, this.options.selector, e.proxy(this.toggle, this)) : this.options.trigger != "manual" && (i = this.options.trigger == "hover" ? "mouseenter" : "focus", s = this.options.trigger == "hover" ? "mouseleave" : "blur", this.$element.on(i + "." + this.type, this.options.selector, e.proxy(this.enter, this)), this.$element.on(s + "." + this.type, this.options.selector, e.proxy(this.leave, this))), this.options.selector ? this._options = e.extend({}, this.options, {trigger: "manual", selector: ""}) : this.fixTitle()
+    }, getOptions: function (t) {
+        return t = e.extend({}, e.fn[this.type].defaults, t, this.$element.data()), t.delay && typeof t.delay == "number" && (t.delay = {show: t.delay, hide: t.delay}), t
+    }, enter: function (t) {
+        var n = e(t.currentTarget)[this.type](this._options).data(this.type);
+        if (!n.options.delay || !n.options.delay.show)return n.show();
+        clearTimeout(this.timeout), n.hoverState = "in", this.timeout = setTimeout(function () {
+            n.hoverState == "in" && n.show()
+        }, n.options.delay.show)
+    }, leave: function (t) {
+        var n = e(t.currentTarget)[this.type](this._options).data(this.type);
+        this.timeout && clearTimeout(this.timeout);
+        if (!n.options.delay || !n.options.delay.hide)return n.hide();
+        n.hoverState = "out", this.timeout = setTimeout(function () {
+            n.hoverState == "out" && n.hide()
+        }, n.options.delay.hide)
+    }, show: function () {
+        var e, t, n, r, i, s, o;
+        if (this.hasContent() && this.enabled) {
+            e = this.tip(), this.setContent(), this.options.animation && e.addClass("fade"), s = typeof this.options.placement == "function" ? this.options.placement.call(this, e[0], this.$element[0]) : this.options.placement, t = /in/.test(s), e.remove().css({top: 0, left: 0, display: "block"}).appendTo(t ? this.$element : document.body), n = this.getPosition(t), r = e[0].offsetWidth, i = e[0].offsetHeight;
+            switch (t ? s.split(" ")[1] : s) {
+                case"bottom":
+                    o = {top: n.top + n.height, left: n.left + n.width / 2 - r / 2};
+                    break;
+                case"top":
+                    o = {top: n.top - i, left: n.left + n.width / 2 - r / 2};
+                    break;
+                case"left":
+                    o = {top: n.top + n.height / 2 - i / 2, left: n.left - r};
+                    break;
+                case"right":
+                    o = {top: n.top + n.height / 2 - i / 2, left: n.left + n.width}
+            }
+            e.css(o).addClass(s).addClass("in")
+        }
+    }, setContent: function () {
+        var e = this.tip(), t = this.getTitle();
+        e.find(".tooltip-inner")[this.options.html ? "html" : "text"](t), e.removeClass("fade in top bottom left right")
+    }, hide: function () {
+        function r() {
+            var t = setTimeout(function () {
+                n.off(e.support.transition.end).remove()
+            }, 500);
+            n.one(e.support.transition.end, function () {
+                clearTimeout(t), n.remove()
+            })
+        }
+
+        var t = this, n = this.tip();
+        return n.removeClass("in"), e.support.transition && this.$tip.hasClass("fade") ? r() : n.remove(), this
+    }, fixTitle: function () {
+        var e = this.$element;
+        (e.attr("title") || typeof e.attr("data-original-title") != "string") && e.attr("data-original-title", e.attr("title") || "").removeAttr("title")
+    }, hasContent: function () {
+        return this.getTitle()
+    }, getPosition: function (t) {
+        return e.extend({}, t ? {top: 0, left: 0} : this.$element.offset(), {width: this.$element[0].offsetWidth, height: this.$element[0].offsetHeight})
+    }, getTitle: function () {
+        var e, t = this.$element, n = this.options;
+        return e = t.attr("data-original-title") || (typeof n.title == "function" ? n.title.call(t[0]) : n.title), e
+    }, tip: function () {
+        return this.$tip = this.$tip || e(this.options.template)
+    }, validate: function () {
+        this.$element[0].parentNode || (this.hide(), this.$element = null, this.options = null)
+    }, enable: function () {
+        this.enabled = !0
+    }, disable: function () {
+        this.enabled = !1
+    }, toggleEnabled: function () {
+        this.enabled = !this.enabled
+    }, toggle: function () {
+        this[this.tip().hasClass("in") ? "hide" : "show"]()
+    }, destroy: function () {
+        this.hide().$element.off("." + this.type).removeData(this.type)
+    }}, e.fn.tooltip = function (n) {
+        return this.each(function () {
+            var r = e(this), i = r.data("tooltip"), s = typeof n == "object" && n;
+            i || r.data("tooltip", i = new t(this, s)), typeof n == "string" && i[n]()
+        })
+    }, e.fn.tooltip.Constructor = t, e.fn.tooltip.defaults = {animation: !0, placement: "top", selector: !1, template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', trigger: "hover", title: "", delay: 0, html: !0}
+}(window.jQuery), !function (e) {
+    "use strict";
+    var t = function (e, t) {
+        this.init("popover", e, t)
+    };
+    t.prototype = e.extend({}, e.fn.tooltip.Constructor.prototype, {constructor: t, setContent: function () {
+        var e = this.tip(), t = this.getTitle(), n = this.getContent();
+        e.find(".popover-title")[this.options.html ? "html" : "text"](t), e.find(".popover-content > *")[this.options.html ? "html" : "text"](n), e.removeClass("fade top bottom left right in")
+    }, hasContent: function () {
+        return this.getTitle() || this.getContent()
+    }, getContent: function () {
+        var e, t = this.$element, n = this.options;
+        return e = t.attr("data-content") || (typeof n.content == "function" ? n.content.call(t[0]) : n.content), e
+    }, tip: function () {
+        return this.$tip || (this.$tip = e(this.options.template)), this.$tip
+    }, destroy: function () {
+        this.hide().$element.off("." + this.type).removeData(this.type)
+    }}), e.fn.popover = function (n) {
+        return this.each(function () {
+            var r = e(this), i = r.data("popover"), s = typeof n == "object" && n;
+            i || r.data("popover", i = new t(this, s)), typeof n == "string" && i[n]()
+        })
+    }, e.fn.popover.Constructor = t, e.fn.popover.defaults = e.extend({}, e.fn.tooltip.defaults, {placement: "right", trigger: "click", content: "", template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})
+}(window.jQuery), !function (e) {
+    "use strict";
+    function t(t, n) {
+        var r = e.proxy(this.process, this), i = e(t).is("body") ? e(window) : e(t), s;
+        this.options = e.extend({}, e.fn.scrollspy.defaults, n), this.$scrollElement = i.on("scroll.scroll-spy.data-api", r), this.selector = (this.options.target || (s = e(t).attr("href")) && s.replace(/.*(?=#[^\s]+$)/, "") || "") + " .nav li > a", this.$body = e("body"), this.refresh(), this.process()
+    }
+
+    t.prototype = {constructor: t, refresh: function () {
+        var t = this, n;
+        this.offsets = e([]), this.targets = e([]), n = this.$body.find(this.selector).map(function () {
+            var t = e(this), n = t.data("target") || t.attr("href"), r = /^#\w/.test(n) && e(n);
+            return r && r.length && [
+                [r.position().top, n]
+            ] || null
+        }).sort(function (e, t) {
+            return e[0] - t[0]
+        }).each(function () {
+            t.offsets.push(this[0]), t.targets.push(this[1])
+        })
+    }, process: function () {
+        var e = this.$scrollElement.scrollTop() + this.options.offset, t = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight, n = t - this.$scrollElement.height(), r = this.offsets, i = this.targets, s = this.activeTarget, o;
+        if (e >= n)return s != (o = i.last()[0]) && this.activate(o);
+        for (o = r.length; o--;)s != i[o] && e >= r[o] && (!r[o + 1] || e <= r[o + 1]) && this.activate(i[o])
+    }, activate: function (t) {
+        var n, r;
+        this.activeTarget = t, e(this.selector).parent(".active").removeClass("active"), r = this.selector + '[data-target="' + t + '"],' + this.selector + '[href="' + t + '"]', n = e(r).parent("li").addClass("active"), n.parent(".dropdown-menu").length && (n = n.closest("li.dropdown").addClass("active")), n.trigger("activate")
+    }}, e.fn.scrollspy = function (n) {
+        return this.each(function () {
+            var r = e(this), i = r.data("scrollspy"), s = typeof n == "object" && n;
+            i || r.data("scrollspy", i = new t(this, s)), typeof n == "string" && i[n]()
+        })
+    }, e.fn.scrollspy.Constructor = t, e.fn.scrollspy.defaults = {offset: 10}, e(window).on("load", function () {
+        e('[data-spy="scroll"]').each(function () {
+            var t = e(this);
+            t.scrollspy(t.data())
+        })
+    })
+}(window.jQuery), !function (e) {
+    "use strict";
+    var t = function (t) {
+        this.element = e(t)
+    };
+    t.prototype = {constructor: t, show: function () {
+        var t = this.element, n = t.closest("ul:not(.dropdown-menu)"), r = t.attr("data-target"), i, s, o;
+        r || (r = t.attr("href"), r = r && r.replace(/.*(?=#[^\s]*$)/, ""));
+        if (t.parent("li").hasClass("active"))return;
+        i = n.find(".active a").last()[0], o = e.Event("show", {relatedTarget: i}), t.trigger(o);
+        if (o.isDefaultPrevented())return;
+        s = e(r), this.activate(t.parent("li"), n), this.activate(s, s.parent(), function () {
+            t.trigger({type: "shown", relatedTarget: i})
+        })
+    }, activate: function (t, n, r) {
+        function o() {
+            i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"), t.addClass("active"), s ? (t[0].offsetWidth, t.addClass("in")) : t.removeClass("fade"), t.parent(".dropdown-menu") && t.closest("li.dropdown").addClass("active"), r && r()
+        }
+
+        var i = n.find("> .active"), s = r && e.support.transition && i.hasClass("fade");
+        s ? i.one(e.support.transition.end, o) : o(), i.removeClass("in")
+    }}, e.fn.tab = function (n) {
+        return this.each(function () {
+            var r = e(this), i = r.data("tab");
+            i || r.data("tab", i = new t(this)), typeof n == "string" && i[n]()
+        })
+    }, e.fn.tab.Constructor = t, e(function () {
+        e("body").on("click.tab.data-api", '[data-toggle="tab"], [data-toggle="pill"]', function (t) {
+            t.preventDefault(), e(this).tab("show")
+        })
+    })
+}(window.jQuery), !function (e) {
+    "use strict";
+    var t = function (t, n) {
+        this.$element = e(t), this.options = e.extend({}, e.fn.typeahead.defaults, n), this.matcher = this.options.matcher || this.matcher, this.sorter = this.options.sorter || this.sorter, this.highlighter = this.options.highlighter || this.highlighter, this.updater = this.options.updater || this.updater, this.$menu = e(this.options.menu).appendTo("body"), this.source = this.options.source, this.shown = !1, this.listen()
+    };
+    t.prototype = {constructor: t, select: function () {
+        var e = this.$menu.find(".active").attr("data-value");
+        return this.$element.val(this.updater(e)).change(), this.hide()
+    }, updater: function (e) {
+        return e
+    }, show: function () {
+        var t = e.extend({}, this.$element.offset(), {height: this.$element[0].offsetHeight});
+        return this.$menu.css({top: t.top + t.height, left: t.left}), this.$menu.show(), this.shown = !0, this
+    }, hide: function () {
+        return this.$menu.hide(), this.shown = !1, this
+    }, lookup: function (t) {
+        var n;
+        return this.query = this.$element.val(), !this.query || this.query.length < this.options.minLength ? this.shown ? this.hide() : this : (n = e.isFunction(this.source) ? this.source(this.query, e.proxy(this.process, this)) : this.source, n ? this.process(n) : this)
+    }, process: function (t) {
+        var n = this;
+        return t = e.grep(t, function (e) {
+            return n.matcher(e)
+        }), t = this.sorter(t), t.length ? this.render(t.slice(0, this.options.items)).show() : this.shown ? this.hide() : this
+    }, matcher: function (e) {
+        return~e.toLowerCase().indexOf(this.query.toLowerCase())
+    }, sorter: function (e) {
+        var t = [], n = [], r = [], i;
+        while (i = e.shift())i.toLowerCase().indexOf(this.query.toLowerCase()) ? ~i.indexOf(this.query) ? n.push(i) : r.push(i) : t.push(i);
+        return t.concat(n, r)
+    }, highlighter: function (e) {
+        var t = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
+        return e.replace(new RegExp("(" + t + ")", "ig"), function (e, t) {
+            return"<strong>" + t + "</strong>"
+        })
+    }, render: function (t) {
+        var n = this;
+        return t = e(t).map(function (t, r) {
+            return t = e(n.options.item).attr("data-value", r), t.find("a").html(n.highlighter(r)), t[0]
+        }), t.first().addClass("active"), this.$menu.html(t), this
+    }, next: function (t) {
+        var n = this.$menu.find(".active").removeClass("active"), r = n.next();
+        r.length || (r = e(this.$menu.find("li")[0])), r.addClass("active")
+    }, prev: function (e) {
+        var t = this.$menu.find(".active").removeClass("active"), n = t.prev();
+        n.length || (n = this.$menu.find("li").last()), n.addClass("active")
+    }, listen: function () {
+        this.$element.on("blur", e.proxy(this.blur, this)).on("keypress", e.proxy(this.keypress, this)).on("keyup", e.proxy(this.keyup, this)), (e.browser.chrome || e.browser.webkit || e.browser.msie) && this.$element.on("keydown", e.proxy(this.keydown, this)), this.$menu.on("click", e.proxy(this.click, this)).on("mouseenter", "li", e.proxy(this.mouseenter, this))
+    }, move: function (e) {
+        if (!this.shown)return;
+        switch (e.keyCode) {
+            case 9:
+            case 13:
+            case 27:
+                e.preventDefault();
+                break;
+            case 38:
+                e.preventDefault(), this.prev();
+                break;
+            case 40:
+                e.preventDefault(), this.next()
+        }
+        e.stopPropagation()
+    }, keydown: function (t) {
+        this.suppressKeyPressRepeat = !~e.inArray(t.keyCode, [40, 38, 9, 13, 27]), this.move(t)
+    }, keypress: function (e) {
+        if (this.suppressKeyPressRepeat)return;
+        this.move(e)
+    }, keyup: function (e) {
+        switch (e.keyCode) {
+            case 40:
+            case 38:
+                break;
+            case 9:
+            case 13:
+                if (!this.shown)return;
+                this.select();
+                break;
+            case 27:
+                if (!this.shown)return;
+                this.hide();
+                break;
+            default:
+                this.lookup()
+        }
+        e.stopPropagation(), e.preventDefault()
+    }, blur: function (e) {
+        var t = this;
+        setTimeout(function () {
+            t.hide()
+        }, 150)
+    }, click: function (e) {
+        e.stopPropagation(), e.preventDefault(), this.select()
+    }, mouseenter: function (t) {
+        this.$menu.find(".active").removeClass("active"), e(t.currentTarget).addClass("active")
+    }}, e.fn.typeahead = function (n) {
+        return this.each(function () {
+            var r = e(this), i = r.data("typeahead"), s = typeof n == "object" && n;
+            i || r.data("typeahead", i = new t(this, s)), typeof n == "string" && i[n]()
+        })
+    }, e.fn.typeahead.defaults = {source: [], items: 8, menu: '<ul class="typeahead dropdown-menu"></ul>', item: '<li><a href="#"></a></li>', minLength: 1}, e.fn.typeahead.Constructor = t, e(function () {
+        e("body").on("focus.typeahead.data-api", '[data-provide="typeahead"]', function (t) {
+            var n = e(this);
+            if (n.data("typeahead"))return;
+            t.preventDefault(), n.typeahead(n.data())
+        })
+    })
+}(window.jQuery), !function (e) {
+    "use strict";
+    var t = function (t, n) {
+        this.options = e.extend({}, e.fn.affix.defaults, n), this.$window = e(window).on("scroll.affix.data-api", e.proxy(this.checkPosition, this)), this.$element = e(t), this.checkPosition()
+    };
+    t.prototype.checkPosition = function () {
+        if (!this.$element.is(":visible"))return;
+        var t = e(document).height(), n = this.$window.scrollTop(), r = this.$element.offset(), i = this.options.offset, s = i.bottom, o = i.top, u = "affix affix-top affix-bottom", a;
+        typeof i != "object" && (s = o = i), typeof o == "function" && (o = i.top()), typeof s == "function" && (s = i.bottom()), a = this.unpin != null && n + this.unpin <= r.top ? !1 : s != null && r.top + this.$element.height() >= t - s ? "bottom" : o != null && n <= o ? "top" : !1;
+        if (this.affixed === a)return;
+        this.affixed = a, this.unpin = a == "bottom" ? r.top - n : null, this.$element.removeClass(u).addClass("affix" + (a ? "-" + a : ""))
+    }, e.fn.affix = function (n) {
+        return this.each(function () {
+            var r = e(this), i = r.data("affix"), s = typeof n == "object" && n;
+            i || r.data("affix", i = new t(this, s)), typeof n == "string" && i[n]()
+        })
+    }, e.fn.affix.Constructor = t, e.fn.affix.defaults = {offset: 0}, e(window).on("load", function () {
+        e('[data-spy="affix"]').each(function () {
+            var t = e(this), n = t.data();
+            n.offset = n.offset || {}, n.offsetBottom && (n.offset.bottom = n.offsetBottom), n.offsetTop && (n.offset.top = n.offsetTop), t.affix(n)
+        })
+    })
+}(window.jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tomee/blob/b2d2cc08/examples/simple-ear/moviefun-webapp/src/main/webapp/default.css
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-webapp/src/main/webapp/default.css b/examples/simple-ear/moviefun-webapp/src/main/webapp/default.css
new file mode 100644
index 0000000..cc1946f
--- /dev/null
+++ b/examples/simple-ear/moviefun-webapp/src/main/webapp/default.css
@@ -0,0 +1,207 @@
+/*
+ *  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.
+ *
+ */
+body, p, td, table, tr, .bodytext, .stepfield {
+    font-family: Verdana, arial, sans-serif;
+    font-size: 11px;
+    line-height: 16px;
+    color: #000000;
+    font-weight: normal;
+}
+
+body {
+    margin: 0px;
+    padding: 0px;
+    text-align: center;
+    background-color: #f0f0f0;
+}
+
+#Content {
+    text-align: left;
+    background-color: #fff;
+    padding: 0px;
+    margin: 0px;
+}
+
+HR {
+    color: 3 c78b5;
+    height: 1;
+}
+
+A:link, A:visited, A:active, A:hover {
+    color: #003366;
+}
+
+h1 A:link, h1 A:visited, h1 A:active {
+    text-decoration: none;
+}
+
+h1 A:hover {
+    border-bottom: 1px dotted #003366;
+}
+
+input {
+    font-family: verdana, geneva, arial, sans-serif;
+    font-size: 11px;
+    color: #000000;
+}
+
+h1 {
+    font-size: 24px;
+    line-height: normal;
+    font-weight: bold;
+    background-color: #f0f0f0;
+    color: #003366;
+    border-bottom: 1px solid #3c78b5;
+    padding: 2px;
+    margin: 36px 0px 4px 0px;
+}
+
+h2 {
+    font-size: 18px;
+    line-height: normal;
+    font-weight: bold;
+    background-color: #f0f0f0;
+    border-bottom: 1px solid #3c78b5;
+    padding: 2px;
+    margin: 27px 0px 4px 0px;
+}
+
+h3 {
+    font-size: 14px;
+    line-height: normal;
+    font-weight: bold;
+    background-color: #f0f0f0;
+    padding: 2px;
+    margin: 21px 0px 4px 0px;
+}
+
+h4 {
+    font-size: 12px;
+    line-height: normal;
+    font-weight: bold;
+    background-color: #f0f0f0;
+    padding: 2px;
+    margin: 18px 0px 4px 0px;
+}
+
+h4.search {
+    font-size: 12px;
+    line-height: normal;
+    font-weight: normal;
+    background-color: #f0f0f0;
+    padding: 4px;
+    margin: 18px 0px 4px 0px;
+}
+
+h5 {
+    font-size: 10px;
+    line-height: normal;
+    font-weight: bold;
+    background-color: #f0f0f0;
+    padding: 2px;
+    margin: 14px 0px 4px 0px;
+}
+
+h6 {
+    font-size: 8px;
+    line-height: normal;
+    font-weight: bold;
+    background-color: #f0f0f0;
+    padding: 2px;
+    margin: 14px 0px 4px 0px;
+}
+
+.smalltext {
+    color: #666666;
+    font-size: 10px;
+}
+
+.smalltext a {
+    color: #666666;
+}
+
+.tableview table {
+    margin: 0;
+}
+
+.tableview th {
+    text-align: left;
+    color: #003366;
+    font-size: 12px;
+    padding: 5px 0px 0px 5px;
+    border-bottom: 2px solid #3c78b5;
+}
+
+.tableview td {
+    text-align: left;
+    border-color: #ccc;
+    border-width: 0px 0px 1px 0px;
+    border-style: solid;
+    margin: 0;
+    padding: 4px 10px 4px 5px;
+}
+
+.bottomshadow {
+    height: 12px;
+    background-image: url("/images/border/border_bottom.gif");
+    background-repeat: repeat-x;
+}
+
+.topBarDiv a:link {
+    color: white;
+}
+
+.topBarDiv a:visited {
+    color: white;
+}
+
+.topBarDiv a:active {
+    color: white;
+}
+
+.topBarDiv a:hover {
+    color: white;
+}
+
+.topBarDiv {
+    color: white;
+}
+
+.topBar td {
+    background-color: #003366;
+}
+
+.basicPanelContainer {
+    border: 1px solid #3c78b5;
+    margin-top: 2px;
+    margin-bottom: 8px;
+    width: 100%
+}
+
+.basicPanelTitle {
+    padding: 5px;
+    margin: 0px;
+    background-color: #f0f0f0;
+    color: black;
+    font-weight: bold;
+}
+
+.basicPanelBody {
+    padding: 5px;
+    margin: 0px
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/b2d2cc08/examples/simple-ear/moviefun-webapp/src/main/webapp/index.jsp
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-webapp/src/main/webapp/index.jsp b/examples/simple-ear/moviefun-webapp/src/main/webapp/index.jsp
new file mode 100644
index 0000000..3a000c5
--- /dev/null
+++ b/examples/simple-ear/moviefun-webapp/src/main/webapp/index.jsp
@@ -0,0 +1,70 @@
+<%--
+    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.
+--%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<c:set var="language" value="${pageContext.request.locale}"/>
+<fmt:setLocale value="${language}"/>
+
+<!DOCTYPE html>
+<html lang="${language}">
+<head>
+  <meta charset="utf-8">
+  <title>Moviefun</title>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="description" content="">
+  <meta name="author" content="">
+
+  <!-- Le styles -->
+  <link href="assets/css/bootstrap.css" rel="stylesheet">
+  <link href="assets/css/movie.css" rel="stylesheet">
+  <style>
+    body {
+      padding-top: 60px;
+      /* 60px to make the container go all the way to the bottom of the topbar */
+    }
+  </style>
+  <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
+</head>
+
+<body>
+
+<div class="navbar navbar-inverse navbar-fixed-top">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="btn btn-navbar" data-toggle="collapse"
+         data-target=".nav-collapse"> <span class="icon-bar"></span> <span
+          class="icon-bar"></span> <span class="icon-bar"></span>
+      </a> <a class="brand" href="#">Moviefun</a>
+      <!--/.nav-collapse -->
+    </div>
+  </div>
+</div>
+
+<div class="container">
+
+  <h1>Moviefun</h1>
+
+  <p>Please select one of the following links:</p>
+  <a href="setup.jsp">Setup</a> - Sets up the application with some sample data<br/>
+  <a href="moviefun">Index</a> - Start the application<br/>
+
+</div>
+<!-- /container -->
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/tomee/blob/b2d2cc08/examples/simple-ear/moviefun-webapp/src/main/webapp/setup.jsp
----------------------------------------------------------------------
diff --git a/examples/simple-ear/moviefun-webapp/src/main/webapp/setup.jsp b/examples/simple-ear/moviefun-webapp/src/main/webapp/setup.jsp
new file mode 100644
index 0000000..3f2e7bb
--- /dev/null
+++ b/examples/simple-ear/moviefun-webapp/src/main/webapp/setup.jsp
@@ -0,0 +1,111 @@
+<%--
+    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.
+--%>
+<%@ page import="javax.naming.InitialContext" %>
+<%@ page import="java.util.Iterator" %>
+<%@ page import="java.util.List" %>
+<%@ page import="org.superbiz.model.Movie" %>
+<%@ page import="org.superbiz.model.Movies" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%
+  InitialContext initialContext = new InitialContext();
+  Movies moviesBean = (Movies) initialContext.lookup("java:comp/env/org.superbiz.moviefun.ActionServlet/moviesBean");
+
+  moviesBean.addMovie(new Movie("Wedding Crashers", "David Dobkin", "Comedy", 7, 2005));
+  moviesBean.addMovie(new Movie("Starsky & Hutch", "Todd Phillips", "Action", 6, 2004));
+  moviesBean.addMovie(new Movie("Shanghai Knights", "David Dobkin", "Action", 6, 2003));
+  moviesBean.addMovie(new Movie("I-Spy", "Betty Thomas", "Adventure", 5, 2002));
+  moviesBean.addMovie(new Movie("The Royal Tenenbaums", "Wes Anderson", "Comedy", 8, 2001));
+  moviesBean.addMovie(new Movie("Zoolander", "Ben Stiller", "Comedy", 6, 2001));
+  moviesBean.addMovie(new Movie("Shanghai Noon", "Tom Dey", "Comedy", 7, 2000));
+%>
+<c:set var="language" value="${pageContext.request.locale}"/>
+<fmt:setLocale value="${language}"/>
+
+<!DOCTYPE html>
+<html lang="${language}">
+<head>
+  <meta charset="utf-8">
+  <title>Moviefun</title>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="description" content="">
+  <meta name="author" content="">
+
+  <!-- Le styles -->
+  <link href="assets/css/bootstrap.css" rel="stylesheet">
+  <link href="assets/css/movie.css" rel="stylesheet">
+  <style>
+    body {
+      padding-top: 60px;
+      /* 60px to make the container go all the way to the bottom of the topbar */
+    }
+  </style>
+  <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
+
+</head>
+
+<body>
+
+<div class="navbar navbar-inverse navbar-fixed-top">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="btn btn-navbar" data-toggle="collapse"
+         data-target=".nav-collapse"> <span class="icon-bar"></span> <span
+          class="icon-bar"></span> <span class="icon-bar"></span>
+      </a> <a class="brand" href="#">Moviefun</a>
+      <!--/.nav-collapse -->
+    </div>
+  </div>
+</div>
+
+<div class="container">
+
+  <h1>Moviefun</h1>
+
+  <h2>Seeded Database with the Following movies</h2>
+  <table width="500">
+    <tr>
+      <td><b>Title</b></td>
+      <td><b>Director</b></td>
+      <td><b>Genre</b></td>
+    </tr>
+    <%
+      List<Movie> movies = moviesBean.getMovies();
+      for (Iterator<Movie> iterator = movies.iterator(); iterator.hasNext(); ) {
+        Movie movie = (Movie) iterator.next();
+    %>
+    <tr>
+      <td><%=movie.getTitle()%>
+      </td>
+      <td><%=movie.getDirector()%>
+      </td>
+      <td><%=movie.getGenre()%>
+      </td>
+    </tr>
+
+    <%
+      }
+    %>
+  </table>
+
+  <h2>Continue</h2>
+  <a href="moviefun">Go to main app</a>
+</div>
+<!-- /container -->
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/tomee/blob/b2d2cc08/examples/simple-ear/pom.xml
----------------------------------------------------------------------
diff --git a/examples/simple-ear/pom.xml b/examples/simple-ear/pom.xml
new file mode 100644
index 0000000..6aeae89
--- /dev/null
+++ b/examples/simple-ear/pom.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+-->
+
+<!-- $Rev: 661532 $ $Date: 2008-05-29 16:46:42 -0700 (Thu, 29 May 2008) $ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.superbiz</groupId>
+  <artifactId>moviefun-ear-parent</artifactId>
+  <version>1.1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+  <name>OpenEJB :: Examples :: Simple EAR</name>
+  <modules>
+    <module>moviefun-business-model</module>
+    <module>moviefun-business-logic</module>
+    <module>moviefun-webapp</module>
+    <module>moviefun-ear</module>
+    <module>moviefun-functional-tests</module>
+  </modules>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+  <repositories>
+    <repository>
+      <id>apache-m2-snapshot</id>
+      <name>Apache Snapshot Repository</name>
+      <url>https://repository.apache.org/content/groups/snapshots/</url>
+    </repository>
+  </repositories>
+  <build>
+    <defaultGoal>install</defaultGoal>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.5.1</version>
+          <configuration>
+            <source>1.7</source>
+            <target>1.7</target>
+          </configuration>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>2.18.1</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.apache.tomee</groupId>
+        <artifactId>javaee-api</artifactId>
+        <version>7.0</version>
+      </dependency>
+      <dependency>
+        <groupId>junit</groupId>
+        <artifactId>junit</artifactId>
+        <version>4.12</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+  <!--
+  This section allows you to configure where to publish libraries for sharing.
+  It is not required and may be deleted.  For more information see:
+  http://maven.apache.org/plugins/maven-deploy-plugin/
+  -->
+  <distributionManagement>
+    <repository>
+      <id>localhost</id>
+      <url>file://${basedir}/target/repo/</url>
+    </repository>
+    <snapshotRepository>
+      <id>localhost</id>
+      <url>file://${basedir}/target/snapshot-repo/</url>
+    </snapshotRepository>
+  </distributionManagement>
+
+</project>
+
+

http://git-wip-us.apache.org/repos/asf/tomee/blob/b2d2cc08/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
index 760bea4..3b69aa5 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
@@ -2233,6 +2233,10 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
                         }
 
                         appInfo = configurationFactory.configureApplication(appModule);
+                        if (file.isFile() && file.getName().toLowerCase().endsWith(".ear")) {
+                            // this is to prevent any WARs inside the EARs being unpacked in a directory where they'll then be deployed again
+                            appInfo.properties.setProperty("tomcat.unpackWar", "false");
+                        }
 
                         // if this is an unpacked dir, tomcat will pick it up as a webapp so undeploy it first
                         if (file.isDirectory()) {


Mime
View raw message