Coder Social home page Coder Social logo

mayaa's Introduction

Mayaa

https://seasarorg.github.io/mayaa-site/

MayaaはHTMLをベースとしたテンプレートによるプログラマとデザイナの作業分担を強く意識したWEBフロントサービスエンジンです。

Mayaa 1.2 よりJDK動作要件が Java7 以上になっています。

システム動作仕様環境

  • Java7 以降
  • Servlet API 2.4 ~ 4.0 の web.xml

動作確認済み環境

  • Wildfly 20.0.1Final + Java 11.0.8
  • Wildfly 10.1.0Final + Java 1.8.0_191
  • Wildfly 8.1.0.Final + Java 1.7.0_201
  • Tomcat 8.5.59.0 + Java 1.8.0_272
  • Tomcat 7.0.106 + Java 1.8.0_272
  • Tomcat 6.0.53 + Java 1.7.0_131

利用方法

Mayaa はバージョン1.1.33以降は Maven Central Repository から配布されています。 1.1.32以前はSeasarプロジェクトのMavenリポジトリから配布されています。

バージョン groupId artifactId リポジトリ
1.1.33 以降 com.github.seasarorg.mayaa mayaa Maven Central Repository
1.1.32 以前 org.seasar.mayaa mayaa http://maven.seasar.org/maven2/

1.1.33以降は mayaa-[version].war, mayaa-getting-started-[version].war および Eclipse Project ZIP のバイナリー配布は停止しています。

サポート & フィードバック方法

Mayaa自体の問題や機能に関する提案や相談については Mayaaリポジトリ(GitHub)のIssue機能にてお願いします。

利用に関するお問い合わせ & フィードバックは Mayaa-User ML(日本語)によって行います。 MLへの参加は下記URLページより購読登録してください。 MLへの投稿はSPAM防止のためML購読者に限定しています。MLの購読は制限しておりませんのでどなたでも参加できます。

ML購読登録: https://www.seasar.org/mailman/listinfo/mayaa-user

変更履歴

最近の変更履歴は下記の通りです。過去の変更点については CHANGELOG.md を参照ください。

Mayaa 1.2.1 : Not yet released

Changes

  • #80 - Mayaa動作要件の最低JavaバージョンをJava8としました。
  • #75 - xml宣言やmetaタグでcharset変更を検知した時に文字コードを指定して再読み込みするように変更しました。

Fixes

  • #75 - balanceTag を無効にするとDOCTYPEがheadタグ内に余分に付加される問題を修正しました。

Experimental

  • #77 - NekoHTMLを使用せずHTML Living Standardの定義に近いHTMLパーサを実装しました。詳細

Internal

  • テストフレームワークをJUnit5に変更しました。

Mayaa 1.2 : 2020-11-15

Changes

  • #16 - Mayaa動作要件の最低JavaバージョンをJava7としました。
  • #35 - Mayaaのバージョンを${org.seasar.mayaa.impl.Version.MAYAA_VERSION}で参照できるようにしました。
  • #32 - JMX経由でMayaaの内部状態をモニタリングできるようにしました。詳細
  • #50 - Serlvet 3.1 および 4.0 の web.xml に対応しました。
  • #15 - スクリプトのキャッシュの強制保持個数を指定できるようにしました。
  • 依存ライブラリをアップグレードしました。
    • commons-beanutils:commons-beanutils:1.8.3 -> 1.9.4
    • commons-collections:commons-collections:3.1 -> 3.2.2
    • commons-logging:commons-logging:1.0.4 -> 1.2
    • xerces:xercesImpl:2.7.1 -> 2.12.0

Fixes

  • #14 - 複数スレッド下でスクリプトキャッシュの競合を解消するとともにキャッシュ保持数の制御を改善しました。 org.seasar.mayaa.provider.ServiceProvider 内の scriptEnvironment のパラメータ名 cacheSize にて最小の保持数を設定します。(デフォルト値128)
  • #49 - URLエンコードされる文字を含むsystemIDのファイル実体が参照できない潜在的不具合に対応しました。

