/*
* Aipo is a groupware program developed by TOWN, Inc.
* Copyright (C) 2004-2015 TOWN, Inc.
* http://www.aipo.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aimluck.eip.filter;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.query.SelectQuery;
import org.apache.jetspeed.om.profile.Entry;
import org.apache.jetspeed.om.profile.Layout;
import org.apache.jetspeed.om.profile.Parameter;
import org.apache.jetspeed.om.profile.Portlets;
import org.apache.jetspeed.om.profile.psml.PsmlEntry;
import org.apache.jetspeed.om.profile.psml.PsmlLayout;
import org.apache.jetspeed.om.profile.psml.PsmlParameter;
import org.apache.jetspeed.services.idgenerator.JetspeedIdGenerator;
import org.apache.jetspeed.services.psmlmanager.db.DBUtils;
import org.exolab.castor.mapping.Mapping;
import org.xml.sax.InputSource;
import com.aimluck.eip.cayenne.om.account.JetspeedUserProfile;
/**
*
*/
public class ALMigrateFilter implements javax.servlet.Filter {
public FilterConfig filterConfig;
@Override
public void doFilter(final ServletRequest request,
final ServletResponse response, FilterChain chain)
throws java.io.IOException, javax.servlet.ServletException {
chain.doFilter(request, response);
}
@Override
public void init(final FilterConfig filterConfig) {
this.filterConfig = filterConfig;
ServletContext servletContext = this.filterConfig.getServletContext();
InputStream resourceAsStream =
servletContext
.getResourceAsStream("WEB-INF/datasource/dbcp-org001.properties");
Connection conn = null;
Statement stmt = null;
try {
Properties dbcpProp = new Properties();
dbcpProp.load(resourceAsStream);
String driverClassName =
dbcpProp.get("cayenne.dbcp.driverClassName").toString();
String url = dbcpProp.get("cayenne.dbcp.url").toString();
String username = dbcpProp.get("cayenne.dbcp.username").toString();
String password = dbcpProp.get("cayenne.dbcp.password").toString();
if (url.startsWith("jdbc:postgresql")) {
// JDBCドライバのロード
Class.forName(driverClassName);
// データベース接続
System.out.println("Connecting to " + url);
conn = DriverManager.getConnection(url, username, password);
stmt = conn.createStatement();
// テーブル構造の確認
List<String> columnsTurbineUser = new ArrayList<String>();
DatabaseMetaData meta = conn.getMetaData();
ResultSet columns = meta.getColumns(null, null, "turbine_user", null);
while (columns.next()) {
columnsTurbineUser
.add(columns.getString("COLUMN_NAME").toUpperCase());
}
columns.close();
boolean hasBatch = false;
/**
* 7000to7010
*/
if (!columnsTurbineUser.contains("TUTORIAL_FORBID")) {
stmt
.addBatch("ALTER TABLE TURBINE_USER ADD COLUMN TUTORIAL_FORBID VARCHAR (1) DEFAULT 'F';");
stmt.addBatch("UPDATE TURBINE_USER SET TUTORIAL_FORBID = 'T' ;");
hasBatch = true;
}
/**
* 7010to7020
*/
if (!columnsTurbineUser.contains("PHOTO_MODIFIED_SMARTPHONE")) {
stmt
.addBatch("UPDATE EIP_T_ACL_PORTLET_FEATURE SET ACL_TYPE = 41 WHERE FEATURE_ID = 172 AND FEATURE_NAME = 'timecard_timecard_other';");
stmt
.addBatch("UPDATE EIP_T_ACL_PORTLET_FEATURE SET ACL_TYPE = 45 WHERE FEATURE_ID = 172 AND FEATURE_NAME = 'timecard_timecard_other';");
stmt
.addBatch("ALTER TABLE activity ALTER COLUMN title TYPE character varying(255);");
stmt
.addBatch("ALTER TABLE activity ALTER COLUMN title SET NOT NULL;");
if (!columnsTurbineUser.contains("PHOTO_SMARTPHONE")) {
stmt
.addBatch("ALTER TABLE turbine_user ADD PHOTO_SMARTPHONE bytea;");
}
if (!columnsTurbineUser.contains("HAS_PHOTO_SMARTPHONE")) {
stmt
.addBatch("ALTER TABLE turbine_user ADD HAS_PHOTO_SMARTPHONE VARCHAR (1) DEFAULT 'F';");
}
stmt
.addBatch("ALTER TABLE turbine_user ADD PHOTO_MODIFIED_SMARTPHONE TIMESTAMP;");
hasBatch = true;
}
if (hasBatch) {
stmt.executeBatch();
}
/*
* 7020to7030
*/
SelectQuery query = new SelectQuery(JetspeedUserProfile.class);
Expression exp =
ExpressionFactory.matchExp(
JetspeedUserProfile.MEDIA_TYPE_PROPERTY,
"html");
query.setQualifier(exp);
DataContext dataContext = DataContext.getThreadDataContext();
@SuppressWarnings("unchecked")
List<JetspeedUserProfile> list = dataContext.performQuery(query);
String mapFile = "conf/psml-mapping.xml";
File map = new File(mapFile);
Mapping mapping = new Mapping();
InputSource is = new InputSource(new FileReader(map));
is.setSystemId(mapFile);
mapping.loadMapping(is);
if (list != null) {
for (JetspeedUserProfile prof : list) {
Portlets portlets =
DBUtils.bytesToPortlets(prof.getProfile(), mapping);
Iterator<Portlets> iterator = portlets.getPortletsIterator();
while (iterator.hasNext()) {
Portlets childPortlets = iterator.next();
long afterPos = 0;
for (Entry entry : childPortlets.getEntriesArray()) {
if ("Cellular".equals(entry.getParent())) {
Layout layout = entry.getLayout();
afterPos = layout.getPosition();
break;
}
}
for (Entry entry : childPortlets.getEntriesArray()) {
Layout layout = entry.getLayout();
if ("Cellular".equals(entry.getParent())) {
PsmlEntry entryPsml = new PsmlEntry();
entryPsml.setId(JetspeedIdGenerator.getNextPeid());
entryPsml.setParent("Cellular");
Layout newLayout = new PsmlLayout();
Parameter columnParam = new PsmlParameter();
columnParam.setName("column");
columnParam.setValue("0");
Parameter rowParam = new PsmlParameter();
rowParam.setName("row");
rowParam.setValue("0");
newLayout.addParameter(columnParam);
newLayout.addParameter(rowParam);
newLayout.setPosition(layout.getPosition() + 1);
entryPsml.setLayout(newLayout);
childPortlets.addEntry(entryPsml);
} else if (layout.getPosition() > afterPos) {
layout.setPosition(layout.getPosition() + 1);
}
}
byte[] newProfBytes = DBUtils.portletsToBytes(portlets, mapping);
prof.setProfile(newProfBytes);
dataContext.commitChanges();
}
}
}
}
} catch (SQLException e) {
while (e != null) {
System.err.println(e.getMessage());
System.err.println(e.getSQLState());
System.err.println(e.getErrorCode());
System.out.println("");
e = e.getNextException();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
stmt.close();
} catch (Exception i2) {
}
try {
conn.close();
} catch (Exception i3) {
}
}
}
@Override
public void destroy() {
}
}