diff --git a/AMM/.project b/AMM/.project new file mode 100644 index 0000000..94726ac --- /dev/null +++ b/AMM/.project @@ -0,0 +1,17 @@ + + + AMM + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/AMM/.settings/org.eclipse.core.resources.prefs b/AMM/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..4824b80 --- /dev/null +++ b/AMM/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/AMM/pom.xml b/AMM/pom.xml new file mode 100644 index 0000000..4b3281e --- /dev/null +++ b/AMM/pom.xml @@ -0,0 +1,732 @@ + + + 4.0.0 + + jp.co.y_net + AMM + AMM + 1.4.2 + pom + http://172.16.12.13/trac/P11344 + + + SunDataCenter + http://www.y-net.co.jp/ + + + + ../AMM_web + + + + + server001 + Sun Data Center Repository + http://172.16.12.13/maven + + + mirrors.ibiblio.org.pub.mirrors.maven2 + Central Mirror + http://mirrors.ibiblio.org/pub/mirrors/maven2 + + + com.springsource.repository.bundles.release + SpringSource Enterprise Bundle Repository - + SpringSource Bundle Releases + http://repository.springsource.com/maven/bundles/release + + + + com.springsource.repository.bundles.external + SpringSource Enterprise Bundle Repository - External + Bundle Releases + http://repository.springsource.com/maven/bundles/external + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.7 + 1.7 + true + true + UTF-8 + + + ${java.home}/lib/rt.jar + + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + + JavadocSiteExecution1 + site + + aggregate + + + + JavadocSiteExecution2 + site + + javadoc + + + + + package + true + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven-checkstyle-plugin.version} + + false + + + + org.apache.maven.plugins + maven-pmd-plugin + ${maven-pmd-plugin.version} + + + org.codehaus.mojo + cobertura-maven-plugin + ${cobertura-maven-plugin.version} + + + CoberturaCleanExecution1 + clean + + clean + + + + CoberturaPackageExecution1 + package + + cobertura + + + + + UTF-8 + + html + xml + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + org.apache.maven.plugins + maven-site-plugin + ${maven-site-plugin.version} + + ja + true + + + org.apache.maven.plugins + maven-project-info-reports-plugin + ${maven-project-info-reports-plugin.version} + + false + false + + + + dependencies + scm + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + + + + + com.atlassian.maven.plugins + maven-clover2-plugin + ${maven-clover2-plugin.version} + + true + true + false + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade-plugin.version} + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven-deploy-plugin.version} + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + org.apache.maven.plugins + maven-pmd-plugin + + + org.codehaus.mojo + cobertura-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + org.apache.maven.plugins + maven-site-plugin + + + com.atlassian.maven.plugins + maven-clover2-plugin + + + org.apache.maven.plugins + maven-shade-plugin + + + + + + + + + + + + junit + junit + ${junit.version} + jar + test + false + + + net.sf.twip + twip + ${twip.version} + jar + test + + + org.hamcrest + hamcrest-library + ${hamcrest.version} + jar + test + + + org.hamcrest + hamcrest-integration + ${hamcrest.version} + jar + test + + + + + + ch.qos.logback + logback-core + 1.1.3 + + + ch.qos.logback + logback-classic + 1.1.3 + + + janino + janino + 2.5.10 + + + + + org.mortbay.jetty + jetty + ${jetty.version} + provided + + + org.mortbay.jetty + jetty-util + ${jetty.version} + provided + + + org.mortbay.jetty + jetty-management + ${jetty.version} + provided + + + + + org.springframework + org.springframework.core + ${spring.version} + jar + false + + + org.aopalliance + com.springsource.org.aopalliance + ${aopalliance.version} + jar + false + + + org.springframework + org.springframework.aop + ${spring.version} + jar + false + + + org.springframework + org.springframework.aspects + ${spring.version} + jar + false + + + org.springframework + org.springframework.beans + ${spring.version} + jar + false + + + org.springframework + org.springframework.asm + ${spring.version} + jar + false + + + org.springframework + org.springframework.expression + ${spring.version} + jar + false + + + org.springframework + org.springframework.jdbc + ${spring.version} + jar + false + + + org.springframework + org.springframework.jms + ${spring.version} + jar + false + + + org.springframework + org.springframework.orm + ${spring.version} + jar + false + + + org.springframework + org.springframework.oxm + ${spring.version} + jar + false + + + org.springframework + org.springframework.context + ${spring.version} + jar + false + + + org.springframework + org.springframework.web + ${spring.version} + jar + + + + + org.hibernate + hibernate-core + ${hibernate.version} + jar + false + + + + javassist + javassist + ${javassist.version} + compile + + + commons-dbcp + commons-dbcp + ${commons-dbcp.version} + jar + compile + + + + org.hibernate + hibernate-c3p0 + ${hibernate.version} + + + + mysql + mysql-connector-java + 5.1.6 + + + + + postgresql + postgresql + ${postgresql.version} + jar + false + + + + + org.apache.commons + commons-compress + ${commons-compress.version} + + + commons-codec + commons-codec + ${commons-codec.version} + + + commons-lang + commons-lang + ${commons-lang.version} + jar + compile + + + commons-email + commons-email + ${commons-email.version} + compile + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + org.apache.httpcomponents + httpmime + ${httpmime.version} + + + + org.quartz-scheduler + quartz + ${quartz.version} + + + org.hsqldb + hsqldb + ${hsqldb.version} + + + + com.itextpdf + itextpdf + 5.4.0 + + + com.itextpdf + itext-asian + 5.2.0 + + + + jfree + jfreechart + 1.0.13 + + + + com.fasterxml.jackson.core + jackson-core + 2.5.0 + + + com.fasterxml.jackson.core + jackson-databind + 2.5.0 + + + com.fasterxml.jackson.core + jackson-annotations + 2.5.0 + + + + + com.fasterxml.jackson.core + jackson-core + 2.5.0 + + + com.fasterxml.jackson.core + jackson-databind + 2.5.0 + + + com.fasterxml.jackson.core + jackson-annotations + 2.5.0 + + + + + false + + + org.codehaus.mojo + cobertura-maven-plugin + true + ${cobertura-maven-plugin.version} + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven-checkstyle-plugin.version} + true + + + org.apache.maven.plugins + maven-surefire-report-plugin + ${maven-surefire-report-plugin.version} + true + + false + + + + org.apache.maven.plugins + maven-jxr-plugin + ${maven-jxr-plugin.version} + true + + true + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + true + + + org.apache.maven.plugins + maven-site-plugin + ${maven-site-plugin.version} + true + + ja + true + + + + org.apache.maven.plugins + maven-pmd-plugin + ${maven-pmd-plugin.version} + true + + + + pmd + cpd + + + + + + org.codehaus.mojo + javancss-maven-plugin + ${javancss-maven-plugin.version} + true + + + org.codehaus.mojo + findbugs-maven-plugin + ${findbugs-maven-plugin} + + true + true + + + + + + + + UTF-8 + UTF-8 + + + + + 1.5.6 + 4.8.2 + 3.3 + 1.2.16 + 1.6.1 + 3.1.1.RELEASE + 1.0.0 + 3.6.10.Final + + 9.1-901-1.jdbc4 + 3.12.1.GA + 2.2.2 + 1.6.11 + 1.6.11 + 4.8 + 1.4.1 + 1.6 + 2.6 + 1.1 + 1.4 + 4.1.3 + 4.1.3 + 2.2.8 + 1.8.6 + + + 2.5.1 + 2.8.1 + 2.9.1 + 2.7.1 + 2.5.1 + 2.12 + 2.5 + 2.4 + 3.1 + 3.1.6 + 1.7 + 2.7 + 2.12 + 2.3 + 2.0 + 2.5.1 + + + 6.1.4 + 1.2.1 + + \ No newline at end of file diff --git a/AMM_web/.checkstyle b/AMM_web/.checkstyle new file mode 100644 index 0000000..81730a9 --- /dev/null +++ b/AMM_web/.checkstyle @@ -0,0 +1,7 @@ + + + + + + + diff --git a/AMM_web/.classpath b/AMM_web/.classpath new file mode 100644 index 0000000..7617edb --- /dev/null +++ b/AMM_web/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AMM_web/.project b/AMM_web/.project new file mode 100644 index 0000000..c894e63 --- /dev/null +++ b/AMM_web/.project @@ -0,0 +1,42 @@ + + + AMM_web + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/AMM_web/.settings/.jsdtscope b/AMM_web/.settings/.jsdtscope new file mode 100644 index 0000000..585c967 --- /dev/null +++ b/AMM_web/.settings/.jsdtscope @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/AMM_web/.settings/de.loskutov.anyedit.AnyEditTools.prefs b/AMM_web/.settings/de.loskutov.anyedit.AnyEditTools.prefs new file mode 100644 index 0000000..e20e398 --- /dev/null +++ b/AMM_web/.settings/de.loskutov.anyedit.AnyEditTools.prefs @@ -0,0 +1,16 @@ +activeContentFilterList=*.makefile,makefile,*.Makefile,Makefile,Makefile.*,*.mk,MANIFEST.MF +addNewLine=true +convertActionOnSaave=AnyEdit.CnvrtTabToSpaces +eclipse.preferences.version=1 +ignoreBlankLinesWhenTrimming=false +inActiveContentFilterList= +javaTabWidthForJava=true +org.eclipse.jdt.ui.editor.tab.width=2 +projectPropsEnabled=false +removeTrailingSpaces=true +replaceAllSpaces=false +replaceAllTabs=false +saveAndAddLine=false +saveAndConvert=false +saveAndTrim=true +useModulo4Tabs=false diff --git a/AMM_web/.settings/org.eclipse.core.resources.prefs b/AMM_web/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..365bbd6 --- /dev/null +++ b/AMM_web/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/AMM_web/.settings/org.eclipse.jdt.core.prefs b/AMM_web/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..f4217b0 --- /dev/null +++ b/AMM_web/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/AMM_web/.settings/org.eclipse.m2e.wtp.prefs b/AMM_web/.settings/org.eclipse.m2e.wtp.prefs new file mode 100644 index 0000000..0492759 --- /dev/null +++ b/AMM_web/.settings/org.eclipse.m2e.wtp.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.m2e.wtp.enabledProjectSpecificPrefs=false diff --git a/AMM_web/.settings/org.eclipse.wst.common.component b/AMM_web/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..616c1d7 --- /dev/null +++ b/AMM_web/.settings/org.eclipse.wst.common.component @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/AMM_web/.settings/org.eclipse.wst.common.project.facet.core.xml b/AMM_web/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..38b472f --- /dev/null +++ b/AMM_web/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/AMM_web/.settings/org.eclipse.wst.html.core.prefs b/AMM_web/.settings/org.eclipse.wst.html.core.prefs new file mode 100644 index 0000000..fca6bf8 --- /dev/null +++ b/AMM_web/.settings/org.eclipse.wst.html.core.prefs @@ -0,0 +1,39 @@ +attrDuplicate=2 +attrInvalidName=2 +attrInvalidValue=2 +attrNameMismatch=2 +attrUndefName=-1 +attrUndefValue=2 +attrValueEqualsMissing=2 +attrValueMismatch=1 +attrValueUnclosed=2 +cdataInvalidContent=2 +cdataUnclosed=1 +commentInvalidContent=2 +commentUnclosed=1 +docDoctypeUnclosed=1 +docDuplicateTag=1 +docInvalidChar=2 +docInvalidContent=2 +eclipse.preferences.version=1 +elemCoexistence=2 +elemDuplicate=2 +elemEndInvalidCase=1 +elemInvalidContent=2 +elemInvalidDirective=1 +elemInvalidEmptyTag=2 +elemInvalidName=1 +elemInvalidText=2 +elemMissingEnd=2 +elemMissingStart=2 +elemStartInvalidCase=2 +elemUnclosedEndTag=1 +elemUnclosedStartTag=1 +elemUnknownName=-1 +elemUnnecessaryEnd=2 +piInvalidContent=2 +piUnclosed=1 +piUndefined=2 +refInvalidContent=2 +resourceNotFound=2 +use-project-settings=true diff --git a/AMM_web/.settings/org.eclipse.wst.jsdt.ui.superType.container b/AMM_web/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/AMM_web/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/AMM_web/.settings/org.eclipse.wst.jsdt.ui.superType.name b/AMM_web/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/AMM_web/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/AMM_web/.settings/org.eclipse.wst.validation.prefs b/AMM_web/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..6f1cba6 --- /dev/null +++ b/AMM_web/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/AMM_web/SQL.txt b/AMM_web/SQL.txt new file mode 100644 index 0000000..fc8e21c --- /dev/null +++ b/AMM_web/SQL.txt @@ -0,0 +1,293 @@ +DB定義作成(コマンドライン) + 参考URL:http://www.dbonline.jp/mysql/database/ +------------------------------------------------- +--全データ削除 +--truncate grp;truncate grpusr;truncate inf;truncate org;truncate usr;truncate inf; +------------------------------------------------- +CREATE DATABASE ammdb; +CREATE USER libgdc IDENTIFIED BY 'libgdcmanager'; +ユーザ一覧確認 + mysql> select User,Host from mysql.user; +-------------------------------------------------- + +CREATE TABLE ammdb.usr +( + id serial NOT NULL, + updatedate bigint, + updateusrid integer, + deleted integer, + + usrid integer unique, + + loginid character varying(512), + name character varying(512), + kind integer, + orgid integer, + orgrole integer, + stoplogin integer, + fromdate integer, + todate integer, + pwhash character varying(512), + cres character varying(512), + cresdate bigint, + joindate bigint, + lastlogintrydate bigint, + loginerrorcount integer, + lastlogindate bigint, + modpwdate bigint, + leavedate bigint, + status integer, + CONSTRAINT usr_pkey PRIMARY KEY (id ) +); + +CREATE TABLE ammdb.org +( + id serial NOT NULL, + updatedate bigint, + updateusrid integer, + deleted integer, + + orgid integer unique, + + kind integer, + name character varying(512), + adminname character varying(512), + adminnamekana character varying(512), + postnum character varying(32), + address character varying(1024), + telnum character varying(32), + mail character varying(512), + fromdate integer, + todate integer, + limitnum integer, + entrydate bigint, + approvaldate bigint, + rejectdate bigint, + note character varying(5000), + joindate bigint, + status integer, + CONSTRAINT org_pkey PRIMARY KEY (id ) +); + + +CREATE TABLE ammdb.pwtckt +( + id serial NOT NULL, + updatedate bigint, + updateusrid integer, + deleted integer, + + pwtcktid integer unique, + + usrid integer, + ticket character varying(16), + createdate bigint, + ticketdate bigint, + completedate bigint, + canceldate bigint, + status integer, + CONSTRAINT pwtckt_pkey PRIMARY KEY (id ) +); + + +CREATE TABLE ammdb.inf +( + id serial NOT NULL, + updatedate bigint, + updateusrid integer, + deleted integer, + + infid integer unique, + + title character varying(512), + body character varying(5000), + pubdate bigint, + status integer, + CONSTRAINT inf_pkey PRIMARY KEY (id ) +); + +CREATE TABLE ammdb.grp +( + id serial NOT NULL, + updatedate bigint, + updateusrid integer, + deleted integer, + + grpid integer unique, + + name character varying(512), + adminusrid integer, + createdate bigint, + + CONSTRAINT grp_pkey PRIMARY KEY (id ) +) +; +CREATE TABLE ammdb.grpusr +( + id serial NOT NULL, + updatedate bigint, + updateusrid integer, + deleted integer, + + grpusrid integer unique, + + grpid integer, + usrid integer, + invitationdate bigint, + joindate bigint, + leavedate bigint, + admindate bigint, + statusadmin integer, + status integer, + CONSTRAINT grpusr_pkey PRIMARY KEY (id ) +); + +-- テーブルへ権限を付与 +GRANT ALL PRIVILEGES ON ammdb.usr TO libgdc; +GRANT ALL PRIVILEGES ON ammdb.org TO libgdc; +GRANT ALL PRIVILEGES ON ammdb.pwtckt TO libgdc; +GRANT ALL PRIVILEGES ON ammdb.inf TO libgdc; +GRANT ALL PRIVILEGES ON ammdb.grp TO libgdc; +GRANT ALL PRIVILEGES ON ammdb.grpusr TO libgdc; + + + +=================== +PostgreSQL検証時のSQL + +/* +CREATE TABLE ammdb.usr +( + id serial NOT NULL, + updatedate bigint, + deleted integer, + usrid serial NOT NULL, + loginid character varying(512), + name character varying(512), + kind integer, + orgid integer, + orgrole integer, + stoplogin integer, + fromdate integer, + todate integer, + pwhash character varying(512), + cres character varying(512), + cresdate bigint, + joindate bigint, + lastlogintrydate bigint, + loginerrorcount integer, + lastlogindate bigint, + modpwdate bigint, + leavedate bigint, + status integer, + CONSTRAINT usr_pkey PRIMARY KEY (id ) +) WITH ( OIDS=FALSE ); +ALTER TABLE ammdb.usr OWNER TO libgdc; +*/ +/* +CREATE TABLE ammdb.org +( + id serial NOT NULL, + updatedate bigint, + deleted integer, + orgid serial NOT NULL, + kind integer, + name character varying(512), + adminname character varying(512), + adminnamekana character varying(512), + postnum character varying(32), + address character varying(1024), + telnum character varying(32), + mail character varying(512), + fromdate integer, + todate integer, + limitnum integer, + entrydate bigint, + approvaldate bigint, + rejectdate bigint, + note character varying(5000), + joindate bigint, + status integer, + CONSTRAINT org_pkey PRIMARY KEY (id ) +) WITH ( OIDS=FALSE ); +ALTER TABLE ammdb.org OWNER TO libgdc; + +*/ +/* +CREATE TABLE ammdb.pwtckt +( + id serial NOT NULL, + updatedate bigint, + deleted integer, + usrid integer, + ticket character varying(16), + createdate bigint, + ticketdate bigint, + completedate bigint, + canceldate bigint, + status integer, + CONSTRAINT pwtckt_pkey PRIMARY KEY (id ) +) WITH ( OIDS=FALSE ); +ALTER TABLE ammdb.pwtckt OWNER TO libgdc; + +*/ +/* +CREATE TABLE ammdb.inf +( + id serial NOT NULL, + updatedate bigint, + deleted integer, + infid serial NOT NULL, + title character varying(512), + body character varying(5000), + pubdate bigint, + status integer, + CONSTRAINT inf_pkey PRIMARY KEY (id ) +) WITH ( OIDS=FALSE ); +ALTER TABLE ammdb.inf OWNER TO libgdc; + +*/ +/* + * データベースのテーブル定義 +CREATE TABLE ammdb.grp +( + id serial NOT NULL, + updatedate bigint, + modusrid integer, + moddate bigint, + + grpid serial NOT NULL, + name character varying(512), + adminusrid integer, + createdate bigint, + + CONSTRAINT grp_pkey PRIMARY KEY (id ) +) WITH ( OIDS=FALSE ); +ALTER TABLE ammdb.grp OWNER TO libgdc; + +*/ +/* + * データベースのテーブル定義 +CREATE TABLE ammdb.grpusr +( + id serial NOT NULL, + updatedate bigint, + modusrid integer, + moddate bigint, + + grpusrid serial NOT NULL, + grpid integer, + usrid integer, + invitationdate bigint, + joindate bigint, + leavedate bigint, + admindate bigint, + + statusadmin integer, + status integer, + + CONSTRAINT grpusr_pkey PRIMARY KEY (id ) +) WITH ( OIDS=FALSE ); +ALTER TABLE ammdb.grpusr OWNER TO libgdc; + +*/ diff --git a/AMM_web/pom.xml b/AMM_web/pom.xml new file mode 100644 index 0000000..0362cb6 --- /dev/null +++ b/AMM_web/pom.xml @@ -0,0 +1,163 @@ + + + 4.0.0 + + + AMM + jp.co.y_net + 1.4.2 + ../AMM/pom.xml + + + AMM_web + AMM_web + war + http://172.16.12.13/trac/P11344 + + + + SunDataCenter + http://www.y-net.co.jp/ + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + false + src/main/resources + + + false + src/main/java + + ** + + + **/*.java + + + + + + false + src/test/java + + ** + + + **/*.java + + + + + + true + org.apache.maven.plugins + maven-compiler-plugin + + 1.7 + 1.7 + true + true + + + + org.mortbay.jetty + maven-jetty-plugin + + + org.apache.maven.plugins + maven-eclipse-plugin + + true + + + + AMM + + + + + + + + + + + + org.apache.wicket + wicket-core + ${wicket.version} + jar + false + + + org.apache.wicket + wicket-extensions + ${wicket.version} + jar + false + + + org.apache.wicket + wicket-auth-roles + ${wicket.version} + jar + false + + + org.apache.wicket + wicket-ioc + ${wicket.version} + jar + false + + + org.apache.wicket + wicket-spring + ${wicket.version} + jar + + + servlet-api + javax.servlet + + + org.springframework + spring + + + false + + + org.msgpack + msgpack + ${org.msgpack} + + + + + false + + + + UTF-8 + UTF-8 + 1.5.7 + 0.6.4 + + + + + + \ No newline at end of file diff --git a/AMM_web/sdc/logs/AMMLog.2016-03-26.0.log b/AMM_web/sdc/logs/AMMLog.2016-03-26.0.log new file mode 100644 index 0000000..28f5df5 --- /dev/null +++ b/AMM_web/sdc/logs/AMMLog.2016-03-26.0.log @@ -0,0 +1,2 @@ +[INFO ] 2016-03-26 12:14:42 jp.TestLog#main(TestLog.java:18) + AppLogger.info diff --git a/AMM_web/sdc/logs/AMMLog.2016-03-29.0.log b/AMM_web/sdc/logs/AMMLog.2016-03-29.0.log new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/AMM_web/sdc/logs/AMMLog.2016-03-29.0.log diff --git a/AMM_web/sdc/logs/mail/AMM_MAIL_Log.2016-03-26.0.log b/AMM_web/sdc/logs/mail/AMM_MAIL_Log.2016-03-26.0.log new file mode 100644 index 0000000..74b6c89 --- /dev/null +++ b/AMM_web/sdc/logs/mail/AMM_MAIL_Log.2016-03-26.0.log @@ -0,0 +1 @@ +[INFO ] 2016-03-26 12:14:42 AppSendMail.loggingTest diff --git a/AMM_web/sdc/logs/mail/AMM_MAIL_Log.2016-03-29.0.log b/AMM_web/sdc/logs/mail/AMM_MAIL_Log.2016-03-29.0.log new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/AMM_web/sdc/logs/mail/AMM_MAIL_Log.2016-03-29.0.log diff --git a/AMM_web/src/main/java/jp/TestDb.java b/AMM_web/src/main/java/jp/TestDb.java new file mode 100644 index 0000000..3640d5c --- /dev/null +++ b/AMM_web/src/main/java/jp/TestDb.java @@ -0,0 +1,30 @@ +package jp; + +import jp.co.y_net.amm.dao.Inf; +import jp.co.y_net.amm.dao.InfDao; + +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class TestDb { + public static void main(String[] args) { + final ClassPathXmlApplicationContext context = + new ClassPathXmlApplicationContext("applicationContextBase.xml", "hibernateContextBase.xml"); + + final InfDao infDao = (InfDao)context.getBean("infDao"); + + for (Inf inf: infDao.get()) { + System.out.println(inf.getInfid()); + } + try { + Thread.sleep(40 * 1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + for (Inf inf: infDao.get()) { + System.out.println(inf.getInfid()); + } + +// BasicResourcePoolFactory + } + +} diff --git a/AMM_web/src/main/java/jp/TestLog.java b/AMM_web/src/main/java/jp/TestLog.java new file mode 100644 index 0000000..42ccb19 --- /dev/null +++ b/AMM_web/src/main/java/jp/TestLog.java @@ -0,0 +1,22 @@ +package jp; + +import jp.co.y_net.amm.common.AppLogger; +import jp.co.y_net.amm.common.AppSendMail; +public class TestLog { +// private static org.slf4j.Logger loggerSlf = LoggerFactory.getLogger(TestLog.class.getName()); + public static void main(String[] args) { + +// System.out.println("test"); +// loggerSlf.error("テスト"); +// +// Logger loggerSlfMail = LoggerFactory.getLogger("jp.co.y_net.amm.mail"); +// loggerSlfMail.info("テストああああ\nいいい"); + + + + AppSendMail.loggingTest("AppSendMail.loggingTest"); + AppLogger.info("AppLogger.info"); + + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/AppRequestCycleListener.java b/AMM_web/src/main/java/jp/co/y_net/amm/AppRequestCycleListener.java new file mode 100644 index 0000000..ff7c778 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/AppRequestCycleListener.java @@ -0,0 +1,114 @@ +package jp.co.y_net.amm; + +import jp.co.y_net.amm.common.AppLogger; + +import org.apache.wicket.protocol.http.PageExpiredException; +import org.apache.wicket.protocol.http.servlet.ResponseIOException; +import org.apache.wicket.request.IRequestHandler; +import org.apache.wicket.request.Url; +import org.apache.wicket.request.cycle.IRequestCycleListener; +import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.mapper.StalePageException; + +/** + * Applicationクラス(PC版はWicketApplication)で設定する為の RequestCycleListener + * エラーログの出力などを行う。 + * + * @author k_inaba + */ +public class AppRequestCycleListener implements IRequestCycleListener { + + public IRequestHandler onException(RequestCycle cycle, Exception ex) { + + /* エラー詳細出力 2013/06/25 K.Inaba */ + String pageName = ""; + if (cycle.getUrlRenderer().getBaseUrl().getSegments().size() > 0) { + pageName = cycle.getUrlRenderer().getBaseUrl().getSegments().get(0); + } + try { + String type = null; + if (ex instanceof PageExpiredException) { // 有効期限切れ + type = "1"; + } + + /* 2016/08/06 追加 */ + if (ex instanceof StalePageException) { // 有効期限切れ + type = "1"; + } + + if (ex instanceof ResponseIOException) { + Throwable t = ex.getCause(); + if (t != null + && "org.apache.catalina.connector.ClientAbortException".equals(t.getClass().getName())) { + /* IEが発生させる既知の処理中断の例外 */ + type = "2"; + } + } + if (type == null) { + type = "3"; + } + if ("1".equals(type)) { // 有効期限切れ + AppLogger.debug(pageName); + AppLogger.debug(ex.getMessage()); + + } else if ("2".equals(type)) { // IEが発生させる既知の処理中断の例外(クライアントによる中断) + AppLogger.debug(pageName); + AppLogger.debug(ex.getMessage()); + + } else { /* 未知の問題 */ + AppLogger.error(pageName); + AppLogger.error(ex); + } + + } catch (Exception e) { + /* エラーハンドリングで循環が発生しないように、極力シンプルな実装にする。 */ + ex.printStackTrace(); + } + return null; + } + @Override + public void onExceptionRequestHandlerResolved(RequestCycle arg0, IRequestHandler arg1, Exception arg2) { + /* 処理なし */ + } +// private static long timerRequest; +// private static String uri; + @Override + public void onBeginRequest(RequestCycle reqestCycle) { // RequestHandlerの解決直前に実行 + /* 処理時間測定開始 */ +// TimeRecorder.startRequest(reqestCycle.getRequest().getUrl().toString()); +// TimeRecorder.startSub("リクエスト受付"); +// timerRequest = System.currentTimeMillis(); +// uri = reqestCycle.getRequest().getUrl().toString(); +// WebOpacLogger.info("計測開始 - [" + uri + "]-----------------------------------------------------------------"); + + } + @Override + public void onEndRequest(RequestCycle reqestCycle) { + /* 処理時間測定終了 */ +// TimeRecorder.endRequest(reqestCycle.getRequest().getUrl().toString()); +// long time = System.currentTimeMillis() - timerRequest; +// WebOpacLogger.info("計測終了 - " + time + "[ms] [" + uri + "]------------------------------------------------"); +// timerRequest = 0; +// uri = ""; + } + @Override + public void onDetach(RequestCycle arg0) { + /* 処理なし */ + } + @Override + public void onRequestHandlerExecuted(RequestCycle arg0, IRequestHandler arg1) { + /* 処理なし */ + } + @Override + public void onRequestHandlerResolved(RequestCycle arg0, IRequestHandler arg1) { + /* 処理なし */ + } + @Override + public void onRequestHandlerScheduled(RequestCycle arg0, IRequestHandler arg1) { + /* 処理なし */ + } + @Override + public void onUrlMapped(RequestCycle arg0, IRequestHandler arg1, Url arg2) { + /* 処理なし */ + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/AppSession.java b/AMM_web/src/main/java/jp/co/y_net/amm/AppSession.java new file mode 100644 index 0000000..1dfca09 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/AppSession.java @@ -0,0 +1,54 @@ +package jp.co.y_net.amm; + +import jp.co.y_net.amm.dao.Usr; + +import org.apache.wicket.Page; +import org.apache.wicket.Session; +import org.apache.wicket.protocol.http.WebSession; +import org.apache.wicket.request.Request; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +public class AppSession extends WebSession { +//AuthenticatedWebSession { + private static final long serialVersionUID = 1L; + + public AppSession(Request request) { + super(request); + } + public static AppSession get() { + return (AppSession) Session.get(); + } + + private LoginUser loginUser; + public boolean isLogin() { + return ((this.loginUser == null) == false); + } + public LoginUser getLoginUser() { + return this.loginUser; + } + public void setLoginUser(LoginUser loginUser) { + this.loginUser = loginUser; + } + public void clearLoginUser() { + this.loginUser = null; + } + public static class LoginUser extends Usr{ + /* 拡張無し */ + } + public void setLoginUser(Usr usr) { + loginUser = new LoginUser(); + usr.copy(loginUser); + + } + + public Class extends Page> returnPageClass; + public PageParameters returnPageParameters; + + + + + + + +} + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/WicketApplication.java b/AMM_web/src/main/java/jp/co/y_net/amm/WicketApplication.java new file mode 100644 index 0000000..cb579dd --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/WicketApplication.java @@ -0,0 +1,133 @@ +package jp.co.y_net.amm; + +import jp.co.y_net.amm.api.ApiChallengestring; +import jp.co.y_net.amm.api.ApiDatainitialize; +import jp.co.y_net.amm.api.ApiGroupmember; +import jp.co.y_net.amm.api.ApiInfo; +import jp.co.y_net.amm.api.ApiLogincheck; +import jp.co.y_net.amm.api.ApiLogout; +import jp.co.y_net.amm.api.ApiMember; +import jp.co.y_net.amm.api.ApiMembergroup; +import jp.co.y_net.amm.common.AppLogger; +import jp.co.y_net.amm.page.DashboardPage; +import jp.co.y_net.amm.page.EntryPasswordPage; +import jp.co.y_net.amm.page.ErrorPage; +import jp.co.y_net.amm.page.GroupListPage; +import jp.co.y_net.amm.page.InfoListPage; +import jp.co.y_net.amm.page.InfoPage; +import jp.co.y_net.amm.page.LoginPage; +import jp.co.y_net.amm.page.MemberDetailPage; +import jp.co.y_net.amm.page.MemberListPage; +import jp.co.y_net.amm.page.OrgDetailPage; +import jp.co.y_net.amm.page.OrgEntryDetailPage; +import jp.co.y_net.amm.page.OrgEntryListPage; +import jp.co.y_net.amm.page.OrgEntryPage; +import jp.co.y_net.amm.page.OrgMemberListPage; +import jp.co.y_net.amm.page.PasswordResetPage; +import jp.co.y_net.amm.page.TopPage; + +import org.apache.wicket.Page; +import org.apache.wicket.RuntimeConfigurationType; +import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.request.Request; +import org.apache.wicket.request.Response; +import org.apache.wicket.spring.injection.annot.SpringComponentInjector; + +/** + * アプリケーション設定クラス + */ +public class WicketApplication extends WebApplication { +//AuthenticatedWebApplication { + + @Override + public Class extends Page> getHomePage() { + return TopPage.class; + } + @Override + protected void init() { + super.init(); + + getRequestCycleSettings().setResponseRequestEncoding("UTF-8"); + getMarkupSettings().setDefaultMarkupEncoding("UTF-8"); + /* Wicket上でStringBeanを使用できるようにする */ + getComponentInstantiationListeners().add(new SpringComponentInjector(this)); + /* Aタグ非表示時にEMタグが表示されるのを回避 */ + getMarkupSettings().setDefaultBeforeDisabledLink(""); + getMarkupSettings().setDefaultAfterDisabledLink(""); + + /* マウント 定義 -------------------------------------------------------------------------------------------*/ + + /* 直接呼び出される可能性のあるものを定義 */ + + + mountPage("/api/challengestring", ApiChallengestring.class); + mountPage("/api/logincheck", ApiLogincheck.class); + mountPage("/api/logout", ApiLogout.class); + mountPage("/api/member", ApiMember.class); + mountPage("/api/info", ApiInfo.class); + mountPage("/api/datainitialize", ApiDatainitialize.class); + + mountPage("/info", InfoPage.class); // 訪問済みリンク、未訪問リンクを識別するためにも必要 + mountPage("/orgentry", OrgEntryPage.class); + mountPage("/passwordreset", PasswordResetPage.class); // メールに記載する + + mountPage("/memberlist", MemberListPage.class); + mountPage("/orgdetail", OrgDetailPage.class); + + mountPage("/memberdetail", MemberDetailPage.class); + + mountPage("/orgentrylist", OrgEntryListPage.class); + mountPage("/orgmemberlist", OrgMemberListPage.class); + mountPage("/infolist", InfoListPage.class); + + mountPage("/entrypassword", EntryPasswordPage.class); // メールに記載する + mountPage("/orgentrydetail", OrgEntryDetailPage.class); // メールに記載する + + + mountPage("/grouplist", GroupListPage.class); + + + mountPage("/dashboard", DashboardPage.class); + + /* API:ユーザ情報(所属グループ)取得 */ + mountPage("/api/membergroup", ApiMembergroup.class); + /* API:グループ所属メンバー情報取得 */ + mountPage("/api/groupmember", ApiGroupmember.class); + + + /* マウント 定義 ここまで------------------------------------------------------------------------------------*/ + + + /* セッションが切れた場合に表示するページ */ + getApplicationSettings().setPageExpiredErrorPage(LoginPage.class); + /* Internal Error時に表示するページ */ + getApplicationSettings().setInternalErrorPage(ErrorPage.class); + /* */ + this.getPageSettings().setVersionPagesByDefault(false); + /* 開発モード(DEVELOPMENT)のときでも、配備モード(DEPLOYMENT)と同様にTMLからwicketタグを削除するようにする */ + getMarkupSettings().setStripWicketTags(true); + /* エラーハンドリングなどを定義 */ + getRequestCycleListeners().add(new AppRequestCycleListener()); + + + } + + /* セッション管理 ------------------------------------------------------------------------------------------------*/ + @Override + public AppSession newSession(Request request, Response response) { + return new AppSession(request); + } + + + /* アプリケーションの実行モードを設定 */ + @Override + public RuntimeConfigurationType getConfigurationType() { + if(AppLogger.isDebug()) { + return RuntimeConfigurationType.DEVELOPMENT; // 開発用 + } else { + return RuntimeConfigurationType.DEPLOYMENT; // 本番用 + } + } + +} + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/WicketApplication.properties b/AMM_web/src/main/java/jp/co/y_net/amm/WicketApplication.properties new file mode 100644 index 0000000..faa9b19 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/WicketApplication.properties @@ -0,0 +1,7 @@ +# +# WicketApplication.properties +# +# App.properties\u3078\u79fb\u884c\u3057\u307e\u3057\u305f\u3002 +# +test = test.test +#EOF diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiChallengestring.java b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiChallengestring.java new file mode 100644 index 0000000..7c246c4 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiChallengestring.java @@ -0,0 +1,27 @@ +package jp.co.y_net.amm.api; + +import jp.co.y_net.amm.service.Challengestring; + +import org.apache.wicket.spring.injection.annot.SpringBean; + +public class ApiChallengestring extends ApiPage { + + @SpringBean(name="challengestring") + private Challengestring challengestring; + + public ApiChallengestring(){ + + /* 主処理 */ + Result result = new Result(); + result.value = challengestring.execute(); + + /* JSONのレスポンスを設定 */ + super.setResponse(result); + } + /** + * 処理結果 + */ + public static class Result extends ApiResult{ + public String value; + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiDatainitialize.java b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiDatainitialize.java new file mode 100644 index 0000000..08f75f0 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiDatainitialize.java @@ -0,0 +1,74 @@ +package jp.co.y_net.amm.api; + +import java.util.List; + +import jp.co.y_net.amm.dao.AppDef; +import jp.co.y_net.amm.dao.Org; +import jp.co.y_net.amm.dao.OrgDao; +import jp.co.y_net.amm.dao.Usr; +import jp.co.y_net.amm.dao.UsrDao; + +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.spring.injection.annot.SpringBean; + +public class ApiDatainitialize extends ApiPage { + + @SpringBean(name="usrDao") + protected UsrDao usrDao; + + @SpringBean(name="orgDao") + protected OrgDao orgDao; + + public ApiDatainitialize(PageParameters pageParams) { + + /* 主処理 */ + Result result = new Result(); + + String msg = ""; + + /* 初期管理者(スーパーユーザー)、初期組織(「運営管理」)のデータがなければ作成する。 */ + Org cndOrg = new Org(); + cndOrg.setKind(Org.KIND_運営管理); + List listOrg = orgDao.get(cndOrg); + Org org運営管理; + if(listOrg.isEmpty()) { + /* 組織「運営管理」が登録されていない */ + org運営管理 = new Org(); + org運営管理.setKind(Org.KIND_運営管理); + org運営管理.setName("運営管理"); + org運営管理.setStatus(Org.STATUS_本登録済み); + + orgDao.add(org運営管理, AppDef.USERID_NONE); // データ登録 + + msg += "組織「運営管理」を登録しました。"; + + } else { + org運営管理 = listOrg.get(0); + + msg += "組織「運営管理」は登録済みです。"; + } + + Usr cndUsr = new Usr(); + cndUsr.setKind(Usr.KIND_運営管理者); + List listUsr = usrDao.get(cndUsr); + if(listUsr.isEmpty()) { + Usr usr運営管理者 = Usr.create運営管理者代表(org運営管理); + usrDao.add(usr運営管理者, AppDef.USERID_NONE); // データ登録 + + msg += "運営管理者を登録しました。"; + } else { + msg += "運営管理者は登録済みです。"; + } + + result.rmsg = msg; + + /* JSONのレスポンスを設定 */ + setResponse(result); + } + /** + * 処理結果 + */ + public static class Result extends ApiResult{ + + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiGroupmember.java b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiGroupmember.java new file mode 100644 index 0000000..0b55981 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiGroupmember.java @@ -0,0 +1,80 @@ +package jp.co.y_net.amm.api; + +import java.util.ArrayList; +import java.util.List; + +import jp.co.y_net.amm.dao.Grp; +import jp.co.y_net.amm.dao.GrpDao; +import jp.co.y_net.amm.dao.Grpusr; +import jp.co.y_net.amm.dao.GrpusrDao; +import jp.co.y_net.amm.dao.Usr; +import jp.co.y_net.amm.dao.UsrDao; + +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.spring.injection.annot.SpringBean; + +public class ApiGroupmember extends ApiPage { + + @SpringBean(name="usrDao") + protected UsrDao usrDao; + + @SpringBean(name="grpDao") + protected GrpDao grpDao; + + @SpringBean(name="grpusrDao") + protected GrpusrDao grpusrDao; + + public ApiGroupmember(PageParameters pageParams) { + + String grpid = pageParams.get("grpid").toString(); + List listResult = new ArrayList(); + + + if(grpid == null) { + setResponse(new Result().err("パラメータ grpid が指定されていません。")); + return; + + } else { + try { + Integer iGrpid = Integer.parseInt(grpid); + Grp grp = grpDao.getByGrpid(iGrpid); + + if(grp == null) { + setResponse(new Result().err("指定された grpid からデータが取得できませんでした。")); + return; + + } else { + + Grpusr cndGrpusr = new Grpusr(); + cndGrpusr.setGrpid(iGrpid); + cndGrpusr.setStatus(Grpusr.STATUS_参加中); + List list = grpusrDao.get(cndGrpusr); + + /* 戻り値作成 */ + for(Grpusr gu: list) { + Usr u = usrDao.getByUsrid(gu.getUsrid()); + Result r = new Result(); + //r.usrloginid = URLEncoder.encode(u.getLoginid(), "UTF-8"); // URLエンコード; + r.usrloginid = u.getLoginid(); + r.usrname = u.getName(); + + listResult.add(r); + } + } + } catch (NumberFormatException e) { + setResponse(new Result().err("パラメータ grpid は不正です。")); + return; + } + } + + /* JSONのレスポンスを設定 */ + setResponse(listResult); + } + /** + * 処理結果 + */ + public static class Result extends ApiResult{ + public String usrloginid; + public String usrname; + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiInfo.java b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiInfo.java new file mode 100644 index 0000000..dc8d964 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiInfo.java @@ -0,0 +1,72 @@ +package jp.co.y_net.amm.api; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import jp.co.y_net.amm.dao.Inf; +import jp.co.y_net.amm.dao.InfDao; + +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.spring.injection.annot.SpringBean; + +public class ApiInfo extends ApiPage { + + + @SpringBean(name="infDao") + protected InfDao infDao; + + public ApiInfo(PageParameters pageParams) { + +// String infid = pageParams.get("infid").toString(); + + + /* 主処理 */ + List listResult = new ArrayList(); + +// if(infid == null) { +// setResponse(result.err("パラメータ infid が指定されていません。")); +// return; +// } + + Inf cnd = new Inf(); + cnd.setStatus(Inf.STATUS_掲載中); + List listInf = infDao.get(cnd); + + /* pubdateの降順とする */ + Collections.sort(listInf, new Comparator() { + @Override + public int compare(Inf o1, Inf o2) { + if (o1 != null && o2 != null) { + if (o1.getPubdate() != null && o2.getPubdate() != null) { + return o1.getPubdate().compareTo(o2.getPubdate()) * -1; // 降順 + } + } + return 0; + } + }); + + for(Inf i: listInf) { + Result r = new Result(); + r.infid = i.getInfid(); + r.title = i.getTitle(); + r.pubdate = i.getPubdate(); + listResult.add(r); + } + + + /* JSONのレスポンスを設定 */ + setResponse(listResult); + } + + /** + * 処理結果 + */ + public static class Result extends ApiResult{ + public Integer infid; + public String title; + public Long pubdate; + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiLogincheck.java b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiLogincheck.java new file mode 100644 index 0000000..3ed9542 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiLogincheck.java @@ -0,0 +1,77 @@ +package jp.co.y_net.amm.api; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +import jp.co.y_net.amm.service.Logincheck; +import jp.co.y_net.amm.service.Logincheck.LogincheckResult; + +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.spring.injection.annot.SpringBean; + +public class ApiLogincheck extends ApiPage { + + @SpringBean(name = "logincheck") + private Logincheck logincheck; + + public ApiLogincheck(PageParameters pageParams) { + + /* 主処理 */ + Result result = new Result(); + + String loginid = pageParams.get("loginid").toString(); + String cres = pageParams.get("cres").toString(); + String cstr = pageParams.get("cstr").toString(); + + if (loginid == null) { + setResponse(result.err("パラメータ loginid が指定されていません。")); + return; + } + if (cres == null) { + setResponse(result.err("パラメータ cres が指定されていません。")); + return; + } + if (cstr == null) { + setResponse(result.err("パラメータ cstr が指定されていません。")); + return; + } + + try { + loginid = URLDecoder.decode(loginid, "UTF-8"); // URLデコード + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + + /* 2016/02/22 戻り値にuseridを追加 */ + LogincheckResult logincheckResult = logincheck.executeFromApi(loginid, cres, cstr); // 認証実施 + if(0 == logincheckResult.errorCode) { // 認証実施 + + /* 認証成功 */ + result.value = true; + result.errorCode = logincheckResult.errorCode; + result.usrid = logincheckResult.usrid; + } else { + + /* 認証失敗 */ + result.value = false; + result.errorCode = logincheckResult.errorCode; + result.rmsg = Logincheck.errorMemo.get(logincheckResult.errorCode); + } + + + /* JSONのレスポンスを設定 */ + setResponse(result); + } + + /** + * 処理結果 + * + * @author k_inaba + */ + public static class Result extends ApiResult { + public boolean value; + public Integer errorCode; + public Integer usrid; /* 2016/02/22 戻り値にuseridを追加 */ + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiLogout.java b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiLogout.java new file mode 100644 index 0000000..93171d7 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiLogout.java @@ -0,0 +1,63 @@ +package jp.co.y_net.amm.api; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +import jp.co.y_net.amm.common.AppUtils; +import jp.co.y_net.amm.dao.AppDef; +import jp.co.y_net.amm.dao.Usr; +import jp.co.y_net.amm.dao.UsrDao; +import jp.co.y_net.amm.service.Logout; + +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.spring.injection.annot.SpringBean; + +public class ApiLogout extends ApiPage { + + @SpringBean(name="logout") + private Logout logout; + + @SpringBean(name="usrDao") + protected UsrDao usrDao; + + public ApiLogout(PageParameters pageParams) { + + String loginid = pageParams.get("loginid").toString(); + + /* 主処理 */ + Result result = new Result(); + + if(loginid == null) { + setResponse(result.err("パラメータ loginid が指定されていません。")); + return; + } + + try { + loginid = URLDecoder.decode(loginid, "UTF-8"); // URLデコード + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + + /* ログアウト処理 */ + logout.execute(loginid); + + /* 2016/03/30 ログアウト要求日時を登録する */ + Usr usr = usrDao.getByLoginid(loginid); + if(usr != null) { + usr.setRequestlogoutdate(AppUtils.createNowLong()); + usrDao.update(usr, AppDef.USERID_NONE); + } + + + /* JSONのレスポンスを設定 */ + setResponse(result); + } + /** + * 処理結果 + * @author k_inaba + */ + public static class Result extends ApiResult{ +// public boolean value; + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiMember.java b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiMember.java new file mode 100644 index 0000000..c88fd2f --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiMember.java @@ -0,0 +1,85 @@ +package jp.co.y_net.amm.api; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.List; + +import jp.co.y_net.amm.dao.Org; +import jp.co.y_net.amm.dao.OrgDao; +import jp.co.y_net.amm.dao.Usr; +import jp.co.y_net.amm.dao.UsrDao; + +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.spring.injection.annot.SpringBean; + +/** + * @author k_inaba + * + * 2015/10/02 ユーザIDも返却する + * + */ +public class ApiMember extends ApiPage { + + + + @SpringBean(name="usrDao") + protected UsrDao usrDao; + + @SpringBean(name="orgDao") + protected OrgDao orgDao; + + public ApiMember(PageParameters pageParams) { + + String loginid = pageParams.get("loginid").toString(); + + /* 主処理 */ + Result result = new Result(); + + if(loginid == null) { + setResponse(result.err("パラメータ loginid が指定されていません。")); + return; + } + + try { + loginid = URLDecoder.decode(loginid, "UTF-8"); // URLデコード + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + + Usr usr = usrDao.getByLoginid(loginid); + + if(usr == null) { + setResponse(result.err("指定された loginid からデータが取得できませんでした。")); + return; + } else { + result.name = usr.getName(); + + result.usrid = usr.getUsrid(); + + result.kind = usr.getKind(); + + Org cnd = new Org(); + cnd.setOrgid(usr.getOrgid()); + List orgs = orgDao.get(cnd); + + if(orgs.size() > 0) { + result.orgid =orgs.get(0).getOrgid(); + result.orgname = orgs.get(0).getName(); + } + + } + + /* JSONのレスポンスを設定 */ + setResponse(result); + } + /** + * 処理結果 + */ + public static class Result extends ApiResult{ + public String name; + public Integer usrid; + public Integer orgid; + public String orgname; + public Integer kind; // 2016/03/07 追加 + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiMembergroup.java b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiMembergroup.java new file mode 100644 index 0000000..35c1e15 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiMembergroup.java @@ -0,0 +1,78 @@ +package jp.co.y_net.amm.api; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.List; + +import jp.co.y_net.amm.dao.Grp; +import jp.co.y_net.amm.dao.GrpDao; +import jp.co.y_net.amm.dao.Grpusr; +import jp.co.y_net.amm.dao.GrpusrDao; +import jp.co.y_net.amm.dao.Usr; +import jp.co.y_net.amm.dao.UsrDao; + +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.spring.injection.annot.SpringBean; + +public class ApiMembergroup extends ApiPage { + + @SpringBean(name="usrDao") + protected UsrDao usrDao; + + @SpringBean(name="grpDao") + protected GrpDao grpDao; + + @SpringBean(name="grpusrDao") + protected GrpusrDao grpusrDao; + + public ApiMembergroup(PageParameters pageParams) { + + String loginid = pageParams.get("loginid").toString(); + List listResult = new ArrayList(); + + if(loginid == null) { + setResponse(new Result().err("パラメータ loginid が指定されていません。")); + return; + } else { + try { + loginid = URLDecoder.decode(loginid, "UTF-8"); // URLデコード + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + Usr usr = usrDao.getByLoginid(loginid); + + if(usr == null) { + setResponse(new Result().err("指定された loginid からデータが取得できませんでした。")); + return; + } else { + + Grpusr cndGrpusr = new Grpusr(); + cndGrpusr.setUsrid(usr.getUsrid()); + cndGrpusr.setStatus(Grpusr.STATUS_参加中); + List list = grpusrDao.get(cndGrpusr); + + /* 戻り値作成 */ + for(Grpusr gu: list) { + Integer grpid = gu.getGrpid(); + Grp g = grpDao.getByGrpid(gu.getGrpid()); + Result r = new Result(); + r.grpid = grpid; + r.grpname = g.getName(); + + listResult.add(r); + } + } + } + + /* JSONのレスポンスを設定 */ + setResponse(listResult); + } + /** + * 処理結果 + */ + public static class Result extends ApiResult{ + public Integer grpid; + public String grpname; + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiPage.html b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiPage.html new file mode 100644 index 0000000..4ed4eef --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiPage.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiPage.java b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiPage.java new file mode 100644 index 0000000..4a8dcd2 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/api/ApiPage.java @@ -0,0 +1,135 @@ +package jp.co.y_net.amm.api; + +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler; +import org.apache.wicket.request.http.WebResponse; +import org.apache.wicket.util.resource.StringResourceStream; +import org.apache.wicket.util.time.Time; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * @author k_inaba + */ +public abstract class ApiPage extends WebPage{ + + @Override + protected void configureResponse(WebResponse response){ +// response.setContentType("application/json; charset=utf-8"); + response.setContentType("application/json; utf-8"); + + /* ブラウザキャッシュ無効化 */ + java.util.Calendar objCal1=java.util.Calendar.getInstance(); + java.util.Calendar objCal2=java.util.Calendar.getInstance(); + objCal2.set(1970,0,1,0,0,0); + + response.setDateHeader("Last-Modified",Time.valueOf(objCal1.getTime())); + response.setDateHeader("Expires",Time.valueOf(objCal2.getTime())); + response.setHeader("progma","no-cache"); + response.setHeader("Cache-Control","no-cache"); + + + super.configureResponse(response); + } + + public void setResponse(Object result) { + ObjectMapper objectMapper = new ObjectMapper(); + String json; + try { + json = objectMapper.writeValueAsString(result); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + getRequestCycle().scheduleRequestHandlerAfterCurrent( + new ResourceStreamRequestHandler(new StringResourceStream(json)) + ); + } +// /* ---------------------------------------------- +// * パラメータ取得ユーティリティ +// */ +// protected String getParam(String key) { +// if (getPageParameters() == null) { +// return ""; +// } else { +// return getPageParameters().get(key).toString(""); +// } +// } + + /* ---------------------------------------------- + * 返却値の共通実装 + */ + public static class ApiResult{ + + public boolean r = true; + public String rmsg = null; + + public ApiResult() { + /* デフォルトコンストラクタ */ + } + public ApiResult(String rmsg) { + this.r = false; + this.rmsg = rmsg; + } + public ApiResult(Exception e) { + this.rmsg = e.getMessage(); + if (rmsg == null) { + this.rmsg = e.getClass().getSimpleName(); + } + } + public ApiResult err(String rmsg) { + this.r = false; + this.rmsg = rmsg; + return this; + } + public ApiResult err(Exception e) { + this.rmsg = e.getMessage(); + if (rmsg == null) { + this.rmsg = e.getClass().getSimpleName(); + } + return this; + } + } + +} +//// String text = "{\"a\":123,\"b\":true,\"c\":\"あいう\"}"; +//String text = readTextAsString(file.getAbsolutePath()); +//ObjectMapper mapper = new ObjectMapper(); +//T bean; +//try { +// // JsonNode root = mapper.readTree(text); +// // String c = root.get("c").asText(); +// bean = mapper.readValue(text, clz); +//} catch (JsonProcessingException e) { +// throw new RuntimeException(e); +//} catch (IOException e) { +// throw new RuntimeException(e); +//} + + +///** +//* 保存する +//* @param bean 保存するデータ +//* @return id 保存したときに付与されたid +//*/ +//public int insert(Object bean) { +// String tablename = bean.getClass().getName(); +// int maxId = -1; +// File[] existfiles = getDbFiles(tablename); +// for (File existfile : existfiles) { +// int id = toId(existfile.getName(), tablename); +// maxId = Math.max(maxId, id); +// } +// int insertId = maxId + 1; +// ObjectMapper objectMapper = new ObjectMapper(); +// try { +// String json = objectMapper.writeValueAsString(bean); +// File f = toFile(bean.getClass(), (insertId)); +// writeText(f.getAbsolutePath(), json); +// } catch (JsonProcessingException e) { +// throw new RuntimeException(e); +// } +// return insertId; +//} + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/AppLabel.java.back b/AMM_web/src/main/java/jp/co/y_net/amm/common/AppLabel.java.back new file mode 100644 index 0000000..a3089f4 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/AppLabel.java.back @@ -0,0 +1,66 @@ +package jp.co.y_net.amm.common; + +import jp.co.y_net.amm.dao.Localestring; +import jp.co.y_net.amm.dao.LocalestringDao; +import jp.co.y_net.amm.service.LocaleStringSearch; + +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.model.Model; +import org.apache.wicket.spring.injection.annot.SpringBean; + +/** + * 運用中に変わる可能性のあるメッセージの取得を行う。 + * + * + * + * + * 通常の利用 + * 引数 initialString に画面に表示した文字列を設定する。 + * プログラムは自動的に、このメッセージをデータベースへ登録する。 + * 二回目以降の呼び出しでは、initialString とは関係なく、データベースに登録された値を取得する。 + * + * メッセージの変更 + * 1.データベース(localestring)に登録されている値を修正する。 + * 2.ダッシュボードからキャッシュクリアを実行する。 + * + * @author k_inaba + */ +public class AppLabel extends Label{ + + @SpringBean(name="localestringDao") + private LocalestringDao localestringDao; + + @SpringBean(name="localeStringSearch") + private LocaleStringSearch ls; + + + public AppLabel(String id) { + super(id); + } + public AppLabel(String screenId, String id, String initialString) { + super(id); + String controlid = id; + String message = ls.getDisplayString(screenId, controlid, 0, ""); + if(StringUtils.isEmpty(message)) { + /* まだ登録されていない文字列なので 登録する */ + Localestring newItem = new Localestring(); + newItem.setScreenid(screenId); + newItem.setControlid(controlid); + newItem.setPrintstring(initialString); + newItem.setLanguageid(0); + newItem.setNum(""); + localestringDao.add(newItem); + /* LocaleStringSearchのキャッシュをクリアして再取得する */ + ls.clearCash(); + message = ls.getDisplayString("", controlid, 0, ""); + } + this.setDefaultModel(Model.of(message)); + } + + public static AppLabel of(String screenId, String id, String def) { + return new AppLabel(screenId, id, def); + } + + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/AppLogger.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/AppLogger.java new file mode 100644 index 0000000..59c6545 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/AppLogger.java @@ -0,0 +1,210 @@ +package jp.co.y_net.amm.common; + +import org.slf4j.LoggerFactory; + +/** + * 標準のロギングクラス + * + * エラーレベルは logback.xml の LEVEL_APP にて定義される。 + * ・通常運用中は ERROR レベル + * ・調査中は INFO レベル + * とする。 + * + * ■ 各開発者による利用方法 + * debug, info, error のいずれかのメソッドを使用する。詳しくは、各メソッドのコメントを参照のこと。 + * + * ■ アプリケーションアーキテクチャからの利用 + * アプリケーションのエラーが発生したときは、WicketApplicationクラスから、RequestCycleListenerを経由して呼び出される。 + * + * ■ 利用のメリット + * ・サーバーの catalina.out, catalina.err にアプリケーション固有のエラーが出力されなくなり、 + * /var/log/app/tomcat/~/logs/AppLog に出力され、世代管理される。 + * ・ログのレベルを指定できるため、開発時に記述したデバッグメッセージをわざわざ消さなくても良くなる。 + * ・logbackを使用しているので、運用中にログ出力レベルの変更が可能。 + * + * K.inaba 2014/02/01 + */ +public class AppLogger { + private static boolean isLocal; + private static org.slf4j.Logger loggerSlf = LoggerFactory.getLogger(AppLogger.class.getName()); + + static { + /* + * 開発者担当者のOSのユーザ名を列挙する。 + * ここに記載がある場合に限り、ローカル開発環境とみなして、標準出力(Eclipseのコンソールなど)へ + * 出力を行う。 + */ + String debugKeys = ResourceReader.getStringQuick("debug.users"); + String[] arrayDebugKey; + if(debugKeys == null) { + arrayDebugKey = new String[]{}; + } else { + arrayDebugKey = debugKeys.split(","); + } + for(String key: arrayDebugKey) { + if (key.trim().equals(System.getenv("USERNAME"))) { + isLocal = true; + break; + } + } + } + + + public static void main(String[] args) throws InterruptedException { + sample(); + } + /** 利用方法のサンプル */ + private static void sample() { + String str = "sundata"; + AppLogger.debug("変数 str の値 = " + str); + + /* + * Infoレベルは運用中に必要となるかもしれないレベルの出力を担う。 + * 通常は表示されない。(開発者のコンソールには表示される。) + * 運用中に詳細なログが必要となった時に、「LEVEL_APP」property の設定を INFO にすること。 + */ + AppLogger.info("Infoレベルの出力。"); + AppLogger.info(new Exception("例外クラスにも対応")); + + /* + * Errorレベルは必ずログに出力される。 + * Try ~ Catch で活用する。 + */ + AppLogger.error("Errorレベルの出力。"); + AppLogger.error(new Exception("例外クラスにも対応")); + try { + int[] i = new int[]{1, 2, 3}; + if (i[3] == 4) { + return; + } + } catch (Exception e) { + AppLogger.error("配列の操作に失敗", e); + } + } + public static boolean isDebug() { + return isLocal; + } + /** + * 開発時のみ出力したいログを出力する。 + * → ローカル環境の標準出力(Eclipseのコンソールなど)にのみ出力される。 + * + * @param message 出力する文字列 + */ + public static void debug(String message) { + if (isLocal) System.out.println("[DEBUG] " + toPlace(getFromStack()) + "\n" + toString(message)); + } + /** + * 何らかのエラーが発生した時に、調査の参考となるログを出力する。 + * → logback.xml LEVEL_APP が INFO であれば、/var/log/app/tomcat/~/logs/AppLog に出力される。 + * → ローカル環境の標準出力(Eclipseのコンソールなど)にも出力される。 + * + * 【ログの出力先】 + * Eclipse : プロジェクト直下 sdc/logs/AppLog.yyyy-mm-dd + * Linux:%Tomcatインスタンス%/logs/AppLog.yyyy-mm-dd + * + * @param message 出力する文字列 + */ + public static void info(String message) { + if (isLocal) System.out.println("[INFO ] " + toPlace(getFromStack()) + "\n" + toString(message)); + loggerSlf.info(toPlace(getFromStack()) + "\n" + toString(message)); + } + /** + * @see AppLogger#info(String) + * @param exception 出力する例外クラス + */ + public static void info(Throwable exception) { + if (isLocal) System.out.println("[INFO ] " + toPlace(getFromStack()) + "\n" + toString(exception)); + loggerSlf.info(toPlace(getFromStack()) + "\n" + toString(exception)); + } + /** + * @see AppLogger#info(String) + * @param message 出力する文字列 + * @param exception 出力する例外クラス + */ + public static void info(String message, Throwable exception) { + if (isLocal) System.out.println("[INFO ] " + toPlace(getFromStack()) + "\n" + toString(message)); + if (isLocal) System.out.println("[INFO ] " + toPlace(getFromStack()) + "\n" + toString(exception)); + loggerSlf.info(toPlace(getFromStack()) + "\n" + toString(message)); + loggerSlf.info(toPlace(getFromStack()) + "\n" + toString(exception)); + } + /** + * Try ~ Catch などで使用する。System.err.println の代用。 + * @param message 出力する文字列 + */ + public static void error(String message) { + if (isLocal) System.out.println("[ERROR] " + toPlace(getFromStack()) + "\n" + toString(message)); + loggerSlf.error(toPlace(getFromStack()) + "\n" + toString(message)); + } + /** + * Try ~ Catch などで使用する。e.printStackTrace();の代用 + * @param exception 出力する例外クラス + */ + public static void error(Throwable exception) { + if (isLocal) System.out.println("[ERROR] " + toPlace(getFromStack()) + "\n" + toString(exception)); + loggerSlf.error(toPlace(getFromStack()) + "\n" + toString(exception)); + } + /** + * @param message + * @param exception + */ + public static void error(String message, Throwable exception) { + if (isLocal) System.out.println("[ERROR] " + toPlace(getFromStack()) + "\n" + toString(message)); + if (isLocal) System.out.println("[ERROR] " + toPlace(getFromStack()) + "\n" + toString(exception)); + loggerSlf.error(toPlace(getFromStack()) + "\n" + toString(message)); + loggerSlf.error(toPlace(getFromStack()) + "\n" + toString(exception)); + } + + + private static StackTraceElement getFromStack() { + return new Throwable().getStackTrace()[2]; // 必ず呼び出し元から2階層目でこのメソッドを呼ぶこと + } + private static String toPlace(StackTraceElement stack) { + return stack.getClassName() + "#" + stack.getMethodName() + "(" + + stack.getFileName() + ":" + stack.getLineNumber() + ")"; + } + private static String toString(Object message) { + String log; + if (message instanceof Throwable) { + log = " " + readStackTrace(new StringBuilder(), (Throwable) message, 1, null).toString(); + } else if (message == null) { + log = " " + null; + } else { + log = " " + message.toString(); + } + return log; + } + /** + * Exceptionの解析ツール + * @param sb + * @param throwable + * @param filter フィルター (スタックトレースの内、指定された文字列以外は無視する。全て有効とする場合はnullを指定。) + */ + private static StringBuilder readStackTrace(StringBuilder sb, Throwable throwable, int token, String filter) { + if(sb == null) sb = new StringBuilder(); + final String LINE_SEP = System.getProperty("line.separator"); + try { + String spacer = ""; + for (int i = 0; i < token; i++) { + spacer += " "; + } + sb.append(spacer + throwable.getClass().getName() + ":" + throwable.getMessage() + LINE_SEP); + StackTraceElement[] se = throwable.getStackTrace(); + for (int i = 0; i < se.length; i++) { + String trace = se[i].toString(); + if(filter == null + || (filter != null && trace.startsWith(filter))) { + + sb.append(spacer + " " + trace + LINE_SEP); + } + } + if (throwable.getCause() != null) { + /* 再帰呼び出し */ + readStackTrace(sb, throwable.getCause(), token + 1, filter); + } + } catch (Exception e) { + /* Exception解析でのエラーは無視することで、無限ループを回避 */ + e.printStackTrace(); + } + return sb; + } +} \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/AppSendMail.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/AppSendMail.java new file mode 100644 index 0000000..c96aaa3 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/AppSendMail.java @@ -0,0 +1,139 @@ +package jp.co.y_net.amm.common; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Properties; + +import javax.mail.Address; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AppSendMail { + private static Logger loggerSlfMail = LoggerFactory.getLogger("AmmMail"); + public static void loggingTest(String msg) { + loggerSlfMail.info(msg); + } + + public static class MailSetting{ + private String mailTo; + private String title; + private String body; + public void setMailTo(String mailTo) { + this.mailTo = mailTo; + } + public void setTemplate(String text) { + String tmp = text; + List lines = Arrays.asList(tmp.split("\n")); + for (String line: lines) { + if(title == null) { + title = line; // 1行目はタイトル + } else { + if(body == null) body = ""; + body += line + "\n"; + } + } + } + public void replace(String key, String value) { + body = body.replace("@"+ key +"@", value); + } + + @Override + public String toString() { + return "MailSetting [title=" + title + ", body=" + body + "]"; + } + } + + public static boolean send(MailSetting mainSetting) { + + Properties objPrp = new Properties(); + objPrp.put("mail.smtp.host", ResourceReader.getStringQuick("Smtp")); + objPrp.put("mail.host", ResourceReader.getStringQuick("Smtp")); + objPrp.put("mail.from", ResourceReader.getStringQuick("MailFrom")); + + /* メールセッションを確立 */ + Session mailSes = Session.getDefaultInstance(objPrp,null); + + /* 送信メッセージを生成 */ + MimeMessage objMsg = new MimeMessage(mailSes); + + try { + /* 設定:送信先 */ + List lstAddress = new ArrayList(); + Address to1 = new InternetAddress(mainSetting.mailTo); + lstAddress.add(to1); + Address[] to = (Address[]) lstAddress.toArray(new Address[0]); + objMsg.setRecipients(Message.RecipientType.TO, to); + + /* 設定:Fromヘッダ */ + InternetAddress objFrm = new InternetAddress(ResourceReader.getStringQuick("MailFrom")); + objMsg.setFrom(objFrm); + + /* 設定:件名 */ + objMsg.setSubject(mainSetting.title, "ISO-2022-JP"); + + /* 設定:本文 */ + String honbun = AppStringUtils.utf8ToSjis(mainSetting.body); + objMsg.setText(new String(honbun.getBytes("ISO-2022-JP")), "ISO-2022-JP"); + objMsg.setSentDate(new Date()); + + /* 送信メールのロギング */ + + loggerSlfMail.info("-----------------------------------------------------------"); + loggerSlfMail.info("Recipients:" + mainSetting.mailTo); + loggerSlfMail.info("Subject:" + mainSetting.title); + loggerSlfMail.info("Text:" + mainSetting.body); + + + /* メール送信実行 */ + Transport.send(objMsg); + + loggerSlfMail.info("Result:Success"); + return true; + + } catch (MessagingException e) { + loggerSlfMail.info("Result:Failure!!(see application log...)"); + AppLogger.error(e); + return false; + } catch (UnsupportedEncodingException e) { + loggerSlfMail.info("Result:Failure!!(see application log...)"); + AppLogger.error(e); + return false; + } + } + + /* + * メールサーバー構築 + * http://itpro.nikkeibp.co.jp/article/COLUMN/20060427/236452/ + * https://technet.microsoft.com/ja-jp/library/cc772058%28v=ws.10%29.aspx + * サーバーマネージャー>機能ビュー + */ + + public static void main(String[] args) { + // TODO インフラに ZASEKI サーバー 25ポート を開けてもらってテスト。 + + //sendMail(); + + /* + * 新着申請内容受信メール + */ + MailSetting setting = new MailSetting(); + setting.setTemplate(ResourceReader.getText("message/mail.orgentry")); + setting.mailTo = ResourceReader.getStringQuick("mailto.olgentry"); + setting.replace("申請画面URL", "http://localhost:8080/AMM/orgentrydetail?orgid=" + 3); + send(setting); + + System.out.println(setting.toString()); + } + +} + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/AppStringUtils.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/AppStringUtils.java new file mode 100644 index 0000000..a921ed7 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/AppStringUtils.java @@ -0,0 +1,445 @@ +package jp.co.y_net.amm.common; + +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.wicket.model.Model; + + +public class AppStringUtils { + + public static String trim(String src) { + if(src == null) return ""; + return src.trim(); + } + public static String trim(Model ceModel) { + if(ceModel == null) return ""; + if(ceModel.getObject() == null) return ""; + return trim(ceModel.getObject().getId()); + } + public static String trimHalf(String str) { + return convZenkakuToHankaku(trim(str)); + } + + + + + + + + + /* ------------------------------------------------------------------------------------------------------------ */ + /* + * 既存より移植 + */ + + /** 半角カタカナ<-->全角カタカナ変換テーブル */ + private static final String kanaHanZenTbl[][] = { + /** 2文字構成の濁点付き半角カナ */ + /** 必ずテーブルに先頭に置いてサーチ順を優先すること */ + { "ガ", "ガ" }, { "ギ", "ギ" }, { "グ", "グ" }, { "ゲ", "ゲ" }, { "ゴ", "ゴ" }, + { "ザ", "ザ" }, { "ジ", "ジ" }, { "ズ", "ズ" }, { "ゼ", "ゼ" }, { "ゾ", "ゾ" }, + { "ダ", "ダ" }, { "ヂ", "ヂ" }, { "ヅ", "ヅ" }, { "デ", "デ" }, { "ド", "ド" }, + { "バ", "バ" }, { "ビ", "ビ" }, { "ブ", "ブ" }, { "ベ", "ベ" }, { "ボ", "ボ" }, + { "パ", "パ" }, { "ピ", "ピ" }, { "プ", "プ" }, { "ペ", "ペ" }, { "ポ", "ポ" }, + { "ヴ", "ヴ" }, + /** 1文字構成の半角カナ */ + { "ア", "ア" }, { "イ", "イ" }, { "ウ", "ウ" }, { "エ", "エ" }, { "オ", "オ" }, + { "カ", "カ" }, { "キ", "キ" }, { "ク", "ク" }, { "ケ", "ケ" }, { "コ", "コ" }, + { "サ", "サ" }, { "シ", "シ" }, { "ス", "ス" }, { "セ", "セ" }, { "ソ", "ソ" }, + { "タ", "タ" }, { "チ", "チ" }, { "ツ", "ツ" }, { "テ", "テ" }, { "ト", "ト" }, + { "ナ", "ナ" }, { "ニ", "ニ" }, { "ヌ", "ヌ" }, { "ネ", "ネ" }, { "ノ", "ノ" }, + { "ハ", "ハ" }, { "ヒ", "ヒ" }, { "フ", "フ" }, { "ヘ", "ヘ" }, { "ホ", "ホ" }, + { "マ", "マ" }, { "ミ", "ミ" }, { "ム", "ム" }, { "メ", "メ" }, { "モ", "モ" }, + { "ヤ", "ヤ" }, { "ユ", "ユ" }, { "ヨ", "ヨ" }, + { "ラ", "ラ" }, { "リ", "リ" }, { "ル", "ル" }, { "レ", "レ" }, { "ロ", "ロ" }, + { "ワ", "ワ" }, { "ヲ", "ヲ" }, { "ン", "ン" }, + { "ァ", "ァ" }, { "ィ", "ィ" }, { "ゥ", "ゥ" }, { "ェ", "ェ" }, { "ォ", "ォ" }, + { "ャ", "ャ" }, { "ュ", "ュ" }, { "ョ", "ョ" }, { "ッ", "ッ" }, + { "。", "。" }, { "「", "「" }, { "」", "」" }, { "、", "、" }, { "・", "・" }, + { "ー", "ー" }, { "", "" } + }; + /** + * 全角→半角に変換する(英字、数字、記号、カタカナ) + * + * @param 対象文字列 + * @return 変換後文字列 + */ + public static String convZenkakuToHankaku(String s){ + String convStr; + + /** 英字、数字、記号 */ + convStr = convZenkakuLatinCharToHankakuLatinChar(s); + + /** カタカナ */ + convStr = convZenkakuKatakanaToHankakuKatakana(convStr); + + return convStr; + } + /** + * 全角ラテン基本文字→半角ラテン基本文字に変換する + * + * ラテン基本文字(英字、数字、記号) + * + * @param 対象文字列 + * @return 変換後文字列 + */ + public static String convZenkakuLatinCharToHankakuLatinChar(String s){ + String str = ""; + + /** パラメータの文字列を先頭から1文字づつ調べる */ + for (int i = 0; i < s.length(); i++) { + /** 文字列から1文字取り出します */ + Character c = new Character(s.substring(i, i + 1).charAt(0)); + + /** Unicode全角ラテン文字のコード範囲(!から~)であるか調べる */ + if (c.compareTo(new Character((char)0xff01)) >= 0 && c.compareTo(new Character((char)0xff5e)) <= 0) { + /** 変換文字から0xfee0を減算して半角文字に変換 */ + Character x = new Character((char) (c.charValue() - (new Character((char)0xfee0)).charValue())); + + /** 文字列としてセット */ + str = str + x.toString(); + } else { + /** 全角ラテン文字以外はそのままセット */ + str = str + s.substring(i, i + 1); + } + } + + /** 変換後文字列を返す */ + return str; + } + /** + * 全角カタカナ→半角カタカナに変換する + * + * @param 対象文字列 + * @return 変換後文字列 + */ + public static String convZenkakuKatakanaToHankakuKatakana(String s) { + String str = ""; + + /** パラメータの文字列を先頭から1文字づつ調べる */ + for (int i = 0, j = 0; i < s.length(); i++) { + /** 文字列から1文字取り出す */ + Character c = new Character(s.substring(i, i + 1).charAt(0)); + + /** Unicode全角カタカナのコード範囲か調べる */ + if (c.compareTo(new Character((char)0x30a1)) >= 0 && c.compareTo(new Character((char)0x30fc)) <= 0) { + /** 半角全角変換テーブルから対応する半角カナを取得して戻り文字列へセット */ + for (j = 0; j < kanaHanZenTbl.length; j++) { + if (s.substring(i).startsWith(kanaHanZenTbl[j][1])) { + str = str + kanaHanZenTbl[j][0]; + break; + } + } + + /** 半角全角変換テーブルにマッチするエントリがなければそのままセット */ + if (j >= kanaHanZenTbl.length) { + str = str + s.substring(i, i + 1); + } + } else { + /** 全角カタカナ以外はそのままセット */ + str = str + s.substring(i, i + 1); + } + } + + /** 変換後文字列を返す */ + return str; + } + /** + * 引数の文字列(UTF-8)を、Shift_JISにエンコードする。 + * @param value 変換対象の文字列 + * @return エンコードされた文字列 + */ + public static String utf8ToSjis(String value) { + try { + /* Sjisにすると文字化けするUnicodeにも対応する。*/ + if(value != null) { + StringBuffer sb = new StringBuffer(); + for(char c: value.toCharArray()) { + sb.append(unicodeToSjis(Character.toString(c))); + } + value = sb.toString(); + } + boolean[] boolAry = new boolean[value.length()]; + byte[] srcStream = value.getBytes("UTF-8"); + value = convert(new String(srcStream, "UTF-8"), "UTF-8", "SJIS"); + boolAry = getQuePos(boolAry,value); + byte[] destStream = value.getBytes("SJIS"); + value = new String(destStream, "SJIS"); + value = convertGeta(value,boolAry); + return value; + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + /** + * 文字列中の「?」の位置を取得する。 + * + * @param value 変換対象の文字列 + * @return boolAry 文字列中の「?」の位置 + */ + private static boolean[] getQuePos(boolean[] boolAry, String value) { + for (int i = 0; i < value.length(); i++) { + if (value.substring(i, i + 1).equals("?")) { + boolAry[i] = true; + } else { + boolAry[i] = false; + } + } + return boolAry; + } + /** + * 文字化け「?」を代用文字「〓」に変換する。 + * + * @param value 変換対象の文字列 + * @param bAry 変換する文字位置 + * @return newVal 変換後の文字列 + */ + private static String convertGeta(String value, boolean[] bAry) { + String newVal = ""; + String c = ""; + for (int i = 0; i < value.length(); i++) { + c = value.substring(i, i + 1); + if (bAry[i] == false) { + if (c.equals("?")) { + c = "〓"; + } + } + newVal = newVal + c; + } + return newVal; + } + /** + * 引数の文字列を、エンコードする。 + * + * @param value 変換対象の文字列 + * @param src 変換前の文字コード + * @param dest 変換後の文字コード + * @return エンコードされた文字列 + */ + private static String convert(String value, String src, String dest) { + Map conversion = createConversionMap(src, dest); + char oldChar; + char newChar; + String key; + for (Iterator itr = conversion.keySet().iterator(); itr.hasNext();) { + key = itr.next(); + oldChar = toChar(key); + newChar = toChar(conversion.get(key)); + value = value.replace(oldChar, newChar); + } + return value; + } + /** + * エンコード情報を作成する + * + * @param src 変換前の文字コード + * @param dest 変換後の文字コード + * @return エンコードされた文字列 + */ + private static Map createConversionMap(String src, String dest) { + Map conversion = new HashMap(); + if ((src.equals("UTF-8")) && (dest.equals("SJIS"))) { + // -(全角マイナス) + conversion.put("U+FF0D", "U+2212"); + // ~(全角チルダ) + conversion.put("U+FF5E", "U+301C"); + // ¢(セント) + conversion.put("U+FFE0", "U+00A2"); + // £(ポンド) + conversion.put("U+FFE1", "U+00A3"); + // ¬(ノット) + conversion.put("U+FFE2", "U+00AC"); + // ―(全角マイナスより少し幅のある文字) + conversion.put("U+2015", "U+2014"); + // ∥(半角パイプが2つ並んだような文字) + conversion.put("U+2225", "U+2016"); + + } else if ((src.equals("SJIS")) && (dest.equals("UTF-8"))) { + // -(全角マイナス) + conversion.put("U+2212", "U+FF0D"); + // ~(全角チルダ) + conversion.put("U+301C", "U+FF5E"); + // ¢(セント) + conversion.put("U+00A2", "U+FFE0"); + // £(ポンド) + conversion.put("U+00A3", "U+FFE1"); + // ¬(ノット) + conversion.put("U+00AC", "U+FFE2"); + // ―(全角マイナスより少し幅のある文字) + conversion.put("U+2014", "U+2015"); + // ∥(半角パイプが2つ並んだような文字) + conversion.put("U+2016", "U+2225"); + + } else { + throw new RuntimeException("この文字コードはサポートしていません。\n・src=" + src + ",dest=" + dest); + } + return conversion; + } + + /** + * 16進表記の文字を取得する。 + * + * @param value 変換対象の文字列 + * @return 16進表記の文字 + */ + private static char toChar(String value) { + return (char) Integer.parseInt(value.trim().substring("U+".length()), 16); + } + + + /** Sjisにすると文字化けするUnicodeにも対応する。*/ + public static String unicodeToSjis(String value) { + if(value == null || value.length() != 1) { + return value; + } + char decodeStr; + + int code = (int)value.charAt(0); + String hex = Integer.toHexString(code); + hex = "u" + hex.toUpperCase(); + + if (hex.equals("u3299")==true) { decodeStr = Character.valueOf('\u79D8');} //㊙(?)→秘(秘) + else if (hex.equals("u4EFD")==true) { decodeStr = Character.valueOf('\u5F6C');} //份(?)→彬(彬) + else if (hex.equals("u4FE0")==true) { decodeStr = Character.valueOf('\u4FA0');} //俠(?)→侠(侠) + else if (hex.equals("u4FE0")==true) { decodeStr = Character.valueOf('\u4FA0');} //俠(?)→侠(侠) + else if (hex.equals("u501C")==true) { decodeStr = Character.valueOf('\u4FF6');} //倜(?)→俶(俶) + else if (hex.equals("u502E")==true) { decodeStr = Character.valueOf('\u88F8');} //倮(?)→裸(裸) + else if (hex.equals("u5040")==true) { decodeStr = Character.valueOf('\u82F1');} //偀(?)→英(英) + else if (hex.equals("u5042")==true) { decodeStr = Character.valueOf('\u524D');} //偂(?)→前(前) + else if (hex.equals("u5070")==true) { decodeStr = Character.valueOf('\u5951');} //偰(?)→契(契) + else if (hex.equals("u510B")==true) { decodeStr = Character.valueOf('\u62C5');} //儋(?)→担(担) + else if (hex.equals("u519D")==true) { decodeStr = Character.valueOf('\u5B9C');} //冝(?)→宜(宜) + else if (hex.equals("u51EE")==true) { decodeStr = Character.valueOf('\u98A8');} //凮(?)→風(風) + else if (hex.equals("u525D")==true) { decodeStr = Character.valueOf('\u5265');} //剝(?)→剥(剥) + else if (hex.equals("u525D")==true) { decodeStr = Character.valueOf('\u5265');} //剝(?)→剥(剥) + else if (hex.equals("u52C8")==true) { decodeStr = Character.valueOf('\u52C7');} //勈(?)→勇(勇) + else if (hex.equals("u5393")==true) { decodeStr = Character.valueOf('\u5D16');} //厓(?)→崖(崖) + else if (hex.equals("u5500")==true) { decodeStr = Character.valueOf('\u8A98');} //唀(?)→誘(誘) + else if (hex.equals("u5511")==true) { decodeStr = Character.valueOf('\u566C');} //唑(?)→噬(噬) + else if (hex.equals("u555E")==true) { decodeStr = Character.valueOf('\u5516');} //啞(?)→唖(唖) + else if (hex.equals("u555E")==true) { decodeStr = Character.valueOf('\u5516');} //啞(?)→唖(唖) + else if (hex.equals("u5649")==true) { decodeStr = Character.valueOf('\u5556');} //噉(?)→啖(啖) + else if (hex.equals("u5653")==true) { decodeStr = Character.valueOf('\u5618');} //噓(?)→嘘(嘘) + else if (hex.equals("u5653")==true) { decodeStr = Character.valueOf('\u5618');} //噓(?)→嘘(嘘) + else if (hex.equals("u5699")==true) { decodeStr = Character.valueOf('\u565B');} //嚙(?)→噛(噛) + else if (hex.equals("u5699")==true) { decodeStr = Character.valueOf('\u565B');} //嚙(?)→噛(噛) + else if (hex.equals("u569E")==true) { decodeStr = Character.valueOf('\u54F2');} //嚞(?)→哲(哲) + else if (hex.equals("u56CA")==true) { decodeStr = Character.valueOf('\u56A2');} //囊(?)→嚢(嚢) + else if (hex.equals("u56CA")==true) { decodeStr = Character.valueOf('\u56A2');} //囊(?)→嚢(嚢) + else if (hex.equals("u5723")==true) { decodeStr = Character.valueOf('\u8056');} //圣(?)→聖(聖) + else if (hex.equals("u57C8")==true) { decodeStr = Character.valueOf('\u5CFB');} //埈(?)→峻(峻) + else if (hex.equals("u5861")==true) { decodeStr = Character.valueOf('\u586B');} //塡(?)→填(填) + else if (hex.equals("u5861")==true) { decodeStr = Character.valueOf('\u586B');} //塡(?)→填(填) + else if (hex.equals("u5AF0")==true) { decodeStr = Character.valueOf('\u5AE9');} //嫰(?)→嫩(嫩) + else if (hex.equals("u5C1E")==true) { decodeStr = Character.valueOf('\u71CE');} //尞(?)→燎(燎) + else if (hex.equals("u5C5B")==true) { decodeStr = Character.valueOf('\u5C4F');} //屛(?)→屏(屏) + else if (hex.equals("u5C5B")==true) { decodeStr = Character.valueOf('\u5C4F');} //屛(?)→屏(屏) + else if (hex.equals("u5C62")==true) { decodeStr = Character.valueOf('\u5C61');} //屢(?)→屡(屡) + else if (hex.equals("u5C62")==true) { decodeStr = Character.valueOf('\u5C61');} //屢(?)→屡(屡) + else if (hex.equals("u5C88")==true) { decodeStr = Character.valueOf('\u8C3A');} //岈(?)→谺(谺) + else if (hex.equals("u5CBA")==true) { decodeStr = Character.valueOf('\u5DBA');} //岺(?)→嶺(嶺) + else if (hex.equals("u5FB0")==true) { decodeStr = Character.valueOf('\u5F81');} //徰(?)→征(征) + else if (hex.equals("u61BC")==true) { decodeStr = Character.valueOf('\u656C');} //憼(?)→敬(敬) + else if (hex.equals("u6414")==true) { decodeStr = Character.valueOf('\u63BB');} //搔(?)→掻(掻) + else if (hex.equals("u6414")==true) { decodeStr = Character.valueOf('\u63BB');} //搔(?)→掻(掻) + else if (hex.equals("u6451")==true) { decodeStr = Character.valueOf('\u63B4');} //摑(?)→掴(掴) + else if (hex.equals("u6451")==true) { decodeStr = Character.valueOf('\u63B4');} //摑(?)→掴(掴) + else if (hex.equals("u64E5")==true) { decodeStr = Character.valueOf('\u652C');} //擥(?)→攬(攬) + else if (hex.equals("u6522")==true) { decodeStr = Character.valueOf('\u6505');} //攢(?)→攅(攅) + else if (hex.equals("u6522")==true) { decodeStr = Character.valueOf('\u6505');} //攢(?)→攅(攅) + else if (hex.equals("u658A")==true) { decodeStr = Character.valueOf('\u6589');} //斊(?)→斉(斉) + else if (hex.equals("u6609")==true) { decodeStr = Character.valueOf('\u70B3');} //昉(?)→炳(炳) + else if (hex.equals("u6630")==true) { decodeStr = Character.valueOf('\u662F');} //昰(?)→是(是) + else if (hex.equals("u663B")==true) { decodeStr = Character.valueOf('\u6602');} //昻(?)→昂(昂) + else if (hex.equals("u663B")==true) { decodeStr = Character.valueOf('\u6602');} //昻(?)→昂(昂) + else if (hex.equals("u6665")==true) { decodeStr = Character.valueOf('\u7696');} //晥(?)→皖(皖) + else if (hex.equals("u66FA")==true) { decodeStr = Character.valueOf('\u66F9');} //曺(?)→曹(曹) + else if (hex.equals("u6702")==true) { decodeStr = Character.valueOf('\u52D7');} //朂(?)→勗(勗) + else if (hex.equals("u67FA")==true) { decodeStr = Character.valueOf('\u67B4');} //柺(?)→枴(枴) + else if (hex.equals("u67FA")==true) { decodeStr = Character.valueOf('\u67B4');} //柺(?)→枴(枴) + else if (hex.equals("u6805")==true) { decodeStr = Character.valueOf('\u67F5');} //栅(?)→柵(柵) + else if (hex.equals("u6805")==true) { decodeStr = Character.valueOf('\u67F5');} //栅(?)→柵(柵) + else if (hex.equals("u68A5")==true) { decodeStr = Character.valueOf('\u677E');} //梥(?)→松(松) + else if (hex.equals("u6A03")==true) { decodeStr = Character.valueOf('\u6994');} //樃(?)→榔(榔) + else if (hex.equals("u6A03")==true) { decodeStr = Character.valueOf('\u6994');} //樃(?)→榔(榔) + else if (hex.equals("u6A45")==true) { decodeStr = Character.valueOf('\u6A21');} //橅(?)→模(模) + else if (hex.equals("u6B56")==true) { decodeStr = Character.valueOf('\u559C');} //歖(?)→喜(喜) + else if (hex.equals("u6BF1")==true) { decodeStr = Character.valueOf('\u97A0');} //毱(?)→鞠(鞠) + else if (hex.equals("u6D82")==true) { decodeStr = Character.valueOf('\u5857');} //涂(?)→塗(塗) + else if (hex.equals("u6F51")==true) { decodeStr = Character.valueOf('\u6E8C');} //潑(?)→溌(溌) + else if (hex.equals("u6F51")==true) { decodeStr = Character.valueOf('\u6E8C');} //潑(?)→溌(溌) + else if (hex.equals("u7006")==true) { decodeStr = Character.valueOf('\u6D9C');} //瀆(?)→涜(涜) + else if (hex.equals("u7006")==true) { decodeStr = Character.valueOf('\u6D9C');} //瀆(?)→涜(涜) + else if (hex.equals("u705E")==true) { decodeStr = Character.valueOf('\u8987');} //灞(?)→覇(覇) + else if (hex.equals("u7130")==true) { decodeStr = Character.valueOf('\u7114');} //焰(?)→焔(焔) + else if (hex.equals("u7130")==true) { decodeStr = Character.valueOf('\u7114');} //焰(?)→焔(焔) + else if (hex.equals("u7147")==true) { decodeStr = Character.valueOf('\u6689');} //煇(?)→暉(暉) + else if (hex.equals("u7411")==true) { decodeStr = Character.valueOf('\u7463');} //琑(?)→瑣(瑣) + else if (hex.equals("u7431")==true) { decodeStr = Character.valueOf('\u5F6B');} //琱(?)→彫(彫) + else if (hex.equals("u7626")==true) { decodeStr = Character.valueOf('\u75E9');} //瘦(?)→痩(痩) + else if (hex.equals("u7626")==true) { decodeStr = Character.valueOf('\u75E9');} //瘦(?)→痩(痩) + else if (hex.equals("u76A6")==true) { decodeStr = Character.valueOf('\u768E');} //皦(?)→皎(皎) + else if (hex.equals("u7900")==true) { decodeStr = Character.valueOf('\u6F97');} //礀(?)→澗(澗) + else if (hex.equals("u79B1")==true) { decodeStr = Character.valueOf('\u7977');} //禱(?)→祷(祷) + else if (hex.equals("u79B1")==true) { decodeStr = Character.valueOf('\u7977');} //禱(?)→祷(祷) + else if (hex.equals("u7C1E")==true) { decodeStr = Character.valueOf('\u7BAA');} //簞(?)→箪(箪) + else if (hex.equals("u7C1E")==true) { decodeStr = Character.valueOf('\u7BAA');} //簞(?)→箪(箪) + else if (hex.equals("u7CB7")==true) { decodeStr = Character.valueOf('\u9EB9');} //粷(?)→麹(麹) + else if (hex.equals("u7E61")==true) { decodeStr = Character.valueOf('\u7E4D');} //繡(?)→繍(繍) + else if (hex.equals("u7E61")==true) { decodeStr = Character.valueOf('\u7E4D');} //繡(?)→繍(繍) + else if (hex.equals("u7E6B")==true) { decodeStr = Character.valueOf('\u7E4B');} //繫(?)→繋(繋) + else if (hex.equals("u7E6B")==true) { decodeStr = Character.valueOf('\u7E4B');} //繫(?)→繋(繋) + else if (hex.equals("u80DC")==true) { decodeStr = Character.valueOf('\u52DD');} //胜(?)→勝(勝) + else if (hex.equals("u8330")==true) { decodeStr = Character.valueOf('\u8438');} //茰(?)→萸(萸) + else if (hex.equals("u8346")==true) { decodeStr = Character.valueOf('\u834A');} //荆(?)→荊(荊) + else if (hex.equals("u8346")==true) { decodeStr = Character.valueOf('\u834A');} //荆(?)→荊(荊) + else if (hex.equals("u840A")==true) { decodeStr = Character.valueOf('\u83B1');} //萊(?)→莱(莱) + else if (hex.equals("u840A")==true) { decodeStr = Character.valueOf('\u83B1');} //萊(?)→莱(莱) + else if (hex.equals("u8493")==true) { decodeStr = Character.valueOf('\u84F4');} //蒓(?)→蓴(蓴) + else if (hex.equals("u8523")==true) { decodeStr = Character.valueOf('\u848B');} //蔣(?)→蒋(蒋) + else if (hex.equals("u8523")==true) { decodeStr = Character.valueOf('\u848B');} //蔣(?)→蒋(蒋) + else if (hex.equals("u8610")==true) { decodeStr = Character.valueOf('\u8431');} //蘐(?)→萱(萱) + else if (hex.equals("u8612")==true) { decodeStr = Character.valueOf('\u8429');} //蘒(?)→萩(萩) + else if (hex.equals("u87EC")==true) { decodeStr = Character.valueOf('\u8749');} //蟬(?)→蝉(蝉) + else if (hex.equals("u87EC")==true) { decodeStr = Character.valueOf('\u8749');} //蟬(?)→蝉(蝉) + else if (hex.equals("u881F")==true) { decodeStr = Character.valueOf('\u874B');} //蠟(?)→蝋(蝋) + else if (hex.equals("u881F")==true) { decodeStr = Character.valueOf('\u874B');} //蠟(?)→蝋(蝋) + else if (hex.equals("u88F5")==true) { decodeStr = Character.valueOf('\u88F4');} //裵(?)→裴(裴) + else if (hex.equals("u8989")==true) { decodeStr = Character.valueOf('\u7F88');} //覉(?)→羈(羈) + else if (hex.equals("u8990")==true) { decodeStr = Character.valueOf('\u899A');} //覐(?)→覚(覚) + else if (hex.equals("u8A37")==true) { decodeStr = Character.valueOf('\u4F38');} //訷(?)→伸(伸) + else if (hex.equals("u8EC0")==true) { decodeStr = Character.valueOf('\u8EAF');} //軀(?)→躯(躯) + else if (hex.equals("u8EC0")==true) { decodeStr = Character.valueOf('\u8EAF');} //軀(?)→躯(躯) + else if (hex.equals("u91AC")==true) { decodeStr = Character.valueOf('\u91A4');} //醬(?)→醤(醤) + else if (hex.equals("u91AC")==true) { decodeStr = Character.valueOf('\u91A4');} //醬(?)→醤(醤) + else if (hex.equals("u91B1")==true) { decodeStr = Character.valueOf('\u9197');} //醱(?)→醗(醗) + else if (hex.equals("u91B1")==true) { decodeStr = Character.valueOf('\u9197');} //醱(?)→醗(醗) + else if (hex.equals("u969D")==true) { decodeStr = Character.valueOf('\u5CF6');} //隝(?)→島(島) + else if (hex.equals("u974D")==true) { decodeStr = Character.valueOf('\u9DB4');} //靍(?)→鶴(鶴) + else if (hex.equals("u974E")==true) { decodeStr = Character.valueOf('\u9DB4');} //靎(?)→鶴(鶴) + else if (hex.equals("u974F")==true) { decodeStr = Character.valueOf('\u9DB4');} //靏(?)→鶴(鶴) + else if (hex.equals("u982B")==true) { decodeStr = Character.valueOf('\u4FEF');} //頫(?)→俯(俯) + else if (hex.equals("u9830")==true) { decodeStr = Character.valueOf('\u982C');} //頰(?)→頬(頬) + else if (hex.equals("u9830")==true) { decodeStr = Character.valueOf('\u982C');} //頰(?)→頬(頬) + else if (hex.equals("u985A")==true) { decodeStr = Character.valueOf('\u985B');} //顚(?)→顛(顛) + else if (hex.equals("u985A")==true) { decodeStr = Character.valueOf('\u985B');} //顚(?)→顛(顛) + else if (hex.equals("u9A52")==true) { decodeStr = Character.valueOf('\u9A28');} //驒(?)→騨(騨) + else if (hex.equals("u9A52")==true) { decodeStr = Character.valueOf('\u9A28');} //驒(?)→騨(騨) + else if (hex.equals("u9DD7")==true) { decodeStr = Character.valueOf('\u9D0E');} //鷗(?)→鴎(鴎) + else if (hex.equals("u9DD7")==true) { decodeStr = Character.valueOf('\u9D0E');} //鷗(?)→鴎(鴎) + else if (hex.equals("u9E7C")==true) { decodeStr = Character.valueOf('\u9E78');} //鹼(?)→鹸(鹸) + else if (hex.equals("u9E7C")==true) { decodeStr = Character.valueOf('\u9E78');} //鹼(?)→鹸(鹸) + else if (hex.equals("u9EB4")==true) { decodeStr = Character.valueOf('\u9EB9');} //麴(?)→麹(麹) + else if (hex.equals("u9EB4")==true) { decodeStr = Character.valueOf('\u9EB9');} //麴(?)→麹(麹) + else if (hex.equals("u9EB5")==true) { decodeStr = Character.valueOf('\u9EBA');} //麵(?)→麺(麺) + else if (hex.equals("u9EB5")==true) { decodeStr = Character.valueOf('\u9EBA');} //麵(?)→麺(麺) + else if (hex.equals("u9FA2")==true) { decodeStr = Character.valueOf('\u548C');} //龢(?)→和(和) + else { + decodeStr = value.charAt(0); + } + return Character.toString(decodeStr); + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/AppUtils.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/AppUtils.java new file mode 100644 index 0000000..ce30f66 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/AppUtils.java @@ -0,0 +1,296 @@ +package jp.co.y_net.amm.common; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jp.co.y_net.amm.dao.AppDef; +import jp.co.y_net.amm.dao.Usr; + +import org.apache.commons.lang.StringUtils; + +// TODO メッセージ取得部品の作成と利用 + +public class AppUtils { + + public static String urlDecode(String str) { + try { + str = URLDecoder.decode(str, "UTF-8"); // URLデコード + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + return str; + } + + + private static final DateFormat DF_LONG = new SimpleDateFormat("yyyyMMddHHmmss"); + private static final DateFormat DF_SHORT = new SimpleDateFormat("yyyyMMdd"); + + + /** + * @return 現在日付 + */ + public static Integer createNowShort() { + Date d = new Date(); + String s = DF_SHORT.format(d); + Integer n = Integer.parseInt(s); + return n; + } + /** + * @return 現在日時 + */ + public static Long createNowLong() { + Date d = new Date(); + String s = DF_LONG.format(d); + Long n = Long.parseLong(s); + return n; + } + /** + * @param offset 加算する[秒] + * @return 現在日時に offset を加算した時間 + */ + public static Long createNowLong(int offset) { + Calendar c = Calendar.getInstance(); + c.add(Calendar.SECOND, offset); + Date d = c.getTime(); + String s = DF_LONG.format(d); + Long n = Long.parseLong(s); + return n; + } + + public static Date toDate(Long longDate) { + try { + String s = String.valueOf(longDate); + Date d = DF_LONG.parse(s); + return d; + } catch (Exception e) { + return null; + } + } + + public static Integer toInteger(String str) { + try { + return Integer.parseInt(str); + } catch (NumberFormatException e) { + return -1; + } + } + public static boolean toBoolean(Integer integer) { + return AppDef.TRUE.equals(integer); + } + public static String toStr(Number num) { + if(num == null) { + return ""; + } + return String.valueOf(num); + } + public static String toStrYyyyMMdd(Integer integer) { + String str = toStr(integer); + if(str.length() == 8) { + str = str.substring(0, 4) + "/" + str.substring(4, 6) + "/" + str.substring(6, 8); + } + return str; + } + public static String toStrYyyyMMdd(Long integer) { + String str = toStr(integer); + if(str.length() >= 8) { + str = str.substring(0, 4) + "/" + str.substring(4, 6) + "/" + str.substring(6, 8); + } + return str; + } + public static String toStrYyyyMMdd_HHmmss(Long integer) { + String str = toStr(integer); + if(str.length() >= 14) { + str = str.substring(0, 4) + "/" + str.substring(4, 6) + "/" + str.substring(6, 8) + + " " + str.substring(8, 10) + ":" + str.substring(10, 12) + ":" + str.substring(12, 14); + } + return str; + } + private static final DateFormat DF_YYYYMMDD = new SimpleDateFormat("yyyy/MM/dd"); + public static String toStrYyyyMMdd(Date date) { + if(date == null) return ""; + return DF_YYYYMMDD.format(date); + } + + /** ID-04900,ID-05242 二つのBooleanを比較する */ + public static boolean equals(Boolean a, Boolean b) { + if(a == null && b == null) return true; + if(a == null && b != null) return false; + if(a != null && b == null) return false; + return a.equals(b); + } + /** ID-04900,ID-05242 二つのIntegerを比較する */ + public static boolean equals(Integer a, Integer b) { + if(a == null && b == null) return true; + if(a == null && b != null) return false; + if(a != null && b == null) return false; + return a.equals(b); + } + /** ID-04900,ID-05242 二つのStringを比較する */ + public static boolean equals(String a, String b) { + if(a == null && b == null) return true; + if(a == null && b != null) return false; + if(a != null && b == null) return false; + return a.equals(b); + } + + public static void main(String[] args) { + Map param = new HashMap(); + param.put("loginid", "test@example.com"); + param.put("parame2", "()=~"); + int result = httpRequest("http://www.y-net.co.jp/abc", param); + + if(result == 200) { + AppLogger.debug("送信成功"); + } else { + AppLogger.error("送信失敗 " + result); + } + } + + /** + * 外部APIに退会者のログインIDを通知 + * @param usr + */ + public static void callDeleteNotice(Usr usr) { + List list = new ArrayList(); + list.add(usr); + callDeleteNotice(list); + } + /** + * 外部APIに退会者のログインIDを通知 + * @param users + */ + public static void callDeleteNotice(List users) { + Map param = new HashMap(); + param.put("size", String.valueOf(users.size())); + for (int i = 0; i < users.size(); i++) { + param.put("loginid" + i, users.get(i).getLoginid()); + } + String urlApiDeletecall = ResourceReader.getStringQuick("api.deletenotice"); + int r = AppUtils.httpRequest(urlApiDeletecall, param); + if(r >= 400) { + AppLogger.error( + "外部APIに退会者のログインIDを通知する処理が失敗しました。" + + " URL=" + urlApiDeletecall + + " HTTPステータスコード=" + r); + } + } + public static int httpRequest(String url, Map params) { + + if(params != null && params.isEmpty() == false) { + String queryString = ""; + for(Map.Entry param: params.entrySet()) { + if(StringUtils.isEmpty(queryString) == false) { + queryString += "&"; + } + String value; + try { + value = URLEncoder.encode(param.getValue(), "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + queryString += param.getKey() + "=" + value; + } + url += "?" + queryString; + } + AppLogger.debug("http request:" + url); + try { + URL urlObj = new URL(url); + HttpURLConnection urlCon = (HttpURLConnection) urlObj.openConnection(); + urlCon.setRequestMethod("GET"); + urlCon.connect(); + int status = urlCon.getResponseCode(); + +// InputStream is = urlCon.getInputStream(); +// BufferedReader reader = new BufferedReader(new InputStreamReader(is)); +// String s; +// while ((s = reader.readLine()) != null) { +// System.out.println(s); +// } +// reader.close(); + + return status; + + } catch (MalformedURLException e) { + AppLogger.error(e); + return -1; + } catch (ProtocolException e) { + AppLogger.error(e); + return -1; + } catch (IOException e) { + AppLogger.error(e); + return -1; + } + + } +// /** +// * 入力されたURLが実在するかチェックする処理 +// * 実在するとき、エラーコードブランクでリターン 実在しないときエラーコードにエラーの理由をセットしてリターン +// * @param url url +// * @return errorCode エラーの理由 +// * */ +// public static String urlChecker(String url) { +// String errorCode = ""; +// +// try { +// /* httpsのページは表示できないため、httpで目的のページを閲覧する */ +// if(url.startsWith("https") == true) { +// url.replace("https", "http"); +// } +// URL u = new URL(url); +// HttpURLConnection urlCon = null; +// try { +// urlCon = (HttpURLConnection) u.openConnection(); +// try { +// urlCon.setRequestMethod("GET"); +// try { +// urlCon.connect(); +// int status = urlCon.getResponseCode(); +// if(status == 200) { +// errorCode = ""; +// } else { +// errorCode = "リンクが切れています。"; +// } +// } catch (UnknownHostException e) { +// /* ホスト名に誤り */ +// errorCode = "入力したURLに誤りがあります。"; +// } catch (NullPointerException e) { +// /* コネクションなどでエラー */ +// errorCode = "入力したURLに誤りがあります。"; +// e.printStackTrace(); +// } +// } catch (ProtocolException e) { +// /* プロトコルでエラー */ +// errorCode = "ネットワークに問題があります。"; +// } finally { +// /* コネクションの切断 */ +// urlCon.disconnect(); +// } +// } catch (IOException e) { +// /* コネクションなどでエラー */ +// errorCode = "入力したURLに誤りがあります。"; +// e.printStackTrace(); +// } +// } catch (MalformedURLException e) { +// /* URLの構文が不正 */ +// errorCode = "入力したURLに誤りがあります。"; +// } +// return errorCode; +// } + + + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/CalcHash.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/CalcHash.java new file mode 100644 index 0000000..d149bdb --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/CalcHash.java @@ -0,0 +1,55 @@ +package jp.co.y_net.amm.common; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class CalcHash { +// private static int STRETCH_COUNT = 500; + public static String passowrdHash(String password, String account) { +// String salt = getSha256(loginId); +// String hash = ""; +// +// for (int i = 0; i < STRETCH_COUNT; i++) { +// hash = getSha256(hash + salt + password); +// } +// return hash; + + return getSha256(account+":"+password); + } + public static String challengeResponse(String phash, String chvalue) { + //return getSha256(passwordHash + challenge); + return getSha256(phash+":"+chvalue); + } + /* + * 文字列から SHA256 のハッシュ値を取得 + */ + private static String getSha256(String target) { + MessageDigest md = null; + StringBuilder buf = new StringBuilder(); + try { + md = MessageDigest.getInstance("SHA-256"); + md.update(target.getBytes()); + byte[] digest = md.digest(); + + for (int i = 0; i < digest.length; i++) { + buf.append(String.format("%02x", digest[i])); + } + + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + + return buf.toString(); + } + + /*---------------------------------------------------------------------------------------------------------------*/ + /* 単体テスト*/ + + public static void main(String[] args) { + System.out.println(passowrdHash("p@ssw0rd", "ryoma.sakamoto@example.com")); + System.out.println(passowrdHash("test", "kondou@example.com")); + System.out.println(passowrdHash("testtest", "okita@example.com")); + System.out.println(passowrdHash("testtest", "admin")); + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/ChoiceDateElement.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/ChoiceDateElement.java new file mode 100644 index 0000000..e7eff0d --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/ChoiceDateElement.java @@ -0,0 +1,208 @@ +package jp.co.y_net.amm.common; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.markup.html.form.ChoiceRenderer; +import org.apache.wicket.markup.html.form.DropDownChoice; +import org.apache.wicket.model.Model; + +/** + * 日付選択用ドロップダウンリストの要素、ユーティリティ + * @author k.inaba + */ +public class ChoiceDateElement implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + private String name; + + public ChoiceDateElement(String id, String name) { + this.id = id; + this.name = name; + } + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + /** + * 日付選択用ドロップダウンリスト + */ + public static class DropDownChoiceDate extends DropDownChoice { + public DropDownChoiceDate(String id, Model model, List choice) { + super(id, model, choice, new MyRenderer()); + } + } + /** + * 日付選択用ドロップダウンリストに使用するレンダラ + */ + private static class MyRenderer extends ChoiceRenderer{ + public MyRenderer() { + super("name","id"); + } + } + + public static String 日付取得(Model y, Model m, Model d) { + return y.getObject().getId() + m.getObject().getId() + d.getObject().getId(); + } + + + /** + * 年の選択肢を作成する。 + * 原則として、現在の年を含む未来6年分の選択肢を作成するが、 + * 引数の fromdateValue、todateValue が含まれない場合は追加する。 + * @param fromdateValue + * @param todateValue + * @return + */ + public static List createChoiceY(String fromdateValue, String todateValue) { + + List choice = new ArrayList(); + choice.add(new ChoiceDateElement("0000", "未指定")); + + Integer iNowYYYY = Calendar.getInstance().get(Calendar.YEAR); + List list = new ArrayList(); + for (int i = 0; i < 6; i++) { // 現在から6年先までの選択肢を作成 + Integer yyyy = iNowYYYY + i; + list.add(yyyy); + } + + /* すでに登録されている値 */ + Integer iFromYYYY = Integer.parseInt(getYYYY(fromdateValue)); + Integer iToYYYY = Integer.parseInt(getYYYY(todateValue)); + if (iFromYYYY != 0 && list.contains(iFromYYYY) == false) { + list.add(iFromYYYY); + } + if (iToYYYY != 0 && list.contains(iToYYYY) == false) { + list.add(iToYYYY); + } + Collections.sort(list); + + for (Integer yyyy : list) { + choice.add(new ChoiceDateElement(String.valueOf(yyyy), yyyy + "年")); + } + + return choice; + } + /** + * 月の選択肢を作成する + * @return + */ + public static List createChoiceM() { + List choice = new ArrayList(); + choice.add(new ChoiceDateElement("00", "--")); + for (int i = 1; i <= 12; i++) { + String str = StringUtils.leftPad(String.valueOf(i), 2, '0'); + choice.add(new ChoiceDateElement(str, i + "月")); + } + return choice; + } + /** + * 日の選択肢を作成する + * @return + */ + public static List createChoiceD() { + List choice = new ArrayList(); + choice.add(new ChoiceDateElement("00", "--")); + for (int i = 1; i <= 31; i++) { + String str = StringUtils.leftPad(String.valueOf(i), 2, '0'); + choice.add(new ChoiceDateElement(str, i + "日")); + } + return choice; + } + + /** + * 年のモデルを作成する + * 引数 choiceY のうち、targetDate と一致するものを初期値とする。 + * targetDateは yyyyMMdd で記述されているものとし、このメソッドでは、yyyy部分を参照する。 + * @param choiceY + * @param targetDate + * @return + */ + public static Model createModelY(List choiceY, String targetDate) { + Model model = new Model(); + select(choiceY, getYYYY(targetDate), model); + return model; + } + /** + * 月のモデルを作成する + * 引数 choiceY のうち、targetDate と一致するものを初期値とする。 + * targetDateは yyyyMMdd で記述されているものとし、このメソッドでは、MM部分を参照する。 + * @param choiceY + * @param targetDate + * @return + */ + public static Model createModelM(List choice, String targetDate) { + Model model = new Model(); + select(choice, getMM(targetDate), model); + return model; + } + /** + * 月のモデルを作成する + * 引数 choiceY のうち、targetDate と一致するものを初期値とする。 + * targetDateは yyyyMMdd で記述されているものとし、このメソッドでは、dd部分を参照する。 + * @param choiceY + * @param targetDate + * @return + */ + public static Model createModelD(List choice, String targetDate) { + Model model = new Model(); + select(choice, getDD(targetDate), model); + return model; + } + + + private static void select(List choice, String target, Model model) { + for (ChoiceDateElement c : choice) { + if (c.getId().equals(target)==true) { + model.setObject(c); + } + } + } + + + + + private static String getYYYY(String yyyyMMdd) { + String str; + if(yyyyMMdd == null || yyyyMMdd.length() != 8) { + str = "0000"; + } else { + str = yyyyMMdd.substring(0, 4); + } + return str; + } + private static String getMM(String yyyyMMdd) { + String str; + if(yyyyMMdd == null || yyyyMMdd.length() != 8) { + str = "00"; + } else { + str = yyyyMMdd.substring(4, 6); + } + return str; + } + private static String getDD(String yyyyMMdd) { + String str; + if(yyyyMMdd == null || yyyyMMdd.length() != 8) { + str = "00"; + } else { + str = yyyyMMdd.substring(6, 8); + } + return str; + } +} + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/ChoiceElement.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/ChoiceElement.java new file mode 100644 index 0000000..6b1251f --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/ChoiceElement.java @@ -0,0 +1,58 @@ +package jp.co.y_net.amm.common; + +import java.io.Serializable; +import java.util.List; + +import org.apache.wicket.markup.html.form.ChoiceRenderer; +import org.apache.wicket.model.Model; + +/** + * ChoiceElement : ドロップダウンリストの要素 + * + * @version 1.0.0 + * @author y.soga + */ +public class ChoiceElement implements Serializable { + + private static final long serialVersionUID = 6210226619432905234L; + + private String id; + private String name; + + public ChoiceElement(String id,String name) { + this.id = id; + this.name = name; + } + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + /** + * ドロップダウンリストに特定の値を選択させる + * @param settingModel 指定するドロップダウンリストのModel + * @param choices 選択リストコレクション + * @param target 選択させる値 + */ + public static void setDropDownList(Model settingModel,List choices ,String target) { + for (ChoiceElement che : choices) { + if (che.getId().equals(target)==true) { + settingModel.setObject(che); + } + } + } + + public static class Renderer extends ChoiceRenderer{ + public Renderer() { + super("name","id"); + } + } +} + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/CookieUtils.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/CookieUtils.java new file mode 100644 index 0000000..0ef0ad0 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/CookieUtils.java @@ -0,0 +1,5 @@ +package jp.co.y_net.amm.common; + +public class CookieUtils { + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/InfoRenderer.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/InfoRenderer.java new file mode 100644 index 0000000..02deb99 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/InfoRenderer.java @@ -0,0 +1,39 @@ +package jp.co.y_net.amm.common; + +import java.util.Date; + +import jp.co.y_net.amm.dao.Inf; + +public class InfoRenderer { +// public static String execute(String title, String body) { +// return execute(title, "XXXX/XX/XX", body); +// } + public static String execute(Inf inf) { + if(inf == null) { + return ""; + } + Date dPubdate = AppUtils.toDate(inf.getPubdate()); + String strPubdate; + if(dPubdate != null) { + strPubdate = Inf.DF_PUBDATE.format(dPubdate); + } else { + strPubdate = Inf.DF_PUBDATE.format(new Date()); + } + + return execute(inf.getTitle(), strPubdate, inf.getBody()); + } + private static String execute(String title, String pubdate, String body) { + + body = body.replaceAll("\n", ""); + + StringBuilder sb = new StringBuilder(); + sb.append("" + title + "\n"); + sb.append(pubdate + "\n"); +// sb.append("\n"); + sb.append(body); + return sb.toString(); + } + + + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/ResourceReader.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/ResourceReader.java new file mode 100644 index 0000000..178e32c --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/ResourceReader.java @@ -0,0 +1,161 @@ +package jp.co.y_net.amm.common; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.Locale; +import java.util.ResourceBundle; + +public class ResourceReader { + + private static final String DEFAULT_PROP = "App"; + + public static Integer getIntegerQuick(String key) { + String str = getStringQuick(key); + try { + return Integer.parseInt(str); + } catch (NumberFormatException e) { + return -1; + } + } + public static boolean getBooleanQuick(String key) { + String str = getStringQuick(key).toLowerCase(); + return str.equals("yes") + || str.equals("y") + || str.equals("true") + || str.equals("t") + || str.equals("1"); + } + + /** + * @see #getString(String, String) + * @param def 値が取得できなかった場合のデフォルト値 + */ + public static final String getStringQuick(String key, String def) { + String value = getStringQuick(key); + if(value == null) { + return def; + } else { + return value; + } + } + /** + * 値の変更でサーバーの再起動を必要としない、プロパティファイルの読み取り機能 + * ・読み取り対象は jp.co.y_net.amm.WicketApplication.properties.properties とする。 + * ・キャッシュの持続時間は 60 秒とする。 + * @param key + * @return + */ + public static final String getStringQuick(String key) { + String value = null; + try { + ResourceBundle bundle = ResourceBundle.getBundle(DEFAULT_PROP, RESOURCE_BUNDLE_CONTROL); + value = bundle.getString(key); + + } catch (Exception e) { + AppLogger.info(DEFAULT_PROP + ".properties から[" + key + "]が取得できませんでした。"); + } + return value; + } + private static final ResourceBundle.Control RESOURCE_BUNDLE_CONTROL = new ResourceBundle.Control() { + public long getTimeToLive(String baseName, Locale locale) { + return 60000L; + } + }; + + + /** + * プロパティファイルの全行をリストで取得 + * @param resourceName + * @return + */ + public static List getLines(String resourceName) { + Enumeration keys; + try { + ResourceBundle bundle = ResourceBundle.getBundle(resourceName, RESOURCE_BUNDLE_CONTROL); + keys = bundle.getKeys(); + + } catch (Exception e) { + AppLogger.info(DEFAULT_PROP + ".properties が参照できませんでした。"); + return new ArrayList(); + } + List lines = new ArrayList(); + while(keys.hasMoreElements()) { + lines.add(keys.nextElement()); + } + return lines; + } + +// /** +// * getString はアプリケーションが稼働しているスレッドからでないと使用できない。 +// * 単体テストやアプリケーションの配下でないところからプロパティファイルを参照する際に使用する。 +// * @param key +// * @return +// */ +// public static final String getStringWithoutApp(String key) { +// String value = null; +// try { +// ResourceBundle bundle = ResourceBundle.getBundle(DEFAULT_PROP); +// value = bundle.getString(key); +// } catch (Exception e) { +// AppLogger.info(DEFAULT_PROP + "から[" + key + "]が取得できませんでした。"); +// } +// return value; +// } + + + /** + * クラスパス上のリソースからテキストファイルとして読み込む + * @param name 相対パス指定は不可 + * @return + */ + public static String getText(String name) { + StringBuilder sb = new StringBuilder(); + InputStream is = null; + InputStreamReader isr = null; + try { + /* mainメソッドからの呼び出しを想定 */ + is = ClassLoader.getSystemResourceAsStream(name); + if(is==null) { + /* webアプリケーションからの呼び出しを想定 */ + is = ResourceReader.class.getResourceAsStream("/" + name); + } + if(is==null) { + AppLogger.info(name + "が取得できませんでした。"); + } + isr = new InputStreamReader(is, Charset.forName("UTF-8")); + int contents; + while ((contents = isr.read()) != -1) { + sb.append((char)contents); +// text += (char)contents; + } + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + try { + if (isr != null) isr.close(); + if (is != null) is.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + String text = sb.toString(); + return text; + } + + + /** + * @deprecated プロパティファイルの参照は ResourceReader へ移行しました。 + */ + public static class QuickeProperty extends ResourceReader { + + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/SessionUsageListener.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/SessionUsageListener.java new file mode 100644 index 0000000..2a7b154 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/SessionUsageListener.java @@ -0,0 +1,42 @@ +package jp.co.y_net.amm.common; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; + + +/** + * セッションの利用状況を検知するためのリスナー + * + * 前提: web.xml での宣言 + * @author k_inaba + * + */ +public class SessionUsageListener implements HttpSessionListener { + + /* + * 利用状況 + * 意図的にスレッドセーフでは無い + */ + public static Map map = new HashMap(); + + @Override + public void sessionCreated(HttpSessionEvent event) { + //System.out.println("sessionCreated:" + event.getSession()); + if(event != null && event.getSession() != null) { + map.put(event.getSession().getId(), new Date()); + } + } + + @Override + public void sessionDestroyed(HttpSessionEvent event) { + //System.out.println("sessionDestroyed" + event.getSession()); + if(event != null && event.getSession() != null) { + map.remove(event.getSession().getId()); + } + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/common/package-info.java b/AMM_web/src/main/java/jp/co/y_net/amm/common/package-info.java new file mode 100644 index 0000000..af772c3 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/common/package-info.java @@ -0,0 +1,5 @@ +/** + * 各所で実装する可能性があるものを集約するためのパッケージ + * 2015/04/22 k.inaba + */ +package jp.co.y_net.amm.common; \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/AbstractDao.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/AbstractDao.java new file mode 100644 index 0000000..60dad69 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/AbstractDao.java @@ -0,0 +1,128 @@ +package jp.co.y_net.amm.dao; + +import java.util.List; + +import jp.co.y_net.amm.common.AppUtils; + +import org.hibernate.Query; +import org.hibernate.SessionFactory; +import org.hibernate.classic.Session; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.orm.hibernate3.HibernateTemplate; +import org.springframework.orm.hibernate3.support.HibernateDaoSupport; +import org.springframework.stereotype.Component; + +/** + * WebopacDao + * @version 1.0.0 + * @author k_ohara + */ +@Component("abstractDao") +abstract class AbstractDao extends HibernateDaoSupport { + + + + /** + * sessionFactoryのインジェクションを行う + * @param sessionFactory + */ + @Autowired(required = true) + @Qualifier("sessionFactory_Amm") // ← hibernateContextBase.xmlにて宣言されている + public void init(SessionFactory sessionFactory){ + super.setSessionFactory(sessionFactory); + } + /** + * 追加対象オブジェクト + * @param item 対象オブジェクト + * @param updateusrid 更新者ID + */ + protected void add(AppDto item, Integer updateusrid) { + if(item.getId() != null) { + throw new RuntimeException("追加対象のオブジェクトに主キーが設定されています。"); + } + + /* 共通項目の登録 */ + if(item != null) { + item.setUpdatedate(AppUtils.createNowLong()); // 更新日付を設定 + item.setUpdateusrid(updateusrid); // 更新者IDを設定 + item.setDeleted(AppDef.FLASE); // 削除フラグをFalse + } + + try { + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + hibernateTemplate.save(item); + hibernateTemplate.flush(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + /** + * 更新処理 + * @param item 対象オブジェクト + * @param updateusrid 更新者ID + */ + protected void update(AppDto item, Integer updateusrid) { + if(item.getId() == null) { + throw new RuntimeException("追加対象のオブジェクトに主キーが設定されていません。"); + } + + /* 共通項目 「更新日付」の登録 */ + if(item != null) { + item.setUpdatedate(AppUtils.createNowLong()); // 更新日付を設定 + item.setUpdateusrid(updateusrid); // 更新者IDを設定 + } + + try { + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + + hibernateTemplate.update(item); + hibernateTemplate.flush(); + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + /** + * 論理削除処理 + * @param item 対象オブジェクト + * @param updateusrid 更新者ID + */ + protected void removeLogical(AppDto item, Integer updateusrid) { + item.setDeleted(AppDef.TRUE); + this.update(item, updateusrid); + } + /** + * 物理削除処理 + */ + protected void remove(AppDto item) { + throw new RuntimeException("本アプリケーションでは物理削除を行わない。"); + } + + /** + * 集合関数 MAX を使用して次に採番すべき値を取得する + * @param entityname + * @param colname + * @return + */ + public Integer getNextId(String entityname, String colname) { + return getNextId(entityname, colname, 1); + } + public Integer getNextId(String entityname, String colname, int init) { + Session session = getSessionFactory().openSession(); + Query query = session.createQuery("SELECT max(" + colname + ") from " + entityname + ""); + @SuppressWarnings("rawtypes") + List list = query.list(); + Integer currentId = 0; + Integer nextId; + if(list != null && list.isEmpty() == false && (Integer)list.get(0) != null) { + currentId = (Integer)list.get(0); + nextId = currentId + 1; + } else { + nextId = init; + } + session.close(); + return nextId; + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/AppDef.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/AppDef.java new file mode 100644 index 0000000..12559c0 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/AppDef.java @@ -0,0 +1,23 @@ +package jp.co.y_net.amm.dao; + +/** + * マジックナンバーなどのリテラルを集約する + * @author k_inaba + */ +public class AppDef { + + public static final Integer TRUE = 1; + public static final Integer FLASE = 0; + + /** + * ログインを必要としないページにおける登録処理で + * 更新者IDに設定する値 + */ + public static final Integer USERID_NONE = -1; + + /** 新規パスワード発行の登録有効期間(時間) */ + public static final int 新規パスワード発行の登録有効期間 = 24 * 7; + + /** パスワードリセット後のパスワード登録有効期間(時間) */ + public static final int パスワードリセット後のパスワード登録有効期間 = 24; +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/AppDto.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/AppDto.java new file mode 100644 index 0000000..e584625 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/AppDto.java @@ -0,0 +1,48 @@ +package jp.co.y_net.amm.dao; + +import java.io.Serializable; + +public class AppDto implements Serializable { + private static final long serialVersionUID = 1L; + + private Integer id; + private Long updatedate; + private Integer updateusrid; + private Integer deleted; + + /** @deprecated 共通項目のアクセサです。AppDao(およびその子クラス)でのみ使用することを想定しています。*/ + public Integer getId() { + return id; + } + /** @deprecated 共通項目のアクセサです。AppDao(およびその子クラス)でのみ使用することを想定しています。*/ + public void setId(Integer id) { + this.id = id; + } + /** @deprecated 共通項目のアクセサです。AppDao(およびその子クラス)でのみ使用することを想定しています。*/ + public Long getUpdatedate() { + return updatedate; + } + /** @deprecated 共通項目のアクセサです。AppDao(およびその子クラス)でのみ使用することを想定しています。*/ + public void setUpdatedate(Long updatedate) { + this.updatedate = updatedate; + } + /** @deprecated 共通項目のアクセサです。AppDao(およびその子クラス)でのみ使用することを想定しています。*/ + public Integer getDeleted() { + return deleted; + } + /** @deprecated 共通項目のアクセサです。AppDao(およびその子クラス)でのみ使用することを想定しています。*/ + public void setDeleted(Integer deleted) { + this.deleted = deleted; + } + /** @deprecated 共通項目のアクセサです。AppDao(およびその子クラス)でのみ使用することを想定しています。*/ + public Integer getUpdateusrid() { + return updateusrid; + } + /** @deprecated 共通項目のアクセサです。AppDao(およびその子クラス)でのみ使用することを想定しています。*/ + public void setUpdateusrid(Integer updateusrid) { + this.updateusrid = updateusrid; + } + + + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/FreeDao.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/FreeDao.java new file mode 100644 index 0000000..f8ac453 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/FreeDao.java @@ -0,0 +1,24 @@ +package jp.co.y_net.amm.dao; +import org.hibernate.HibernateException; +import org.hibernate.Query; +import org.hibernate.Session; +import org.springframework.orm.hibernate3.HibernateCallback; +import org.springframework.orm.hibernate3.HibernateTemplate; +import org.springframework.stereotype.Component; + + +@Component("freeDao") +public class FreeDao extends AbstractDao { + + public void copy(final String sql) { + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + hibernateTemplate.execute(new HibernateCallback() { + public Object doInHibernate(Session session) throws HibernateException { + Query query = session.createSQLQuery(sql); + Object result = query.list(); + return result; + } + }); + hibernateTemplate.clear(); + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grp.hbm.xml b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grp.hbm.xml new file mode 100644 index 0000000..4ecc9a9 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grp.hbm.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grp.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grp.java new file mode 100644 index 0000000..b2b35a6 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grp.java @@ -0,0 +1,80 @@ +package jp.co.y_net.amm.dao; + +import java.io.Serializable; +import java.util.Comparator; + + +public class Grp extends AppDto implements Serializable { + + private static final long serialVersionUID = 1L; + + /* DBMSと連携するメンバ */ + private Integer grpid; + private String name; + private Integer adminusrid; + private Long createdate; + + + /* アプリケーションで設定するメンバ */ + // なし + + /* 自動生成のアクセサ */ + public Integer getGrpid() { + return grpid; + } + public void setGrpid(Integer grpid) { + this.grpid = grpid; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Integer getAdminusrid() { + return adminusrid; + } + public void setAdminusrid(Integer adminusrid) { + this.adminusrid = adminusrid; + } + public Long getCreatedate() { + return createdate; + } + public void setCreatedate(Long createdate) { + this.createdate = createdate; + } + /* 自動生成のアクセサ -end */ + + /* 型変換のアクセサ */ + /* 型変換のアクセサ - end */ + + + + /** + * 作成日時のソートに用いるComparator + */ + public static class CreatedateComparator implements Comparator { + /** trueに変更すると 申請日時の新しい順 */ + private boolean desc = false; + + public CreatedateComparator(boolean desc) { + this.desc = desc; + } + + @Override + public int compare(Grp o1, Grp o2) { + int reverse = 1; + if(desc) { + reverse = -1; + } + + Long n1 = 0L; + Long n2 = 0L; + if(o1 != null && o1.getCreatedate() != null) n1 = o1.getCreatedate(); + if(o2 != null && o2.getCreatedate() != null) n2 = o2.getCreatedate(); + + return Long.compare(n1, n2) * reverse; + } + } +} + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/GrpDao.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/GrpDao.java new file mode 100644 index 0000000..8bfe2a3 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/GrpDao.java @@ -0,0 +1,68 @@ +package jp.co.y_net.amm.dao; +import java.util.List; + +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Example; +import org.springframework.orm.hibernate3.HibernateTemplate; +import org.springframework.stereotype.Component; + + +@Component("grpDao") +public class GrpDao extends AbstractDao { + + /* 参照形処理 ------------------------------------------------------------------------------------------------ */ + /** ユニークキーを使用した取得 */ + public Grp getByGrpid(Integer grpid) { + Grp cnd = new Grp(); + cnd.setGrpid(grpid); + List list = get(cnd); + if(list.size() == 1) { + return list.get(0); + } + return null; + } + /** 全件取得(論理削除除外) */ + public List get() { + Grp cnd = new Grp(); + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + return get(cnd); + } + /** 条件付き取得(論理削除除外) */ + public List get(Grp cnd) { + if(cnd != null) { + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + } + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + DetachedCriteria dc = DetachedCriteria.forClass(Grp.class); + dc.add(Example.create(cnd)); + @SuppressWarnings("unchecked") + List list = (List) hibernateTemplate.findByCriteria(dc); + hibernateTemplate.clear(); + return list; + } + + /* 更新系処理 ------------------------------------------------------------------------------------------------ */ + private static final String ENTITYNAME = "Grp"; + private static final String PKEYNAME = "grpid"; + /** + * 登録処理 + * ・必要なカラムを自動採番する + * ・共通処理を実施する。 + * @see AbstractDao#add(AppDto, Integer) + * @param item 追加対象オブジェクト + * @param updateusrid 更新者ID + */ + public void add(Grp item, Integer updateusrid) { + /* 自動採番 */ + item.setGrpid(getNextId(ENTITYNAME, PKEYNAME, 1000000001)); // グループIDとユーザIDの重複を避けるため、開始する値を変更する。 + /* Insert実施 */ + super.add(item, updateusrid); + } + + public void update(Grp item, Integer updateusrid) { + super.update(item, updateusrid); + } + public void removeLogical(Grp item, Integer updateusrid) { + super.removeLogical(item, updateusrid); + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grpusr.hbm.xml b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grpusr.hbm.xml new file mode 100644 index 0000000..6d28282 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grpusr.hbm.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grpusr.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grpusr.java new file mode 100644 index 0000000..09dcb6f --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Grpusr.java @@ -0,0 +1,169 @@ +package jp.co.y_net.amm.dao; + +import java.io.Serializable; +import java.util.Comparator; + +import jp.co.y_net.amm.common.AppUtils; + + +public class Grpusr extends AppDto implements Serializable { + private static final long serialVersionUID = 1L; + + public static final Integer STATUS_未設定 = -1; + public static final Integer STATUS_招待中 = 0; + public static final Integer STATUS_参加中 = 1; + public static final Integer STATUS_脱退 = 2; + + public static final Integer STATUS_ADMIN_未設定 = -1; + public static final Integer STATUS_ADMIN_移管依頼中 = 0; + public static final Integer STATUS_ADMIN_移管完了 = 1; + + + /* DBMSと連携するメンバ */ + private Integer grpusrid; + private Integer grpid; + private Integer usrid; + + private Long invitationdate; + private Long joindate; + private Long leavedate; + private Long admindate; + + private Integer statusadmin; + private Integer status; + + + + /* アプリケーションで設定するメンバ */ + // なし + + /* 自動生成のアクセサ */ + public Integer getGrpusrid() { + return grpusrid; + } + public void setGrpusrid(Integer grpusrid) { + this.grpusrid = grpusrid; + } + public Integer getGrpid() { + return grpid; + } + public void setGrpid(Integer grpid) { + this.grpid = grpid; + } + public Integer getUsrid() { + return usrid; + } + public void setUsrid(Integer usrid) { + this.usrid = usrid; + } + public Long getInvitationdate() { + return invitationdate; + } + public void setInvitationdate(Long invitationdate) { + this.invitationdate = invitationdate; + } + public Long getJoindate() { + return joindate; + } + public void setJoindate(Long joindate) { + this.joindate = joindate; + } + public Long getLeavedate() { + return leavedate; + } + public void setLeavedate(Long leavedate) { + this.leavedate = leavedate; + } + public Long getAdmindate() { + return admindate; + } + public void setAdmindate(Long admindate) { + this.admindate = admindate; + } + public Integer getStatusadmin() { + return statusadmin; + } + public void setStatusadmin(Integer statusadmin) { + this.statusadmin = statusadmin; + } + public Integer getStatus() { + return status; + } + public void setStatus(Integer status) { + this.status = status; + } + /* 自動生成のアクセサ -end */ + + /* 型変換のアクセサ */ + + + /* 型変換のアクセサ - end */ + + + /** + * 参加日時のソートに用いるComparator + */ + public static class JoindateComparator implements Comparator { + /** trueに変更すると新しい順 */ + private boolean desc = false; + + public JoindateComparator(boolean desc) { + this.desc = desc; + } + + @Override + public int compare(Grpusr o1, Grpusr o2) { + int reverse = 1; + if(desc) { + reverse = -1; + } + + Long n1 = 0L; + Long n2 = 0L; + if(o1 != null && o1.getJoindate() != null) n1 = o1.getJoindate(); + if(o2 != null && o2.getJoindate() != null) n2 = o2.getJoindate(); + + /* 参加日が未設定の時は、招待日に置き換える */ + if(n1 == 0L) { + if(o1 != null && o1.getInvitationdate() != null) n1 = o1.getInvitationdate(); + } + if(n2 == 0L) { + if(o2 != null && o2.getInvitationdate() != null) n2 = o2.getInvitationdate(); + } + + return Long.compare(n1, n2) * reverse; + } + } + + /** + * statusadmin と status を合算した結果を表示文字列で返す。 + * + * 参加状態(status)=「招待中」 ⇒ 招待中 + * 参加状態(status)=「参加済み」 かつ 移管状態=未設定 ⇒ 参加中 + * 参加状態(status)=「参加済み」 かつ 移管状態=「移管依頼中」 ⇒ 移管依頼中 + * 参加状態(status)=「参加済み」 かつ 移管状態=「移管完了」 ⇒ 参加中 + */ + public String getStatus合算() { + if(this.status == null || STATUS_未設定.equals(this.status) ) { + return ""; + } + if(STATUS_招待中.equals(this.status)) { + return "招待中"; + } + if(STATUS_参加中.equals(this.status)) { + + if(STATUS_ADMIN_移管依頼中.equals(this.status)) { + return "移管依頼中"; + } + return "参加中"; + } + return ""; + } + public void set脱退設定() { + this.setLeavedate(AppUtils.createNowLong()); // 脱退日時 + this.setStatus(Grpusr.STATUS_脱退); + } + + +} + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/GrpusrDao.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/GrpusrDao.java new file mode 100644 index 0000000..ad07168 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/GrpusrDao.java @@ -0,0 +1,93 @@ +package jp.co.y_net.amm.dao; +import java.util.List; + +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Example; +import org.springframework.orm.hibernate3.HibernateTemplate; +import org.springframework.stereotype.Component; + + +@Component("grpusrDao") +public class GrpusrDao extends AbstractDao { + + /* 参照形処理 ------------------------------------------------------------------------------------------------ */ + /** ユニークキーを使用した取得 */ + public Grpusr getByGrpusrid(Integer grpusrid) { + Grpusr cnd = new Grpusr(); + cnd.setGrpusrid(grpusrid); + List list = get(cnd); + if(list.size() == 1) { + return list.get(0); + } + return null; + } + /** 全件取得(論理削除除外) */ + public List get() { + Grpusr cnd = new Grpusr(); + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + return get(cnd); + } + /** 条件付き取得(論理削除除外) */ + public List get(Grpusr cnd) { + if(cnd != null) { + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + } + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + DetachedCriteria dc = DetachedCriteria.forClass(Grpusr.class); + dc.add(Example.create(cnd)); + @SuppressWarnings("unchecked") + List list = (List) hibernateTemplate.findByCriteria(dc); + hibernateTemplate.clear(); + return list; + } + + /* 更新系処理 ------------------------------------------------------------------------------------------------ */ + private static final String ENTITYNAME = "Grpusr"; + private static final String PKEYNAME = "grpusrid"; + /** + * 登録処理 + * ・必要なカラムを自動採番する + * ・共通処理を実施する。 + * @see AbstractDao#add(AppDto, Integer) + * @param item 追加対象オブジェクト + * @param updateusrid 更新者ID + */ + public void add(Grpusr item, Integer updateusrid) { + /* 自動採番 */ + item.setGrpusrid(getNextId(ENTITYNAME, PKEYNAME)); + /* Insert実施 */ + super.add(item, updateusrid); + } + public void update(Grpusr item, Integer updateusrid) { + super.update(item, updateusrid); + } + public void removeLogical(Grpusr item, Integer updateusrid) { + super.removeLogical(item, updateusrid); + } + + /* entity固有のユーティリティ ----------------------------------------------------------------------------------- */ + /** + * 所属メンバー数 + * @param grpid + * @return + */ + public String getMembercount参加中AsString(Integer grpid) { + return String.valueOf(getMembercount参加中(grpid)); + } + /** + * 所属メンバー数 + * @param grpid + * @return + */ + public Integer getMembercount参加中(Integer grpid) { + Grpusr cndGu = new Grpusr(); + cndGu.setGrpid(grpid); + cndGu.setStatus(Grpusr.STATUS_参加中); + List member = this.get(cndGu); + return member.size(); + } + + + + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Inf.hbm.xml b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Inf.hbm.xml new file mode 100644 index 0000000..11387c5 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Inf.hbm.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Inf.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Inf.java new file mode 100644 index 0000000..2eeae8c --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Inf.java @@ -0,0 +1,71 @@ +package jp.co.y_net.amm.dao; + +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import jp.co.y_net.amm.common.AppUtils; + +import org.apache.commons.lang.StringUtils; + + +public class Inf extends AppDto implements Serializable { + private static final long serialVersionUID = 1L; + + public static final DateFormat DF_PUBDATE = new SimpleDateFormat("yyyy/MM/dd"); // 掲載日 フォーマット + public static final Integer DEFお知らせ本文の文字数 = 5000; + + /** 状態 */ + public static final Integer STATUS_掲載中 = 2; + public static final Integer STATUS_その他 = 1; + public static final Integer STATUS_掲載終了 = 9; + + private Integer infid; + private String title; + private String body; + private Long pubdate; + private Integer status; + + + public String getTitleFormat() { + return StringUtils.abbreviate(title, 50); // 50文字に省略 + } + public String getPubdate_Disp() { + Date d = AppUtils.toDate(this.pubdate); + return DF_PUBDATE.format(d); + } + + + public Integer getInfid() { + return infid; + } + public void setInfid(Integer infid) { + this.infid = infid; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public String getBody() { + return body; + } + public void setBody(String body) { + this.body = body; + } + public Long getPubdate() { + return pubdate; + } + public void setPubdate(Long pubdate) { + this.pubdate = pubdate; + } + public Integer getStatus() { + return status; + } + public void setStatus(Integer status) { + this.status = status; + } +} + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/InfDao.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/InfDao.java new file mode 100644 index 0000000..4d80ecc --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/InfDao.java @@ -0,0 +1,67 @@ +package jp.co.y_net.amm.dao; +import java.util.List; + +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Example; +import org.springframework.orm.hibernate3.HibernateTemplate; +import org.springframework.stereotype.Component; + + +@Component("infDao") +public class InfDao extends AbstractDao { + + /* 参照形処理 ------------------------------------------------------------------------------------------------ */ + /** ユニークキーを使用した取得 */ + public Inf getByInfid(Integer infid) { + Inf cnd = new Inf(); + cnd.setInfid(infid); + List list = get(cnd); + if(list.size() == 1) { + return list.get(0); + } + return null; + } + /** 全件取得(論理削除除外) */ + public List get() { + Inf cnd = new Inf(); + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + return get(cnd); + } + /** 条件付き取得(論理削除除外) */ + public List get(Inf cnd) { + if(cnd != null) { + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + } + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + DetachedCriteria dc = DetachedCriteria.forClass(Inf.class); + dc.add(Example.create(cnd)); + @SuppressWarnings("unchecked") + List list = (List) hibernateTemplate.findByCriteria(dc); + hibernateTemplate.clear(); + return list; + } + + /* 更新系処理 ------------------------------------------------------------------------------------------------ */ + private static final String ENTITYNAME = "Inf"; + private static final String PKEYNAME = "infid"; + /** + * 登録処理 + * ・必要なカラムを自動採番する + * ・共通処理を実施する。 + * @param item + */ + public void add(Inf item, Integer updateusrid) { + /* 自動採番 */ + item.setInfid(getNextId(ENTITYNAME, PKEYNAME)); + /* Insert実施 */ + super.add(item, updateusrid); + } + public void update(Inf item, Integer updateusrid) { + super.update(item, updateusrid); + } + public void removeLogical(Inf item, Integer updateusrid) { + super.removeLogical(item, updateusrid); + } + + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Localestring.hbm.xml.back b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Localestring.hbm.xml.back new file mode 100644 index 0000000..c51fbb8 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Localestring.hbm.xml.back @@ -0,0 +1,33 @@ + + + + + + + + localestring_id_seq + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Localestring.java.back b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Localestring.java.back new file mode 100644 index 0000000..e9d8296 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Localestring.java.back @@ -0,0 +1,187 @@ +package jp.co.y_net.amm.dao; + + +/** + * Localestring + * + * @version 1.0.0 + * @author k_ohara + */ +public class Localestring implements java.io.Serializable { + + /** + * 表示文字クラス + */ + private static final long serialVersionUID = 1L; + + /** ID */ + private Integer id; + /** screenid */ + private String screenid; + /** languageid */ + private Integer languageid; + /** controlid */ + private String controlid; + /** num */ + private String num; + /** printstring */ + private String printstring; + + /** + * コンストラクタ + * + */ + public Localestring() { + } + + /** + * コンストラクタ + * + */ + public Localestring(String screenid, Integer languageid, String controlid, + String num, String printstring) { + + this.screenid = screenid; + this.languageid = languageid; + this.controlid = controlid; + this.num = num; + this.printstring = printstring; + } + + /** + * コピーコンストラクタ + * + */ + public Localestring(Localestring item) { + this.id = item.id; + this.screenid = item.screenid; + this.languageid = item.languageid; + this.controlid = item.controlid; + this.num = item.num; + this.printstring = item.printstring; + } + + /** + * IDを取得 + * + * @return ID + */ + public Integer getId() { + return this.id; + } + + /** + * IDを設定 + * + * @param id ID + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * screenidを取得 + * @return screenid + */ + public String getScreenid() { + return screenid; + } + + /** + * screenidを設定 + * @param screenid screenid + */ + public void setScreenid(String screenid) { + this.screenid = screenid; + } + + /** + * languageidを取得 + * @return languageid + */ + public Integer getLanguageid() { + return languageid; + } + + /** + * languageidを設定 + * @param languageid languageid + */ + public void setLanguageid(Integer languageid) { + this.languageid = languageid; + } + + /** + * controlidを取得 + * @return controlid + */ + public String getControlid() { + return controlid; + } + + /** + * controlidを設定 + * @param controlid controlid + */ + public void setControlid(String controlid) { + this.controlid = controlid; + } + + /** + * numを取得 + * @return num + */ + public String getNum() { + return num; + } + + /** + * numを設定 + * @param num num + */ + public void setNum(String num) { + this.num = num; + } + + /** + * printstringを取得 + * @return printstring + */ + public String getPrintstring() { + return printstring; + } + + /** + * printstringを設定 + * @param printstring printstring + */ + public void setPrintstring(String printstring) { + this.printstring = printstring; + } + +} +/* +CREATE TABLE ammdb.localestring +( + id serial NOT NULL, -- ID + screenid character varying(64), -- 画面ID + languageid integer, -- 言語 0=日本語/1=英語 + controlid character varying(64), -- 項目ID + num character varying(20), -- 枝番 + printstring character varying(1024), -- 表示文字列 + CONSTRAINT localestring_pkey PRIMARY KEY (id ) +) +WITH ( + OIDS=FALSE +); +ALTER TABLE ammdb.localestring + OWNER TO libgdc; +COMMENT ON TABLE ammdb.localestring + IS '表示文字列'; +COMMENT ON COLUMN ammdb.localestring.id IS 'ID'; +COMMENT ON COLUMN ammdb.localestring.screenid IS '画面ID'; +COMMENT ON COLUMN ammdb.localestring.languageid IS '言語 0=日本語/1=英語'; +COMMENT ON COLUMN ammdb.localestring.controlid IS '項目ID'; +COMMENT ON COLUMN ammdb.localestring.num IS '枝番'; +COMMENT ON COLUMN ammdb.localestring.printstring IS '表示文字列'; +*/ diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/LocalestringDao.java.back b/AMM_web/src/main/java/jp/co/y_net/amm/dao/LocalestringDao.java.back new file mode 100644 index 0000000..ceb9c7e --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/LocalestringDao.java.back @@ -0,0 +1,41 @@ +package jp.co.y_net.amm.dao; + +import java.util.List; + +/** + * LocalestringDao + * + * @version 1.0.0 + */ +public interface LocalestringDao { + + /** + * Localestringを取得 + * + * @param item Localestring + * @return List + */ + List get(Localestring item); + + /** + * Localestringを追加 + * + * @param item Localestring + */ + void add(Localestring item); + + /** + * Localestringを更新 + * + * @param item Localestring + */ + void update(Localestring item); + + /** + * Localestringを削除 + * + * @param item Localestring + */ + void remove(Localestring item); + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/LocalestringDaoImpl.java.back b/AMM_web/src/main/java/jp/co/y_net/amm/dao/LocalestringDaoImpl.java.back new file mode 100644 index 0000000..93ee127 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/LocalestringDaoImpl.java.back @@ -0,0 +1,61 @@ +package jp.co.y_net.amm.dao; +import java.util.List; + +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Example; +import org.hibernate.criterion.Order; +import org.springframework.orm.hibernate3.HibernateTemplate; +import org.springframework.stereotype.Component; + +/** + * LocalestringDaoImpl + * + * @version 1.0.0 + */ +@Component("localestringDao") +public class LocalestringDaoImpl extends AbstractDao implements LocalestringDao { + + @Override + public List get(Localestring item) { + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + DetachedCriteria dc = DetachedCriteria.forClass(Localestring.class); + dc.add(Example.create(item)); + dc.addOrder(Order.asc("num")); + @SuppressWarnings("unchecked") + List list = (List) hibernateTemplate.findByCriteria(dc); + hibernateTemplate.clear(); + return list; + + } + @Override + public void add(Localestring item) { + try { + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + hibernateTemplate.save(item); + hibernateTemplate.flush(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Override + public void update(Localestring item) { + try { + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + + hibernateTemplate.update(item); + hibernateTemplate.flush(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Override + public void remove(Localestring item) { + try { + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + hibernateTemplate.delete(item); + hibernateTemplate.flush(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Org.hbm.xml b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Org.hbm.xml new file mode 100644 index 0000000..0d05ac2 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Org.hbm.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Org.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Org.java new file mode 100644 index 0000000..9542cae --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Org.java @@ -0,0 +1,484 @@ +package jp.co.y_net.amm.dao; + +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import jp.co.y_net.amm.common.AppLogger; +import jp.co.y_net.amm.common.AppUtils; +import jp.co.y_net.amm.common.ChoiceElement; +import jp.co.y_net.amm.common.ResourceReader; + +import org.apache.commons.lang.StringUtils; + + +public class Org extends AppDto implements Serializable { + private static final long serialVersionUID = 1L; + + /** 申請日に使用するDateFormat */ + final DateFormat DF_YYYYMMDDHHMM = new SimpleDateFormat("yyyy/MM/dd HH:mm"); + + public static final int KIND_PERSONAL = 9; // 個人会員 + public static final String KIND_PERSONAL_STR = "9"; // 個人会員 + + public static final int KIND_運営管理 = 999; + + public static final int LIMITNUM_未指定 = -1; + + private Integer orgid; + private Integer kind; + private String name; + private String adminname; + private String adminnamekana; + private String postnum; + private String address; + private String telnum; + private String mail; + private Integer fromdate; + private Integer todate; + private Integer limitnum; + private Long entrydate; + private Long approvaldate; + private Long rejectdate; + private String note; + private Long joindate; + private Integer status; + + /** 状態 */ + public static final int STATUS_未処理 = 0; + public static final int STATUS_承認済み = 1; + public static final int STATUS_拒否済み = 2; + public static final int STATUS_本登録済み = 3; + + public static Map getStatusMap() { + Map map = new TreeMap(); + map.put("0", "未処理"); + map.put("1", "承認済み"); + map.put("2", "拒否済み"); + map.put("3", "本登録済み"); + return map; + } + + /** + * @return 状態の名称 + */ + public String getStatus_Disp() { + if(status == null) { + return null; + } + switch (status) { + case STATUS_未処理: + return "未処理"; + case STATUS_承認済み: + return "承認済み"; + case STATUS_拒否済み: + return "拒否済み"; + case STATUS_本登録済み: + return "本登録済み"; + default: + return String.valueOf(status); + } + } + + /** @return 機関会員の種類の名称 */ + public String getKind_Disp() { + String key = getKind().toString(); + return getOrgkindMap().get(key); + } + /** + * @return 個人会員であれば true + */ + public boolean isPersonalOrg() { + if(this.kind != null && this.kind == KIND_PERSONAL) { + return true; + } else { + return false; + } + } + + /** + * @return 郵便番号のハイフン付き表記 + */ + public String getPostnum_Disp() { + String tmp = getPostnum(); + if(tmp != null && tmp.length() > 4) { + StringBuilder sb = new StringBuilder(tmp); + sb.insert(3, "-"); + tmp = sb.toString(); + } + return tmp; + } + + /** + * @return 機関・団体であればその名称。個人会員であれば代表者名。 + */ + public String getNameOrAdminname() { + String name; + if(this.isPersonalOrg()) { + name = this.getAdminname(); + } else { + name = this.getName(); + } +// if(StringUtils.isEmpty(this.getName()) == false) { +// name = this.getName(); +// } else if(StringUtils.isEmpty(this.getAdminname()) == false) { +// name = this.getAdminname(); +// } else { +// name = ""; +// } + + + String str = StringUtils.abbreviate(name, 100); + return str; + } + + + +// public static void main(String[] args) { +//// Map map = getKindMap(); +//// for(Entry e: map.entrySet()) { +//// System.out.println(e.getKey() + "=" + e.getValue()); +//// } +//// System.out.println(ResourceReader.getText("message/termsofuse")); +// Org org = new Org(); +// org.setPostnum("123"); +// System.out.println(org.getPostnum_Disp()); +// org.setPostnum("1234"); +// System.out.println(org.getPostnum_Disp()); +// org.setPostnum("12345"); +// System.out.println(org.getPostnum_Disp()); +// org.setPostnum("123456"); +// System.out.println(org.getPostnum_Disp()); +// org.setPostnum("1234567"); +// System.out.println(org.getPostnum_Disp()); +// org.setPostnum(null); +// System.out.println(org.getPostnum_Disp()); +// } + + public static TreeMap getOrgkindMap() { + String orgkinds = ResourceReader.getStringQuick("orgkinds"); + String[] orgkindArray = orgkinds.split(","); + TreeMap map = new TreeMap(); + for(String kind: orgkindArray) { + kind = kind.trim(); + String key; + String value; + int index = kind.indexOf("."); + if(index != -1) { + key = kind.split("\\.")[0]; + value = kind.split("\\.")[1]; + } else { + key = kind; + value = ""; + } + map.put(key, value); + } + return map; + } + + /** + * @return 申請日時(書式:yyyy/MM/dd HH:mm) + */ + public String getEntrydate_Disp() { + String entrydate; + try { + Date d = AppUtils.toDate(this.getEntrydate()); + if(d != null) { + entrydate = DF_YYYYMMDDHHMM.format(d); + } else { + entrydate = ""; + } + } catch (Exception e) { + AppLogger.error(e); + if (this.getEntrydate() != null) { + entrydate = String.valueOf(this.getEntrydate()); + } else { + entrydate = ""; + }; + } + return entrydate; + } + + /** + * 申請日付のソートに用いるComparator + */ + public static class EntryDateComparator implements Comparator{ + /** trueに変更すると 申請日時の新しい順 */ + private boolean desc = false; + + public EntryDateComparator(boolean desc) { + this.desc = desc; + } + + @Override + public int compare(Org o1, Org o2) { + int reverse = 1; + //if(sortModel.getObject().getId().equals("1")) { + if(desc) { + reverse = -1; + } + + Long n1 = 0L; + Long n2 = 0L; + if(o1 != null && o1.getEntrydate() != null) n1 = o1.getEntrydate(); + if(o2 != null && o2.getEntrydate() != null) n2 = o2.getEntrydate(); + + return Long.compare(n1, n2) * reverse; + } + } + + /** 登録可能会員数の選択肢 */ + public static List createLimitChices(String limitnumValue) { + List limitnumList = new ArrayList(); + limitnumList.add(LIMITNUM_未指定); // 未指定 + /* 設定ファイルより選択肢を取得 */ + String str = ResourceReader.getStringQuick("limitnums"); + String[] array = str.split(","); + for (int i = 0; i < array.length; i++) { + int num; + try { + num = Integer.parseInt(array[i].trim()); + limitnumList.add(num); + } catch (NumberFormatException e) { + AppLogger.info("設定値 limitnums に数値に変換できない値があります。", e); + } + } + String existValue = String.valueOf(limitnumValue); + if(StringUtils.isEmpty(existValue) == false) { + int iExistValue; + try { + iExistValue = Integer.parseInt(existValue); + if(limitnumList.contains(iExistValue) == false) { + limitnumList.add(iExistValue); // 現在の値が選択肢になければ追加する + } + } catch (NumberFormatException e1) { + // 処理なし + } + } + Collections.sort(limitnumList); + List choiceLimitnum = new ArrayList(); + for (Integer num: limitnumList) { + String label; + if(num == LIMITNUM_未指定) { + label = "指定なし"; + } else { + label = num + "人"; + } + choiceLimitnum.add(new ChoiceElement(String.valueOf(num), label)); + } + return choiceLimitnum; + } + + public boolean is利用可能期間内() { + return betweenNow(this.fromdate, this.todate); + } + + private static boolean betweenNow(Integer from, Integer to) { + if(from == null || from == -1) from = Integer.MIN_VALUE; + if(to == null || to == -1) to = Integer.MAX_VALUE; + Integer now = AppUtils.createNowShort(); + return from <= now && now <= to; + } +// public static void main(String[] args) { +// System.out.println(betweenNow(-1, -1)); +// System.out.println(betweenNow(null, null)); +// System.out.println(betweenNow(20150803, 20150831)); +// System.out.println(betweenNow(20150804, 20150831)); +// System.out.println(betweenNow(20150801, 20150802)); +// System.out.println(betweenNow(20150801, 20150803)); +// } + + /** + * @return 利用期間(表示用) + */ + public String getFromTodate_Disp() { + String fromdate = AppUtils.toStrYyyyMMdd(this.getFromdate()); + if(is利用期間未指定(this.getFromdate())) { + fromdate = ""; + } + String todate = AppUtils.toStrYyyyMMdd(this.getTodate()); + if(is利用期間未指定(this.getTodate())) { + todate = ""; + } + String fromtodateStr; + if(StringUtils.isEmpty(fromdate) && StringUtils.isEmpty(todate)) { + fromtodateStr = ""; + } else if (StringUtils.isEmpty(fromdate) == false && StringUtils.isEmpty(todate) == true) { + fromtodateStr = fromdate + "~"; + } else if (StringUtils.isEmpty(fromdate) == true && StringUtils.isEmpty(todate) == false) { + fromtodateStr = "~" + todate; + } else { + fromtodateStr = fromdate + "~" + todate; + } + if("~".equals(fromtodateStr)) { + return ""; + } + return fromtodateStr; + } + + private boolean is利用期間未指定(Integer fromOrTo) { + if(fromOrTo == null) { + return true; + } + if(LIMITNUM_未指定 == fromOrTo) { + return true; + } + return false; + } + public boolean isLimitnum指定なし() { + return limitnum == null || LIMITNUM_未指定 == limitnum; + } + + public static void main(String[] args) { + Org org = new Org(); + System.out.println(org.getFromTodate_Disp()); + org.setFromdate(-1); + System.out.println(org.getFromTodate_Disp()); + org.setTodate(-1); + System.out.println(org.getFromTodate_Disp()); + org.setFromdate(20150101); + System.out.println(org.getFromTodate_Disp()); + org.setTodate(20151212); + System.out.println(org.getFromTodate_Disp()); + + } + + /* -- 以下、自動生成 --*/ + +// public Integer getId() { +// return id; +// } +// public void setId(Integer id) { +// this.id = id; +// } +// public Integer getUpdatedate() { +// return updatedate; +// } +// public void setUpdatedate(Integer updatedate) { +// this.updatedate = updatedate; +// } +// public Integer getDeleted() { +// return deleted; +// } +// public void setDeleted(Integer deleted) { +// this.deleted = deleted; +// } + public Integer getOrgid() { + return orgid; + } + public void setOrgid(Integer orgid) { + this.orgid = orgid; + } + public Integer getKind() { + return kind; + } + public void setKind(Integer kind) { + this.kind = kind; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getAdminname() { + return adminname; + } + public void setAdminname(String adminname) { + this.adminname = adminname; + } + public String getAdminnamekana() { + return adminnamekana; + } + public void setAdminnamekana(String adminnamekana) { + this.adminnamekana = adminnamekana; + } + public String getPostnum() { + return postnum; + } + public void setPostnum(String postnum) { + this.postnum = postnum; + } + public String getAddress() { + return address; + } + public void setAddress(String address) { + this.address = address; + } + public String getTelnum() { + return telnum; + } + public void setTelnum(String telnum) { + this.telnum = telnum; + } + public String getMail() { + return mail; + } + public void setMail(String mail) { + this.mail = mail; + } + public Integer getFromdate() { + return fromdate; + } + public void setFromdate(Integer fromdate) { + this.fromdate = fromdate; + } + public Integer getTodate() { + return todate; + } + public void setTodate(Integer todate) { + this.todate = todate; + } + + public Long getEntrydate() { + return entrydate; + } + public void setEntrydate(Long entrydate) { + this.entrydate = entrydate; + } + public Long getApprovaldate() { + return approvaldate; + } + public void setApprovaldate(Long approvaldate) { + this.approvaldate = approvaldate; + } + public Long getRejectdate() { + return rejectdate; + } + public void setRejectdate(Long rejectdate) { + this.rejectdate = rejectdate; + } + public String getNote() { + return note; + } + public void setNote(String note) { + this.note = note; + } + public Long getJoindate() { + return joindate; + } + public void setJoindate(Long joindate) { + this.joindate = joindate; + } + public Integer getLimitnum() { + return limitnum; + } + public void setLimitnum(Integer limitnum) { + this.limitnum = limitnum; + } + public Integer getStatus() { + return status; + } + public void setStatus(Integer status) { + this.status = status; + } + + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/OrgDao.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/OrgDao.java new file mode 100644 index 0000000..df6c4fe --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/OrgDao.java @@ -0,0 +1,77 @@ +package jp.co.y_net.amm.dao; +import java.util.List; + +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Example; +import org.springframework.orm.hibernate3.HibernateTemplate; +import org.springframework.stereotype.Component; + + +@Component("orgDao") +public class OrgDao extends AbstractDao { + + /* 参照形処理 ------------------------------------------------------------------------------------------------ */ + /** ユニークキーを使用した取得 */ + public Org getByOrgid(Integer orgid) { + return getByOrgid(orgid, false); + } + + public Org getByOrgid(Integer orgid, boolean withDeleted) { + Org cnd = new Org(); + cnd.setOrgid(orgid); + List orgs = get(cnd, withDeleted); + if(orgs.size() == 1) { + return orgs.get(0); + } + return null; + } + + /** 全件取得(論理削除除外) */ + public List get() { + Org cnd = new Org(); + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + return get(cnd); + } + /** 条件付き取得(論理削除除外) */ + public List get(Org cnd) { + return get(cnd, false); + } + public List get(Org cnd, boolean withDeleted) { + if (withDeleted == false) { + if(cnd != null) { + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + } + } + + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + DetachedCriteria dc = DetachedCriteria.forClass(Org.class); + dc.add(Example.create(cnd)); + @SuppressWarnings("unchecked") + List list = (List) hibernateTemplate.findByCriteria(dc); + hibernateTemplate.clear(); + return list; + } + /* 更新系処理 ------------------------------------------------------------------------------------------------ */ + private static final String ENTITYNAME = "Org"; + private static final String PKEYNAME = "orgid"; + /** + * 登録処理 + * ・必要なカラムを自動採番する + * ・共通処理を実施する。 + * @param item + */ + public void add(Org item, Integer updateusrid) { + /* 自動採番 */ + item.setOrgid(getNextId(ENTITYNAME, PKEYNAME)); + /* Insert実施 */ + super.add(item, updateusrid); + } + public void update(Org item, Integer updateusrid) { + super.update(item, updateusrid); + } + public void removeLogical(Org item, Integer updateusrid) { + super.removeLogical(item, updateusrid); + } + + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Pwtckt.hbm.xml b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Pwtckt.hbm.xml new file mode 100644 index 0000000..7d83892 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Pwtckt.hbm.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Pwtckt.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Pwtckt.java new file mode 100644 index 0000000..a58116b --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Pwtckt.java @@ -0,0 +1,73 @@ +package jp.co.y_net.amm.dao; + +import java.io.Serializable; + + +public class Pwtckt extends AppDto implements Serializable { + private static final long serialVersionUID = 1L; + + /** 状態 */ + public static final Integer STATUS_受付中 = 0; + public static final Integer STATUS_完了 = 1; + public static final Integer STATUS_中止 = 2; + public static final Integer STATUS_有効期限切れ = 3; + + private Integer pwtcktid; + private Integer usrid; + private String ticket; + private Long createdate; + private Long ticketdate; + private Long completedate; + private Long canceldate; + private Integer status; + + + public Integer getPwtcktid() { + return pwtcktid; + } + public void setPwtcktid(Integer pwtcktid) { + this.pwtcktid = pwtcktid; + } + public Integer getUsrid() { + return usrid; + } + public void setUsrid(Integer usrid) { + this.usrid = usrid; + } + public String getTicket() { + return ticket; + } + public void setTicket(String ticket) { + this.ticket = ticket; + } + public Long getCreatedate() { + return createdate; + } + public void setCreatedate(Long createdate) { + this.createdate = createdate; + } + public Long getTicketdate() { + return ticketdate; + } + public void setTicketdate(Long ticketdate) { + this.ticketdate = ticketdate; + } + public Long getCompletedate() { + return completedate; + } + public void setCompletedate(Long completedate) { + this.completedate = completedate; + } + public Long getCanceldate() { + return canceldate; + } + public void setCanceldate(Long canceldate) { + this.canceldate = canceldate; + } + public Integer getStatus() { + return status; + } + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/PwtcktDao.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/PwtcktDao.java new file mode 100644 index 0000000..911b2b0 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/PwtcktDao.java @@ -0,0 +1,53 @@ +package jp.co.y_net.amm.dao; +import java.util.List; + +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Example; +import org.springframework.orm.hibernate3.HibernateTemplate; +import org.springframework.stereotype.Component; + + +@Component("pwtcktDao") +public class PwtcktDao extends AbstractDao { + + /* 参照形処理 ------------------------------------------------------------------------------------------------ */ + /** ユニークキーを使用した取得 */ + public List get(Pwtckt cnd) { + if(cnd != null) { + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + } + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + DetachedCriteria dc = DetachedCriteria.forClass(Pwtckt.class); + dc.add(Example.create(cnd)); + @SuppressWarnings("unchecked") + List list = (List) hibernateTemplate.findByCriteria(dc); + hibernateTemplate.clear(); + return list; + } + /** TODO 全件取得(論理削除除外) 必要になったら実装 */ + + /** TODO 条件付き取得(論理削除除外) 必要になったら実装*/ + + /* 更新系処理 ------------------------------------------------------------------------------------------------ */ + private static final String ENTITYNAME = "Pwtckt"; + private static final String PKEYNAME = "pwtcktid"; + /** + * 登録処理 + * ・必要なカラムを自動採番する + * ・共通処理を実施する。 + * @param item + */ + public void add(Pwtckt item, Integer updateusrid) { + /* 自動採番 */ + item.setPwtcktid(getNextId(ENTITYNAME, PKEYNAME)); + /* Insert実施 */ + super.add(item, updateusrid); + } + public void update(Pwtckt item, Integer updateusrid) { + super.update(item, updateusrid); + } + public void removeLogical(Pwtckt item, Integer updateusrid) { + super.removeLogical(item, updateusrid); + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/TextDao.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/TextDao.java new file mode 100644 index 0000000..ee4fc22 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/TextDao.java @@ -0,0 +1,491 @@ +package jp.co.y_net.amm.dao; + + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.lang.reflect.Field; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import javax.servlet.ServletContext; + +import org.apache.wicket.protocol.http.WebApplication; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** +* テキストファイルをストレージとするData Access Object +* +* オブジェクトはJSON形式に変換する。 +* +* 必須ライブラリは、親プロジェクトの pom.xml に記述 +* + + + com.fasterxml.jackson.core + jackson-core + 2.5.0 + + + com.fasterxml.jackson.core + jackson-databind + 2.5.0 + + + com.fasterxml.jackson.core + jackson-annotations + 2.5.0 + +* +* @author k.inaba +*/ +public class TextDao { + + /* + * -------------------------------------------------------------------------- + * サンプル実装 + */ + + /** + * 実装のサンプル このDAOの使用方法を示す。 + * @param args パラメータ不要 + */ + public static void main(String[] args) { + + /* + * DAOをインスタンス化する。 + * このとき保存先を指定する。 + */ + TextDao dao = new TextDao("C:\\tmp\\textdb"); + + /* 登録のサンプル */ + + TextDBAccSampleDto insertdto1 = new TextDBAccSampleDto(10, "aiueo"); + int insertId1 = dao.insert(insertdto1); + System.out.println(insertdto1.toString() + "を[" + insertId1 + "]として保存しました。"); + + TextDBAccSampleDto insertdto2 = new TextDBAccSampleDto(10, "あいうえお"); + int insertId2 = dao.insert(insertdto2); + System.out.println(insertdto2.toString() + "を[" + insertId2 + "]として保存しました。"); + + /* 検索のサンプル*/ + + TextDBAccSampleDto condA = new TextDBAccSampleDto(); + condA.col1 = 10; + List resultsA = dao.select(condA, TextDBAccSampleDto.class); + + System.out.println(condA.toString() + " を条件として検索を実行。"); + for (TextDBAccSampleDto dto: resultsA) { + System.out.println(">" + dto.toString()); + } + + TextDBAccSampleDto condB = new TextDBAccSampleDto(); + condB.col1 = 10; + condB.col2 = "あいうえお"; + List resultsB = dao.select(condB, TextDBAccSampleDto.class); + + System.out.println(condB.toString() + " を条件として検索を実行。"); + for (TextDBAccSampleDto dto: resultsB) { + System.out.println(">" + dto.toString()); + } + + /* 削除のサンプル */ + + List resultsAll = dao.select(TextDBAccSampleDto.class); + Collections.reverse(resultsAll); + int i = 0; + for (TextDBAccSampleDto dto : resultsAll) { + System.out.println(dto.toString()); + if (i > 5) { + System.out.println(dto.id + " を削除します。"); + // dao.delete(r, false); 論理削除ではなく、実際にファイルを削除する。 + dao.delete(dto); + } + i++; + } + } + + /** + * 実装のサンプル このDAOで扱うDTOを実装する際の参考とする。 + */ + private static class TextDBAccSampleDto { + /** + * 制御用のフィールド[id] + * + */ + public int id; + /* 保存するフィールド */ + public int col1; + public String col2; + + /** + * JSONからオブジェクトへ変換するために、 引数付きのコンストラクタが実装されている場合は、 デフォルトコンストラクタの実装が必要である。 + */ + public TextDBAccSampleDto() { + // 処理なし + } + + public TextDBAccSampleDto(int col1, String col2) { + this.col1 = col1; + this.col2 = col2; + } + + @Override + public String toString() { + return "TextDBAccSampleBean [id=" + id + ", col1=" + col1 + + ", col2=" + col2 + "]"; + } + } + + /* -------------------------------------------------------------------------- */ + + private File dbroot; + /** + * @param root データを保存するディレクトリ + */ + public TextDao(String dbname) { + dbroot = new File(getDbPath(dbname)); + if (dbroot.exists() == false) { + dbroot.mkdirs(); + } + } + /** + * Tomcatインスタンスのコンテキストルートより2階層上位のディレクトリを + * テキストデータを保存するディレクトリのパスとして取得する。 + * + * Linuxでの実行環境では + * /var/local/opt/tomcat/apache-tomcat/7.0/{???}-web/{dbname}/ + * + * 開発環境(ローカルのEclipse)では + * {ワークスペース}\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\{dbname} + * + * @return テキストデータを保存するディレクトリのパス + */ + private static String getDbPath(String dbname) { + ServletContext servletContext = WebApplication.get().getServletContext(); + File tomCatInstance = new File(servletContext.getRealPath("")).getParentFile().getParentFile(); // コンテキストルートより2階層上位 + File file = new File(new File(tomCatInstance, dbname), dbname + ".txt"); + if (file.exists() == false) { + file.getParentFile().mkdirs(); + try { + boolean result = file.createNewFile(); + if (result == false) { + throw new RuntimeException("ファイルの作成に失敗:" + file.getAbsolutePath()); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return file.getParent(); + } + + /** + * 保存する + * @param bean 保存するデータ + * @return id 保存したときに付与されたid + */ + public int insert(Object bean) { + String tablename = bean.getClass().getName(); + int maxId = -1; + File[] existfiles = getDbFiles(tablename); + for (File existfile : existfiles) { + int id = toId(existfile.getName(), tablename); + maxId = Math.max(maxId, id); + } + int insertId = maxId + 1; + ObjectMapper objectMapper = new ObjectMapper(); + try { + String json = objectMapper.writeValueAsString(bean); + File f = toFile(bean.getClass(), (insertId)); + writeText(f.getAbsolutePath(), json); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + return insertId; + } + + /** + * 指定されたクラスのデータをすべて取得する。 + * @param clz 指定クラス + * @return 取得したデータ + */ + public List select(Class clz) { + return select(null, clz) ; + } + + /** + * 指定されたクラスのデータのうち、引数 cond の条件に合うものを取得する。 + * + * ・cond のフィールドのうち、 nullでないフィールドが検索条件となる。 + * ・AND条件となる。 + * ・フィールド id は無視する。 + * + * @param clz 指定クラス + * @return 取得したデータ + */ + public List select(T cond, Class clz) { + List cndFields = new ArrayList(); + for (Field f : clz.getFields()) { + if (f.getName().equals("id") == false) { + cndFields.add(f); + } + } + String tablename = clz.getName(); + File[] existfiles = getDbFiles(tablename); + List result = new ArrayList(); + for (File file : existfiles) { + // String text = "{\"a\":123,\"b\":true,\"c\":\"あいう\"}"; + String text = readTextAsString(file.getAbsolutePath()); + ObjectMapper mapper = new ObjectMapper(); + T bean; + try { + // JsonNode root = mapper.readTree(text); + // String c = root.get("c").asText(); + bean = mapper.readValue(text, clz); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + + /* 絞り込みのための判定 */ + boolean isMatch; + if (cond == null) { + /* 条件なしのため必ず選択(true) */ + isMatch = true; + } else { + isMatch = true; + for (Field cndField : cndFields) { + Object cndValue; + Object targetValue; + try { + cndValue = cndField.get(cond); + targetValue = cndField.get(bean); + } catch (Exception e) { + throw new RuntimeException(e); + } + if (cndValue != null + && cndValue.equals(targetValue) == false) { + /* 不一致の条件を検出 */ + isMatch = false; + break; + } + } + } + if (isMatch) { + /* beanにidを付与する */ + /* ファイル名からidを取得する */ + try { + Field f = clz.getField("id"); + f.set(bean, toId(file.getName(), tablename)); + } catch (NoSuchFieldException e) { + /* フィールド[id]がなければ無視する。エラーとしない。 */ + } catch (Exception e) { + throw new RuntimeException(e); + } + result.add(bean); + } + } + return result; + } + + /** + * 指定されたBeanのidと一致するデータを論理削除する。 + * 論理削除の場合は、該当のデータの拡張子に[.del]が付与され、無効化される。 + * @param bean + */ + public void delete(Object bean) { + delete(bean, true); // デフォルトは論理削除 + } + /** + * 指定されたBeanのidと一致するデータを削除する。 + * 論理削除の場合は、該当のデータの拡張子に[.del]が付与され、無効化される。 + * @param bean + * @param logical 論理削除とする場合はTrue, 物理削除はFalseを指定する。 + */ + private void delete(Object bean, boolean logical) { + int id; + try { + Field f = bean.getClass().getField("id"); + id = f.getInt(bean); + } catch (NoSuchFieldException e) { + throw new RuntimeException("フィールド[id]がないbeanは削除できません。", e); + } catch (Exception e) { + throw new RuntimeException(e); + } + File file = toFile(bean.getClass(), id); + if (logical) { + /* 論理削除 (ファイル名の末尾に[.del]を付与する) */ + File dest = getDelFile(file); + file.renameTo(dest); + } else { + file.delete(); + } + } + + /** + * 引数srcのファイルオブジェクトのファイル名の末尾に [.del]を付与したオブジェクトを取得する。 + * すでに同名のファイルが存在するときは、[.del.del]となるように 再起処理を行う。 + * + * @param src + * @return + */ + private File getDelFile(File src) { + File delFile = new File(src.getAbsolutePath() + ".del"); + if (delFile.exists()) { + return getDelFile(delFile); + } + return delFile; + } + + private File toFile(Class extends Object> clz, int id) { + String tablename = clz.getName(); + String filename = dbroot.getAbsolutePath() + File.separatorChar + + tablename + "_" + id + ".txt"; + return new File(filename); + } + + private int toId(String filename, String tablename) { + // Matcher m = Pattern.compile("_([0-9]+)\\.txt").matcher(tmp); + // tmp = m.group(1); + String tmp = filename; + tmp = tmp.substring(tablename.length()); // 接頭のテーブル名を除去 + tmp = tmp.substring(1); // _を除去 + tmp = tmp.substring(0, tmp.lastIndexOf(".txt")); + int id; + try { + id = Integer.parseInt(tmp); + } catch (NumberFormatException e) { + throw new RuntimeException(e); + } + return id; + } + + private File[] getDbFiles(final String tablename) { + File[] existfiles = dbroot.listFiles(new FileFilter() { + @Override + public boolean accept(File f) { + return (f.getName().startsWith(tablename + "_") && f.getName() + .endsWith(".txt")); + } + }); + return existfiles; + } + /*------------------------------------------------------------------------------*/ + private static final String DEFAULT_ENC = "UTF-8"; + public static final String FILE_SEPARATOR = File.separator; + public static final String LINE_SEPARATOR = System.getProperty("line.separator"); + /** + * テキストファイルを書き出す + * @param filepath + * @param charsetName 例:"UTF-8" + * @param text + */ + public static void writeText(String filepath, String charsetName, List text) { + File f = new File(filepath); + OutputStream os = null; + Writer w = null; + BufferedWriter bw = null; + try { + os = new FileOutputStream(f); + w = new OutputStreamWriter(os, charsetName); + bw = new BufferedWriter(w); + for (String line: text) { + bw.write(line); + bw.newLine(); + //bw.flush(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + try { + if (bw != null) bw.close(); + if (w != null) w.close(); + if (os != null) os.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + public static void writeText(String filepath, String charsetName, String text) { + String[] array = text.split(LINE_SEPARATOR); + List list = Arrays.asList(array); + writeText(filepath, charsetName, list); + } + public static void writeText(String filepath, List string) { + writeText(filepath, DEFAULT_ENC, string); + } + public static void writeText(String filepath, String string) { + writeText(filepath, DEFAULT_ENC, string); + } + public static String readTextAsString(String filepath, String charsetName) { + StringBuilder sb = new StringBuilder(); + List lines = readText(filepath, charsetName); + for (String line: lines) { + sb.append(line).append(LINE_SEPARATOR); + } + return sb.toString(); + } + /** + * テキストファイルを読み込む + * @param filepath + * @return + */ + public static String readTextAsString(String filepath) { + return readTextAsString(filepath, DEFAULT_ENC); + } + /** + * テキストファイルを読み込む + * @param filepath + * @param charsetName 例:"UTF-8" + * @return List + */ + public static List readText(String filepath, String charsetName) { + if( new File(filepath).exists() == false ) { + throw new RuntimeException("ファイルが見つかりません。 [" + new File(filepath).getAbsolutePath() + "]"); + } + List result = new ArrayList(); + FileInputStream is = null; + InputStreamReader r = null; + BufferedReader br = null; + try { + is = new FileInputStream(filepath); + r = new InputStreamReader(is, Charset.forName(charsetName)); + br = new BufferedReader(r); +// int ch; +// while ((ch = in.read()) != -1) { + String line; + while((line = br.readLine()) != null) { + result.add(line); + + //System.out.print(str + NEW_LINE_CODE); + /* Unicode表現でデバッグ表示 */ + //System.out.print(Integer.toHexString(ch) + " "); + } + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + try { + if (br != null) br.close(); + if (r != null) r.close(); + if (is != null) is.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return result; + } +} \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Usr.hbm.xml b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Usr.hbm.xml new file mode 100644 index 0000000..b71d8d1 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Usr.hbm.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/Usr.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Usr.java new file mode 100644 index 0000000..e7a2bb5 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/Usr.java @@ -0,0 +1,332 @@ +package jp.co.y_net.amm.dao; + +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Comparator; +import java.util.Date; + +import jp.co.y_net.amm.AppSession.LoginUser; +import jp.co.y_net.amm.common.AppLogger; +import jp.co.y_net.amm.common.AppUtils; +import jp.co.y_net.amm.common.CalcHash; + +import org.apache.commons.lang.StringUtils; + + +public class Usr extends AppDto implements Serializable { + private static final long serialVersionUID = 1L; + + + + private Integer usrid; + private String loginid; + private String name; + private Integer kind; + private Integer orgid; + private Integer orgrole; + private Integer stoplogin; + private Integer fromdate; + private Integer todate; + private String pwhash; + private String cres; + private Long cresdate; + private Long joindate; + private Long lastlogintrydate; + private Integer loginerrorcount; + private Long lastlogindate; + private Long modpwdate; + private Long leavedate; + private Integer status; + private Long requestlogoutdate; + + /* 自動生成のアクセサ - start */ + public Integer getUsrid() { + return usrid; + } + public void setUsrid(Integer usrid) { + this.usrid = usrid; + } + public String getLoginid() { + return loginid; + } + public void setLoginid(String loginid) { + this.loginid = loginid; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Integer getKind() { + return kind; + } + public void setKind(Integer kind) { + this.kind = kind; + } + public Integer getOrgid() { + return orgid; + } + public void setOrgid(Integer orgid) { + this.orgid = orgid; + } + public Integer getOrgrole() { + return orgrole; + } + public void setOrgrole(Integer olgrole) { + this.orgrole = olgrole; + } + public Integer getStoplogin() { + return stoplogin; + } + public void setStoplogin(Integer stoplogin) { + this.stoplogin = stoplogin; + } + public Integer getFromdate() { + return fromdate; + } + public void setFromdate(Integer fromdate) { + this.fromdate = fromdate; + } + public Integer getTodate() { + return todate; + } + public void setTodate(Integer todate) { + this.todate = todate; + } + public String getPwhash() { + return pwhash; + } + public void setPwhash(String pwhash) { + this.pwhash = pwhash; + } + public String getCres() { + return cres; + } + public void setCres(String cres) { + this.cres = cres; + } + public Long getCresdate() { + return cresdate; + } + public void setCresdate(Long cresdate) { + this.cresdate = cresdate; + } + public Long getJoindate() { + return joindate; + } + public void setJoindate(Long joindate) { + this.joindate = joindate; + } + public Long getLastlogintrydate() { + return lastlogintrydate; + } + public void setLastlogintrydate(Long lastlogintrydate) { + this.lastlogintrydate = lastlogintrydate; + } + public Integer getLoginerrorcount() { + return loginerrorcount; + } + public void setLoginerrorcount(Integer loginerrorcount) { + this.loginerrorcount = loginerrorcount; + } + public Long getLastlogindate() { + return lastlogindate; + } + public void setLastlogindate(Long lastlogindate) { + this.lastlogindate = lastlogindate; + } + public Long getModpwdate() { + return modpwdate; + } + public void setModpwdate(Long modpwdate) { + this.modpwdate = modpwdate; + } + public Long getLeavedate() { + return leavedate; + } + public void setLeavedate(Long leavedate) { + this.leavedate = leavedate; + } + public Integer getStatus() { + return status; + } + public void setStatus(Integer status) { + this.status = status; + } + public Long getRequestlogoutdate() { + return requestlogoutdate; + } + public void setRequestlogoutdate(Long requestlogoutdate) { + this.requestlogoutdate = requestlogoutdate; + } + /* 自動生成のアクセサ - end */ + + + /** + * LoginUserオブジェクトへの値コピー + */ + public void copy(LoginUser loginUser) { + loginUser.setUsrid(this.getUsrid()); + loginUser.setLoginid(this.getLoginid()); + loginUser.setKind(this.getKind()); + loginUser.setOrgid(this.getOrgid()); + loginUser.setOrgrole(this.getOrgrole()); + } + + public static final String 管理者初期パスワード = "testtest"; + public static Usr create運営管理者代表(Org org運営管理){ + return create運営管理者(org運営管理, null, null, true); + } + public static Usr create運営管理者(Org org運営管理, String loginid, String name, boolean is管理者代表) { + int role; + if(is管理者代表) { + role = ROLE_管理者; + loginid = "admin"; + name = "運営管理者"; + } else { + role = ROLE_通常会員; + } + Usr usr運営管理者 = new Usr(); + usr運営管理者.setLoginid(loginid); + usr運営管理者.setName(name); + usr運営管理者.setKind(Usr.KIND_運営管理者); + usr運営管理者.setOrgrole(role); + usr運営管理者.setOrgid(org運営管理.getOrgid()); + usr運営管理者.setStatus(Usr.STATUS_登録済み); + usr運営管理者.setStoplogin(AppDef.FLASE); + String pwhash = CalcHash.passowrdHash(管理者初期パスワード, usr運営管理者.getLoginid()); // 初期パスワード + usr運営管理者.setPwhash(pwhash); + usr運営管理者.setModpwdate(AppUtils.createNowLong()); + + return usr運営管理者; + } + + + + + /* 会員種別 */ + public static final int KIND_機関会員 = 1; + public static final int KIND_機関管理者 = 2; + public static final int KIND_運営管理者 = 3; + + /* 所属機関での役割 */ + public static final Integer ROLE_管理者 = 1; + public static final Integer ROLE_通常会員 = 9; + + /* 状態 */ + public static final int STATUS_仮登録 = 0; + public static final int STATUS_登録済み = 1; + public static final int STATUS_退会 = 2; + + /** + * @return 状態の名称 + */ + public String getStatus_Disp() { + switch (status) { + case STATUS_仮登録: + return "仮登録"; + case STATUS_登録済み: + return "登録済み"; + case STATUS_退会: + return "退会"; + default: + return String.valueOf(status); + } + } + + /** @return 種類の名称 */ + public String getKind_Disp() { + switch (kind) { + case KIND_機関会員: + return "機関会員"; + case KIND_機関管理者: + return "機関管理者"; + case KIND_運営管理者: + return "運営管理者"; + default: + return String.valueOf(status); + } + } + public String getLastlogindate_Disp() { + String lastlogin; + try { + final DateFormat DF = new SimpleDateFormat("yyyy/MM/dd HH:mm"); + Date d = AppUtils.toDate(this.getLastlogindate()); + if(d == null) { + lastlogin = "未ログイン"; + } else { + lastlogin = DF.format(d); + } + + } catch (Exception e) { + AppLogger.error(e); + if (this.getLastlogindate() != null) { + lastlogin = String.valueOf(this.getLastlogindate()); + } else { + lastlogin = ""; + }; + } + return lastlogin; + } + /** + * @return 代表者の時はTrue + */ + public boolean isAdmin() { + return ROLE_管理者.equals(getKind()); + } + + public boolean isログイン停止() { + if(this.stoplogin != null && this.stoplogin == 1) { + return true; + } + return false; + } + + /** + * ・会員情報編集画面からの退会 + * ・登録会員情報削除によるカスケード退会 + */ + public void 退会処理() { + this.setLeavedate(AppUtils.createNowLong()); + this.setStatus(Usr.STATUS_退会); + } + + /** + * 最終ログイン日時のソートに用いるComparator + */ + public static class LastlogindateComparator implements Comparator { + /** trueに変更すると新しい順 */ + private boolean desc = false; + + public LastlogindateComparator(boolean desc) { + this.desc = desc; + } + + @Override + public int compare(Usr o1, Usr o2) { + int reverse = 1; + if(desc) { + reverse = -1; + } + + Long n1 = 0L; + Long n2 = 0L; + if(o1 != null && o1.getLastlogindate() != null) n1 = o1.getLastlogindate(); + if(o2 != null && o2.getLastlogindate() != null) n2 = o2.getLastlogindate(); + + return Long.compare(n1, n2) * reverse; + } + } + + public String getName_Disp() { + String str = StringUtils.abbreviate(getName(), 100); + return str; + } + public String getLoginid_Disp() { + String str = StringUtils.abbreviate(getLoginid(), 30); + return str; + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/UsrDao.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/UsrDao.java new file mode 100644 index 0000000..ce218dd --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/UsrDao.java @@ -0,0 +1,111 @@ +package jp.co.y_net.amm.dao; +import java.util.List; + +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Example; +import org.hibernate.criterion.Restrictions; +import org.springframework.orm.hibernate3.HibernateTemplate; +import org.springframework.stereotype.Component; + + +@Component("usrDao") +public class UsrDao extends AbstractDao { + + /* 参照形処理 ------------------------------------------------------------------------------------------------ */ + /** ユニークキーを使用した取得 */ + public Usr getByUsrid(Integer usrid) { + Usr cnd = new Usr(); + cnd.setUsrid(usrid); + List usrs = get(cnd); + if(usrs.size() == 1) { + return usrs.get(0); + } + return null; + } + /** 全件取得(論理削除除外) */ + public List get() { + Usr cnd = new Usr(); + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + return get(cnd); + } + /** 条件付き取得(論理削除除外) */ + public List get(Usr cnd) { + if(cnd != null) { + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + } + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + DetachedCriteria dc = DetachedCriteria.forClass(Usr.class); + dc.add(Example.create(cnd)); + @SuppressWarnings("unchecked") + List list = (List) hibernateTemplate.findByCriteria(dc); + hibernateTemplate.clear(); + return list; + } + + /* 登録系 ----------------------------------------------------------------------------------------------------*/ + private static final String ENTITYNAME = "Usr"; + private static final String PKEYNAME = "usrid"; + /** + * 登録処理 + * ・必要なカラムを自動採番する + * ・共通処理を実施する。 + * @param item + */ + public void add(Usr item, Integer updateusrid) { + /* 自動採番 */ + item.setUsrid(getNextId(ENTITYNAME, PKEYNAME)); + /* Insert実施 */ + super.add(item, updateusrid); + } + public void update(Usr item, Integer updateusrid) { + super.update(item, updateusrid); + } + public void removeLogical(Usr item, Integer updateusrid) { + super.removeLogical(item, updateusrid); + } + + /* entity固有のユーティリティ ----------------------------------------------------------------------------------- */ + /** + * ログインIDによる検索 + * ・論理削除は除く + * ・複数件取得できる場合は、退会していないレコード + * @param loginid + * @return + */ + public Usr getByLoginid(String loginid) { + Usr cnd = new Usr(); + cnd.setLoginid(loginid); + List usrs = get(cnd); + + if(usrs.size() == 1) { + return usrs.get(0); + } + /* 複数件取得できる場合は、退会していないレコード */ + for(Usr usr: usrs) { + if(Usr.STATUS_退会 != usr.getStatus()) { + return usr; + } + } + return null; + } + /** + * 条件を指定した検索 + * ・論理削除は除く + * @param cnd 絞り込み条件 + * @param cndNot 否定条件 + * @return 検索結果 + */ + public List get(Usr cnd, Usr cndNot) { + if(cnd != null) { + cnd.setDeleted(AppDef.FLASE); // 論理削除考慮 + } + HibernateTemplate hibernateTemplate = getHibernateTemplate(); + DetachedCriteria dc = DetachedCriteria.forClass(Usr.class); + dc.add(Example.create(cnd)); + dc.add(Restrictions.not(Example.create(cndNot))); + @SuppressWarnings("unchecked") + List list = (List) hibernateTemplate.findByCriteria(dc); + hibernateTemplate.clear(); + return list; + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/dao/package-info.java b/AMM_web/src/main/java/jp/co/y_net/amm/dao/package-info.java new file mode 100644 index 0000000..732de7f --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/dao/package-info.java @@ -0,0 +1,21 @@ +/** + * データアクセス関連のパッケージ。ストレージはRDBを想定。 + * 2015/04/24 k.inaba + */ +package jp.co.y_net.amm.dao; + +/* + +CREATE DATABASE amm + WITH OWNER = libgdc + ENCODING = 'UTF8' + TABLESPACE = pg_default + LC_COLLATE = 'ja_JP.UTF-8' + LC_CTYPE = 'ja_JP.UTF-8' + CONNECTION LIMIT = -1; +CREATE SCHEMA ammdb AUTHORIZATION libgdc; +COMMENT ON SCHEMA ammdb IS 'AMM開発用'; + + + +*/ \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/AppPage.java b/AMM_web/src/main/java/jp/co/y_net/amm/page/AppPage.java new file mode 100644 index 0000000..9ba9905 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/AppPage.java @@ -0,0 +1,464 @@ +package jp.co.y_net.amm.page; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.List; + +import javax.servlet.http.Cookie; + +import jp.co.y_net.amm.AppSession; +import jp.co.y_net.amm.common.AppLogger; +import jp.co.y_net.amm.common.ResourceReader; +import jp.co.y_net.amm.dao.GrpDao; +import jp.co.y_net.amm.dao.GrpusrDao; +import jp.co.y_net.amm.dao.InfDao; +import jp.co.y_net.amm.dao.OrgDao; +import jp.co.y_net.amm.dao.PwtcktDao; +import jp.co.y_net.amm.dao.Usr; +import jp.co.y_net.amm.dao.UsrDao; +import jp.co.y_net.amm.service.BatchUsrCreate; +import jp.co.y_net.amm.service.Challengestring; +import jp.co.y_net.amm.service.Logincheck; +import jp.co.y_net.amm.service.Logout; +import jp.co.y_net.amm.service.MailAddressCheck; +import jp.co.y_net.amm.service.PasswordTicketManager; + +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.request.http.WebRequest; +import org.apache.wicket.request.http.WebResponse; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.spring.injection.annot.SpringBean; + +/** + * このアプリケーションの最上位のPageクラス + * pageパッケージ配下のPageクラスは必ず継承しなければならない。 + * + * CommonFrameXを経由して継承することを想定するため、 + * このPageクラスは画面のレイアウトは決定せず、 + * 共通処理を責務とする。 + * + * @author k_inaba + */ +public abstract class AppPage extends WebPage{ + + /* + * SpringBean宣言 + */ + + @SpringBean(name="usrDao") + protected UsrDao usrDao; + + @SpringBean(name="orgDao") + protected OrgDao orgDao; + + @SpringBean(name="pwtcktDao") + protected PwtcktDao pwtcktDao; + + @SpringBean(name="infDao") + protected InfDao infDao; + + @SpringBean(name="grpDao") + protected GrpDao grpDao; + + @SpringBean(name="grpusrDao") + protected GrpusrDao grpusrDao; + + @SpringBean(name="challengestring") + protected Challengestring challengestring; + + @SpringBean(name="logincheck") + protected Logincheck logincheck; + + @SpringBean(name="logout") + protected Logout logout; + + @SpringBean(name="passwordTicketManager") + protected PasswordTicketManager passwordTicketManager; + + @SpringBean(name="mailAddressCheck") + protected MailAddressCheck mailAddressCheck; + + @SpringBean(name="batchUsrCreate") + protected BatchUsrCreate batchUsrCreate; + + public AppPage() { + /* ステートレスなページでも、 + * JavaEEの実際のSessionオブジェクトと関連付けする */ + AppSession.get().bind(); + } + + /** + * コンストラクタ呼び出しが行われなくても処理対象となるメソッド + * 戻るボタンによる遷移でも呼び出される。 + * @see org.apache.wicket.Component#onConfigure() + */ + @Override + protected void onConfigure() { + /* ログインチェック */ + if (validateLogin() == false || existRequestLogout() || missmatchLoginId()) { + + /* 戻り画面を設定 */ + AppSession.get().returnPageClass = getPageClass(); + AppSession.get().returnPageParameters = getPageParameters(); + /* ログイン画面へ遷移 */ + setResponsePage(LoginPage.class, getPageParameters()); + + return; + } + } + + /** + * @return ログアウト要求が登録されていればTrue + */ + private boolean existRequestLogout() { + if (AppSession.get().isLogin()) { + + Integer usrId = AppSession.get().getLoginUser().getUsrid(); + if (usrId != null) { + Usr usr = usrDao.getByUsrid(usrId); + if (usr != null) { + if (usr.getRequestlogoutdate() != null && usr.getRequestlogoutdate() != -1L) { + + /* ログアウトを実行する */ + logout.execute(AppSession.get().getLoginUser().getLoginid()); +// AppSession.get().invalidateNow(); // セッション無効化 + AppSession.get().clearLoginUser(); + + return true; + } + } + } + } + return false; + } + + /** + * 2016/06/02 + * @return パラメータに付与されているログインIDとセッション上のログインIDが一致していなければTrue + */ + private boolean missmatchLoginId() { + if (AppSession.get().isLogin()) { + /* + * パラメータにログインIDが含まれている場合の処理 + */ + PageParameters params = getPageParameters(); + String paramLoginid = params.get("loginid").toString(); + if (StringUtils.isEmpty(paramLoginid) == false) { + if (AppSession.get().getLoginUser().getLoginid().equals(paramLoginid) == false) { + /* パラメータのログインIDとセッション情報のログインIDが一致していない。*/ + + /* ログアウトを実行する */ + logout.execute(AppSession.get().getLoginUser().getLoginid()); +// AppSession.get().invalidateNow(); // セッション無効化 + AppSession.get().clearLoginUser(); + + return true; + } + } + + } + return false; + + } + + /** + * ログインチェック + * ログイン認証が必要な画面ではOverrideして実装すること + * @return Pageへのアクセスを認める場合はTrue + */ + protected boolean validateLogin() { + return true; // 既定では必ず「チェックOK」となる。 + } + + + + + /* --------------------------------------------------------------------------------------------------------------- + * 入力値検査 + */ + + + /** + * 【文字列】 + * valueが妥当な値でなければ error でメッセージをセットする。 + * @param value 検査対象 + * @param itemname メッセージで使用する項目名 + * @param min 許容される最小値(必須入力の場合は1以上の値を設定すること) + * @param max 許容される最大値 + */ + protected void validItem(String value, String itemname, int min, int max) { + if(StringUtils.isEmpty(value)) { + if(min > 0) { + error(itemname + "を入力してください。"); + } else { + /* 処理なし */ + } + } else { + if ((value.length() >= min && value.length() <= max) == false ) { + if(min == max) { + error(itemname + "は" + min + "文字で入力してください。"); + } else { + if(min == 1 || min == 0) { + error(itemname + "は" + max + "文字以下で入力してください。"); + } else { + error(itemname + "は" + min + "~" + max + "文字で入力してください。"); + } + } + } + } + } + /** + * 【数値】 + * valueが妥当な値でなければ error でメッセージをセットする。 + * @param value 検査対象 + * @param itemname メッセージで使用する項目名 + * @param min 許容される最小値(必須入力の場合は1以上の値を設定すること) + * @param max 許容される最大値 + */ + protected void validItemNum(String value, String itemname, int min, int max) { + validItem(value, itemname, min, max); + if(hasInputError()) return; // ここまでにエラーがあれば中断 + if(StringUtils.isEmpty(value) == false) { + if(isNumeric(value) == false) { + error(itemname + "は数字で入力してください。"); + } + } + } + /** + * 【電話番号】 + * valueが妥当な値でなければ error でメッセージをセットする。 + * @param value 検査対象 + * @param itemname メッセージで使用する項目名 + * @param min 許容される最小値(必須入力の場合は1以上の値を設定すること) + * @param max 許容される最大値 + */ + protected void validItemTel(String value, String itemname, int min, int max) { + validItem(value, itemname, min, max); + if(hasInputError()) return; // ここまでにエラーがあれば中断 + if(StringUtils.isEmpty(value) == false) { + value = value.replaceAll("-", ""); + if(isNumeric(value) == false) { + error(itemname + "は数字とハイフンのみ使用できます。"); + } + } + } + /** + * 【英数記号】 + * valueが妥当な値でなければ error でメッセージをセットする。 + * @param value 検査対象 + * @param itemname メッセージで使用する項目名 + * @param min 許容される最小値(必須入力の場合は1以上の値を設定すること) + * @param max 許容される最大値 + */ + protected void validItemAscii(String value, String itemname, int min, int max) { + validItem(value, itemname, min, max); + if(hasInputError()) return; // ここまでにエラーがあれば中断 + if(StringUtils.isEmpty(value) == false) { + if(StringUtils.isAsciiPrintable(value) == false) { + error(itemname + "に使用できない文字が含まれています。"); + } + } + } + /** + * 【メールアドレス】 + * @param value 検査対象 + * @param itemname メッセージで使用する項目名 + * @param min 許容される最小値(必須入力の場合は1以上の値を設定すること) + * @param max 許容される最大値 + */ + protected void validItemMail(String value, String itemname) { + validItemMail(value, itemname, false); + } + /** + * 【メールアドレス】 + * @param value 検査対象 + * @param itemname メッセージで使用する項目名 + * @param min 許容される最小値(必須入力の場合は1以上の値を設定すること) + * @param max 許容される最大値 + */ + protected void validItemMail(String value, String itemname, boolean freemailCheck) { + + if(StringUtils.isEmpty(value)) { + error(itemname + "を入力してください。"); + return; + } + if (value.length() > 256 ) { + error(itemname + "は256文字以内で入力してください。"); + return; + } + if(StringUtils.isAsciiPrintable(value) == false) { + error(itemname + "に使用できない文字が含まれています。"); + return; + } + if(value.indexOf('@') == -1) { + /* @がないメールアドレスは不正とする */ + error(itemname + "は形式が正しくありません。"); + return; + } + if(freemailCheck) { + /* フリーメールチェック */ + for (String ng: ResourceReader.getLines("omitmaildomains")) { + if(ng == null) ng = ""; + ng = ng.trim(); + if(StringUtils.isEmpty(ng) == false) { + if(value.endsWith(ng)) { + error(itemname + "は利用できないドメインです。"); + + /* 攻撃時の調査のため、ログ出力 */ + AppLogger.info("次のメールアドレスで申請されましたが、拒否リストに含まるため受け付けませんでした。:" + value); + + return; + } + } + } + } + } + + /** + * @return エラーが検知されているときにTrue + */ + protected boolean hasInputError() { + return AppSession.get().getFeedbackMessages().isEmpty() == false; + } + + + + /** + * 文字列が数値かどうかチェックする + * @param value 対象文字列 + * @return 数値 true 数値以外 false + */ + public static boolean isNumeric(String value) { +// try { 以下の実装では Intの最大値以上で不正な結果を返す。 +// Integer.parseInt(value); +// } catch (NumberFormatException e) { +// return false; +// } +// return true; + if("-1".equals(value)) { + return true; // 「指定なし」を示す数値として許可する + } + if(StringUtils.isNumeric(value) == false) { + return false; + } + + if(StringUtils.isEmpty(value) != false) { + /* 全角の数字をNGとする。*/ + if(value.indexOf('0') != -1) return false; + if(value.indexOf('1') != -1) return false; + if(value.indexOf('2') != -1) return false; + if(value.indexOf('3') != -1) return false; + if(value.indexOf('4') != -1) return false; + if(value.indexOf('5') != -1) return false; + if(value.indexOf('6') != -1) return false; + if(value.indexOf('7') != -1) return false; + if(value.indexOf('8') != -1) return false; + if(value.indexOf('9') != -1) return false; + } + return true; + } + + + + + + /* + * ユーティリティ --------------------------------------------------------------------------------------------- + */ + /** @return 機関会員がログインしているときにTrue */ + protected boolean isMember() { + return AppSession.get().isLogin() + && AppSession.get().getLoginUser().getKind() != null + && AppSession.get().getLoginUser().getKind().equals(Usr.KIND_機関会員); + } + /** @return 機関管理者がログインしているときにTrue */ + protected boolean isOrgAdmin() { + return AppSession.get().isLogin() + && AppSession.get().getLoginUser().getKind() != null + && AppSession.get().getLoginUser().getKind().equals(Usr.KIND_機関管理者); + } + /** @return 運営管理者がログインしているときにTrue */ + protected boolean isSystemAdmin() { + return AppSession.get().isLogin() + && AppSession.get().getLoginUser().getKind() != null + && AppSession.get().getLoginUser().getKind().equals(Usr.KIND_運営管理者); + } + protected boolean isSystemAdmin代表者() { + return AppSession.get().isLogin() + && AppSession.get().getLoginUser().getKind() != null + && AppSession.get().getLoginUser().getKind().equals(Usr.KIND_運営管理者) + && AppSession.get().getLoginUser().getOrgrole() != null + && AppSession.get().getLoginUser().getOrgrole().equals(Usr.ROLE_管理者); + } + /** + * @param usr + * @return usr のログインIDが、ログインユーザのIDと一致するときにTrue + */ + protected boolean isLoginUser(Usr usr) { + return AppSession.get().isLogin() + && AppSession.get().getLoginUser().getUsrid().equals(usr.getUsrid()); + } + +// protected String createFullUrl(String url, boolean https) { +// /* URLを作成する */ +// Url urlMe = getRequestCycle().getRequest().getOriginalUrl(); +// /* 必要に応じてプロトコルを変更する */ +// String protocol = https ? "https://" : "http://"; +// String host = urlMe.getHost(); // 現在のホスト名を引き継ぐ +// String port = String.valueOf(urlMe.getPort()); // 現在のポートを引き継ぐ +// if (StringUtils.isEmpty(port) || "80".equals(port)) { +// port = ""; +// } else { +// port = ":" + port; +// } +// String contextPath = getRequestCycle().getRequest().getContextPath(); // 現在のコンテキストパスを引き継ぐ +// String urlBase = protocol + host + port + contextPath + "/" + url; +// return urlBase; +// } + + protected String getScreenId() { + return getPage().getClass().getSimpleName(); + } + protected PageParameters getParams() { + return super.getPageParameters(); + } + protected void addCookie(String name, String value, int time) { + Cookie cookie = new Cookie(name, value); + cookie.setPath("/"); + cookie.setMaxAge(time); // 保存期間 + ((WebResponse) getRequestCycle().getResponse()).addCookie(cookie); + } + protected String getCookie(String name) { + List cookies = ((WebRequest) getRequestCycle().getRequest()).getCookies(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if (name.equals(cookie.getName())) { + return cookie.getValue(); + } + } + } + return ""; + } +// TODO 実装箇所再検討 + protected static boolean validFromToDate(String value) { + if("00000000".equals(value)){ + return true; // 未指定として正しい値 + } + final DateFormat DF = new SimpleDateFormat("yyyyMMdd"); + DF.setLenient(false); // 厳密な変換 + try { + DF.parse(value); + return true; + } catch (ParseException e) { + return false; + } + } + + + + + + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonConfirmPage.html b/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonConfirmPage.html new file mode 100644 index 0000000..59904b2 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonConfirmPage.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + フィードバックメッセージ + + + + + 確認メッセージ + + + 本当によろしいですか? + + + + + + + + + + + + \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonConfirmPage.java b/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonConfirmPage.java new file mode 100644 index 0000000..0c6d492 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonConfirmPage.java @@ -0,0 +1,88 @@ +package jp.co.y_net.amm.page; + +import java.io.Serializable; + +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.form.AjaxButton; +import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.panel.FeedbackPanel; +import org.apache.wicket.model.PropertyModel; + +public class CommonConfirmPage extends WebPage { + private static final long serialVersionUID = 1L; + + /** 確認メッセージ */ + public String confirmMessage = ""; // 変数名変更禁止 + public String confirmMessageStrong = ""; // 変数名変更禁止 + + /** + * コールバックオブジェクト + */ + public Callback callback; + public static abstract class Callback implements Serializable { + abstract void callback(AjaxRequestTarget target); + } + + /** + * 処理実行オブジェクト + */ + public Executable executable; + public static abstract class Executable { + abstract void execute(); + } + + public CommonConfirmPage() { + + /* フィードバックパネル */ + final FeedbackPanel fbPanel = new FeedbackPanel("feedback"); + fbPanel.setOutputMarkupId(true); + add(fbPanel); + + Form form = new Form("form"); + add(form); + + /* 確認メッセージ */ + form.add(new Label("confirmMessage", new PropertyModel(this, "confirmMessage"))); + form.add(new Label("confirmMessageStrong", new PropertyModel(this, "confirmMessageStrong")){ + @Override + public boolean isVisible() { + return StringUtils.isEmpty(confirmMessageStrong) == false; + } + + }); + + + /* 実行ボタン */ + form.add(new AjaxButton("btnExecute"){ + @Override + protected void onSubmit(AjaxRequestTarget target, Form> form) { + executable.execute(); // executableの実行 + callback.callback(target); // コールバックに通知 + ModalWindow.closeCurrent(target); // 画面を閉じる + } + + @Override + protected void onError(AjaxRequestTarget target, Form> form) { + // 処理なし + } + }); + + /* 戻る/キャンセル ボタン */ + form.add(new AjaxButton("btnBack") { + @Override + protected void onSubmit(AjaxRequestTarget target, Form> form) { + ModalWindow.closeCurrent(target); // 画面を閉じる + } + + @Override + protected void onError(AjaxRequestTarget target, Form> form) { + // 処理なし + } + }); + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonFrameA.html b/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonFrameA.html new file mode 100644 index 0000000..f30aa48 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonFrameA.html @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + ChattyInftyOnline + + + + + + + + + + + + 0123456789 + + + + + + + + + + + + + + +[各ページで記載] +test + +test + + + + + +[DEBUG]メールに記載したURL + + + + + + + + \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonFrameA.java b/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonFrameA.java new file mode 100644 index 0000000..25a17b7 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/CommonFrameA.java @@ -0,0 +1,379 @@ +package jp.co.y_net.amm.page; + +import jp.co.y_net.amm.AppSession; +import jp.co.y_net.amm.common.AppLogger; +import jp.co.y_net.amm.common.AppSendMail; +import jp.co.y_net.amm.common.AppSendMail.MailSetting; +import jp.co.y_net.amm.common.ResourceReader; +import jp.co.y_net.amm.service.PasswordTicketManager; + +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.Page; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.form.AjaxButton; +import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Button; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.link.ExternalLink; +import org.apache.wicket.markup.html.link.Link; +import org.apache.wicket.markup.html.panel.FeedbackPanel; +import org.apache.wicket.model.Model; + + + +/** + * 1カラムでデザインされたページの共通クラス + * + * ヘッダー領域 + * ・トップぺ戻るリンク + * ・ログイン中のユーザID + * ・ログアウトボタン + * + * フッター領域 + * + * @author k_inaba + */ +public class CommonFrameA extends AppPage { + + /* 確認画面用のモーダル */ + /** モーダル確認画面で「処理実行」が選択されたときにTreuになるモデルオブジェクト*/ + final private Model doExecute = Model.of(false); + final private ModalWindow modalCommonConfirm = new ModalWindow("modalCommonConfirm"); + + /* [デバッグ用] メールに記載されたURLを表示するコンテナ */ + final private WebMarkupContainer cntDebugUrlOnMail = new WebMarkupContainer("cntDebugUrlOnMail"); + final private ExternalLink linkDebugUrlOnMail = new ExternalLink("debugUrlOnMail", ""){ + @Override + public boolean isVisible() { + return StringUtils.isEmpty(this.getDefaultModelObjectAsString()) == false; + } + }; + protected void addDebugUrl(String debugUrl){ + linkDebugUrlOnMail.setDefaultModelObject(debugUrl); + } + public CommonFrameA() { + + /* ロゴのクリック */ + //add(new BookmarkablePageLink("goTop", TopPage.class)); +// add(new ExternalLink("goTop",ResourceReader.getStringQuick("url.back.top"))); + + /* + * ログイン情報領域 + */ + WebMarkupContainer divLoginUser = new WebMarkupContainer("divLoginUser"){ + @Override + public boolean isVisible() { + //return AppSession.isLogin(); // ログイン中のみ表示する。 + return true; + } + }; + add(divLoginUser); + + /* + * ログイン中ユーザ + */ + Model loginUserId = new Model() { + @Override + public String getObject() { + if(AppSession.get().isLogin()) { + String loginid = AppSession.get().getLoginUser().getLoginid(); + //return "ログインユーザー:" + loginid; + return "ログインユーザー:" + StringUtils.abbreviate(loginid, 30); + } else { + //return "ログインしていません"; + return ""; + } + } + }; + Label labelLoginId = new Label("labelLoginId", loginUserId); + divLoginUser.add(labelLoginId); + + /* + * ログアウトボタン + */ + Form formLoginUser = new Form("formLoginUser"); + divLoginUser.add(formLoginUser); + Button buttonLogout = new Button("buttonLogout") { + @Override + public void onSubmit() { + + /* APIログアウト相当の実施 */ + logout.execute(AppSession.get().getLoginUser().getLoginid()); + + /* セッション無効化 */ + AppSession.get().invalidateNow(); + + /* トップ画面へ遷移 */ + //setResponsePage(getApplication().getHomePage()); + } + @Override + public boolean isVisible() { + return AppSession.get().isLogin(); // ログイン中のみ表示する。 + } + }; + formLoginUser.add(buttonLogout); + + /* 確認画面用のモーダル */ + /** モーダル確認画面で「処理実行」が選択されたときにTreuになるモデルオブジェクト*/ + add(modalCommonConfirm); + + /* デバッグ出力:メールに記載したURL */ + cntDebugUrlOnMail.setOutputMarkupId(true); + add(cntDebugUrlOnMail); + linkDebugUrlOnMail.setOutputMarkupId(true); + linkDebugUrlOnMail.setOutputMarkupPlaceholderTag(true); + cntDebugUrlOnMail.add(linkDebugUrlOnMail); + +// /* +// * LocaleStringに関するデバッグ情報 +// */ +// WebMarkupContainer devls = new WebMarkupContainer("devls") { +// @Override +// public boolean isVisible() { +// return AppLogger.isDebug(); +// } +// }; +// add(devls); + +// Localestring cnd = new Localestring(); +// cnd.setScreenid(getScreenId()); +// List localestrings = localestringDao.get(cnd); +// devls.add(new ListView("listView", localestrings) { +// @Override +// protected void populateItem(ListItem item) { +// item.add(new Label("screenid", item.getModelObject().getScreenid())); +// item.add(new Label("controlid", item.getModelObject().getControlid())); +// item.add(new Label("lang", String.valueOf(item.getModelObject().getLanguageid()))); +// item.add(new Label("string", String.valueOf(item.getModelObject().getPrintstring()))); +// } +// }); + + } + + /** モーダル確認画面を呼び出すためのボタン(共通実装)*/ + protected abstract class ConfirmAjaxButton extends AjaxButton { + public ConfirmAjaxButton(String id) { + super(id); + } + @Override + final protected void onSubmit(AjaxRequestTarget target, Form> form) { + + /* + * 事前処理 + * 呼び出し元のPageクラスで実装したexecuteBeforeの処理を行います。 + */ + boolean check = executeBefore(); + if(check == false + || hasInputError()) { + + FeedbackPanel feedback = (FeedbackPanel)getPage().get("feedback"); + if(feedback != null) { + target.add(feedback); + } + return; // 【処理中断】 + } + + doExecute.setObject(false); + + /* モーダル確認画面を構築 */ + //modalDefPreview.setTitle(""); + modalCommonConfirm.setCssClassName(ModalWindow.CSS_CLASS_GRAY); + final Integer MODAL_PREVIEW_HEIGHT = 150; + final Integer MODAL_PREVIEW_WIDTH = 400; + modalCommonConfirm.setInitialHeight(MODAL_PREVIEW_HEIGHT); + modalCommonConfirm.setInitialWidth(MODAL_PREVIEW_WIDTH); + modalCommonConfirm.setResizable(true); + modalCommonConfirm.setPageCreator(new ModalWindow.PageCreator() { + private static final long serialVersionUID = 1L; + public Page createPage() { + /* Pageインスタンスの作成 */ + CommonConfirmPage modalPage = new CommonConfirmPage(); + /* + * 確認メッセージの設定 + * 呼び出し元のPageクラスでオーバーライドして設定します。 + */ + modalPage.confirmMessage = getConfirmMessage(); + modalPage.confirmMessageStrong = getConfirmMessageStrong(); + /* + * executableオブジェクトの設定 + * executableは確認モーダル画面の「実行」ボタンを押した直後に実行されます。 + */ + modalPage.executable = new CommonConfirmPage.Executable() { + @Override + void execute() { + executableWork(); + } + }; + + /* + * CallBack の設定 + * Modal画面から呼び出し元のPageオブジェクトに参照を引き渡す処理です。 + * Callbackクラスを使用し、PageReferenceを経由しないと、正しく引き渡しできません。 + */ + final CommonConfirmPage.Callback callback = new CommonConfirmPage.Callback() { + @Override + public void callback(AjaxRequestTarget target) { + CommonFrameA me = (CommonFrameA)getPage().getPageReference().getPage(); // 左記の実装でないと、インスタンスが変化する。 + me.doExecute.setObject(true); + } + }; + modalPage.callback = callback; + return modalPage; + } + }); + /* CallBack の処理 */ + modalCommonConfirm.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() { + private static final long serialVersionUID = 1L; + @Override + public void onClose(AjaxRequestTarget target) { + if(doExecute.getObject()) { + /* 確認モーダル画面の「実行」ボタンを押した後、呼び出し元のPageクラスで実行される処理。 */ + executeAfter(target); + + FeedbackPanel feedback = (FeedbackPanel)getPage().get("feedback"); + if(feedback != null) { + target.add(feedback); + } + + if(AppLogger.isDebug()) { + /* [デバッグ用] メールに記載されたURLを表示するコンテナ */ + target.add(cntDebugUrlOnMail); + } + } + } + }); + modalCommonConfirm.show(target); // モーダルを表示 + } + + @Override + protected void onError(AjaxRequestTarget target, Form> form) { + // 処理なし + } + + /** 確認メッセージの設定 */ + abstract String getConfirmMessage(); + /** 確認メッセージの設定 */ + String getConfirmMessageStrong(){ + return ""; + }; + /** + * 前処理 + * 入力値チェックを行います。 + * 呼び出し元のPageクラスでオーバーライドします。 + * 入力値チェックが不要の場合は、オーバーライドしなくてよいです。 + */ + boolean executeBefore() { + return true; + } + /** + * 確認モーダル画面の「実行」ボタンを押した直後に実行される処理。 + * ここでは、呼び出し元のPageクラスのメンバに、正しく値を設定することができないことに注意する。 + */ + void executableWork(){ + // 必要に応じてオーバーライド + }; + /** + * 確認モーダル画面の「実行」ボタンを押した後、呼び出し元のPageクラスで実行される処理。 + */ + abstract void executeAfter(AjaxRequestTarget target); + } + + protected void doパスワードリセット(final Integer targetUserid, PasswordTicketManager passwordTicketManager, String mailValue) { + + + + /* 共通機能:パスワード登録チケット発行 からチケットを取得する */ + String random = passwordTicketManager.executeパスワードリセット(targetUserid); + + /* パスワード再設定用メールを送信する */ + MailSetting setting = new MailSetting(); + setting.setTemplate(ResourceReader.getText("message/mail.resetpw")); + setting.setMailTo(mailValue); + String パスワード登録画面のURL = ResourceReader.getStringQuick("urlroot") + "entrypassword?value=" + random; + setting.replace("パスワード登録画面のURL", パスワード登録画面のURL); + boolean sendmailrsult = AppSendMail.send(setting); + if(sendmailrsult == false) { + error("メールの送信に失敗しました。"); + } + + /* テスト自動化対応 */ + if (AppLogger.isDebug()) { + //info("メールに記載したURL【" + パスワード登録画面のURL + "】"); + addDebugUrl(パスワード登録画面のURL); + } + } + + private Page returnPage; + protected Page getReturnPage() { + return returnPage; + } + protected void setReturnPage(Page returnPage) { + this.returnPage = returnPage; + } + + + + /** + * 共通戻るリンクの設置 + */ + protected void createCommonBackLinks() { + add(new ExternalLink("lnkMember", ResourceReader.getStringQuick("url.back.member")) { + @Override + public boolean isVisible() { + return isMember(); + } + }); + add(new ExternalLink("lnkOrgAdmin", ResourceReader.getStringQuick("url.back.orgadmin")) { + @Override + public boolean isVisible() { + return isOrgAdmin(); + } + }); + add(new ExternalLink("lnkSysAdmin", ResourceReader.getStringQuick("url.back.sysadmin")) { + @Override + public boolean isVisible() { + return isSystemAdmin(); + } + }); + } + /** + * 画面固有の戻るボタンの設置 + * @param clz + * @param string + */ + protected void createBackLink(final Class extends CommonFrameA> clz, final String name) { + Link linkReturn = new Link("lnkReturn") { + @Override + public void onClick() { + setResponsePage(getReturnPage()); + } + @Override + public boolean isVisible() { + return getReturnPage() != null; + } + }; + Label lnkReturnAnker = new Label("lnkReturnAnker", new Model(){ + @Override + public String getObject() { + if(getReturnPage() != null && getReturnPage().getClass().equals(clz)) { + return name + "へ戻る"; + } else { + return "前へ戻る"; + } + } + }); + linkReturn.add(lnkReturnAnker); + add(linkReturn); + } + /** + * フィードバックパネルの設置 + */ + protected void createFeedbackPanel() { + final FeedbackPanel feedbackPanel = new FeedbackPanel("feedback"); + feedbackPanel.setOutputMarkupId(true); + add(feedbackPanel); + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/DashboardPage.html b/AMM_web/src/main/java/jp/co/y_net/amm/page/DashboardPage.html new file mode 100644 index 0000000..5008a01 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/DashboardPage.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + ログイン + + + + + + + + ChattyInftyOnline + + ログインID:sakamoto.ryouma@example.com + + + + + + + + +この書式で記述するコメントは詳細設計の記述です。実際には画面に表示されません。 + +2016/10/18 更新 +インターフェース一覧 + + (API)アプリケーション初期化 api/datainitialize初期ユーザの作成処理です。(データの削除はしません) + (API)チャレンジ文字列算出 api/challengestring + (API)アカウント認証 api/logincheck(テストは下部のスタブを使用のこと) + (API)ログアウト api/logout?loginid=okita%40example.com + (API)ユーザー情報取得 api/member?loginid=okita%40example.com + (API)お知らせ情報取得 api/info + (API)ユーザ情報(所属グループ)取得 api/membergroup?loginid=okita%40example.com + (API)グループ所属メンバー情報取得 api/groupmember?grpid=1 + + 新規申請 orgentry + お知らせ本文 info?infid=1 + パスワードリセット(パスワードを忘れた場合) passwordreset + + 代表者メニュー:会員管理 memberlist + 代表者メニュー:登録情報編集 orgdetail + + 会員メニュー:会員情報編集 memberdetail + 会員メニュー:グループリスト grouplist + + 運営管理者メニュー:申請一覧 orgentrylist + 運営管理者メニュー:登録会員情報管理 orgmemberlist + 運営管理者メニュー:お知らせ管理 infolist + 運営管理者メニュー:グループリスト grouplist + + ログイン済みの代表者による「会員管理」画面へのアクセス memberlist?loginid=hizikata%40example.com&cres=xxxxx(cresはログイン時に使用したチャレンジレスポンスの値) + + パスワード登録 orgentrypass(メール内のリンクから呼び出す。) + 申請内容表示 orgentrydetail(メール内のリンクから呼び出す。) + + + + + + + +ログイン(スタブ) +フィードバックメッセージ + + + + + チャレンジ値(A) + + + + アカウント(B) + + + + パスワード(C) + + + + パスワードハッシュ(D) + + + + チャレンジレスポンス(E) + + + + + + + + + + + + + + + + + +メール送信テスト + + + + + メールアドレス + + + + + + + + +エラーログ + + +ログ + +<前へ 次へ> + + + + + +セッション利用状況 + + 連番:時間:ID + 連番:時間:ID + + + + + + +再表示<< + + + + + + +for + + + + \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/DashboardPage.java b/AMM_web/src/main/java/jp/co/y_net/amm/page/DashboardPage.java new file mode 100644 index 0000000..e660a4d --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/DashboardPage.java @@ -0,0 +1,232 @@ +package jp.co.y_net.amm.page; + +import java.io.File; +import java.io.FilenameFilter; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import jp.co.y_net.amm.AppSession; +import jp.co.y_net.amm.common.AppSendMail; +import jp.co.y_net.amm.common.AppSendMail.MailSetting; +import jp.co.y_net.amm.common.ResourceReader; +import jp.co.y_net.amm.common.SessionUsageListener; +import jp.co.y_net.amm.dao.Usr; +import jp.co.y_net.amm.service.Logincheck; +import jp.co.y_net.amm.service.Logincheck.LogincheckResult; + +import org.apache.wicket.RestartResponseException; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Button; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.TextField; +import org.apache.wicket.markup.html.link.BookmarkablePageLink; +import org.apache.wicket.markup.html.link.DownloadLink; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.list.PageableListView; +import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; +import org.apache.wicket.markup.html.panel.FeedbackPanel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.LoadableDetachableModel; +import org.apache.wicket.model.Model; + +public class DashboardPage extends CommonFrameA { + private static final long serialVersionUID = 1L; + + private static final DateFormat DF_YYYYMMDDHHMMSSSS = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.S"); + + public DashboardPage() { + + /* 認証 */ + if(isSystemAdmin() == false && ResourceReader.getBooleanQuick("debug.mode") == false) { + AppSession.get().returnPageClass = DashboardPage.class; + throw new RestartResponseException(LoginPage.class); + } + + /* フィードバックパネル */ + final WebMarkupContainer fbPanel = new FeedbackPanel("feedback"); + add(fbPanel); + + /* ログインフォーム領域 ------------------------------------------------------------------------------------- */ + WebMarkupContainer divLogin = new WebMarkupContainer("divLogin") { + @Override + public boolean isVisible() { + //return AppSession.isLogin() == false; + return true; + } + }; + add(divLogin); + + + final Model modelChallengestringA = Model.of(challengestring.execute()); + final TextField textChallenge = new TextField("textChallenge", modelChallengestringA); + final TextField textLoginId = new TextField("textLoginId", Model.of("")); + final TextField textChallengeResponse = new TextField("textChallengeResponse", Model.of("")); + + + /* ログイン */ + Button btnLogin = new Button("btnLogin"); + + Form form =new Form("form") { + @Override + public boolean isVisible() { + //return AppSession.isLogin() == false; + return true; + } + @Override + public void onSubmit() { + /* ログイン処理 */ + + String challengestringA = modelChallengestringA.getObject(); + String loginidB = textLoginId.getValue(); + String cresE = textChallengeResponse.getValue(); + + + /* ------------------------ */ + + LogincheckResult checkresult = logincheck.executeFromApi(loginidB, cresE, challengestringA); // ここではAPI呼び出しと同等にする + + if(0 == checkresult.errorCode) { + /* 認証成功 */ + + /* セッションへ登録 */ + Usr usr = usrDao.getByLoginid(loginidB); + AppSession.get().setLoginUser(usr); + + /* jsessionidの変更(セッション固定化攻撃対策)*/ + AppSession.get().replaceSession(); + + if(AppSession.get().returnPageClass != null) { + /* 呼び出し元が設定されている場合 */ + setResponsePage(AppSession.get().returnPageClass, AppSession.get().returnPageParameters); + } else { + /* 呼び出し元が設定されていない場合 */ + //setResponsePage(getApplication().getHomePage()); + setResponsePage(getPage()); + } + + } else { + error(Logincheck.errorMemo.get(checkresult.errorCode) + "/" + Logincheck.errorMessage.get(checkresult.errorCode) ); + } + } + }; + divLogin.add(form); + form.add(textChallenge); + form.add(textLoginId); + form.add(textChallengeResponse); + form.add(btnLogin); + + /* + * メール送信テスト + */ + WebMarkupContainer divSendMail = new WebMarkupContainer("divSendMail"); + add(divSendMail); + { + Form formMail =new Form("form"); + divSendMail.add(formMail); + + final TextField mail = new TextField("mail", Model.of("")); + formMail.add(mail); + + final Button btnSubmit = new Button("btnSubmit"){ + @Override + public void onSubmit() { + MailSetting setting = new MailSetting(); + setting.setTemplate(ResourceReader.getText("message/mail.test")); + setting.setMailTo(mail.getValue()); + boolean sendmailrsult = AppSendMail.send(setting); + if(sendmailrsult == false) { + error("メールの送信に失敗しました。"); + } + + } + }; + formMail.add(btnSubmit); + } + + /* ログ取得 */ + WebMarkupContainer cntLogs = new WebMarkupContainer("cntLogs") { + @Override + public boolean isVisible() { + //return AppSession.get().isLogin(); + return true; + } + }; + add(cntLogs); + final IModel> logs = new LoadableDetachableModel>() { + @Override + protected List load() { + File dir = new File(System.getProperty("catalina.base"), "logs"); + if(dir.exists() == false) { + return new ArrayList(); + } + File[] aryLogs = dir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return (name.startsWith("AMMLog") && name.endsWith(".log")); + } + }); + List logs = new ArrayList(); + for(File l: aryLogs) { + logs.add(l); + } + Collections.sort(logs, new Comparator() { + @Override + public int compare(File o1, File o2) { + return Long.valueOf(o1.lastModified()) + .compareTo( + Long.valueOf(o2.lastModified()) + ) * -1; + } + }); + return logs; + } + }; + final PageableListView listview = new PageableListView("lvLog", logs, 5) { + private static final long serialVersionUID = 1L; + @Override + protected void populateItem(ListItem item) { + File log = item.getModelObject(); + + DownloadLink lnkLog = new DownloadLink("lnkLog", log); + + lnkLog.add(new Label("log", log.getAbsolutePath())); + item.add(lnkLog); + } + }; +// listview.setReuseItems(true); + cntLogs.add(listview); + PagingNavigator navigator = new PagingNavigator("paging", listview); + cntLogs.add(navigator); + + + /* セッション利用状況 */ + StringBuilder sb = new StringBuilder(); + + int i = 0; + for (Map.Entry e: SessionUsageListener.map.entrySet()) { + + String startTime = DF_YYYYMMDDHHMMSSSS.format(e.getValue()); + String sessinId = e.getKey(); + + sb.append(String.format("#%1$04d",i++ )+ ":" + startTime + ":"+ sessinId + "\n"); + } + if(i == 0) { + sb.append("0件"); + } + add(new Label("sessionusage", sb.toString())); + + + /* 再表示 */ + BookmarkablePageLink lnkReload = new BookmarkablePageLink("lnkReload", DashboardPage.class); + add(lnkReload); + + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/EntryPasswordPage.html b/AMM_web/src/main/java/jp/co/y_net/amm/page/EntryPasswordPage.html new file mode 100644 index 0000000..f1e79c3 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/EntryPasswordPage.html @@ -0,0 +1,58 @@ + + + + + + + + + + パスワード入力 + + + + + + + + ChattyInftyOnline + + + + + +トップへ戻る + +フィードバックメッセージ + + + + +パスワードが登録されました。 + + + + + + +パスワード + + + +パスワード(確認) + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/EntryPasswordPage.java b/AMM_web/src/main/java/jp/co/y_net/amm/page/EntryPasswordPage.java new file mode 100644 index 0000000..4999f9e --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/EntryPasswordPage.java @@ -0,0 +1,205 @@ +package jp.co.y_net.amm.page; + +import java.util.List; + +import jp.co.y_net.amm.AppSession; +import jp.co.y_net.amm.common.AppStringUtils; +import jp.co.y_net.amm.common.AppUtils; +import jp.co.y_net.amm.common.CalcHash; +import jp.co.y_net.amm.common.ResourceReader; +import jp.co.y_net.amm.dao.AppDef; +import jp.co.y_net.amm.dao.Org; +import jp.co.y_net.amm.dao.Pwtckt; +import jp.co.y_net.amm.dao.Usr; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Button; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.PasswordTextField; +import org.apache.wicket.markup.html.link.ExternalLink; +import org.apache.wicket.markup.html.panel.FeedbackPanel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +public class EntryPasswordPage extends CommonFrameA { + private static final long serialVersionUID = 1L; + + /* + * 画面入力値 + */ + public String passwordValue; + public String password2Value; + + /* + * 画面の状態 + */ + private boolean complete = false; + + public EntryPasswordPage(PageParameters pageParams) { + + add(new ExternalLink("lnkTop", ResourceReader.getStringQuick("url.back.top"))); + + /* フィードバックメッセージ */ + final FeedbackPanel feedbackPanel = new FeedbackPanel("feedback"); + feedbackPanel.setOutputMarkupId(true); + add(feedbackPanel); + + final Form form = new Form("form"); + form.setOutputMarkupId(true); + form.setVisible(false); // エラーチェックが完了するまで非表示とする。 + add(form); + + /* パラメータチェック ------------------------------------------- */ + String paramValue = pageParams.get("value").toString(); + validItem(paramValue, "パラメータvalue", 1, 16); + //if(hasInputError()) return; + if(hasInputError()) { + /* 有効文字数を表示してしまう具体的なエラーメッセージを避ける */ + AppSession.get().getFeedbackMessages().clear(); + error("このURLは無効です。"); + return; + } + + /* 有効なランダムチケットが無い場合は、メッセージを表示する。*/ + Pwtckt cnd = new Pwtckt(); + cnd.setTicket(paramValue); + final Pwtckt dbTicket; + List tickets = pwtcktDao.get(cnd); + if(tickets.size() != 1) { + error("このURLは無効です。"); + return; + } else { + dbTicket = tickets.get(0); + } + if(dbTicket.getStatus().equals(Pwtckt.STATUS_受付中) == false) { + error("このURLは無効です。"); + return; + } + if(dbTicket.getTicketdate() < AppUtils.createNowLong()) { + error("このURLは期限切れです。もう一度手続きを行ってください。"); + + dbTicket.setStatus(Pwtckt.STATUS_有効期限切れ); + pwtcktDao.update(dbTicket, AppDef.USERID_NONE); // 【更新処理】 + + return; + } + + form.setVisible(true); + /* -------------------------------------------------------------------------------------------------------*/ + /* Form内の設定 */ + + /* 完了メッセージ */ + Model resultMessageModel = new Model() { + @Override + public String getObject() { + //String msg = "パスワードを登録してください。パスワード登録後、本登録完了となります。パスワードは8文字以上、16文字以内で入力してください。"; + String msg = "パスワードを登録してください。パスワードは8文字以上、16文字以内で入力してください。"; + if(complete) { + msg = "パスワードの登録が完了しました。"; + } + return msg; + } + }; + final Label resutlMessage = new Label("resutlMessage", resultMessageModel); + resutlMessage.setEscapeModelStrings(false); + form.add(resutlMessage); + + PasswordTextField password = new PasswordTextField("password", new PropertyModel(this, "passwordValue")){ + @Override + public boolean isVisible() { + /* 完了後の状態なら表示しない */ + return complete == false; + } + }; + form.add(password); + PasswordTextField password2 = new PasswordTextField("password2", new PropertyModel(this, "password2Value")){ + @Override + public boolean isVisible() { + /* 完了後の状態なら表示しない */ + return complete == false; + } + }; + form.add(password2); + + Button btnSubmit = new ConfirmAjaxButton("btnSubmit"){ + @Override + protected String getConfirmMessage() { + return "パスワードを登録します。"; + } + @Override + boolean executeBefore() { + /* 入力値変換 */ + passwordValue = AppStringUtils.trim(passwordValue); + password2Value = AppStringUtils.trim(password2Value); + + /* 入力値チェック */ + validItemAscii(passwordValue, "パスワード", 8, 16); + validItemAscii(password2Value, "パスワード確認用", 8, 16); + if(passwordValue.equals(password2Value) == false) { + error("入力されたパスワードが一致しません。"); + } + if(hasInputError()) return false; // ここまででエラーチェック + return true; + } + @Override + void executeAfter(AjaxRequestTarget target) { + /* データアクセス 機関申請者のパスワード登録 */ + Usr usr = usrDao.getByUsrid(dbTicket.getUsrid()); + if(usr == null) { + error("(ユーザ情報が登録されていません。)"); + return; + } + if(Usr.STATUS_退会 == usr.getStatus()) { + /* 仮登録中に退会処理をされた場合を考慮 */ + error("(ユーザ情報が取り消されています。)"); + return; + } + + /* ユーザ情報更新 */ + String pwhash = CalcHash.passowrdHash(passwordValue, usr.getLoginid()); + usr.setPwhash(pwhash); + usr.setModpwdate(AppUtils.createNowLong()); + usr.setJoindate(AppUtils.createNowLong()); // 入会日時 + usr.setStatus(Usr.STATUS_登録済み); + + usrDao.update(usr, AppDef.USERID_NONE); // 【更新処理】 + + + /* 機関情報更新 */ + Org org = orgDao.getByOrgid(usr.getOrgid()); + if(org == null) { + error("(組織情報が登録されていません。)"); + return; + } + org.setStatus(Org.STATUS_本登録済み); + org.setJoindate(AppUtils.createNowLong()); // 本登録日時 + + orgDao.update(org, AppDef.USERID_NONE); // 【更新処理】 + + + /* パスワード受付管理情報更新 */ + dbTicket.setStatus(Pwtckt.STATUS_完了); + dbTicket.setCompletedate(AppUtils.createNowLong()); + + pwtcktDao.update(dbTicket, AppDef.USERID_NONE); // 【更新処理】 + + + /* 完了状態へ移行 */ + complete = true; + + /* 画面コンポーネントの再描画 */ + target.add(form); + } + @Override + public boolean isVisible() { + /* 完了後の状態ならボタンを表示しない */ + return complete == false; + } + }; + form.add(btnSubmit); + + } + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/ErrorPage.html b/AMM_web/src/main/java/jp/co/y_net/amm/page/ErrorPage.html new file mode 100644 index 0000000..d7081b5 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/ErrorPage.html @@ -0,0 +1,24 @@ + + + + + + エラー + + + + + +フィードバックメッセージ + + +エラーが発生しました。 + + + +トップへ + + + + + \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/ErrorPage.java b/AMM_web/src/main/java/jp/co/y_net/amm/page/ErrorPage.java new file mode 100644 index 0000000..1ae9367 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/ErrorPage.java @@ -0,0 +1,28 @@ +package jp.co.y_net.amm.page; + +import jp.co.y_net.amm.common.ResourceReader; + +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.link.ExternalLink; +import org.apache.wicket.markup.html.panel.FeedbackPanel; + +public class ErrorPage extends AppPage{ + public ErrorPage() { + /* フィードバックパネル設置 */ + add(new FeedbackPanel("feedback")); + + /* 標準メッセージ */ + add(new WebMarkupContainer("starndardmsg") { + @Override + public boolean isVisible() { + return getPage().hasFeedbackMessage() == false; + } + }); + + add(new ExternalLink("goTop",ResourceReader.getStringQuick("url.back.top"))); + } +// @Override +// protected boolean needLogin() { +// return false; +// } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/ExportPage.html b/AMM_web/src/main/java/jp/co/y_net/amm/page/ExportPage.html new file mode 100644 index 0000000..7536e79 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/ExportPage.html @@ -0,0 +1,47 @@ + + + + + + + + + + データエクスポート + + + + + + + + ChattyInftyOnline + + ログインID:sakamoto.ryouma@example.com + + + + + + + +運営管理者メニューに戻る + +フィードバックメッセージ + +データエクスポート + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/ExportPage.java b/AMM_web/src/main/java/jp/co/y_net/amm/page/ExportPage.java new file mode 100644 index 0000000..27e2cec --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/ExportPage.java @@ -0,0 +1,332 @@ +package jp.co.y_net.amm.page; + +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import jp.co.y_net.amm.AppSession; +import jp.co.y_net.amm.common.AppLogger; +import jp.co.y_net.amm.common.AppUtils; +import jp.co.y_net.amm.common.ResourceReader; +import jp.co.y_net.amm.dao.Grp; +import jp.co.y_net.amm.dao.Grpusr; +import jp.co.y_net.amm.dao.Org; +import jp.co.y_net.amm.dao.Usr; + +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.wicket.markup.html.form.Button; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.link.ExternalLink; +import org.apache.wicket.markup.html.panel.FeedbackPanel; +import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.util.resource.StringResourceStream; + +public class ExportPage extends CommonFrameA { + private static final long serialVersionUID = 1L; + + /* + * 画面入力値 + */ + // 無し + + /* + * 画面の状態 + */ +// private boolean complete = true; + + /** + * ログインチェック定義 + * @see jp.co.y_net.amm.page.AppPage#validateLogin() + */ + @Override + public boolean validateLogin() { + if(AppSession.get().isLogin()) { + if(AppSession.get().getLoginUser().getKind().equals(Usr.KIND_運営管理者)) { + return true; + } + } + return false; + } + + public ExportPage(PageParameters pageParams) { + + /* 戻るリンク */ + add(new ExternalLink("lnkSysAdmin", ResourceReader.getStringQuick("url.back.sysadmin"))); + + /* フィードバックメッセージ */ + final FeedbackPanel feedbackPanel = new FeedbackPanel("feedback"); + feedbackPanel.setOutputMarkupId(true); + add(feedbackPanel); + + /* 入力フォーム */ + Form form = new Form("form"); + add(form); + + /* 初期表示エラーチェック ----------------------------------------------------------------------------------- */ + form.setVisible(false); // Formはエラーチェックが完了するまで非表示とする。 + // なし + + if(hasInputError()) return; // ----------エラーがあれば中止 + form.setVisible(true); + + final List usrs = usrDao.get(); + final List orgs = orgDao.get(); + final List grps = grpDao.get(); + + /* Form内の設定 ----------------------------------------------------------------------------------------------*/ + form.add(new Button("btnCsvUsr"){ + @Override + public void onSubmit() { + StringBuilder csvBuilder = new StringBuilder(); + + csvBuilder.append("ユーザ情報\n"); + csvBuilder.append("出力日:" + new SimpleDateFormat("yyyy年MM月dd日 HH時:mm分").format(new Date()) + "\n"); + csvBuilder.append("\n"); + + List heads = Arrays.asList(new String[]{ + "ユーザID", + "ログインID", + "氏名", + "種別", + "所属組織", + "所属組織での役割", + "入会日時", + "ログイン失敗回数", + "最終ログイン日時", + "パスワード変更日時", + "退会日付", + "状態", + }); + for (String str: heads) { + csvBuilder.append(escapeCsv(str) + ","); + } + csvBuilder.append("\n"); + + List> recodes = new ArrayList>(); + for (Usr usr: usrs) { + List datas = Arrays.asList(new Object[]{ + (usr.getUsrid()), + (usr.getLoginid()), + (usr.getName()), + 名称へ変換(usr.getKind(), "1.機関会員,2.機関管理者,3.運営管理者,"), + 組織名へ変換(usr.getOrgid(), orgs), + 名称へ変換(usr.getOrgrole(), "1.管理者, 9.通常会員"), + yyyyMMddへ変換(usr.getJoindate()), + (usr.getLoginerrorcount()), + yyyyMMddへ変換(usr.getLastlogindate()), + yyyyMMddへ変換(usr.getModpwdate()), + yyyyMMddへ変換(usr.getLeavedate()), + 名称へ変換(usr.getStatus(), "0.仮登録(登録待ち),1.登録済み,2.退会,"), + }); + recodes.add(datas); + } + for (List recode: recodes) { + for (Object obj: recode) { + String str= ""; + if (obj!= null) { + str = obj.toString(); + } + csvBuilder.append(escapeCsv(str) + ","); + } + csvBuilder.append("\n"); + } + + /* CSVファイル名をセットしてレスポンス */ + String strCsvName = "USR_" + String.valueOf(getTodayNumber()) + ".csv"; + responseCsv(csvBuilder, strCsvName); + } + }); + + form.add(new Button("btnCsvOrg"){ + @Override + public void onSubmit() { + StringBuilder csvBuilder = new StringBuilder(); + + csvBuilder.append("組織情報\n"); + csvBuilder.append("出力日:" + new SimpleDateFormat("yyyy年MM月dd日 HH時:mm分").format(new Date()) + "\n"); + csvBuilder.append("\n"); + + List heads = Arrays.asList(new String[]{ + "組織ID", + "種別", + "名称", + "管理者氏名", + "申請日時", + "本登録日時", + "状態", + }); + for (String str: heads) { + csvBuilder.append(escapeCsv(str) + ","); + } + csvBuilder.append("\n"); + + List> recodes = new ArrayList>(); + for (Org data: orgs) { + List datas = Arrays.asList(new Object[]{ + (data.getOrgid()), + 名称へ変換(data.getKind(),"1.教育機関, 2.施設団体(政令指定), 3.施設団体(非政令指定), 9.個人, 999.運営管理"), + (data.getName()), + (data.getAdminname()), + yyyyMMddへ変換(data.getEntrydate()), + yyyyMMddへ変換(data.getJoindate()), + 名称へ変換(data.getStatus(),"0. 申請中(未処理),1. 承認済み(本登録待ち),2. 拒否済み,3. 本登録済み,"), + + }); + recodes.add(datas); + } + for (List recode: recodes) { + for (Object obj: recode) { + String str= ""; + if (obj!= null) { + str = obj.toString(); + } + csvBuilder.append(escapeCsv(str) + ","); + } + csvBuilder.append("\n"); + } + + /* CSVファイル名をセットしてレスポンス */ + String strCsvName = "ORG_" + String.valueOf(getTodayNumber()) + ".csv"; + responseCsv(csvBuilder, strCsvName); + } + }); + + form.add(new Button("btnCsvGrp"){ + @Override + public void onSubmit() { + StringBuilder csvBuilder = new StringBuilder(); + + csvBuilder.append("グループ情報\n"); + csvBuilder.append("出力日:" + new SimpleDateFormat("yyyy年MM月dd日 HH時:mm分").format(new Date()) + "\n"); + csvBuilder.append("\n"); + + List heads = Arrays.asList(new String[]{ + "グループID", + "名称", + "メンバー", + "メンバーの状態", + }); + for (String str: heads) { + csvBuilder.append(escapeCsv(str) + ","); + } + csvBuilder.append("\n"); + + List> recodes = new ArrayList>(); + for (Grp grp: grps) { + Grpusr cnd = new Grpusr(); + cnd.setGrpid(grp.getGrpid()); + boolean first = true; + for (Grpusr grpusr: grpusrDao.get(cnd)){ + Usr member = usrDao.getByUsrid(grpusr.getUsrid()); + String admin = ""; + if (grp.getAdminusrid().equals(member.getUsrid())) { + admin = "(グループ管理者)"; + } + List datas = Arrays.asList(new Object[]{ + first ? grp.getGrpid() : "", + first ?grp.getName() : "", + member.getUsrid() + "." + member.getName() + admin, + 名称へ変換(grpusr.getStatus(),"0.招待中,1.参加中,2.脱退,"), + }); + recodes.add(datas); + first = false; + } + } + for (List recode: recodes) { + for (Object obj: recode) { + String str= ""; + if (obj!= null) { + str = obj.toString(); + } + csvBuilder.append(escapeCsv(str) + ","); + } + csvBuilder.append("\n"); + } + + /* CSVファイル名をセットしてレスポンス */ + String strCsvName = "GRP_" + String.valueOf(getTodayNumber()) + ".csv"; + responseCsv(csvBuilder, strCsvName); + } + }); + } + + + private String 名称へ変換(Integer i, String defs) { + List listDefs = Arrays.asList(defs.split(",")); + for (String def: listDefs) { + if (def.trim().isEmpty()) continue; + String key = def.split("\\.")[0].trim(); + String value = def.split("\\.")[1].trim(); + if (key.equals(i.toString())) { + return value; + } + } + AppLogger.error("!!! 値が不正です !!!(" + i + ")"); + return "!!! 値が不正です !!!(" + i + ")"; + } + + private String yyyyMMddへ変換(Long l) { + if (l == null) return ""; + return new SimpleDateFormat("yyyy/MM/dd").format(AppUtils.toDate(l)); + } + + private String 組織名へ変換(Integer orgid, List orgs) { + for (Org org: orgs) { + if (org.getOrgid().equals(orgid)) { + return "(" + orgid + ")"+org.getName(); + } + } + + Org deletedOrg = orgDao.getByOrgid(orgid, true); + if (deletedOrg != null) { + return "(" + orgid + ")" + deletedOrg.getNameOrAdminname() + "(削除済み)"; + } + + AppLogger.error("!!! 組織情報が引き当てられませんでした !!!" + orgid); + return "!!! 組織情報が引き当てられませんでした !!!" + orgid; + } + + /** + * + * システム日付(yyyymmdd)を数値で返す + * + * @return システム日付(8桁数値) + */ + private static int getTodayNumber(){ + + Calendar cal; + int intToday = 0; + + cal = Calendar.getInstance(); + + /* 年を取得 */ + int y = cal.get(Calendar.YEAR) * 10000; + + /* 月を取得(0~11で返ってくるため+1する) */ + int m = (cal.get(Calendar.MONTH) + 1) * 100; + + /* 日を取得 */ + int d = cal.get(Calendar.DATE); + + /* 日付yyyymmddを取得 */ + intToday = y + m + d; + + return intToday; + } + private String escapeCsv(String value) { + return StringEscapeUtils.escapeCsv(value); + } + + private void responseCsv(StringBuilder csvBuilder, String strCsvName) { + /* 作成したCSVデータを配信するためのリソースストリームを生成 */ + StringResourceStream stream = new StringResourceStream(csvBuilder.toString(), "application/octet-stream"); + stream.setCharset(Charset.forName("Shift_JIS")); + /* ターゲットをResourceStreamRequestTargetに差し替える */ + getRequestCycle().scheduleRequestHandlerAfterCurrent(new ResourceStreamRequestHandler(stream, strCsvName)); + } +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/GroupListPage.html b/AMM_web/src/main/java/jp/co/y_net/amm/page/GroupListPage.html new file mode 100644 index 0000000..0fff569 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/GroupListPage.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + ChattyInftyOnline + + ログインID:sakamoto.ryouma@example.com + + + + + + + +会員メニューに戻る +代表者メニューに戻る +運営管理者メニューに戻る + +フィードバックメッセージ + + + + + 完了メッセージ + + 管理グループ一覧 + + グループ作成 + 名称: + + + + + グループ名称 + 作成日 + 参加人数 + 管理者 + + + + グループ名 + 2015/3/28 + 5 + 管理者 + + メンバーリストへ + + + + + <前へ 次へ> + + + 該当データなし + + + + 参加グループ一覧 + + + + + グループ名称 + メンバー数 + 管理者 + 参加日 + 状態 + + + + グループ名 + 5 + 管理者 + 2015/3/28 + 参加済み + + + + + + + + + + <前へ 次へ> + + + 該当データなし + + + + + + + + + + + + \ No newline at end of file diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/GroupListPage.java b/AMM_web/src/main/java/jp/co/y_net/amm/page/GroupListPage.java new file mode 100644 index 0000000..87fa2ca --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/GroupListPage.java @@ -0,0 +1,523 @@ +package jp.co.y_net.amm.page; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import jp.co.y_net.amm.AppSession; +import jp.co.y_net.amm.AppSession.LoginUser; +import jp.co.y_net.amm.common.AppStringUtils; +import jp.co.y_net.amm.common.AppUtils; +import jp.co.y_net.amm.common.ResourceReader; +import jp.co.y_net.amm.dao.Grp; +import jp.co.y_net.amm.dao.Grpusr; +import jp.co.y_net.amm.dao.Usr; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.TextField; +import org.apache.wicket.markup.html.link.BookmarkablePageLink; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.list.PageableListView; +import org.apache.wicket.markup.html.panel.FeedbackPanel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.LoadableDetachableModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +public class GroupListPage extends CommonFrameA { + private static final long serialVersionUID = 1L; + + /* + * 画面入力値 + */ + /* グループ作成.名称 */ + private String groupnameValue = ""; + + /** + * ログインチェック定義 + * @see jp.co.y_net.amm.page.AppPage#validateLogin() + */ + @Override + public boolean validateLogin() { + if(AppSession.get().isLogin()) { + return true; + } + return false; + } + + public GroupListPage(PageParameters pageParams) { + + /* 共通戻るリンクの設置 */ + createCommonBackLinks(); + + /* フィードバックメッセージ */ + final FeedbackPanel feedbackPanel = new FeedbackPanel("feedback"); + feedbackPanel.setOutputMarkupId(true); + add(feedbackPanel); + + /* 入力フォーム */ + Form form = new Form("form"); + add(form); + + /* 初期表示エラーチェック・共通変数設定 --------------------------------------------------------------------- */ + + /* + * 機能制御 + */ + if (ResourceReader.getBooleanQuick("enable.grouplist") == false) { + form.setVisible(false); + error("現在この機能はご利用いただけません。"); + } + + + form.setVisible(false); // Formはエラーチェックが完了するまで非表示とする。 + + final LoginUser loginUser = AppSession.get().getLoginUser(); + if(loginUser == null) { + error("ログイン情報が取得できません。"); + return; + } + final Integer loginUserId = loginUser.getUsrid(); + + if(hasInputError()) return; // ----------エラーがあれば中止 + form.setVisible(true); + + /* Form内の設定 ----------------------------------------------------------------------------------------------*/ + /* 完了メッセージ */ + Model resultMessageModel = new Model() { +// @Override +// public String getObject() { +// if(complete) { +// return ""; +// } +// return ""; +// } + }; + final Label resutlMessage = new Label("resutlMessage", resultMessageModel); + resutlMessage.setOutputMarkupId(true); + form.add(resutlMessage); + + /* -----------------------------------------------------------------------------------------------------------*/ + + /* + * listA = 管理グループ一覧のモデル + * リクエストごとにloadが実行される + */ + final IModel> listAModel = new LoadableDetachableModel>() { + /* */ + @Override + protected List load() { + + Grp cndGrp = new Grp(); + + if(Usr.KIND_運営管理者 == loginUser.getKind()) { + // 運営管理者は全て表示 + } else { + cndGrp.setAdminusrid(loginUserId); // 自分の管理しているグループに絞り込む + } + + List list = grpDao.get(cndGrp); + + /* 作成日の新しい順でソート*/ + Collections.sort(list, new Grp.CreatedateComparator(true)); + return list; + } + + }; + /* + * listB = 参加グループ一覧のモデル + * リクエストごとにloadが実行される + */ + final IModel> listBModel = new LoadableDetachableModel>() { + @Override + protected List load() { + Grpusr cndGrpusr = new Grpusr(); + cndGrpusr.setUsrid(loginUserId); + List list = grpusrDao.get(cndGrpusr); + + /* + *・自分が管理者のグループは除外する + *・脱退者は除外する + */ + List tmp = new ArrayList(); + for(Grpusr gu: list) { + Grp g = grpDao.getByGrpid(gu.getGrpid()); + if(g == null) { + // 追加しない + } else if(g.getAdminusrid().equals(loginUserId)) { + // 追加しない + } else if(Grpusr.STATUS_脱退.equals(gu.getStatus())) { + // 追加しない + } else { + tmp.add(gu); + } + + } + list = tmp; + + /* 参加日の新しい順でソート*/ + Collections.sort(list, new Grpusr.JoindateComparator(true)); + return list; + } + }; + + + /* コンテナの設定 ------------------------------------------------------------------------------------------------*/ + /* + * 画面の部分更新の対象となるコンテナ + * ページをインスタンス化するときに初期非表示としてはいけない。 + */ + + /* 管理グループ一覧 */ + final WebMarkupContainer listAContainer = new WebMarkupContainer("listAContainer"); + listAContainer.setOutputMarkupId(true); + form.add(listAContainer); + + final WebMarkupContainer listAContainerData = new WebMarkupContainer("listAContainerData"){ + @Override + public boolean isVisible() { + return listAModel.getObject().isEmpty() == false; + } + }; + listAContainerData.setOutputMarkupPlaceholderTag(true);// 初期非表示の場合に、後から表示できるようにする + listAContainer.add(listAContainerData); + + final WebMarkupContainer listAContainerNoData = new WebMarkupContainer("listAContainerNoData"){ + @Override + public boolean isVisible() { + return listAModel.getObject().isEmpty(); + } + }; + listAContainerNoData.setOutputMarkupPlaceholderTag(true);// 初期非表示の場合に、後から表示できるようにする + listAContainer.add(listAContainerNoData); + + /* 参加グループ一覧 */ + final WebMarkupContainer listBContainer = new WebMarkupContainer("listBContainer"); + listBContainer.setOutputMarkupId(true); + form.add(listBContainer); + + final WebMarkupContainer listBContainerData = new WebMarkupContainer("listBContainerData"){ + @Override + public boolean isVisible() { + return listBModel.getObject().isEmpty() == false; + } + }; + listBContainerData.setOutputMarkupPlaceholderTag(true);// 初期非表示の場合に、後から表示できるようにする + listBContainer.add(listBContainerData); + + final WebMarkupContainer listBContainerNoData = new WebMarkupContainer("listBContainerNoData"){ + @Override + public boolean isVisible() { + return listBModel.getObject().isEmpty(); + } + }; + listBContainerNoData.setOutputMarkupPlaceholderTag(true);// 初期非表示の場合に、後から表示できるようにする + listBContainer.add(listBContainerNoData); + + /* 一覧の設定 ------------------------------------------------------------------------------------------------*/ + + + /*listA = 管理グループ一覧 ------------------------------------------------------------------- */ + final PageableListView listA = new PageableListView("listA", listAModel, 5) { + private static final long serialVersionUID = 1L; + @Override + protected void populateItem(ListItem item) { + + final Grp grp = item.getModelObject(); + + item.add(new Label("groupname", grp.getName())); // グループ名 + item.add(new Label("createdate" , AppUtils.toStrYyyyMMdd(grp.getCreatedate()))); // 作成日 + item.add(new Label("membercount" , grpusrDao.getMembercount参加中AsString(grp.getGrpid()))); // 参加人数 + + String adminname = usrDao.getByUsrid(grp.getAdminusrid()).getName(); + item.add(new Label("leadername" , adminname)); // 管理者 + + /* 「メンバーリストへ」*/ + PageParameters param = new PageParameters(); + param.add("grpid", grp.getGrpid()); + item.add(new BookmarkablePageLink("goMemberlist", GroupMemberListPage.class, param)); + + /* グループ削除 ボタン */ + item.add(new ConfirmAjaxButton("buttonDelete"){ + + @Override + protected String getConfirmMessage() { + return "すべてのメンバーを脱退させ、グループを削除します。"; + } + @Override + void executableWork() { + /* データ操作 */ + grpDao.removeLogical(grp, loginUserId); // 【論理削除】 + + // 紐づくメンバーも削除 + Grpusr members = new Grpusr(); + members.setGrpid(grp.getGrpid()); + for(Grpusr member: grpusrDao.get(members)) { + member.set脱退設定(); + grpusrDao.update(member, loginUserId); + } + } + @Override + void executeAfter(AjaxRequestTarget target) { + + /* メッセージ表示 */ + feedbackPanel.info(grp.getName() + " のすべてのメンバーを脱退させ、グループを削除しました。"); +// /* LoadableDetachableModel#load を再実行させるためのデタッチ */ +// listAModel.detach(); + + target.add(listAContainer); + } + }); + } + }; + listAContainerData.add(listA); + + /* ページングの部品 */ + final AjaxPagingNavigator pagingListA = new AjaxPagingNavigator("pagingListA", listA){}; + listAContainerData.add(pagingListA); + + + /* グループ作成.名称 */ + TextField inputgroupname = new TextField("inputgroupname", new PropertyModel(this, "groupnameValue")); + listAContainer.add(inputgroupname); + + /* グループを作成する ボタン */ + listAContainer.add(new ConfirmAjaxButton("buttonCreateGroup"){ + @Override + protected String getConfirmMessage() { + return "グループを作成します。"; + } + @Override + boolean executeBefore() { + /* 入力値変換 */ + groupnameValue = AppStringUtils.trim(groupnameValue); + /* 入力値検査 */ + validItem(groupnameValue, "グループ名", 1, 512); + if(hasInputError()) return false; // ここまででエラーチェック + return true; + } + @Override + void executableWork() { + /* データ更新 */ + Grp group = new Grp(); + group.setName(groupnameValue); + group.setAdminusrid(loginUser.getUsrid()); + group.setCreatedate(AppUtils.createNowLong()); + grpDao.add(group, loginUserId); // 【データ更新】 + + Grpusr member = new Grpusr(); + member.setGrpid(group.getGrpid()); + member.setUsrid(loginUser.getUsrid()); + member.setJoindate(AppUtils.createNowLong()); + member.setAdmindate(AppUtils.createNowLong()); + member.setStatus(Grpusr.STATUS_参加中); + grpusrDao.add(member, loginUserId); // 【データ更新】 + } + @Override + void executeAfter(AjaxRequestTarget target) { + + /* メッセージ表示 */ + feedbackPanel.info("グループ「" + groupnameValue + "」を作成しました。"); + + /* 入力項目初期化 */ + groupnameValue = ""; + + /* 画面部品の更新 */ + target.add(listAContainer); // 管理グループ一覧領域 + } + }); + + + /*listB = 参加グループ一覧 ------------------------------------------------------------------- */ + + final PageableListView listB = new PageableListView("listB", listBModel, 20) { + private static final long serialVersionUID = 1L; + @Override + protected void populateItem(ListItem item) { + + final Grpusr grpusr = item.getModelObject(); + final Grp grp = grpDao.getByGrpid(grpusr.getGrpid()); + + final String groupname = grp.getName(); + + item.add(new Label("groupname", groupname)); // グループ名 + item.add(new Label("membercount" , grpusrDao.getMembercount参加中AsString(grp.getGrpid()))); // 参加人数 + + String adminname = usrDao.getByUsrid(grp.getAdminusrid()).getName(); + item.add(new Label("leadername" , adminname)); // 管理者 + + + Date joindate = AppUtils.toDate(grpusr.getJoindate()); + String joindateStr = ""; + if(joindate != null) { + joindateStr = AppUtils.toStrYyyyMMdd(joindate); + } + item.add(new Label("joindate" , joindateStr)); // 参加日 + item.add(new Label("status" , grpusr.getStatus合算())); // 状態 + + + /* 参加する ボタン */ + item.add(new ConfirmAjaxButton("buttonJoin"){ + @Override + protected String getConfirmMessage() { + return "グループ「" + groupname + "」に参加します。"; + } + @Override + void executableWork() { + /* データ操作 */ + grpusr.setJoindate(AppUtils.createNowLong()); // 参加日時 + grpusr.setStatus(Grpusr.STATUS_参加中); + grpusrDao.update(grpusr, loginUserId); // 【データ更新】 + } + @Override + void executeAfter(AjaxRequestTarget target) { + + /* メッセージ表示 */ + feedbackPanel.info("グループ「" + groupname + "」に参加しました。"); + + /* 画面部品の更新 */ + target.add(listBContainer); // 参加グループ一覧領域 + } + @Override + public boolean isVisible() { + /* 招待中状態で無ければ非表示 */ + if(Grpusr.STATUS_招待中.equals(grpusr.getStatus()) == false) return false; + + return true; + } + }); + /* 参加しない ボタン */ + item.add(new ConfirmAjaxButton("buttonReject"){ + @Override + protected String getConfirmMessage() { + return "グループ「" + groupname + "」への参加を辞退します。"; + } + @Override + void executableWork() { + /* データ操作 */ + grpusrDao.removeLogical(grpusr, loginUserId); // 【論理削除】 + } + @Override + void executeAfter(AjaxRequestTarget target) { + + /* メッセージ表示 */ + feedbackPanel.info("グループ「" + groupname + "」への参加を辞退しました。"); + + /* 画面部品の更新 */ + target.add(listBContainer); // 参加グループ一覧領域 + } + @Override + public boolean isVisible() { + /* 招待中状態で無ければ非表示 */ + if(Grpusr.STATUS_招待中.equals(grpusr.getStatus()) == false) return false; + + return true; + } + }); + /* 脱退する ボタン */ + item.add(new ConfirmAjaxButton("buttonLeave"){ + @Override + protected String getConfirmMessage() { + return "グループ「" + groupname + "」から脱退します。"; + } + @Override + void executableWork() { + /* データ操作 */ + grpusr.set脱退設定(); + grpusrDao.update(grpusr, loginUserId); // 【データ更新】 + } + @Override + void executeAfter(AjaxRequestTarget target) { + + /* メッセージ表示 */ + feedbackPanel.info("グループ「" + groupname + "」から脱退しました。"); + + /* 画面部品の更新 */ + target.add(listBContainer); // 参加グループ一覧領域 + } + @Override + public boolean isVisible() { + if (Grpusr.STATUS_参加中.equals(grpusr.getStatus()) == false) return false; + return true; + } + }); + + /* 承諾する ボタン */ + item.add(new ConfirmAjaxButton("buttonAdminAccept"){ + @Override + protected String getConfirmMessage() { + return "グループ「" + groupname + "」の管理者を承諾します。"; + } + @Override + void executableWork() { + /* データ操作 */ + grpusr.setAdmindate(AppUtils.createNowLong()); // 管理者就任日時 + grpusr.setStatusadmin(Grpusr.STATUS_ADMIN_移管完了); + grpusrDao.update(grpusr, loginUserId); // 【データ更新】 + + grp.setAdminusrid(loginUser.getUsrid()); + grpDao.update(grp, loginUserId); // 【データ更新】 + } + @Override + void executeAfter(AjaxRequestTarget target) { + + /* メッセージ表示 */ + feedbackPanel.info("グループ「" + groupname + "」の管理者を承諾しました。"); + + /* 画面部品の更新 */ + target.add(listAContainer); // 管理グループ一覧領域 + target.add(listBContainer); // 参加グループ一覧領域 + } + @Override + public boolean isVisible() { + /* 移管依頼中でなければ表示しない */ + if(Grpusr.STATUS_ADMIN_移管依頼中.equals(grpusr.getStatusadmin()) == false) return false; + return true; + } + }); + /* 承諾しない ボタン */ + item.add(new ConfirmAjaxButton("buttonAdminReject"){ + @Override + protected String getConfirmMessage() { + return "グループ「" + groupname + "」の管理者を辞退します。"; + } + @Override + void executableWork() { + /* データ操作 */ + grpusr.setStatusadmin(Grpusr.STATUS_ADMIN_未設定); + grpusrDao.update(grpusr, loginUserId); // 【データ更新】 + } + @Override + void executeAfter(AjaxRequestTarget target) { + + /* メッセージ表示 */ + feedbackPanel.info("グループ「" + groupname + "」の管理者を辞退しました。"); + + /* 画面部品の更新 */ + target.add(listBContainer); // 参加グループ一覧領域 + } + @Override + public boolean isVisible() { + /* 移管依頼中でなければ表示しない */ + if(Grpusr.STATUS_ADMIN_移管依頼中.equals(grpusr.getStatusadmin()) == false) return false; + return true; + } + }); + } + }; + listBContainerData.add(listB); + + /* ページングの部品 */ + final AjaxPagingNavigator pagingListB = new AjaxPagingNavigator("pagingListB", listB){}; + listBContainerData.add(pagingListB); + + } + + +} diff --git a/AMM_web/src/main/java/jp/co/y_net/amm/page/GroupMemberListPage.html b/AMM_web/src/main/java/jp/co/y_net/amm/page/GroupMemberListPage.html new file mode 100644 index 0000000..bb8aa32 --- /dev/null +++ b/AMM_web/src/main/java/jp/co/y_net/amm/page/GroupMemberListPage.html @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + ChattyInftyOnline + + ログインID:sakamoto.ryouma@example.com +
+ 連番:時間:ID + 連番:時間:ID +
+パスワードが登録されました。 +
完了メッセージ