新パーサーについて

昨今のフロントエンドの仕様に追従できるようにNekoHTMLを使用せずHTML Living Standardの定義に近いHTMLパーサを独自実装しました。

WEB-INF/org.seasar.mayaa.provider.ServiceProvider の templateBuilder 設定でパラメータ名 useNewParsertrue に設定すると有効になります。

    <templateBuilder class="org.seasar.mayaa.impl.builder.TemplateBuilderImpl">
        (snip)
        <parameter name="useNewParser" value="true"/>

未指定時は NekoHTMLパーサを使用します。 将来的にはこの新パーサをデフォルトにします。最終的にはNekoHTML版のパーサは廃止する計画です。

まだ実験的機能ですが下記の特徴があります。

  • HTMLのタグバランシング機能を廃止
  • Void Element を正しく処理できるようにした(一部のエレメントはNekoHTMLパーサでも対応した)
  • Empty attribute では属性名のみを出力する ( <input disabled> のように出力される )
  • Unquoted attribute value をパースできるようにした( '=' 以後の最初の空白文字までを値とみなす)。出力は常に二重引用符で囲む。
  • @click や :value などJavaScriptのUIライブラリで使用される属性の記法を出力する

mayaa's People

Contributors

dependabot[bot] avatar eltociear avatar ko-suga avatar mitonize avatar susumuishigami avatar tkatochin avatar zyyxwada avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mayaa's Issues

128を超えるJavaScriptがある場合にリクエストを複数同時に処理するとscriptCacheが壊れる

現状だとコンパイル済みスクリプトのキャッシュのキャパシティが↓で128とハードコードされています。
https://github.com/seasarorg/mayaa/blob/master/src-impl/org/seasar/mayaa/impl/cycle/script/rhino/ScriptEnvironmentImpl.java#L52

128個を超えるスクリプトが存在していて、すでにキャッシュに128個分のコンパイル済みスクリプトが格納されている状態で、キャッシュに存在しないスクリプトのコンパイルリクエストがきた場合、
https://github.com/seasarorg/mayaa/blob/master/src-impl/org/seasar/mayaa/impl/util/WeakValueHashMap.java#L68-L71
でキャッシュのlastをLinkedList#removeLast()で刈り取る実装になっています。

しかし、
https://github.com/seasarorg/mayaa/blob/master/src-impl/org/seasar/mayaa/impl/cycle/script/rhino/ScriptEnvironmentImpl.java#L70-L73
でダブルチェックロック的にキャッシュからの引当を 同期なし に実行しているため、LinkedList#removeLast()が同期なしで複数スレッドから同時実行される可能性があります。

複数スレッドから同時に実行された場合、LinkedListの内部データが破壊されてしまい、毎回(要素が存在していたとしても)LinkedList#removeLast()NoSuchElementExceptionが発生することになります。

MetaInfSourceScanner の ignore パラメータが効いていない

事象

MetaInfSourceScannerignoreパラメータが効いていない

再現確認

*.tld が含まれているJAR(例えば standard-1.1.2.jar )をWEB-INF/lib に配置した状態で
そのJARファイル名を ignore パラメータに指定して起動した時に読み込んだログが表示される。

standard- から始まるJARを除外指定する。
src/integration-test/webapp/WEB-INF/org.seasar.mayaa.provider.ServiceProvider

<provider>
    <libraryManager>
       :
        <scanner class="org.seasar.mayaa.impl.builder.library.scanner.MetaInfSourceScanner">
            <parameter name="folder" value="/WEB-INF/lib"/>
            <parameter name="extension" value=".jar"/>
            <parameter name="ignore" value="standard-"/>
            <parameter name="jar.ignore" value="META-INF/MANIFEST.MF"/>
            <parameter name="jar.extension" value=".mld"/>
            <parameter name="jar.extension" value=".tld"/>
        </scanner>

