Pmd2XML 変更履歴
+1.203.2 (2019-07-04)
+ * Prevent XXE vulnerabilities from external resources.
+
1.202.2 (2019-06-06)
・必須環境をJavaSE8に引き上げ。
・デフォルトロケールによる出力揺らぎを解消。
<!--
Checkstyle suppressions
- for Checkstyle 8.20 or later
+ for Checkstyle 8.22 or later
[ https://checkstyle.org/ ]
<suppress files="" checks="ImportControl" />
<!-- Javadoc Comments -->
- <suppress files="" checks="JavadocParagraph" />
- <suppress files="" checks="JavadocTagContinuationIndentation" />
<suppress files="" checks="SummaryJavadocCheck" />
<!-- Miscellaneous -->
<suppress files="" checks="FinalParameters" />
+ <suppress files="" checks="OrderedProperties" />
<suppress files="" checks="TrailingComment" />
<!-- Modifier -->
- <suppress files="" checks="InterfaceMemberImpliedModifier" />
+ <suppress files="" checks="RedundantModifier" />
<!-- Whitespace -->
+ <suppress files="" checks="MethodParam" />
+ <suppress files="" checks="ParenPad" />
<suppress files="" checks="SingleSpaceSeparator" />
</suppressions>
<!--
Checkstyle modules
- for Checkstyle 8.21 or later
+ for Checkstyle 8.22 or later
[ https://checkstyle.org/ ]
<property name="fileExtensions" value="xml" />
</module>
<module name="RegexpHeader">
+ <!-- /* ... */ -->
<property name="header" value="^/\*$\n^ \*( .*)?$\n^ \*/$\n" />
<property name="multiLines" value="2" />
<property name="fileExtensions" value="java" />
<module name="NewlineAtEndOfFile">
<property name="fileExtensions" value="java, properties, xml, xsd, md, txt" />
</module>
+ <module name="OrderedProperties" />
<module name="Translation" />
<module name="UniqueProperties" />
<module name="RequireThis">
<property name="checkMethods" value="false" />
</module>
- <module name="ReturnCount" />
+ <module name="ReturnCount">
+ <property name="max" value="5" />
+ <property name="maxForVoid" value="5" />
+ </module>
<module name="SimplifyBooleanExpression" />
<module name="SimplifyBooleanReturn" />
<module name="StringLiteralEquality" />
<module name="SuperClone" />
<module name="SuperFinalize" />
<module name="UnnecessaryParentheses" />
+ <module name="UnnecessarySemicolonInEnumeration" />
+ <module name="UnnecessarySemicolonInTryWithResources" />
<module name="VariableDeclarationUsageDistance">
<property name="allowedDistance" value="5"/>
</module>
<property name="scope" value="protected" />
</module>
<module name="MissingJavadocMethod" />
+ <module name="MissingJavadocPackage" />
<module name="MissingJavadocType" />
<module name="NonEmptyAtclauseDescription" />
<module name="SingleLineJavadoc" />
<module name="GenericWhitespace" />
<module name="MethodParamPad" />
<module name="NoLineWrap" />
- <module name="NoWhitespaceAfter" />
- <module name="NoWhitespaceBefore" />
- <module name="OperatorWrap" />
- <module name="ParenPad">
- <property name="option" value="nospace" />
+ <module name="NoWhitespaceAfter">
<property
name="tokens"
- value="CTOR_CALL, METHOD_CALL, SUPER_CTOR_CALL"
+ value="AT, INC, DEC, UNARY_MINUS, UNARY_PLUS, DOT"
/>
</module>
+ <module name="NoWhitespaceBefore">
+ <property name="allowLineBreaks" value="true" />
+ </module>
+ <module name="OperatorWrap" />
+ <module name="ParenPad" />
<module name="SeparatorWrap">
<property name="tokens" value="DOT"/>
<property name="option" value="nl"/>
</module>
- </module>
+</module>
<!-- EOF -->
<property name="checkSingleIfStmt" value="false"/>
</properties>
</rule>
+ <rule ref="category/java/codestyle.xml/LongVariable" >
+ <properties>
+ <property name="minimum" value="25"/>
+ </properties>
+ </rule>
<rule ref="category/java/design.xml" >
<exclude name="LawOfDemeter" />
<groupId>jp.sourceforge.mikutoga</groupId>
<artifactId>pmd2xml</artifactId>
- <version>1.202.2</version>
+ <version>1.203.2</version>
<packaging>jar</packaging>
<name>Pmd2XML</name>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <locale>en</locale>
- <site.locales>${locale}</site.locales>
- <javadoc.locale>${locale}</javadoc.locale>
- <spotbugs.jvmArgs>-Duser.language=${locale}</spotbugs.jvmArgs>
-
- <!-- Walk around: JDK 11 javadoc + Maven -->
- <detectJavaApiLink>false</detectJavaApiLink>
+ <!-- DO NOT USE ${locale} with site-plugin -->
+ <site.locales>en</site.locales>
+ <javadoc.locale>en</javadoc.locale>
+ <spotbugs.jvmArgs>-Duser.language=en</spotbugs.jvmArgs>
<surefire-plugin.version>3.0.0-M3</surefire-plugin.version>
<jacoco-plugin.version>0.8.4</jacoco-plugin.version>
<checkstyle-plugin.version>3.1.0</checkstyle-plugin.version>
- <checkstyleruntime.version>8.21</checkstyleruntime.version>
- <checkstyle.config.location>${project.basedir}/config/checkstyle/checkstyle.xml</checkstyle.config.location>
- <checkstyle.suppressions.location>${project.basedir}/config/checkstyle/checkstyle-suppressions.xml</checkstyle.suppressions.location>
+ <checkstyleruntime.version>8.22</checkstyleruntime.version>
+ <checkstyle.config.location>config/checkstyle/checkstyle.xml</checkstyle.config.location>
+ <checkstyle.suppressions.location>config/checkstyle/checkstyle-suppressions.xml</checkstyle.suppressions.location>
<checkstyle.enable.rss>false</checkstyle.enable.rss>
<pmd-plugin.version>3.12.0</pmd-plugin.version>
- <spotbugs-plugin.version>3.1.11</spotbugs-plugin.version>
+ <spotbugs-plugin.version>3.1.12</spotbugs-plugin.version>
<spotbugs.effort>Max</spotbugs.effort>
<spotbugs.threshold>Low</spotbugs.threshold>
<!-- for Jenkins -->
<dependency>
<groupId>jp.sourceforge.mikutoga</groupId>
<artifactId>togagem</artifactId>
- <version>3.121.2</version>
+ <version>3.122.2</version>
<scope>compile</scope>
</dependency>
<execution>
<phase>package</phase>
<goals>
- <goal>shade</goal>
+ <goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
- <goal>jar-no-fork</goal>
+ <goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.0</version>
<configuration>
+ <locale>${javadoc.locale}</locale>
+ <source>${maven.compiler.source}</source>
<author>false</author>
<notimestamp>true</notimestamp>
<quiet>true</quiet>
<show>protected</show>
<header>${project.name} ${project.version} API</header>
<version>true</version>
- <locale>${javadoc.locale}</locale>
<!-- for JDK11 javadoc -->
<additionalJOption>-J-Duser.language=${javadoc.locale}</additionalJOption>
</configuration>
<version>${pmd-plugin.version}</version>
<configuration>
<rulesets>
- <ruleset>${project.basedir}/config/pmd/pmdrules.xml</ruleset>
+ <ruleset>config/pmd/pmdrules.xml</ruleset>
</rulesets>
</configuration>
<reportSets>
* 通し番号0のボーングループは、
* 暗黙に用意される「デフォルトボーングループ」とする。
*/
-public class BoneGroup implements SerialNumbered , Iterable<BoneInfo> {
+public class BoneGroup implements SerialNumbered, Iterable<BoneInfo> {
private final I18nText groupName = new I18nText();
- private final List<BoneInfo> boneList = new ArrayList<BoneInfo>();
+ private final List<BoneInfo> boneList = new ArrayList<>();
private int serialNo = -1;
private int ikDepth;
private float ikWeight;
- private final List<BoneInfo> chainList = new ArrayList<BoneInfo>();
+ private final List<BoneInfo> chainList = new ArrayList<>();
/**
private boolean edgeAppearance = true;
- private final List<Surface> surfaceList = new ArrayList<Surface>();
+ private final List<Surface> surfaceList = new ArrayList<>();
/**
private MorphType type;
private final List<MorphVertex> morphVertexList =
- new ArrayList<MorphVertex>();
+ new ArrayList<>();
private int morphSerialNo = -1;
private final I18nText modelName = new I18nText();
private final I18nText description = new I18nText();
- private final List<Vertex> vertexList = new ArrayList<Vertex>();
- private final List<Surface> surfaceList = new ArrayList<Surface>();
- private final List<Material> materialList = new LinkedList<Material>();
+ private final List<Vertex> vertexList = new ArrayList<>();
+ private final List<Surface> surfaceList = new ArrayList<>();
+ private final List<Material> materialList = new LinkedList<>();
- private final List<BoneInfo> boneList = new ArrayList<BoneInfo>();
- private final List<BoneGroup> boneGroupList = new ArrayList<BoneGroup>();
+ private final List<BoneInfo> boneList = new ArrayList<>();
+ private final List<BoneGroup> boneGroupList = new ArrayList<>();
- private final List<IKChain> ikChainList = new ArrayList<IKChain>();
+ private final List<IKChain> ikChainList = new ArrayList<>();
private final Map<MorphType, List<MorphPart>> morphMap =
- new EnumMap<MorphType, List<MorphPart>>(MorphType.class);
+ new EnumMap<>(MorphType.class);
- private final List<RigidInfo> rigidList = new ArrayList<RigidInfo>();
+ private final List<RigidInfo> rigidList = new ArrayList<>();
private final List<RigidGroup> rigidGroupList =
- new ArrayList<RigidGroup>();
+ new ArrayList<>();
- private final List<JointInfo> jointList = new ArrayList<JointInfo>();
+ private final List<JointInfo> jointList = new ArrayList<>();
private ToonMap toonMap = new ToonMap();
assert this.vertexList instanceof RandomAccess;
assert this.surfaceList instanceof RandomAccess;
- this.morphMap.put(MorphType.EYEBROW, new ArrayList<MorphPart>());
- this.morphMap.put(MorphType.EYE, new ArrayList<MorphPart>());
- this.morphMap.put(MorphType.LIP, new ArrayList<MorphPart>());
- this.morphMap.put(MorphType.EXTRA, new ArrayList<MorphPart>());
+ this.morphMap.put(MorphType.EYEBROW, new ArrayList<>());
+ this.morphMap.put(MorphType.EYE, new ArrayList<>());
+ this.morphMap.put(MorphType.LIP, new ArrayList<>());
+ this.morphMap.put(MorphType.EXTRA, new ArrayList<>());
return;
}
/**
* モデル名を返す。
+ *
* @return モデル名
*/
public I18nText getModelName(){
/**
* モデル説明文を返す。
* 改行表現には{@literal \n}が用いられる
+ *
* @return モデル説明文
*/
public I18nText getDescription(){
/**
* 頂点リストを返す。
+ *
* @return 頂点リスト。
*/
public List<Vertex> getVertexList(){
/**
* 面リストを返す。
+ *
* @return 面リスト
*/
public List<Surface> getSurfaceList(){
/**
* 素材リストを返す。
+ *
* @return 素材リスト
*/
public List<Material> getMaterialList(){
/**
* ボーンリストを返す。
+ *
* @return ボーンリスト
*/
public List<BoneInfo> getBoneList(){
/**
* ボーングループリストを返す。
+ *
* @return ボーングループリスト
*/
public List<BoneGroup> getBoneGroupList(){
/**
* IKチェーンリストを返す。
+ *
* @return IKチェーンリスト
*/
public List<IKChain> getIKChainList(){
/**
* 種類別モーフリストのマップを返す。
+ *
* @return 種類別モーフリストのマップ
*/
public Map<MorphType, List<MorphPart>> getMorphMap(){
/**
* 剛体リストを返す。
+ *
* @return 剛体リスト
*/
public List<RigidInfo> getRigidList(){
/**
* 剛体グループリストを返す。
+ *
* @return 剛体グループリスト。
*/
public List<RigidGroup> getRigidGroupList(){
/**
* 剛体間ジョイントリストを返す。
+ *
* @return 剛体間ジョイントリスト
*/
public List<JointInfo> getJointList(){
/**
* トゥーンファイルマップを返す。
+ *
* @return トゥーンファイルマップ
*/
public ToonMap getToonMap(){
/**
* トゥーンファイルマップを設定する。
* 各素材のシェーディングで参照するトゥーンファイルマップも更新される。
+ *
* @param map トゥーンファイルマップ
*/
public void setToonMap(ToonMap map){
/**
* このモデルがグローバル名を含むか判定する。
* ボーン名、ボーングループ名、モーフ名、モデル説明文が判定対象。
+ *
* @return グローバル名を持つならtrue
*/
public boolean hasGlobalText(){
/**
* 全モーフが使う全モーフ頂点の出現順リストを返す。
* モーフ種別毎に固まっている事が保証される。
+ *
* @return モーフ頂点リスト
*/
private List<MorphVertex> getAllMorphVertexList(){
- List<MorphVertex> allList = new ArrayList<MorphVertex>();
+ List<MorphVertex> allList = new ArrayList<>();
for(MorphType type : this.morphMap.keySet()){
if(type.isBase()) continue;
/**
* 重複する頂点参照を除いたモーフ頂点リストを返す。
+ *
* @param allList モーフ頂点リスト
* @return 重複が除かれたモーフ頂点リスト
*/
private List<MorphVertex> getUniqueMorphVertexList(
List<MorphVertex> allList ){
- List<MorphVertex> result = new ArrayList<MorphVertex>();
+ List<MorphVertex> result = new ArrayList<>();
- Set<Vertex> mergedVertexSet = new HashSet<Vertex>();
+ Set<Vertex> mergedVertexSet = new HashSet<>();
for(MorphVertex morphVertex : allList){
Vertex vertex = morphVertex.getBaseVertex();
* モーフで使われる全てのモーフ頂点のリストを返す。
* モーフ間で重複する頂点はマージされる。
* 頂点IDでソートされる。
- * <p>
- * 0から始まる通し番号がリナンバリングされる。
+ *
+ * <p>0から始まる通し番号がリナンバリングされる。
* 通し番号は返されるモーフ頂点リストの添え字番号と一致する。
+ *
* @return モーフに使われるモーフ頂点のリスト
*/
public List<MorphVertex> mergeMorphVertex(){
ListUtil.assignIndexedSerial(result);
Map<Vertex, MorphVertex> numberedMap =
- new HashMap<Vertex, MorphVertex>();
+ new HashMap<>();
for(MorphVertex morphVertex : result){
Vertex vertex = morphVertex.getBaseVertex();
numberedMap.put(vertex, morphVertex);
* 所属マテリアル順に再配置し、通し番号を割り振り直す。
* 所属マテリアルの無い面はリストの末端に配置される。
* 面リスト中のnullは削除され詰められる。
+ *
* @return トリミングされた面リスト
*/
private List<Surface> trimmingSurfaceList(){
- Set<Surface> materialedSurfaceSet = new HashSet<Surface>();
+ Set<Surface> materialedSurfaceSet = new HashSet<>();
for(Material material : this.materialList){
if(material == null) continue;
for(Surface surface : material){
materialedSurfaceSet.removeAll(this.surfaceList);
- List<Surface> result = new ArrayList<Surface>();
+ List<Surface> result = new ArrayList<>();
for(Surface surface : this.surfaceList){
if(surface == null) continue;
result.add(surface);
* 通し番号を振り直す。
* 所属面の無い頂点はリストの末端に配置される。
* 頂点リスト中のnullは削除され詰められる。
+ *
* @return トリミングされた頂点リスト
*/
private List<Vertex> trimmingVertexList(){
- Set<Vertex> surfacedVertexSet = new HashSet<Vertex>();
+ Set<Vertex> surfacedVertexSet = new HashSet<>();
for(Surface surface : this.surfaceList){
if(surface == null) continue;
for(Vertex vertex : surface){
surfacedVertexSet.removeAll(this.vertexList);
- List<Vertex> result = new ArrayList<Vertex>();
+ List<Vertex> result = new ArrayList<>();
for(Vertex vertex : this.vertexList){
if(vertex == null) continue;
result.add(vertex);
public static final int MAX_RIGID_GROUP = 16;
- private final List<RigidInfo> rigidList = new ArrayList<RigidInfo>();
+ private final List<RigidInfo> rigidList = new ArrayList<>();
private int rigidGroupSerialNo = -1;
private final DynamicsInfo dynamicsInfo = new DynamicsInfo();
private final Collection<RigidGroup> throughGroupColl =
- new ArrayList<RigidGroup>();
+ new ArrayList<>();
private RigidGroup rigidGroup;
public interface SerialNumbered {
/** 昇順での比較子。 */
- Comparator<SerialNumbered> COMPARATOR = new SerialComparator();
+ public static final Comparator<SerialNumbered> COMPARATOR =
+ new SerialComparator();
/**
* 通し番号を設定する。
+ *
* @param num 通し番号
*/
- void setSerialNumber(int num);
+ public abstract void setSerialNumber(int num);
/**
* 通し番号を返す。
+ *
* @return 通し番号
*/
- int getSerialNumber();
+ public abstract int getSerialNumber();
/**
* 通し番号の昇順を定義づける。
*/
@SuppressWarnings("serial")
- class SerialComparator
+ public static class SerialComparator
implements Comparator<SerialNumbered> {
/**
/**
* {@inheritDoc}
+ *
* @param o1 {@inheritDoc}
* @param o2 {@inheritDoc}
* @return {@inheritDoc}
/**
* 3頂点を設定する。
+ *
* @param vtx1 頂点1
* @param vtx2 頂点2
* @param vtx3 頂点3
/**
* 3頂点を返す。
+ *
* @param store 頂点格納用配列。nullもしくは3要素に満たない場合は無視され、
- * 新規に格納用配列が生成される。
+ * 新規に格納用配列が生成される。
* @return 先頭3要素に3頂点が収められた配列。未設定要素にはnullが入る。
- * 引数が長さ3以上の配列であれば引数と同じ配列が返る。
+ * 引数が長さ3以上の配列であれば引数と同じ配列が返る。
*/
public Vertex[] getTriangle(Vertex[] store){
Vertex[] result;
/**
* 頂点その1を返す。
+ *
* @return 頂点その1
*/
public Vertex getVertex1(){
/**
* 頂点その2を返す。
+ *
* @return 頂点その2
*/
public Vertex getVertex2(){
/**
* 頂点その3を返す。
+ *
* @return 頂点その3
*/
public Vertex getVertex3(){
* {@inheritDoc}
* 頂点を返す反復子を生成する。
* 反復子がnullを返す可能性もありうる。
+ *
* @return {@inheritDoc}
*/
@Override
public Iterator<Vertex> iterator(){
- List<Vertex> list = new ArrayList<Vertex>(TRIANGLE);
+ List<Vertex> list = new ArrayList<>(TRIANGLE);
list.add(this.vertex1);
list.add(this.vertex2);
/**
* 3頂点全てが設定されているか判定する。
+ *
* @return 3頂点とも非nullが設定されていればtrue
*/
public boolean isCompleted(){
/**
* {@inheritDoc}
+ *
* @param num {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
private static final int IDX_SP = 0xff; // 特殊トゥーンのインデックス
static{
- Map<Integer, String> map = new TreeMap<Integer, String>();
+ Map<Integer, String> map = new TreeMap<>();
int idx = 0x00;
map.put(idx++, "toon01.bmp");
private final Map<Integer, String> toonDefMap =
- new TreeMap<Integer, String>(DEF_TOONMAP);
+ new TreeMap<>(DEF_TOONMAP);
/**
/**
* 頂点位置座標を返す。
+ *
* @return 頂点の位置座標
*/
public MkPos3D getPosition(){
/**
* 法線ベクトルを返す。
+ *
* @return 法線ベクトル
*/
public MkVec3D getNormal(){
/**
* UVマップ座標を返す。
+ *
* @return UVマップ情報
*/
public MkPos2D getUVPosition(){
/**
* 頂点の属するボーンを設定する。
+ *
* @param boneAArg ボーンA
* @param boneBArg ボーンB
* @throws NullPointerException 引数がnull
/**
* ボーンAを返す。
+ *
* @return ボーンA
*/
public BoneInfo getBoneA(){
/**
* ボーンBを返す。
+ *
* @return ボーンB
*/
public BoneInfo getBoneB(){
/**
* ボーンAのウェイト値を設定する。
+ *
* @param weight ウェイト値。0(影響小)-100(影響大)
* @throws IllegalArgumentException ウェイト値が範囲外
*/
public void setWeightA(int weight) throws IllegalArgumentException{
- if( weight < MIN_WEIGHT
- || MAX_WEIGHT < weight ){
+ if( weight < MIN_WEIGHT
+ || MAX_WEIGHT < weight ){
throw new IllegalArgumentException();
}
this.boneWeight = weight;
/**
* ボーンBのウェイト値を設定する。
+ *
* @param weight ウェイト値。0(影響小)-100(影響大)
* @throws IllegalArgumentException ウェイト値が範囲外
*/
/**
* ボーンAのウェイト値を返す。
+ *
* @return ウェイト値
*/
public int getWeightA(){
/**
* ボーンBのウェイト値を返す。
+ *
* @return ウェイト値
*/
public int getWeightB(){
/**
* ボーンAのウェイト率を返す。
+ *
* @return ウェイト率。0.0(影響小)-1.0(影響大)
*/
public float getWeightRatioA(){
/**
* ボーンBのウェイト率を返す。
+ *
* @return ウェイト率。0.0(影響小)-1.0(影響大)
*/
public float getWeightRatioB(){
/**
* エッジを表示するか設定する。
* マテリアル材質単位の設定より優先度は高い。
+ *
* @param show 表示するならtrue
*/
public void setEdgeAppearance(boolean show){
/**
* エッジを表示するか判定する。
* マテリアル材質単位の設定より優先度は高い。
+ *
* @return 表示するならtrue
*/
public boolean getEdgeAppearance(){
/**
* {@inheritDoc}
+ *
* @param num {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
* 所属グループの無いボーンをデフォルトボーングループへ登録する。
*/
private void pickOrphanBone(){
- List<BoneInfo> orpahnList = new LinkedList<BoneInfo>();
+ List<BoneInfo> orpahnList = new LinkedList<>();
orpahnList.addAll(this.boneList);
for(BoneGroup group : this.boneGroupList){
orpahnList.removeAll(group.getBoneList());
private MorphPart currentMorphPart;
private final List<Vertex> vertexList;
- private final List<Vertex> morphVertexList = new ArrayList<Vertex>();
+ private final List<Vertex> morphVertexList = new ArrayList<>();
/**
* コンストラクタ。
List<MorphPart> partList = this.morphMap.get(type);
if(partList == null){
- partList = new LinkedList<MorphPart>();
+ partList = new LinkedList<>();
this.morphMap.put(type, partList);
}
partList.add(part);
/**
* PMDファイルのエクスポーター(拡張無し基本フォーマット)。
- * <p>
- * 英名対応以降のPMDファイルフォーマットを
+ *
+ * <p>英名対応以降のPMDファイルフォーマットを
* 使いたくない場合はこのエクスポーターを用いて出力せよ。
*/
public class PmdExporterBase extends BinaryExporter{
/**
* コンストラクタ。
+ *
* @param stream 出力ストリーム
* @throws NullPointerException 引数がnull
*/
/**
* 改行文字の正規化を行う。
* CR(0x0d)およびCRLF(0x0d0a)がLF(0x0a)へと正規化される。
+ *
* @param text 文字列
* @return 正規化の行われた文字列。
*/
* 文字列の改行記号はLF(0x0a)に正規化される。
* エンコード結果がバイト長に満たない場合は
* 1つの0x00及びそれに続く複数の0xfdがパディングされる。
+ *
* @param text 文字列
* @param maxByteLength バイト長指定
* @throws IOException 出力エラー
* @throws IllegalTextExportException エンコード結果が
- * 指定バイト長をはみ出した。
+ * 指定バイト長をはみ出した。
*/
protected void dumpText(String text, int maxByteLength)
throws IOException, IllegalTextExportException{
/**
* モデルデータをPMDファイル形式で出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalPmdDataException モデルデータに不備が発見された
/**
* モデル基本情報を出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException モデル名もしくは説明が長すぎる
/**
* 頂点リストを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
*/
/**
* 個別の頂点データを出力する。
+ *
* @param vertex 頂点
* @throws IOException 出力エラー
*/
/**
* 面リストを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
*/
/**
* マテリアル素材リストを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException シェーディングファイル情報が長すぎる
/**
* フォンシェーディングの色情報を出力する。
+ *
* @param material マテリアル情報
* @throws IOException 出力エラー
*/
/**
* シェーディング情報を出力する。
+ *
* @param material マテリアル情報
* @throws IOException 出力エラー
* @throws IllegalTextExportException ファイル名が長すぎる
/**
* シェーディングファイル情報を出力する。
+ *
* @param shade シェーディング情報
* @throws IOException 出力エラー
* @throws IllegalTextExportException ファイル名が長すぎる
/**
* ボーンリストを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException ボーン名が長すぎる
/**
* 個別のボーン情報を出力する。
+ *
* @param bone ボーン情報
* @throws IOException 出力エラー
* @throws IllegalTextExportException ボーン名が長すぎる
/**
* IKチェーンリストを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
*/
/**
* IKチェーンを出力する。
+ *
* @param chain IKチェーン
* @throws IOException 出力エラー
*/
/**
* モーフリストを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException モーフ名が長すぎる
throws IOException, IllegalTextExportException{
Map<MorphType, List<MorphPart>> morphMap = model.getMorphMap();
Set<MorphType> typeSet = morphMap.keySet();
- List<MorphPart> morphPartList = new LinkedList<MorphPart>();
+ List<MorphPart> morphPartList = new LinkedList<>();
for(MorphType type : typeSet){
List<MorphPart> partList = morphMap.get(type);
/**
* BASEモーフを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException モーフ名が長すぎる
/**
* モーフグループを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
*/
}
dumpByte(totalMorph);
- List<MorphType> typeList = new LinkedList<MorphType>();
+ List<MorphType> typeList = new LinkedList<>();
for(MorphType type : typeSet){
assert ! type.isBase();
typeList.add(type);
/**
* ボーングループリストを出力する。
* デフォルトボーングループ内訳は出力されない。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException ボーングループ名が長すぎる
/**
* 各種通し番号をshort値で出力する。
* short値に収まらない上位ビットは捨てられる。
+ *
* @param obj 番号づけられたオブジェクト
* @throws IOException 出力エラー
*/
/**
* 2次元位置情報を出力する。
+ *
* @param position 2次元位置情報
* @throws IOException 出力エラー
*/
/**
* 3次元位置情報を出力する。
+ *
* @param position 3次元位置情報
* @throws IOException 出力エラー
*/
/**
* 3次元ベクトル情報を出力する。
+ *
* @param vector 3次元ベクトル
* @throws IOException 出力エラー
*/
/**
* PMDファイルのエクスポーター(拡張1:英名対応)。
- * <p>
- * 任意のトゥーンファイル名対応以降のPMDファイルフォーマットを
+ *
+ * <p>任意のトゥーンファイル名対応以降のPMDファイルフォーマットを
* 使いたくない場合はこのエクスポーターを用いて出力せよ。
*/
public class PmdExporterExt1 extends PmdExporterBase{
/**
* コンストラクタ。
+ *
* @param stream 出力ストリーム
* @throws NullPointerException 引数がnull
*/
/**
* {@inheritDoc}
+ *
* @param model {@inheritDoc}
* @throws IOException {@inheritDoc}
* @throws IllegalPmdDataException {@inheritDoc}
/**
* 英語名情報を出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalPmdDataException 文字列が長すぎる。
/**
* モデル基本情報を英語で出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException 文字列が長すぎる。
/**
* ボーン英語名情報を出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException 文字列が長すぎる。
/**
* モーフ英語名情報を出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException 文字列が長すぎる。
/**
* ボーングループ英語名情報を出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException 文字列が長すぎる
/**
* PMDファイルのエクスポーター(拡張2:任意のトゥーンファイル名対応)。
- * <p>
- * 物理演算対応以降のPMDファイルフォーマットを
+ *
+ * <p>物理演算対応以降のPMDファイルフォーマットを
* 使いたくない場合はこのエクスポーターを用いて出力せよ。
*/
public class PmdExporterExt2 extends PmdExporterExt1{
/**
* コンストラクタ。
+ *
* @param stream 出力ストリーム
* @throws NullPointerException 引数がnull
*/
/**
* {@inheritDoc}
+ *
* @param model {@inheritDoc}
* @throws IOException {@inheritDoc}
* @throws IllegalPmdDataException {@inheritDoc}
/**
* 独自トゥーンファイルテーブルを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException トゥーンファイル名が長すぎる
/**
* PMDファイルのエクスポーター(拡張3:物理演算対応)。
- * <p>
- * 物理演算対応のPMDファイルフォーマットを
+ *
+ * <p>物理演算対応のPMDファイルフォーマットを
* 使いたい場合はこのエクスポーターを用いて出力せよ。
*/
public class PmdExporterExt3 extends PmdExporterExt2{
/**
* コンストラクタ。
+ *
* @param stream 出力ストリーム
* @throws NullPointerException 引数がnull
*/
/**
* {@inheritDoc}
+ *
* @param model {@inheritDoc}
* @throws IOException {@inheritDoc}
* @throws IllegalPmdDataException {@inheritDoc}
/**
* 剛体リストを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException 長すぎる剛体名
/**
* 個別の剛体情報を出力する。
+ *
* @param rigid 剛体
* @throws IOException 出力エラー
* @throws IllegalTextExportException 長すぎる剛体名
/**
* 剛体形状を出力する。
+ *
* @param shape 剛体形状
* @throws IOException 出力エラー
*/
/**
* 力学設定を出力する。
+ *
* @param dynamics 力学設定
* @throws IOException 出力エラー
*/
/**
* ジョイントリストを出力する。
+ *
* @param model モデルデータ
* @throws IOException 出力エラー
* @throws IllegalTextExportException 長すぎるジョイント名
/**
* 個別のジョイント情報を出力する。
+ *
* @param joint ジョイント
* @throws IOException 出力エラー
* @throws IllegalTextExportException 長すぎるジョイント名
/**
* 3次元範囲制約を出力する。
+ *
* @param range 3次元範囲制約
* @throws IOException 出力エラー
*/
/**
* ラジアンによる3次元姿勢情報を出力する。
+ *
* @param rad 3次元姿勢情報
* @throws IOException 出力エラー
*/
/**
* 度数法による3次元姿勢情報を出力する。
+ *
* @param deg 3次元姿勢情報
* @throws IOException 出力エラー
*/
/**
* 正常パース時に読み残したデータがあったか判定する。
+ *
* <p>MMDでの仕様拡張による
* PMDファイルフォーマットの拡張が行われた場合を想定。
+ *
* @return 読み残したデータがあればtrue
* @throws IllegalStateException まだパースを試みていない。
*/
/**
* PMDファイルの読み込みを行いモデル情報を返す。
* 1インスタンスにつき一度しかロードできない。
+ *
* @param source PMDファイル入力ソース
* @return モデル情報
* @throws IOException 入力エラー
RigidBuilder rigidBuilder = new RigidBuilder(model);
JointBuilder jointBuilder = new JointBuilder(model);
- List<MorphPart> morphPartList = new ArrayList<MorphPart>();
+ List<MorphPart> morphPartList = new ArrayList<>();
morphBuilder.setMorphPartList(morphPartList);
textBuilder.setMorphPartList(morphPartList);
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface CloseXmlMark {
- /** タグ指定。 */
+
+ /**
+ * タグ指定。
+ *
+ * @return tag
+ */
PmdTag value();
+
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface OpenXmlMark {
- /** タグ指定。 */
+
+ /**
+ * タグ指定。
+ *
+ * @return tag
+ */
PmdTag value();
+
}
;
private static final Map<String, PmdTag> NAME_MAP =
- new HashMap<String, PmdTag>();
+ new HashMap<>();
static{
for(PmdTag tag : values()){
import jp.sfjp.mikutoga.corelib.I18nText;
import jp.sfjp.mikutoga.pmd.model.PmdModel;
import jp.sfjp.mikutoga.xml.BasicXmlExporter;
-import jp.sfjp.mikutoga.xml.XmlResourceResolver;
+import jp.sfjp.mikutoga.xml.SchemaUtil;
/**
* PMDモーションデータをXMLへエクスポートする。
}
ind().putAttr("xmlns", namespace).ln();
- ind().putAttr("xmlns:" + XSINS, XmlResourceResolver.NS_XSD).ln();
+ ind().putAttr("xmlns:" + XSINS, SchemaUtil.NS_XSD).ln();
ind().putRawText(XSINS).putRawText(":schemaLocation=")
.putRawCh('"');
// マテリアル関連
private final List<IdRefHolder<Material>> materialSfcGroupIdRefList =
- new LinkedList<IdRefHolder<Material>>();
+ new LinkedList<>();
private final List<IdRefHolder<Material>> materialToonIdRefList =
- new LinkedList<IdRefHolder<Material>>();
+ new LinkedList<>();
private final Map<String, Integer> toonIdxMap =
- new HashMap<String, Integer>();
+ new HashMap<>();
// ボーン関連
private final Map<String, BoneInfo> boneIdMap =
- new HashMap<String, BoneInfo>();
+ new HashMap<>();
private final List<IdRefHolder<BoneInfo>> boneChainIdRefList =
- new LinkedList<IdRefHolder<BoneInfo>>();
+ new LinkedList<>();
private final List<IdRefHolder<BoneInfo>> boneSourceIdRefList =
- new LinkedList<IdRefHolder<BoneInfo>>();
+ new LinkedList<>();
// モーフ関連
private final List<IdRefHolder<MorphVertex>> morphVertexIdRefList =
- new LinkedList<IdRefHolder<MorphVertex>>();
+ new LinkedList<>();
// 剛体関連
private final Map<String, RigidInfo> rigidIdMap =
- new HashMap<String, RigidInfo>();
+ new HashMap<>();
private final Map<String, RigidGroup> rigidGroupIdMap =
- new HashMap<String, RigidGroup>();
+ new HashMap<>();
private final List<IdRefHolder<RigidInfo>> thghRigidGroupIdRefList =
- new LinkedList<IdRefHolder<RigidInfo>>();
+ new LinkedList<>();
// 面関連
private final Map<String, List<Surface>> surfaceGroupIdMap =
- new HashMap<String, List<Surface>>();
+ new HashMap<>();
private final List<IdRefHolder<Surface>> surfaceVertexIdRef =
- new LinkedList<IdRefHolder<Surface>>();
+ new LinkedList<>();
// 頂点関連
private final Map<String, Vertex> vertexIdMap =
- new HashMap<String, Vertex>();
+ new HashMap<>();
/**
*/
void addSurfaceGroupIdRef(Material material, String idRef){
IdRefHolder<Material> holder =
- new IdRefHolder<Material>(material, idRef);
+ new IdRefHolder<>(material, idRef);
this.materialSfcGroupIdRefList.add(holder);
return;
List<Surface> surfaceGroup =
this.surfaceGroupIdMap.get(surfaceGroupId);
if(surfaceGroup == null){
- surfaceGroup = new LinkedList<Surface>();
+ surfaceGroup = new LinkedList<>();
this.surfaceGroupIdMap.put(surfaceGroupId, surfaceGroup);
}
*/
void addToonFileIdRef(Material material, String idRef){
IdRefHolder<Material> holder =
- new IdRefHolder<Material>(material, idRef);
+ new IdRefHolder<>(material, idRef);
this.materialToonIdRefList.add(holder);
return;
}
void addBoneChain(BoneInfo bone,
String prevBoneIdRef, String nextBoneIdRef ){
IdRefHolder<BoneInfo> holder =
- new IdRefHolder<BoneInfo>(bone, prevBoneIdRef, nextBoneIdRef);
+ new IdRefHolder<>(bone, prevBoneIdRef, nextBoneIdRef);
this.boneChainIdRefList.add(holder);
return;
}
*/
void addSrcBoneIdRef(BoneInfo bone, String srcBoneIdRef){
IdRefHolder<BoneInfo> holder =
- new IdRefHolder<BoneInfo>(bone, srcBoneIdRef);
+ new IdRefHolder<>(bone, srcBoneIdRef);
this.boneSourceIdRefList.add(holder);
return;
}
*/
void addMorphVertexIdRef(MorphVertex morphVertex, String vertexIdRef){
IdRefHolder<MorphVertex> holder =
- new IdRefHolder<MorphVertex>(morphVertex, vertexIdRef);
+ new IdRefHolder<>(morphVertex, vertexIdRef);
this.morphVertexIdRefList.add(holder);
return;
}
*/
void addThroughRigidGroupIdRef(RigidInfo rigid, String rigidGroupIdRef){
IdRefHolder<RigidInfo> holder =
- new IdRefHolder<RigidInfo>(rigid, rigidGroupIdRef);
+ new IdRefHolder<>(rigid, rigidGroupIdRef);
this.thghRigidGroupIdRefList.add(holder);
return;
}
String vtxIdRef2,
String vtxIdRef3 ){
IdRefHolder<Surface> holder =
- new IdRefHolder<Surface>(surface,
- vtxIdRef1,
- vtxIdRef2,
- vtxIdRef3 );
+ new IdRefHolder<>(surface,
+ vtxIdRef1,
+ vtxIdRef2,
+ vtxIdRef3 );
this.surfaceVertexIdRef.add(holder);
*/
private static Collection<Method> filtMethod(Class<?> klass,
Class<? extends Annotation> filter ){
- Collection<Method> result = new LinkedList<Method>();
+ Collection<Method> result = new LinkedList<>();
for(Method method : klass.getDeclaredMethods()){
int modifiers = method.getModifiers();
*/
private static Map<PmdTag, Method> getOpenDispatcher(Class<?> klass){
Map<PmdTag, Method> result =
- new EnumMap<PmdTag, Method>(PmdTag.class);
+ new EnumMap<>(PmdTag.class);
for(Method method : filtMethod(klass, OpenXmlMark.class)){
Annotation anno = method.getAnnotation(OpenXmlMark.class);
*/
private static Map<PmdTag, Method> getCloseDispatcher(Class<?> klass){
Map<PmdTag, Method> result =
- new EnumMap<PmdTag, Method>(PmdTag.class);
+ new EnumMap<>(PmdTag.class);
for(Method method : filtMethod(klass, CloseXmlMark.class)){
Annotation anno = method.getAnnotation(CloseXmlMark.class);
void closeMorphList(){
Map<MorphType, List<MorphPart>> morphMap =
getPmdModel().getMorphMap();
- List<MorphPart> tempList = new LinkedList<MorphPart>();
+ List<MorphPart> tempList = new LinkedList<>();
tempList.addAll(morphMap.get(MorphType.EYEBROW));
tempList.addAll(morphMap.get(MorphType.EYE));
import java.net.URI;
import java.net.URISyntaxException;
-import jp.sfjp.mikutoga.xml.LocalXmlResource;
/**
* 101009形式XML各種リソースの定義。
*/
-public final class Schema101009 implements LocalXmlResource{
-
- /** 唯一のシングルトン。 */
- public static final Schema101009 SINGLETON;
+public final class Schema101009{
/** 名前空間。 */
public static final String NS_PMDXML =
public static final String LOCAL_SCHEMA_PMDXML =
"resources/pmdxml-101009.xsd";
- private static final URI URI_SCHEMA_PMDXML = URI.create(SCHEMA_PMDXML);
- private static final URI RES_SCHEMA_PMDXML;
+ /** schema URI. */
+ public static final URI URI_SCHEMA_PMDXML = URI.create(SCHEMA_PMDXML);
+ /** local resource URI. */
+ public static final URI RES_SCHEMA_PMDXML;
private static final Class<?> THISCLASS = Schema101009.class;
}catch(URISyntaxException e){
throw new ExceptionInInitializerError(e);
}
-
- SINGLETON = new Schema101009();
}
* コンストラクタ。
*/
private Schema101009(){
- super();
- assert this.getClass() == THISCLASS;
- return;
- }
-
-
- /**
- * {@inheritDoc}
- * @return {@inheritDoc}
- * ※101009版。
- */
- @Override
- public URI getOriginalResource(){
- return URI_SCHEMA_PMDXML;
- }
-
- /**
- * {@inheritDoc}
- * ※101009版。
- * @return {@inheritDoc}
- */
- @Override
- public URI getLocalResource(){
- return RES_SCHEMA_PMDXML;
+ assert false;
}
}
import java.net.URI;
import java.net.URISyntaxException;
-import jp.sfjp.mikutoga.xml.LocalXmlResource;
/**
* 130128形式XML各種リソースの定義。
*/
-public final class Schema130128 implements LocalXmlResource{
-
- /** 唯一のシングルトン。 */
- public static final Schema130128 SINGLETON;
+public final class Schema130128{
/** 名前空間。 */
public static final String NS_PMDXML =
public static final String LOCAL_SCHEMA_PMDXML =
"resources/pmdxml-130128.xsd";
- private static final URI URI_SCHEMA_PMDXML = URI.create(SCHEMA_PMDXML);
- private static final URI RES_SCHEMA_PMDXML;
+ /** schema URI. */
+ public static final URI URI_SCHEMA_PMDXML = URI.create(SCHEMA_PMDXML);
+ /** local resource URI. */
+ public static final URI RES_SCHEMA_PMDXML;
private static final Class<?> THISCLASS = Schema130128.class;
}catch(URISyntaxException e){
throw new ExceptionInInitializerError(e);
}
-
- SINGLETON = new Schema130128();
}
* コンストラクタ。
*/
private Schema130128(){
- super();
- assert this.getClass() == THISCLASS;
- return;
- }
-
-
- /**
- * {@inheritDoc}
- * ※130128版。
- * @return {@inheritDoc}
- */
- @Override
- public URI getOriginalResource(){
- return URI_SCHEMA_PMDXML;
- }
-
- /**
- * {@inheritDoc}
- * ※130128版。
- * @return {@inheritDoc}
- */
- @Override
- public URI getLocalResource(){
- return RES_SCHEMA_PMDXML;
+ assert false;
}
}
/**
* XMLモデルファイルパース用SAXハンドラ。
+ *
* <p>下位リスナに各種通知が振り分けられる。
*/
class XmlHandler implements ContentHandler{
SaxListener dynamicsListener = new SaxDynamicsListener(helper);
SaxListener shapeListener = new SaxShapeListener(helper);
- this.listenerMap = new EnumMap<PmdTag, SaxListener>(PmdTag.class);
+ this.listenerMap = new EnumMap<>(PmdTag.class);
this.listenerMap.put(PmdTag.PMD_MODEL, modelListener);
this.listenerMap.put(PmdTag.MATERIAL_LIST, materialListener);
this.listenerMap.put(PmdTag.BONE_LIST, boneListener);
/**
* ビルド対象のモデルを返す。
+ *
* @return ビルド対象のモデル。ビルド前ならnull
*/
PmdModel getPmdModel(){
/**
* {@inheritDoc}
+ *
* @throws SAXException {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @throws SAXException {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param prefix {@inheritDoc}
* @param uri {@inheritDoc}
* @throws SAXException {@inheritDoc}
@Override
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
- if( Schema101009.NS_PMDXML.equals(uri)
- || Schema130128.NS_PMDXML.equals(uri) ){
+ if( Schema101009.NS_PMDXML.equals(uri)
+ || Schema130128.NS_PMDXML.equals(uri) ){
this.nspfx = prefix;
this.nsuri = uri;
}
/**
* {@inheritDoc}
+ *
* @param prefix {@inheritDoc}
* @throws SAXException {@inheritDoc}
*/
/**
* {@inheritDoc}
+ *
* @param uri {@inheritDoc}
* @param localName {@inheritDoc}
* @param qName {@inheritDoc}
/**
* タグ出現に従い通知リスナを切り替える。
+ *
* @param tag タグ種別
*/
private void switchListener(PmdTag tag){
/**
* {@inheritDoc}
+ *
* @param uri {@inheritDoc}
* @param localName {@inheritDoc}
* @param qName {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @param locator {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param target {@inheritDoc}
* @param data {@inheritDoc}
* @throws SAXException {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @param ch {@inheritDoc}
* @param start {@inheritDoc}
* @param length {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @param ch {@inheritDoc}
* @param start {@inheritDoc}
* @param length {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @param name {@inheritDoc}
* @throws SAXException {@inheritDoc}
*/
/**
* XMLファイル。
- * <p>読み込み時のスキーマ判別は自動。
- * 出力時のスキーマ種別は最新。
+ *
+ * <p>読み込み時のスキーマ判別は自動。出力時のスキーマ種別は最新。
*/
XML_AUTO,
/**
* コンストラクタ。
+ *
* <p>XMLリーダは名前空間をサポートしていなければならない。
+ *
* @param reader XMLリーダ
* @throws NullPointerException 引数がnull
* @throws SAXException 機能不足のXMLリーダが渡された
/**
* XMLのパースを開始する。
+ *
* @param source XML入力
* @return モデルデータ
* @throws SAXException 構文エラー
/**
* コマンドライン解析を行う。
+ *
* @param args コマンドライン
* @return 解析されたコマンドライン並び
*/
/**
* コマンドライン解析を行う。
+ *
* @param argList コマンドライン
* @return 解析されたコマンドライン並び
*/
static List<CmdLine> parse(List<String> argList){
- List<CmdLine> result = new LinkedList<CmdLine>();
+ List<CmdLine> result = new LinkedList<>();
Iterator<String> it = argList.iterator();
while (it.hasNext()) {
if (info.opt != null) {
exArgNum = info.opt.getExArgNum();
}
- info.optArgs = new ArrayList<String>(exArgNum + 1);
+ info.optArgs = new ArrayList<>(exArgNum + 1);
info.optArgs.add(arg);
/**
* オプション識別子を返す。
+ *
* @return オプション識別子。
- * オプションを伴わない単純なコマンドライン引数の場合はnullを返す。
+ * オプションを伴わない単純なコマンドライン引数の場合はnullを返す。
*/
OptSwitch getOptSwitch() {
return this.opt;
/**
* オプションに付随する引数群を返す。
+ *
* @return オプションに付随する引数群。
- * 先頭要素はオプション識別子。
- * 単純なコマンドライン引数の場合は自身が1要素のみを占める。
+ * 先頭要素はオプション識別子。
+ * 単純なコマンドライン引数の場合は自身が1要素のみを占める。
*/
List<String> getOptArgs() {
return this.optArgs;
/**
* XMLファイル。
+ *
* <p>読み込み時のスキーマ判別は自動。
+ *
* <p>書き込み時のスキーマは最新。
*/
XML_AUTO,
/**
* コンストラクタ。
*/
- private ModelFileType(){
+ ModelFileType(){
return;
}
/**
* ファイル種別をXMLファイル種別に変換する。
+ *
* <p>未定義の場合はXML_AUTOを返す。
+ *
* @return XMLファイル種別
*/
public XmlModelFileType toXmlType(){
/**
* ファイル種別がXMLか判定する。
+ *
* @return XMLならtrue
*/
public boolean isXml(){
/**
* ファイル種別がPMDか判定する。
+ *
* @return PMDならtrue
*/
public boolean isPmd(){
/**
* フォーマット種別指定子をデコードする。
+ *
* @param arg 文字列
* @return デコード結果。
* @throws CmdLineException 不正なフォーマット種別
/**
* 改行文字指定子をデコードする。
+ *
* @param arg 文字列
* @return デコード結果。
* @throws CmdLineException 不正なフォーマット種別
/**
* ブール指定子をデコードする。
+ *
* @param arg 文字列
* @return デコード結果。
* @throws CmdLineException 不正なフォーマット種別
throws CmdLineException{
boolean result;
- if( "on" .equals(arg)
- || "true".equals(arg)
- || "yes" .equals(arg) ){
+ if( "on" .equals(arg)
+ || "true".equals(arg)
+ || "yes" .equals(arg) ){
result = true;
}else if( "off" .equals(arg)
|| "false".equals(arg)
/**
* ファイル名からファイル種別を類推する。
+ *
* <p>拡張子が「pmd」ならPMDファイル、「xml」ならXMLファイル。
+ *
* @param fileName ファイル名
* @return ファイル種別
*/
/**
* コマンドラインを解析する。
+ *
* @param args コマンドライン
* @return オプション情報
* @throws CmdLineException 不正なコマンドライン
/**
* 単純なコマンドラインエラーを検出する。
+ *
* <p>検出項目は未知のオプションおよび不正な引数の個数
+ *
* @param cmdLines コマンドライン
* @throws CmdLineException 異常系
*/
/**
* ファイルフォーマット情報の推測を行う。
+ *
* @param result オプション情報
*/
private static void fixFormat(OptInfo result){
/**
* オプション整合性の事後検査。
+ *
* @param result オプション情報
* @throws CmdLineException 不正なオプション設定
*/
/**
* ヘルプ表示が必要か否か判定する。
+ *
* @return 必要ならtrue
*/
boolean needHelp(){
/**
* 入力ファイル種別を返す。
+ *
* @return 入力ファイル種別
*/
ModelFileType getInFileType(){
/**
* 出力ファイル種別を返す。
+ *
* @return 出力ファイル種別
*/
ModelFileType getOutFileType(){
/**
* 入力ファイル名を返す。
+ *
* @return 入力ファイル名
*/
String getInFilename(){
/**
* 出力ファイル名を返す。
+ *
* @return 出力ファイル名
*/
String getOutFilename(){
/**
* 上書きモードか否か返す。
+ *
* @return 上書きモードならtrue
*/
boolean overwriteMode(){
/**
* XML改行文字を返す。
+ *
* @return 改行文字
*/
String getNewline(){
/**
* ジェネレータ名を返す。
+ *
* @return ジェネレータ名。表示したくない時はnull
*/
String getGenerator(){
*/
enum OptSwitch {
- OPT_HELP (0, "-h", "-help", "-?"),
- OPT_INFILE (1, "-i"),
- OPT_OUTFILE (1, "-o"),
- OPT_FORCE (0, "-f"),
- OPT_NEWLINE (1, "-nl"),
- OPT_GENOUT (1, "-genout"),
- OPT_IFORM (1, "-iform"),
- OPT_OFORM (1, "-oform"),
+ OPT_HELP( 0, "-h", "-help", "-?"),
+ OPT_INFILE( 1, "-i"),
+ OPT_OUTFILE( 1, "-o"),
+ OPT_FORCE( 0, "-f"),
+ OPT_NEWLINE( 1, "-nl"),
+ OPT_GENOUT( 1, "-genout"),
+ OPT_IFORM( 1, "-iform"),
+ OPT_OFORM( 1, "-oform"),
;
private static final String HELP_CONSOLE =
private static final Map<String, OptSwitch> MAP_OPT;
static{
- Map<String, OptSwitch> map = new HashMap<String, OptSwitch>();
+ Map<String, OptSwitch> map = new HashMap<>();
for(OptSwitch opt : values()){
for(String cmdarg : opt.cmdopts){
/**
* コンストラクタ。
+ *
* @param argnum 必要な引数の数
* @param cmdopts オプションスイッチパターン群
*/
- private OptSwitch(int argnum, String... cmdopts) {
+ OptSwitch(int argnum, String... cmdopts) {
this.exArgNum = argnum;
List<String> optlist;
/**
* コンソール提示用ヘルプ出力文字列を返す。
+ *
* @return オプションヘルプ文字列
*/
static String getConsoleHelp(){
/**
* 文字列に合致するオプションを返す。
+ *
* <p>一つのオプションが複数の表記に合致する場合がある。
+ *
* @param cmd 文字列
* @return オプション種別。合致する物が見つからなければnull
*/
/**
* 各オプションに後続する引数の数を返す。
+ *
* <p>引数をとらないオプションは0を返す。
+ *
* @return 引数の数
*/
int getExArgNum(){
+ "If you want to overwrite, use -f.";
private static final String MSG_OLDJRE = "You need JRE {0} or later.";
- private static final String REQUIRED_JRE = "1.6";
+ private static final String REQUIRED_JRE = "1.8";
static{
THISCLASS = Pmd2Xml.class;
/**
* VMを終了させる。
+ *
* @param code 終了コード
* @see java.lang.System#exit(int)
*/
/**
* 共通エラーメッセージを出力する。
+ *
* @param text 個別メッセージ
*/
private static void errMsg(String text){
/**
* 標準エラー出力へ例外情報出力。
+ *
* @param ex 例外
* @param dumpStack スタックトレースを出力するならtrue
*/
/**
* 標準エラー出力へ例外情報出力。
+ *
* @param ex 例外
*/
private static void thPrintln(Throwable ex){
/**
* 入出力エラー処理。
* 例外を出力してVM終了する。
+ *
* @param ex 例外
*/
private static void ioError(IOException ex){
/**
* XML構文エラー処理。
* 例外を出力してVM終了する。
+ *
* @param ex 例外
*/
private static void xmlError(Throwable ex){
/**
* PMDファイルフォーマットエラー処理。
* 例外を出力してVM終了する。
+ *
* @param ex 例外
*/
private static void pmdError(MmdFormatException ex){
/**
* 内部エラー処理。
* 例外を出力してVM終了する。
+ *
* @param ex 例外
*/
private static void internalError(Throwable ex){
/**
* ファイルサイズを0に切り詰める。
+ *
* <p>ファイルが存在しなければなにもしない。
+ *
* <p>通常ファイルでなければなにもしない。
+ *
* @param file ファイル
* @throws IOException 入出力エラー
*/
/**
* 入力ソースを準備する。
+ *
* <p>入力ファイルが通常ファイルとして存在しなければエラー終了。
+ *
* @param optInfo オプション情報
* @return 入力ソース
*/
/**
* 出力ストリームを準備する。
+ *
* <p>出力ファイルが通常ファイルでない場合はエラー終了。
+ *
* <p>既存の出力ファイルに上書き指示が伴っていなければエラー終了。
+ *
* @param optInfo オプション情報
* @return 出力ストリーム
*/
/**
* オプション情報に従いコンバータを生成する。
+ *
* @param optInfo オプション情報
* @return コンバータ
*/
private static Pmd2XmlConv buildConverter(OptInfo optInfo){
Pmd2XmlConv converter = new Pmd2XmlConv();
- converter.setInType (optInfo.getInFileType());
+ converter.setInType( optInfo.getInFileType());
converter.setOutType(optInfo.getOutFileType());
converter.setNewline(optInfo.getNewline());
/**
* 実際のコンバート作業と異常系処理を行う。
+ *
* <p>異常系が起きた場合、このメソッドは制御を戻さない。
+ *
* @param converter コンバータ
* @param source 入力ソース
* @param ostream 出力ストリーム
/**
* コマンドライン文字列をオプション情報としてパースする。
+ *
* <p>異常系が起きた場合、このメソッドは制御を戻さない。
+ *
* @param args コマンドライン文字列群
* @return オプション情報
*/
- private static OptInfo parseOption(String[] args){
+ private static OptInfo parseOption(String... args){
OptInfo optInfo;
try{
/**
* Mainエントリ。
+ *
* @param args コマンドパラメータ
*/
public static void main(String[] args){
/**
* 入力ファイル種別を設定する。
+ *
* @param type ファイル種別
* @throws NullPointerException 引数がnull
* @throws IllegalArgumentException 具体的な種別を渡さなかった
/**
* 入力ファイル種別を返す。
+ *
* @return ファイル種別
*/
public ModelFileType getInTypes(){
/**
* 出力ファイル種別を設定する。
+ *
* @param type ファイル種別
* @throws NullPointerException 引数がnull
* @throws IllegalArgumentException 具体的な種別を渡さなかった
/**
* 出力ファイル種別を返す。
+ *
* @return ファイル種別
*/
public ModelFileType getOutTypes(){
/**
* XML出力用改行文字列を設定する。
+ *
* @param newline 改行文字
*/
public void setNewline(String newline){
/**
* XML出力用改行文字列を返す。
+ *
* @return 改行文字
*/
public String getNewline(){
/**
* ジェネレータ名を設定する。
+ *
* @param generator ジェネレータ名。表示したくない場合はnull
*/
public void setGenerator(String generator){
/**
* ジェネレータ名を返す。
+ *
* @return ジェネレータ名。非表示の場合はnullを返す。
*/
public String getGenerator(){
/**
* ファイル変換を行う。
+ *
* <p>XML入力の場合は{@link #convert(InputSource, OutputStream)}を
* 推奨する。
+ *
* @param is 入力ストリーム
* @param os 出力ストリーム
* @throws IOException 入力エラー
/**
* ファイル変換を行う。
+ *
* <p>PMD入力の場合は{@link InputStream}に
* バイトストリームが直接設定されていなければならない。
+ *
* <p>XML入力の場合は{@link InputStream}に
* URL(systemId)のみの設定を推奨する。
+ *
* @param source 入力ソース
* @param os 出力ストリーム
* @throws IOException 入力エラー
/**
* モデルファイルを読み込む。
+ *
* <p>XML読み込みの場合は、
* こちらより{@link #readModel(InputSource)}版を推奨する。
+ *
* @param is 入力ストリーム
* @return モデルデータ
* @throws IOException 入力エラー
/**
* モデルファイルを読み込む。
+ *
* @param source 入力ソース
* @return モデルデータ
* @throws IOException 入力エラー
/**
* モデルファイルを出力する。
+ *
* @param model モデルデータ
* @param os 出力ストリーム
* @throws IOException 出力エラー
/**
* PMDファイルからモデルデータを読み込む。
+ *
* @param is 入力ストリーム
* @return モデルデータ
* @throws IOException 入力エラー
/**
* XMLファイルからモデルデータを読み込む。
+ *
* @param source 入力ソース
* @return モデルデータ
* @throws IOException 入力エラー
/**
* モデルデータをPMDファイルに出力する。
+ *
* @param model モデルデータ
* @param ostream 出力ストリーム
* @throws IOException 出力エラー
/**
* モデルデータをXMLファイルに出力する。
+ *
* @param model モデルデータ
* @param ostream 出力ストリーム
* @throws IOException 出力エラー
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
+import javax.xml.XMLConstants;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import jp.sfjp.mikutoga.pmd.model.xml.Schema101009;
import jp.sfjp.mikutoga.pmd.model.xml.Schema130128;
import jp.sfjp.mikutoga.xml.BotherHandler;
-import jp.sfjp.mikutoga.xml.LocalXmlResource;
+import jp.sfjp.mikutoga.xml.NoopEntityResolver;
import jp.sfjp.mikutoga.xml.SchemaUtil;
-import jp.sfjp.mikutoga.xml.XmlResourceResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;
/**
*/
final class XmlInputUtil {
+ private static final String F_DISALLOW_DOCTYPE_DECL =
+ "http://apache.org/xml/features/disallow-doctype-decl";
+ private static final String F_EXTERNAL_GENERAL_ENTITIES =
+ "http://xml.org/sax/features/external-general-entities";
+ private static final String F_EXTERNAL_PARAMETER_ENTITIES =
+ "http://xml.org/sax/features/external-parameter-entities";
+ private static final String F_LOAD_EXTERNAL_DTD =
+ "http://apache.org/xml/features/nonvalidating/load-external-dtd";
+
+
/**
* 隠しコンストラクタ。
*/
/**
* 実在ファイルからXML入力ソースを得る。
+ *
* @param file 実在ファイル
* @return XML入力ソース
*/
/**
* InputSourceからInputStreamを得る。
+ *
* <p>入力ソースには、少なくともバイトストリームか
* URL文字列(SystemId)のいずれかが設定されていなければならない。
+ *
* @param source 入力ソース
* @return 入力バイトストリーム
* @throws IllegalArgumentException 入力ソースの設定が足りない。
/**
* SAXパーサファクトリを生成する。
+ *
* <ul>
* <li>XML名前空間機能は有効になる。
* <li>DTDによる形式検証は無効となる。
* <li>XIncludeによる差し込み機能は無効となる。
* </ul>
+ *
* @param schema スキーマ
* @return ファクトリ
*/
factory.setNamespaceAware(true);
factory.setValidating(false);
factory.setXIncludeAware(false);
-// factory.setFeature(name, value);
+
+ try{
+ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ factory.setFeature(F_DISALLOW_DOCTYPE_DECL, true);
+ factory.setFeature(F_EXTERNAL_GENERAL_ENTITIES, false);
+ factory.setFeature(F_EXTERNAL_PARAMETER_ENTITIES, false);
+ factory.setFeature(F_LOAD_EXTERNAL_DTD, false);
+ }catch( ParserConfigurationException
+ | SAXNotRecognizedException
+ | SAXNotSupportedException e ){
+ assert false;
+ throw new AssertionError(e);
+ }
factory.setSchema(schema);
/**
* SAXパーサを生成する。
+ *
* @param schema スキーマ
* @return SAXパーサ
*/
SAXParser parser;
try{
parser = factory.newSAXParser();
- }catch(ParserConfigurationException e){
+ }catch(ParserConfigurationException | SAXException e){
assert false;
throw new AssertionError(e);
- }catch(SAXException e){
+ }
+
+ try{
+ parser.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
+ parser.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
+ }catch(SAXNotRecognizedException | SAXNotSupportedException e){
assert false;
throw new AssertionError(e);
}
-// parser.setProperty(name, value);
-
return parser;
}
/**
* スキーマを生成する。
- * @param resolver リゾルバ
+ *
* @param xmlInType 入力XML種別
* @return スキーマ
*/
- private static Schema builsSchema(XmlResourceResolver resolver,
- ModelFileType xmlInType ){
- LocalXmlResource[] schemaArray;
+ private static Schema buildSchema(ModelFileType xmlInType ){
+ URI[] schemaUris;
switch(xmlInType){
case XML_101009:
- schemaArray = new LocalXmlResource[]{
- Schema101009.SINGLETON,
+ schemaUris = new URI[]{
+ Schema101009.RES_SCHEMA_PMDXML,
};
break;
case XML_130128:
- schemaArray = new LocalXmlResource[]{
- Schema130128.SINGLETON,
+ schemaUris = new URI[]{
+ Schema130128.RES_SCHEMA_PMDXML,
};
break;
case XML_AUTO:
- schemaArray = new LocalXmlResource[]{
- Schema101009.SINGLETON,
- Schema130128.SINGLETON,
+ schemaUris = new URI[]{
+ Schema101009.RES_SCHEMA_PMDXML,
+ Schema130128.RES_SCHEMA_PMDXML,
};
break;
default:
throw new IllegalStateException();
}
- Schema schema = SchemaUtil.newSchema(resolver, schemaArray);
+ Schema schema;
+ try{
+ schema = SchemaUtil.newSchema(schemaUris);
+ }catch(IOException | SAXException e){
+ assert false;
+ throw new AssertionError(e);
+ }
return schema;
}
/**
* XMLリーダを生成する。
+ *
* <p>エラーハンドラには{@link BotherHandler}が指定される。
+ *
* @param xmlInType 入力XML種別
* @return XMLリーダ
*/
static XMLReader buildReader(ModelFileType xmlInType){
- XmlResourceResolver resolver = new XmlResourceResolver();
-
- Schema schema = builsSchema(resolver, xmlInType);
+ Schema schema = buildSchema(xmlInType);
SAXParser parser = buildParser(schema);
throw new AssertionError(e);
}
- reader.setEntityResolver(resolver);
+ reader.setEntityResolver(NoopEntityResolver.NOOP_RESOLVER);
reader.setErrorHandler(BotherHandler.HANDLER);
return reader;