001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.plugin.column;
017
018import java.util.Map;                                                                           // 7.4.2.0 (2021/05/08)
019import java.util.HashMap;                                                                       // 8.5.3.0 (2023/09/08) Add
020
021import org.opengion.hayabusa.common.HybsSystem;
022import org.opengion.hayabusa.db.AbstractEditor;
023import org.opengion.hayabusa.db.CellEditor;
024import org.opengion.hayabusa.db.DBColumn;
025import org.opengion.fukurou.util.XHTMLTag;
026import org.opengion.fukurou.util.Attributes;
027
028/**
029 * UPLOAD2 エディターは、ドラッグ&ドロップでファイルアップロードを行う場合に
030 * 使用する編集用クラスです。
031 *
032 * 行ごとの対応も、ファイル名の書き換えもサポートしていません。
033 * 現状できるのは、filetemp/ログインID フォルダに、そのままのファイル名で
034 * アップロードするだけです。
035 *
036 *  カラムの表示に必要な属性は、DBColumn オブジェクト より取り出します。
037 * このクラスは、DBColumn オブジェクト毎に1つ作成されます。
038 *
039 * 編集パラメータに指定できる項目は、『;』で
040 *  width=300px;                                                初期値
041 *  height=180px;                                               初期値
042 *  CALL_JSP=/common/dragFiles.jsp;             初期値
043 *  UPLOAD_DIR=                                                 初期値 (filetemp/{@USER.ID})
044 *
045 * @og.rev 7.4.2.0 (2021/05/08) 新規追加
046 *
047 * @og.group データ編集
048 *
049 * @version  7.4
050 * @author   Kazuhiko Hasegawa
051 * @since    JDK11.0,
052 */
053public class Editor_UPLOAD2 extends AbstractEditor {
054        /** このプログラムのVERSION文字列を設定します。 {@value} */
055        private static final String VERSION = "8.5.3.0 (2023/09/08)" ;
056
057        private static final String JSP = HybsSystem.sys( "JSP" ) ;
058
059        private static final String CALL_JSP   = "/common/dragFiles.jsp" ;
060//      private static final String UPLOAD_DIR = "" ;                   // 指定がない場合は、デフォルト( filetemp/{@USER.ID} )               8.0.0.0 (2021/07/31) 未使用
061                                                                                                                        // dragFiles.jsp 内で、設定。jsp/ 以下のフォルダを指定
062
063        private static final String DEF_WIDTH  = "300px" ;
064//      private static final String DEF_HEIGHT = "180px" ;
065        private static final String DEF_HEIGHT = "135px" ;              // 8.0.1.0 (2021/10/29)
066
067//      private  String         name;
068
069        /**
070         * デフォルトコンストラクター。
071         * このコンストラクターで、基本オブジェクトを作成します。
072         *
073         */
074        public Editor_UPLOAD2() { super(); }    // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
075
076        /**
077         * DBColumnオブジェクトを指定したprivateコンストラクター。
078         *
079         * @og.rev 7.4.2.0 (2021/05/08) optionAttributesが使えるように修正。
080         * @og.rev 8.5.3.0 (2023/09/08) DynamicAttributes対応(getParamMapをAttributes.javaから移植)
081         *
082         * @param       clm     DBColumnオブジェクト
083         */
084        private Editor_UPLOAD2( final DBColumn clm ) {
085                super( clm );
086
087                final String name = clm.getName();
088
089                final Attributes attri = clm.getEditorAttributes()
090                                        .set( "width"   , DEF_WIDTH  )                  // 初期値として渡したい
091                                        .set( "height"  , DEF_HEIGHT );
092
093                // 7.4.2.0 (2021/05/08)
094                String srcURL = JSP + CALL_JSP ;
095                final String param = clm.getEditorParam();
096                if( param != null ) {
097//                      final Map<String,String> prmMap = attri.getParamMap( param );           // param をMapに分解した物
098                        final Map<String,String> prmMap = getParamMap( param );                         // 8.5.3.0 (2023/09/08) Modify
099
100                        attri.set( "width"  , prmMap.get( "width"  )  );        // width 指定があれば使う
101                        attri.set( "height" , prmMap.get( "height" ) );         // width 指定があれば使う
102
103                        final String callJsp = prmMap.get( "CALL_JSP" ) ;
104                        if( callJsp != null && !callJsp.isEmpty() ) { srcURL = JSP + callJsp ; }
105
106                        final String urlOpt  = prmMap.get( "UPLOAD_DIR" ) ;
107                        if( urlOpt != null && !urlOpt.isEmpty() ) { srcURL += "?UPLOAD_DIR=" + urlOpt ; }
108                }
109
110                attributes = new Attributes()
111                                        .set( "name"    , name  )
112                                        .set( "id"              , name  )
113                                        .set( "src"             , srcURL  )
114                //                      .set( "width"   , "300px" )                     // 初期値として渡したい
115                //                      .set( "height"  , "180px" )
116                //                      .set( clm.getEditorAttributes() );      // #addAttributes( Attributes ) の代替え
117                                        .set( attri );                                          // #addAttributes( Attributes ) の代替え
118
119                tagBuffer.add( XHTMLTag.iframe( attributes , "" ) );
120        }
121
122        /**
123         * 各オブジェクトから自分のインスタンスを返します。
124         * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に
125         * まかされます。
126         *
127         * @og.rev 7.4.2.0 (2021/05/08) ドラッグ&ドロップのファイルアップロードを追加
128         *
129         * @param       clm     DBColumnオブジェクト
130         *
131         * @return      CellEditorオブジェクト
132         * @og.rtnNotNull
133         */
134        public CellEditor newInstance( final DBColumn clm ) {
135                return new Editor_UPLOAD2( clm );
136        }
137        /**
138         * データの編集用文字列を返します。
139         *
140         * @og.rev 7.4.2.0 (2021/05/08) ドラッグ&ドロップのファイルアップロードを追加
141         *
142         * @param       value 値
143         *
144         * @return      データの編集用文字列
145         * @og.rtnNotNull
146         */
147        public String getValue( final String value ) {
148                return tagBuffer.makeTag();
149        }
150
151        /**
152         * name属性を変えた、データ表示/編集用のHTML文字列を作成します。
153         * テーブル上の name に 行番号を付加して、名前_行番号 で登録するキーを作成し、
154         * リクエスト情報を1つ毎のフィールドで処理できます。
155         *
156         * @og.rev 7.4.2.0 (2021/05/08) ドラッグ&ドロップのファイルアップロードを追加
157         *
158         * @param       row   行番号
159         * @param       value 値
160         *
161         * @return      データ表示/編集用の文字列
162         * @og.rtnNotNull
163         */
164        public String getValue( final int row,final String value ) {
165                return tagBuffer.makeTag();
166        }
167
168        /**
169         * 指定の文字列を分解して、Mapを作成します。
170         * 『;』 で分解して、ここのキーと値を、『=』で分解します。
171         * 引数の値は、そのまま適用されますので、クオーテーション等は、付けないと想定しています。
172         *
173         * @og.rev 7.4.2.1 (2021/05/08)
174         * @og.rev 8.5.3.0 (2023/09/08) DynamicAttributes対応(getParamMapをAttributes.javaから移植)
175         *
176         * @param       params  キー=値; キー=値 形式の文字列
177         *
178         * @return      キーと属性に分解したMap
179         * @og.rtnNotNull
180         */
181        private Map<String,String> getParamMap( final String params ) {
182                final Map<String,String> optMap = new HashMap<>();
183                if( params != null ) {
184                        final String[] prms = params.split( ";" );              // 各項目は、『;』で分解する。
185                        for( final String prm : prms ) {
186                                final String[] keyval = prm.split( "=" );       // キーと値は、『=』で分解する。
187                                if( keyval.length >= 2 ) {
188                                        final String val = keyval[1].replaceAll( "'","" ).replaceAll( "\"","" );
189                                        optMap.put( keyval[0].trim() , val );
190                                }
191                        }
192                }
193                return optMap ;
194        }
195}