mvnからjetty:runすると、下記のようなログがコンソールに表示される。

 :
12月 16, 2023 4:18:48 午後 org.seasar.mayaa.impl.builder.library.LibraryManagerImpl buildAll
情報: loaded library - /tld/TestTag.tld - http://mayaa.seasar.org/test/mayaa-test
12月 16, 2023 4:18:53 午後 org.seasar.mayaa.impl.builder.library.LibraryManagerImpl buildAll
情報: loaded library - /META-INF/sql.tld - http://java.sun.com/jsp/jstl/sql from /WEB-INF/lib/standard-1.1.2.jar
12月 16, 2023 4:18:53 午後 org.seasar.mayaa.impl.builder.library.LibraryManagerImpl buildAll
情報: loaded library - /META-INF/x.tld - http://java.sun.com/jsp/jstl/xml from /WEB-INF/lib/standard-1.1.2.jar
12月 16, 2023 4:18:53 午後 org.seasar.mayaa.impl.builder.library.LibraryManagerImpl buildAll

Forプロセッサのtest属性で繰り返し終了と判断されても余分にmax属性を評価してしまう?

Forプロセッサのtest属性で繰り返し終了と判断されても余分にmax属性を評価してしまっているように見えます。

まず、ドキュメント上は「ループ回数が上限数以上になると例外が発生します。」とありますが、
下記の場合、例外が発生することが正しいということで良いでしょうか?
実際に下記の結果は3回個要素が出力されたのちに例外が発生します。
maxに指定している3回繰り返されたので例外が飛ぶこと自体は上記の仕様記述に合っていると思うのですが、
テストケースとしては正常系テストの流れように見えたので念のための確認です。
なお、Too Many Loopのテストケースは別途存在しています。

<m:for id="test3"
init="${ i = 0 }" test="${ i &lt; 3 }" after="${ i++ }" max="3">
test3_${ i }
</m:for>

i test評価結果 子要素出力 max値判定で例外発生
0 true あり なし
1 true あり なし
2 true あり 例外発生

Too Many Loopのテストケース

<m:for id="test1"
init="${ i = 0 }" test="${ i &lt; 3 }" after="${ i++ }" max="2">
test1_${ i }
</m:for>

EngineImplで同期実行が必要な箇所を減らせないか

MayaaServlet から呼び出される Engineインタフェースのインスタンス(EngineImpl)は
Mayaa処理のエントリーポイントとして /default.mayaa を表していますが、MayaaServletから見ると
同じインスタンスを使用しており、synchronized の影響でなかなか並列実行の性能が上がりません。

特に下記の箇所は負担が大きいように見えます。

  1. build(boolean)
    下記の処理をsynchronized(this)で囲んでいる。比較的コストのかかるファイルシステムアクセスが毎リクエストで
    発生し、同期化されている。

    • _defaultSpecification の isDeprecated() : 内部的にファイルシステムにアクセスして存在確認&タイムスタンプ取得
    • /default.mayaaのビルド処理
  2. deserialize(systemId)
    実装はSpecificationImpl だがsynchronized(this) のthisはEngineImpl インスタンスのため全てのファイルの
    デシリアライスファイルの存在有無の確認およびデシリアライズ処理が同期化される。

Servlet 3.1のweb.xmlのパースに失敗する

#2 Servlet 3.1に対応したのとことでしたが、
現状でServlet API 3.1のweb.xmlのパースに失敗します。

原因は web-common_3_1.xsd 内でインクルードしている
javaee_7.xsd、jsp_2_3.xsd の配置が足りないことのようです。

確認環境はJBoss7.2となります。

[mayaa-user:1087] 独自プロセッサーを使うとエラーが発生する場合がある

下記のもので a.html -> b.html の順で実行すると ClassCastException が発生する。

sample.mld

    <processor name="formatDate" class="com.example.FormatDateProcessor">
        <property name="value" required="true" expectedClass="java.time.LocalDateTime"/>
        <property name="default" expectedClass="java.lang.String"/>
        <property name="pattern" expectedClass="java.lang.String"/>
    </processor>

a.mayaa

  <m:beforeRender><![CDATA[
    var value = "TEST";
  ]]></m:beforeRender>
 
  <m:echo m:id="item">
    <m:attribute name="value" value="${value}" />
  </m:echo>

b.mayaa

  <m:beforeRender><![CDATA[
    var value = java.time.LocalDateTime.now();
  ]]></m:beforeRender>
 
  <a:formatDate m:id="item" value="${value}" pattern="yyyy-MM-dd" />

例外

java.lang.ClassCastException: Cannot cast java.lang.String to java.time.LocalDateTime
        at java.lang.Class.cast(Class.java:3369)
        at com.example.FormatDateProcessor.format(FormatDateProcessor.java:45)
        at com.example.FormatDateProcessor.doStartProcess(FormatDateProcessor.java:33)
        at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)
        at org.seasar.mayaa.impl.engine.RenderUtil.renderProcessorTree(RenderUtil.java:265)
        at org.seasar.mayaa.impl.engine.TemplateImpl.doTemplateRender(TemplateImpl.java:202)
        at org.seasar.mayaa.impl.engine.PageImpl.renderTemplate(PageImpl.java:241)
        at org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:349)
        at org.seasar.mayaa.impl.engine.PageImpl.doPageRender(PageImpl.java:189)
        at org.seasar.mayaa.impl.engine.EngineImpl.doPageService(EngineImpl.java:373)
        at org.seasar.mayaa.impl.engine.EngineImpl.doService(EngineImpl.java:481)
        at org.seasar.mayaa.impl.MayaaServlet.doService(MayaaServlet.java:107)
        at org.seasar.mayaa.impl.MayaaServlet.doGet(MayaaServlet.java:90)

m:idとスクリプトの変数を同じ名前にすると意図しない動作になる

m:id, forプロセッサのvarなどで同じ名前を使うと1.1.32以前と1.1.33では挙動が異なる。

index.html

<ul m:id="aaa">
<li><span m:id="aaa.name"></span></li>
</ul>

index.mayaa

<m:beforeRender><![CDATA[
    var aaa = [{name:"foo"}, {name:"bar"}];
]]></m:beforeRender>

<m:forEach m:id="aaa" items="${aaa}" var="aaa">
    <m:echo><m:doBody /></m:echo>
</m:forEach>

<m:echo m:id="aaa.name">
    <m:write value="${aaa.name}" />
</m:echo>

結果: 1.1.32以前

<ul>
<li><span>foo</span></li><li><span>bar</span></li>
</ul>

結果: 1.1.33

<ul>
<li><span>aaa.name</span></li><li><span>aaa.name</span></li>
</ul>

TemplateProcessor.notifyBeginRenderが実質的に呼ばれていない

TemplateProcessor.notifyBeginRender はページに対して予め通知を受けるように登録していた場合にレンダリング時に呼び出される想定のメソッドであるが、PageImpl.doPageRender 内のRenderUtil.renderPage直前の PageImpl.notifyBeginRender が呼び出されているものの、この時点では PageImpl.registBeginRenderNotifier がまだ呼ばれていないため空振りしてしまう。

PageImpl.registBeginRenderNotifierTemplateProcessor.processStart にて呼ばれているのみであるが、
意図通りに動作していないこともあり実質的に TemplateProcessor.notifyBeginRender は不必要となっている。

従ってこのnotifyBeginRenderはインタフェースとしては deprecated として、呼び出し実装の箇所は廃止してはどうか。

JMXで内部状態の取得を行いたい

大規模な環境での運用ではJMXの仕組みを使ったモニタリングなどが行われますが、
MayaaにおいてもJMX経由で内部の状態のモニタリングを行いたいです。

モニタリングの目的は、メモリの使用量が適正に推移しているか、
ページの処理で著しく負荷が高いページが存在していないかを把握するためです。

最終的にはm:insertなどでよく参照されるページを優先的にキャッシュしたり、
部分的に静的化するなどの分析に役立てたいと考えています。

まずは内部状態を取得するためのとっかかりとしてJMXでアクセスして
各キャッシュのヒット率などを見られるようにしたいと思います。

Mayaa自体のJavaバージョンの引上げ提案

現在のMayaa自体のビルドに必要なJavaバージョンはpom.xmlにて1.4と指定されておりますが、
このJavaバージョンを引き上げて欲しいと考えております。

Mayaa自体のメンテナンスを個人的に実施しておりますが、このバージョンが低すぎて
新しい構文が使えないなど不自由なところが増えてきております。
現状ですとジェネリックスもアノテーションも使用できません。

どこまで引き上げるかというところですが、現時点ではソースバージョンも
バイナリバージョンも Java8 がよいと考えています。

理由は下記の通りです。

  • Java8 は LTS として各ベンダーの商用サポートがしばらくは受けられる
  • Java9〜11で追加になった言語機能(ソース仕様)にそれほど大きなものはない(と感じている)
    逆にJava1.5〜Java8で使えるようになった言語機能が多い
  • Spring Framework のJar配布でのclassバージョンも 52 (Java8のバージョン)となっている。

Java7以下の環境で使われている方はいらっしゃいますでしょうか?

また、合わせて今後 Maven Central への配布に使用するコンパイラは
最新のLTSのOpenJDK とするということで認識問題ないでしょうか。
現在だとOpenJDK11となります。
(OpenJDK11のjavacで -source 1.8 -target 1.8 でビルドする)

ReferenceCacheのcontains, removeが動作しない

[mayaa-user:1061] より。
ReferenceCacheのcontains, removeが動作しない。
addする際にReferenceでwrapしているため、比較する際にはそれを考慮しなければ一致しない。

次回のMayaaリリース準備

次のMayaa リリース準備に向けてこれまでの Issue および Pull Request を整理。
CHANGELOG.md と README.md を記載する。

Mayaa のバージョンニングと最低JREバージョンについて

Mayaa のバージョンニング方針については明確ではなかったため改めてバージョニングの方針を決めておきたい。
利用者の影響調査の利便性を考慮してセマンティックバージョニングにするのが良いと思われるが、
後方互換性のない変更として最低のJREバージョンが問題となる。

2020年11月の 1.2リリースで Java7 を最低JDKバージョンにしたのち2年以上経過し
Java7のExtended Support期限の2022年7月も過ぎていることから、今回Java8(Extended Support期限は 2030年)とした。

この変更自体は一部の利用者からは非互換となるため、
メジャーバージョンを上げなければならない。

Addition

Change

Fix

Internal (Performance)

Internal (Maintenancability)


balanceTag を無効にするとDOCTYPEが<head>内に余分に付加される

現象

balanceTag を無効にするとソースとなるHTMLに記載されているDOCTYPE宣言がhead開きタグの直後に挿入されてしまう。
挿入されるDOCTYPEの種類は問わない様子だが、元のHTMLソースにDOCTYPE宣言がないときは発生しない。

HTMLソース

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang="ja">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<meta http-equiv="Cache-Control" content="no-cache">

Mayaaを通じて生成されたHTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang="ja">
<head>
	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<meta http-equiv="Cache-Control" content="no-cache">

発生バージョン

1.1.29 以降

再現方法

  1. 利用しているAPの WEB-INF/org.seasar.mayaa.provider.ServiceProvider 内の templateBuilder 設定にある balanceTag を false に設定する。
    <parameter name="balanceTag" value="false"/><!-- since 1.1.29 -->

  2. DOCTYPE宣言があるhtmlをMayaaを通じて参照する。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.